From f46a9e1bf2b6f76fc7227db6b2937c37d24051b5 Mon Sep 17 00:00:00 2001 From: djq <1953187027@qq.com> Date: Fri, 10 May 2024 01:07:12 +0800 Subject: [PATCH] =?UTF-8?q?=E6=97=A5=E5=BF=97=E6=95=B0=E6=8D=AE=E5=88=86?= =?UTF-8?q?=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- goaccess++/ABOUT-NLS | 1327 ++ goaccess++/AUTHORS | 77 + goaccess++/COPYING | 21 + goaccess++/ChangeLog | 705 + goaccess++/INSTALL | 370 + goaccess++/Makefile | 1268 ++ goaccess++/Makefile.am | 219 + goaccess++/Makefile.in | 1268 ++ goaccess++/NEWS | 80 + goaccess++/README | 100 + goaccess++/TODO | 10 + goaccess++/aclocal.m4 | 1015 ++ goaccess++/bin2c | Bin 0 -> 17096 bytes goaccess++/compile | 343 + goaccess++/config.guess | 1530 ++ goaccess++/config.log | 1751 ++ goaccess++/config.rpath | 672 + goaccess++/config.status | 1406 ++ goaccess++/config.sub | 1782 ++ goaccess++/config/browsers.list | 102 + goaccess++/config/goaccess.conf | 766 + goaccess++/configure | 10655 ++++++++++++ goaccess++/configure.ac | 309 + goaccess++/depcomp | 708 + goaccess++/goaccess | Bin 0 -> 707704 bytes goaccess++/goaccess.1 | 1166 ++ goaccess++/install-sh | 527 + goaccess++/m4/gettext.m4 | 383 + goaccess++/m4/iconv.m4 | 199 + goaccess++/m4/intlmacosx.m4 | 51 + goaccess++/m4/lib-ld.m4 | 110 + goaccess++/m4/lib-link.m4 | 774 + goaccess++/m4/lib-prefix.m4 | 224 + goaccess++/m4/nls.m4 | 32 + goaccess++/m4/po.m4 | 449 + goaccess++/m4/progtest.m4 | 92 + goaccess++/missing | 331 + goaccess++/po/LINGUAS | 4 + goaccess++/po/Makefile | 571 + goaccess++/po/Makefile.in | 444 + goaccess++/po/Makefile.in.in | 444 + goaccess++/po/Makevars | 79 + goaccess++/po/POTFILES | 1 + goaccess++/po/POTFILES.in | 2 + goaccess++/po/Rules-quot | 47 + goaccess++/po/boldquot.sed | 10 + goaccess++/po/en@boldquot.header | 25 + goaccess++/po/en@quot.header | 22 + goaccess++/po/es.gmo | Bin 0 -> 17442 bytes goaccess++/po/es.po | 902 + goaccess++/po/fr.gmo | Bin 0 -> 9094 bytes goaccess++/po/fr.po | 904 + goaccess++/po/goaccess.pot | 882 + goaccess++/po/insert-header.sin | 23 + goaccess++/po/ja.gmo | Bin 0 -> 21828 bytes goaccess++/po/ja.po | 914 + goaccess++/po/quot.sed | 6 + goaccess++/po/remove-potcdate.sin | 19 + goaccess++/po/stamp-po | 1 + goaccess++/po/zh_CN.gmo | Bin 0 -> 17925 bytes goaccess++/po/zh_CN.po | 899 + goaccess++/resources/css/app.css | 987 ++ goaccess++/resources/css/app.css.tmp | 1 + goaccess++/resources/css/bootstrap.min.css | 1 + .../resources/css/bootstrap.min.css.tmp | 1 + goaccess++/resources/css/fa.min.css | 8 + goaccess++/resources/css/fa.min.css.tmp | 1 + goaccess++/resources/js/app.js | 1793 ++ goaccess++/resources/js/app.js.tmp | 1 + goaccess++/resources/js/charts.js | 1067 ++ goaccess++/resources/js/charts.js.tmp | 1 + goaccess++/resources/js/d3.v3.min.js | 5 + goaccess++/resources/js/d3.v3.min.js.tmp | 1 + goaccess++/resources/js/hogan.min.js | 5 + goaccess++/resources/js/hogan.min.js.tmp | 1 + goaccess++/resources/tpls.html | 276 + goaccess++/resources/tpls.html.tmp | 1 + goaccess++/src/.deps/.dirstamp | 0 goaccess++/src/.deps/base64.Po | 151 + goaccess++/src/.deps/bin2c.Po | 185 + goaccess++/src/.deps/browsers.Po | 250 + goaccess++/src/.deps/color.Po | 253 + goaccess++/src/.deps/commons.Po | 264 + goaccess++/src/.deps/csv.Po | 344 + goaccess++/src/.deps/error.Po | 313 + goaccess++/src/.deps/gdashboard.Po | 312 + goaccess++/src/.deps/gdns.Po | 414 + goaccess++/src/.deps/geoip1.Po | 304 + goaccess++/src/.deps/geoip2.Po | 1 + goaccess++/src/.deps/gholder.Po | 348 + goaccess++/src/.deps/gkhash.Po | 280 + goaccess++/src/.deps/gmenu.Po | 264 + goaccess++/src/.deps/goaccess.Po | 497 + goaccess++/src/.deps/gslist.Po | 191 + goaccess++/src/.deps/gstorage.Po | 260 + goaccess++/src/.deps/gwsocket.Po | 469 + goaccess++/src/.deps/json.Po | 406 + goaccess++/src/.deps/opesys.Po | 238 + goaccess++/src/.deps/options.Po | 336 + goaccess++/src/.deps/output.Po | 398 + goaccess++/src/.deps/parser.Po | 375 + goaccess++/src/.deps/settings.Po | 283 + goaccess++/src/.deps/sha1.Po | 171 + goaccess++/src/.deps/sort.Po | 257 + goaccess++/src/.deps/tcabdb.Po | 1 + goaccess++/src/.deps/tcbtdb.Po | 1 + goaccess++/src/.deps/ui.Po | 348 + goaccess++/src/.deps/util.Po | 310 + goaccess++/src/.deps/websocket.Po | 412 + goaccess++/src/.deps/xmalloc.Po | 230 + goaccess++/src/.dirstamp | 0 goaccess++/src/appcss.h | 1512 ++ goaccess++/src/appjs.h | 3613 ++++ goaccess++/src/base64.c | 80 + goaccess++/src/base64.h | 37 + goaccess++/src/base64.o | Bin 0 -> 2040 bytes goaccess++/src/bin2c.c | 117 + goaccess++/src/bin2c.o | Bin 0 -> 4224 bytes goaccess++/src/bootstrapcss.h | 4696 ++++++ goaccess++/src/browsers.c | 522 + goaccess++/src/browsers.h | 49 + goaccess++/src/browsers.o | Bin 0 -> 24128 bytes goaccess++/src/chartsjs.h | 1861 +++ goaccess++/src/color.c | 840 + goaccess++/src/color.h | 113 + goaccess++/src/color.o | Bin 0 -> 31096 bytes goaccess++/src/commons.c | 504 + goaccess++/src/commons.h | 272 + goaccess++/src/commons.o | Bin 0 -> 13024 bytes goaccess++/src/config.h | 325 + goaccess++/src/config.h.in | 324 + goaccess++/src/csv.c | 327 + goaccess++/src/csv.h | 43 + goaccess++/src/csv.o | Bin 0 -> 12168 bytes goaccess++/src/d3js.h | 13744 ++++++++++++++++ goaccess++/src/error.c | 237 + goaccess++/src/error.h | 94 + goaccess++/src/error.o | Bin 0 -> 8208 bytes goaccess++/src/facss.h | 1683 ++ goaccess++/src/gdashboard.c | 1510 ++ goaccess++/src/gdashboard.h | 142 + goaccess++/src/gdashboard.o | Bin 0 -> 27808 bytes goaccess++/src/gdns.c | 296 + goaccess++/src/gdns.h | 70 + goaccess++/src/gdns.o | Bin 0 -> 10968 bytes goaccess++/src/geoip1.c | 439 + goaccess++/src/geoip1.h | 58 + goaccess++/src/geoip1.o | Bin 0 -> 12288 bytes goaccess++/src/geoip2.c | 297 + goaccess++/src/gholder.c | 673 + goaccess++/src/gholder.h | 49 + goaccess++/src/gholder.o | Bin 0 -> 11832 bytes goaccess++/src/gkhash.c | 1610 ++ goaccess++/src/gkhash.h | 250 + goaccess++/src/gkhash.o | Bin 0 -> 38520 bytes goaccess++/src/gmenu.c | 150 + goaccess++/src/gmenu.h | 87 + goaccess++/src/gmenu.o | Bin 0 -> 3568 bytes goaccess++/src/goaccess.c | 1537 ++ goaccess++/src/goaccess.h | 40 + goaccess++/src/goaccess.o | Bin 0 -> 66416 bytes goaccess++/src/gslist.c | 166 + goaccess++/src/gslist.h | 51 + goaccess++/src/gslist.o | Bin 0 -> 2992 bytes goaccess++/src/gstorage.c | 140 + goaccess++/src/gstorage.h | 68 + goaccess++/src/gstorage.o | Bin 0 -> 3136 bytes goaccess++/src/gwsocket.c | 410 + goaccess++/src/gwsocket.h | 74 + goaccess++/src/gwsocket.o | Bin 0 -> 17272 bytes goaccess++/src/hoganjs.h | 782 + goaccess++/src/json.c | 1251 ++ goaccess++/src/json.h | 65 + goaccess++/src/json.o | Bin 0 -> 34256 bytes goaccess++/src/khash.h | 675 + goaccess++/src/labels.h | 497 + goaccess++/src/opesys.c | 398 + goaccess++/src/opesys.h | 44 + goaccess++/src/opesys.o | Bin 0 -> 17184 bytes goaccess++/src/options.c | 839 + goaccess++/src/options.h | 38 + goaccess++/src/options.o | Bin 0 -> 33032 bytes goaccess++/src/output.c | 1240 ++ goaccess++/src/output.h | 99 + goaccess++/src/output.o | Bin 0 -> 361872 bytes goaccess++/src/parser.c | 2804 ++++ goaccess++/src/parser.h | 185 + goaccess++/src/parser.o | Bin 0 -> 48848 bytes goaccess++/src/settings.c | 787 + goaccess++/src/settings.h | 237 + goaccess++/src/settings.o | Bin 0 -> 23984 bytes goaccess++/src/sha1.c | 235 + goaccess++/src/sha1.h | 20 + goaccess++/src/sha1.o | Bin 0 -> 7664 bytes goaccess++/src/sort.c | 572 + goaccess++/src/sort.h | 92 + goaccess++/src/sort.o | Bin 0 -> 10976 bytes goaccess++/src/stamp-h1 | 1 + goaccess++/src/tcabdb.c | 1716 ++ goaccess++/src/tcabdb.h | 226 + goaccess++/src/tcbtdb.c | 333 + goaccess++/src/tcbtdb.h | 91 + goaccess++/src/tpls.h | 941 ++ goaccess++/src/ui.c | 1965 +++ goaccess++/src/ui.h | 257 + goaccess++/src/ui.o | Bin 0 -> 62104 bytes goaccess++/src/util.c | 1006 ++ goaccess++/src/util.h | 97 + goaccess++/src/util.o | Bin 0 -> 28440 bytes goaccess++/src/websocket.c | 3018 ++++ goaccess++/src/websocket.h | 341 + goaccess++/src/websocket.o | Bin 0 -> 48424 bytes goaccess++/src/xmalloc.c | 88 + goaccess++/src/xmalloc.h | 38 + goaccess++/src/xmalloc.o | Bin 0 -> 6432 bytes 215 files changed, 110125 insertions(+) create mode 100644 goaccess++/ABOUT-NLS create mode 100644 goaccess++/AUTHORS create mode 100644 goaccess++/COPYING create mode 100644 goaccess++/ChangeLog create mode 100644 goaccess++/INSTALL create mode 100644 goaccess++/Makefile create mode 100644 goaccess++/Makefile.am create mode 100644 goaccess++/Makefile.in create mode 100644 goaccess++/NEWS create mode 100644 goaccess++/README create mode 100644 goaccess++/TODO create mode 100644 goaccess++/aclocal.m4 create mode 100644 goaccess++/bin2c create mode 100644 goaccess++/compile create mode 100644 goaccess++/config.guess create mode 100644 goaccess++/config.log create mode 100644 goaccess++/config.rpath create mode 100644 goaccess++/config.status create mode 100644 goaccess++/config.sub create mode 100644 goaccess++/config/browsers.list create mode 100644 goaccess++/config/goaccess.conf create mode 100644 goaccess++/configure create mode 100644 goaccess++/configure.ac create mode 100644 goaccess++/depcomp create mode 100644 goaccess++/goaccess create mode 100644 goaccess++/goaccess.1 create mode 100644 goaccess++/install-sh create mode 100644 goaccess++/m4/gettext.m4 create mode 100644 goaccess++/m4/iconv.m4 create mode 100644 goaccess++/m4/intlmacosx.m4 create mode 100644 goaccess++/m4/lib-ld.m4 create mode 100644 goaccess++/m4/lib-link.m4 create mode 100644 goaccess++/m4/lib-prefix.m4 create mode 100644 goaccess++/m4/nls.m4 create mode 100644 goaccess++/m4/po.m4 create mode 100644 goaccess++/m4/progtest.m4 create mode 100644 goaccess++/missing create mode 100644 goaccess++/po/LINGUAS create mode 100644 goaccess++/po/Makefile create mode 100644 goaccess++/po/Makefile.in create mode 100644 goaccess++/po/Makefile.in.in create mode 100644 goaccess++/po/Makevars create mode 100644 goaccess++/po/POTFILES create mode 100644 goaccess++/po/POTFILES.in create mode 100644 goaccess++/po/Rules-quot create mode 100644 goaccess++/po/boldquot.sed create mode 100644 goaccess++/po/en@boldquot.header create mode 100644 goaccess++/po/en@quot.header create mode 100644 goaccess++/po/es.gmo create mode 100644 goaccess++/po/es.po create mode 100644 goaccess++/po/fr.gmo create mode 100644 goaccess++/po/fr.po create mode 100644 goaccess++/po/goaccess.pot create mode 100644 goaccess++/po/insert-header.sin create mode 100644 goaccess++/po/ja.gmo create mode 100644 goaccess++/po/ja.po create mode 100644 goaccess++/po/quot.sed create mode 100644 goaccess++/po/remove-potcdate.sin create mode 100644 goaccess++/po/stamp-po create mode 100644 goaccess++/po/zh_CN.gmo create mode 100644 goaccess++/po/zh_CN.po create mode 100644 goaccess++/resources/css/app.css create mode 100644 goaccess++/resources/css/app.css.tmp create mode 100644 goaccess++/resources/css/bootstrap.min.css create mode 100644 goaccess++/resources/css/bootstrap.min.css.tmp create mode 100644 goaccess++/resources/css/fa.min.css create mode 100644 goaccess++/resources/css/fa.min.css.tmp create mode 100644 goaccess++/resources/js/app.js create mode 100644 goaccess++/resources/js/app.js.tmp create mode 100644 goaccess++/resources/js/charts.js create mode 100644 goaccess++/resources/js/charts.js.tmp create mode 100644 goaccess++/resources/js/d3.v3.min.js create mode 100644 goaccess++/resources/js/d3.v3.min.js.tmp create mode 100644 goaccess++/resources/js/hogan.min.js create mode 100644 goaccess++/resources/js/hogan.min.js.tmp create mode 100644 goaccess++/resources/tpls.html create mode 100644 goaccess++/resources/tpls.html.tmp create mode 100644 goaccess++/src/.deps/.dirstamp create mode 100644 goaccess++/src/.deps/base64.Po create mode 100644 goaccess++/src/.deps/bin2c.Po create mode 100644 goaccess++/src/.deps/browsers.Po create mode 100644 goaccess++/src/.deps/color.Po create mode 100644 goaccess++/src/.deps/commons.Po create mode 100644 goaccess++/src/.deps/csv.Po create mode 100644 goaccess++/src/.deps/error.Po create mode 100644 goaccess++/src/.deps/gdashboard.Po create mode 100644 goaccess++/src/.deps/gdns.Po create mode 100644 goaccess++/src/.deps/geoip1.Po create mode 100644 goaccess++/src/.deps/geoip2.Po create mode 100644 goaccess++/src/.deps/gholder.Po create mode 100644 goaccess++/src/.deps/gkhash.Po create mode 100644 goaccess++/src/.deps/gmenu.Po create mode 100644 goaccess++/src/.deps/goaccess.Po create mode 100644 goaccess++/src/.deps/gslist.Po create mode 100644 goaccess++/src/.deps/gstorage.Po create mode 100644 goaccess++/src/.deps/gwsocket.Po create mode 100644 goaccess++/src/.deps/json.Po create mode 100644 goaccess++/src/.deps/opesys.Po create mode 100644 goaccess++/src/.deps/options.Po create mode 100644 goaccess++/src/.deps/output.Po create mode 100644 goaccess++/src/.deps/parser.Po create mode 100644 goaccess++/src/.deps/settings.Po create mode 100644 goaccess++/src/.deps/sha1.Po create mode 100644 goaccess++/src/.deps/sort.Po create mode 100644 goaccess++/src/.deps/tcabdb.Po create mode 100644 goaccess++/src/.deps/tcbtdb.Po create mode 100644 goaccess++/src/.deps/ui.Po create mode 100644 goaccess++/src/.deps/util.Po create mode 100644 goaccess++/src/.deps/websocket.Po create mode 100644 goaccess++/src/.deps/xmalloc.Po create mode 100644 goaccess++/src/.dirstamp create mode 100644 goaccess++/src/appcss.h create mode 100644 goaccess++/src/appjs.h create mode 100644 goaccess++/src/base64.c create mode 100644 goaccess++/src/base64.h create mode 100644 goaccess++/src/base64.o create mode 100644 goaccess++/src/bin2c.c create mode 100644 goaccess++/src/bin2c.o create mode 100644 goaccess++/src/bootstrapcss.h create mode 100644 goaccess++/src/browsers.c create mode 100644 goaccess++/src/browsers.h create mode 100644 goaccess++/src/browsers.o create mode 100644 goaccess++/src/chartsjs.h create mode 100644 goaccess++/src/color.c create mode 100644 goaccess++/src/color.h create mode 100644 goaccess++/src/color.o create mode 100644 goaccess++/src/commons.c create mode 100644 goaccess++/src/commons.h create mode 100644 goaccess++/src/commons.o create mode 100644 goaccess++/src/config.h create mode 100644 goaccess++/src/config.h.in create mode 100644 goaccess++/src/csv.c create mode 100644 goaccess++/src/csv.h create mode 100644 goaccess++/src/csv.o create mode 100644 goaccess++/src/d3js.h create mode 100644 goaccess++/src/error.c create mode 100644 goaccess++/src/error.h create mode 100644 goaccess++/src/error.o create mode 100644 goaccess++/src/facss.h create mode 100644 goaccess++/src/gdashboard.c create mode 100644 goaccess++/src/gdashboard.h create mode 100644 goaccess++/src/gdashboard.o create mode 100644 goaccess++/src/gdns.c create mode 100644 goaccess++/src/gdns.h create mode 100644 goaccess++/src/gdns.o create mode 100644 goaccess++/src/geoip1.c create mode 100644 goaccess++/src/geoip1.h create mode 100644 goaccess++/src/geoip1.o create mode 100644 goaccess++/src/geoip2.c create mode 100644 goaccess++/src/gholder.c create mode 100644 goaccess++/src/gholder.h create mode 100644 goaccess++/src/gholder.o create mode 100644 goaccess++/src/gkhash.c create mode 100644 goaccess++/src/gkhash.h create mode 100644 goaccess++/src/gkhash.o create mode 100644 goaccess++/src/gmenu.c create mode 100644 goaccess++/src/gmenu.h create mode 100644 goaccess++/src/gmenu.o create mode 100644 goaccess++/src/goaccess.c create mode 100644 goaccess++/src/goaccess.h create mode 100644 goaccess++/src/goaccess.o create mode 100644 goaccess++/src/gslist.c create mode 100644 goaccess++/src/gslist.h create mode 100644 goaccess++/src/gslist.o create mode 100644 goaccess++/src/gstorage.c create mode 100644 goaccess++/src/gstorage.h create mode 100644 goaccess++/src/gstorage.o create mode 100644 goaccess++/src/gwsocket.c create mode 100644 goaccess++/src/gwsocket.h create mode 100644 goaccess++/src/gwsocket.o create mode 100644 goaccess++/src/hoganjs.h create mode 100644 goaccess++/src/json.c create mode 100644 goaccess++/src/json.h create mode 100644 goaccess++/src/json.o create mode 100644 goaccess++/src/khash.h create mode 100644 goaccess++/src/labels.h create mode 100644 goaccess++/src/opesys.c create mode 100644 goaccess++/src/opesys.h create mode 100644 goaccess++/src/opesys.o create mode 100644 goaccess++/src/options.c create mode 100644 goaccess++/src/options.h create mode 100644 goaccess++/src/options.o create mode 100644 goaccess++/src/output.c create mode 100644 goaccess++/src/output.h create mode 100644 goaccess++/src/output.o create mode 100644 goaccess++/src/parser.c create mode 100644 goaccess++/src/parser.h create mode 100644 goaccess++/src/parser.o create mode 100644 goaccess++/src/settings.c create mode 100644 goaccess++/src/settings.h create mode 100644 goaccess++/src/settings.o create mode 100644 goaccess++/src/sha1.c create mode 100644 goaccess++/src/sha1.h create mode 100644 goaccess++/src/sha1.o create mode 100644 goaccess++/src/sort.c create mode 100644 goaccess++/src/sort.h create mode 100644 goaccess++/src/sort.o create mode 100644 goaccess++/src/stamp-h1 create mode 100644 goaccess++/src/tcabdb.c create mode 100644 goaccess++/src/tcabdb.h create mode 100644 goaccess++/src/tcbtdb.c create mode 100644 goaccess++/src/tcbtdb.h create mode 100644 goaccess++/src/tpls.h create mode 100644 goaccess++/src/ui.c create mode 100644 goaccess++/src/ui.h create mode 100644 goaccess++/src/ui.o create mode 100644 goaccess++/src/util.c create mode 100644 goaccess++/src/util.h create mode 100644 goaccess++/src/util.o create mode 100644 goaccess++/src/websocket.c create mode 100644 goaccess++/src/websocket.h create mode 100644 goaccess++/src/websocket.o create mode 100644 goaccess++/src/xmalloc.c create mode 100644 goaccess++/src/xmalloc.h create mode 100644 goaccess++/src/xmalloc.o diff --git a/goaccess++/ABOUT-NLS b/goaccess++/ABOUT-NLS new file mode 100644 index 0000000..4f50fb5 --- /dev/null +++ b/goaccess++/ABOUT-NLS @@ -0,0 +1,1327 @@ +1 Notes on the Free Translation Project +*************************************** + +Free software is going international! The Free Translation Project is +a way to get maintainers of free software, translators, and users all +together, so that free software will gradually become able to speak many +languages. A few packages already provide translations for their +messages. + + If you found this `ABOUT-NLS' file inside a distribution, you may +assume that the distributed package does use GNU `gettext' internally, +itself available at your nearest GNU archive site. But you do _not_ +need to install GNU `gettext' prior to configuring, installing or using +this package with messages translated. + + Installers will find here some useful hints. These notes also +explain how users should proceed for getting the programs to use the +available translations. They tell how people wanting to contribute and +work on translations can contact the appropriate team. + + When reporting bugs in the `intl/' directory or bugs which may be +related to internationalization, you should tell about the version of +`gettext' which is used. The information can be found in the +`intl/VERSION' file, in internationalized packages. + +1.1 Quick configuration advice +============================== + +If you want to exploit the full power of internationalization, you +should configure it using + + ./configure --with-included-gettext + +to force usage of internationalizing routines provided within this +package, despite the existence of internationalizing capabilities in the +operating system where this package is being installed. So far, only +the `gettext' implementation in the GNU C library version 2 provides as +many features (such as locale alias, message inheritance, automatic +charset conversion or plural form handling) as the implementation here. +It is also not possible to offer this additional functionality on top +of a `catgets' implementation. Future versions of GNU `gettext' will +very likely convey even more functionality. So it might be a good idea +to change to GNU `gettext' as soon as possible. + + So you need _not_ provide this option if you are using GNU libc 2 or +you have installed a recent copy of the GNU gettext package with the +included `libintl'. + +1.2 INSTALL Matters +=================== + +Some packages are "localizable" when properly installed; the programs +they contain can be made to speak your own native language. Most such +packages use GNU `gettext'. Other packages have their own ways to +internationalization, predating GNU `gettext'. + + By default, this package will be installed to allow translation of +messages. It will automatically detect whether the system already +provides the GNU `gettext' functions. If not, the included GNU +`gettext' library will be used. This library is wholly contained +within this package, usually in the `intl/' subdirectory, so prior +installation of the GNU `gettext' package is _not_ required. +Installers may use special options at configuration time for changing +the default behaviour. The commands: + + ./configure --with-included-gettext + ./configure --disable-nls + +will, respectively, bypass any pre-existing `gettext' to use the +internationalizing routines provided within this package, or else, +_totally_ disable translation of messages. + + When you already have GNU `gettext' installed on your system and run +configure without an option for your new package, `configure' will +probably detect the previously built and installed `libintl.a' file and +will decide to use this. This might not be desirable. You should use +the more recent version of the GNU `gettext' library. I.e. if the file +`intl/VERSION' shows that the library which comes with this package is +more recent, you should use + + ./configure --with-included-gettext + +to prevent auto-detection. + + The configuration process will not test for the `catgets' function +and therefore it will not be used. The reason is that even an +emulation of `gettext' on top of `catgets' could not provide all the +extensions of the GNU `gettext' library. + + Internationalized packages usually have many `po/LL.po' files, where +LL gives an ISO 639 two-letter code identifying the language. Unless +translations have been forbidden at `configure' time by using the +`--disable-nls' switch, all available translations are installed +together with the package. However, the environment variable `LINGUAS' +may be set, prior to configuration, to limit the installed set. +`LINGUAS' should then contain a space separated list of two-letter +codes, stating which languages are allowed. + +1.3 Using This Package +====================== + +As a user, if your language has been installed for this package, you +only have to set the `LANG' environment variable to the appropriate +`LL_CC' combination. If you happen to have the `LC_ALL' or some other +`LC_xxx' environment variables set, you should unset them before +setting `LANG', otherwise the setting of `LANG' will not have the +desired effect. Here `LL' is an ISO 639 two-letter language code, and +`CC' is an ISO 3166 two-letter country code. For example, let's +suppose that you speak German and live in Germany. At the shell +prompt, merely execute `setenv LANG de_DE' (in `csh'), +`export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash'). +This can be done from your `.login' or `.profile' file, once and for +all. + + You might think that the country code specification is redundant. +But in fact, some languages have dialects in different countries. For +example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The +country code serves to distinguish the dialects. + + The locale naming convention of `LL_CC', with `LL' denoting the +language and `CC' denoting the country, is the one use on systems based +on GNU libc. On other systems, some variations of this scheme are +used, such as `LL' or `LL_CC.ENCODING'. You can get the list of +locales supported by your system for your language by running the +command `locale -a | grep '^LL''. + + Not all programs have translations for all languages. By default, an +English message is shown in place of a nonexistent translation. If you +understand other languages, you can set up a priority list of languages. +This is done through a different environment variable, called +`LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG' +for the purpose of message handling, but you still need to have `LANG' +set to the primary language; this is required by other parts of the +system libraries. For example, some Swedish users who would rather +read translations in German than English for when Swedish is not +available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'. + + Special advice for Norwegian users: The language code for Norwegian +bokma*l changed from `no' to `nb' recently (in 2003). During the +transition period, while some message catalogs for this language are +installed under `nb' and some older ones under `no', it's recommended +for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and +older translations are used. + + In the `LANGUAGE' environment variable, but not in the `LANG' +environment variable, `LL_CC' combinations can be abbreviated as `LL' +to denote the language's main dialect. For example, `de' is equivalent +to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT' +(Portuguese as spoken in Portugal) in this context. + +1.4 Translating Teams +===================== + +For the Free Translation Project to be a success, we need interested +people who like their own language and write it well, and who are also +able to synergize with other translators speaking the same language. +Each translation team has its own mailing list. The up-to-date list of +teams can be found at the Free Translation Project's homepage, +`http://translationproject.org/', in the "Teams" area. + + If you'd like to volunteer to _work_ at translating messages, you +should become a member of the translating team for your own language. +The subscribing address is _not_ the same as the list itself, it has +`-request' appended. For example, speakers of Swedish can send a +message to `sv-request@li.org', having this message body: + + subscribe + + Keep in mind that team members are expected to participate +_actively_ in translations, or at solving translational difficulties, +rather than merely lurking around. If your team does not exist yet and +you want to start one, or if you are unsure about what to do or how to +get started, please write to `coordinator@translationproject.org' to +reach the coordinator for all translator teams. + + The English team is special. It works at improving and uniformizing +the terminology in use. Proven linguistic skills are praised more than +programming skills, here. + +1.5 Available Packages +====================== + +Languages are not equally supported in all packages. The following +matrix shows the current state of internationalization, as of May 2010. +The matrix shows, in regard of each package, for which languages PO +files have been submitted to translation coordination, with a +translation percentage of at least 50%. + + Ready PO files af am ar as ast az be be@latin bg bn_IN bs ca crh + +---------------------------------------------------+ + a2ps | [] [] | + aegis | | + ant-phone | | + anubis | | + aspell | [] [] | + bash | | + bfd | | + bibshelf | [] | + binutils | | + bison | | + bison-runtime | [] | + bluez-pin | [] [] | + bombono-dvd | | + buzztard | | + cflow | | + clisp | | + coreutils | [] [] | + cpio | | + cppi | | + cpplib | [] | + cryptsetup | | + dfarc | | + dialog | [] [] | + dico | | + diffutils | [] | + dink | | + doodle | | + e2fsprogs | [] | + enscript | [] | + exif | | + fetchmail | [] | + findutils | [] | + flex | [] | + freedink | | + gas | | + gawk | [] [] | + gcal | [] | + gcc | | + gettext-examples | [] [] [] [] | + gettext-runtime | [] [] [] | + gettext-tools | [] [] | + gip | [] | + gjay | | + gliv | [] | + glunarclock | [] [] | + gnubiff | | + gnucash | [] | + gnuedu | | + gnulib | | + gnunet | | + gnunet-gtk | | + gnutls | | + gold | | + gpe-aerial | | + gpe-beam | | + gpe-bluetooth | | + gpe-calendar | | + gpe-clock | [] | + gpe-conf | | + gpe-contacts | | + gpe-edit | | + gpe-filemanager | | + gpe-go | | + gpe-login | | + gpe-ownerinfo | [] | + gpe-package | | + gpe-sketchbook | | + gpe-su | [] | + gpe-taskmanager | [] | + gpe-timesheet | [] | + gpe-today | [] | + gpe-todo | | + gphoto2 | | + gprof | [] | + gpsdrive | | + gramadoir | | + grep | | + grub | [] [] | + gsasl | | + gss | | + gst-plugins-bad | [] | + gst-plugins-base | [] | + gst-plugins-good | [] | + gst-plugins-ugly | [] | + gstreamer | [] [] [] | + gtick | | + gtkam | [] | + gtkorphan | [] | + gtkspell | [] [] [] | + gutenprint | | + hello | [] | + help2man | | + hylafax | | + idutils | | + indent | [] [] | + iso_15924 | | + iso_3166 | [] [] [] [] [] [] [] [] | + iso_3166_2 | | + iso_4217 | | + iso_639 | [] [] [] [] [] | + iso_639_3 | [] | + jwhois | | + kbd | | + keytouch | [] | + keytouch-editor | | + keytouch-keyboa... | [] | + klavaro | [] | + latrine | | + ld | [] | + leafpad | [] [] | + libc | [] [] | + libexif | () | + libextractor | | + libgnutls | | + libgpewidget | | + libgpg-error | | + libgphoto2 | | + libgphoto2_port | | + libgsasl | | + libiconv | [] | + libidn | | + lifelines | | + liferea | [] [] | + lilypond | | + linkdr | [] | + lordsawar | | + lprng | | + lynx | [] | + m4 | | + mailfromd | | + mailutils | | + make | | + man-db | | + man-db-manpages | | + minicom | | + mkisofs | | + myserver | | + nano | [] [] | + opcodes | | + parted | | + pies | | + popt | | + psmisc | | + pspp | [] | + pwdutils | | + radius | [] | + recode | [] [] | + rosegarden | | + rpm | | + rush | | + sarg | | + screem | | + scrollkeeper | [] [] [] | + sed | [] [] | + sharutils | [] [] | + shishi | | + skencil | | + solfege | | + solfege-manual | | + soundtracker | | + sp | | + sysstat | | + tar | [] | + texinfo | | + tin | | + unicode-han-tra... | | + unicode-transla... | | + util-linux-ng | [] | + vice | | + vmm | | + vorbis-tools | | + wastesedge | | + wdiff | | + wget | [] [] | + wyslij-po | | + xchat | [] [] [] [] | + xdg-user-dirs | [] [] [] [] [] [] [] [] [] | + xkeyboard-config | [] [] [] | + +---------------------------------------------------+ + af am ar as ast az be be@latin bg bn_IN bs ca crh + 6 0 2 3 19 1 11 3 28 3 1 38 5 + + cs da de el en en_GB en_ZA eo es et eu fa fi + +-------------------------------------------------+ + a2ps | [] [] [] [] [] [] [] [] | + aegis | [] [] [] | + ant-phone | [] () | + anubis | [] [] [] | + aspell | [] [] [] [] [] | + bash | [] [] [] [] | + bfd | [] [] | + bibshelf | [] [] [] [] | + binutils | [] [] | + bison | [] [] [] | + bison-runtime | [] [] [] [] [] | + bluez-pin | [] [] [] [] [] [] [] | + bombono-dvd | [] [] | + buzztard | [] [] [] | + cflow | [] [] [] | + clisp | [] [] [] [] | + coreutils | [] [] [] [] | + cpio | [] | + cppi | [] | + cpplib | [] [] [] | + cryptsetup | [] | + dfarc | [] [] [] [] | + dialog | [] [] [] [] [] | + dico | | + diffutils | [] [] [] [] [] [] [] | + dink | [] [] [] | + doodle | [] | + e2fsprogs | [] [] [] | + enscript | [] [] [] | + exif | () [] [] [] | + fetchmail | [] [] () [] [] [] | + findutils | [] [] [] [] | + flex | [] [] [] | + freedink | [] [] [] [] | + gas | [] | + gawk | [] [] [] | + gcal | [] | + gcc | [] [] | + gettext-examples | [] [] [] [] [] | + gettext-runtime | [] [] [] [] [] | + gettext-tools | [] [] [] | + gip | [] [] [] [] [] | + gjay | [] [] | + gliv | [] [] [] [] | + glunarclock | [] [] [] | + gnubiff | () | + gnucash | [] () () () () () | + gnuedu | [] [] | + gnulib | [] [] [] | + gnunet | | + gnunet-gtk | [] | + gnutls | [] [] | + gold | [] [] | + gpe-aerial | [] [] [] [] [] | + gpe-beam | [] [] [] [] [] | + gpe-bluetooth | [] [] [] | + gpe-calendar | [] [] | + gpe-clock | [] [] [] [] [] | + gpe-conf | [] [] [] [] | + gpe-contacts | [] [] [] [] | + gpe-edit | [] [] [] | + gpe-filemanager | [] [] [] [] | + gpe-go | [] [] [] [] [] | + gpe-login | [] [] [] | + gpe-ownerinfo | [] [] [] [] [] | + gpe-package | [] [] [] [] | + gpe-sketchbook | [] [] [] [] [] | + gpe-su | [] [] [] [] [] | + gpe-taskmanager | [] [] [] [] [] | + gpe-timesheet | [] [] [] [] [] | + gpe-today | [] [] [] [] [] | + gpe-todo | [] [] [] [] | + gphoto2 | [] [] () [] [] [] [] | + gprof | [] [] [] [] | + gpsdrive | [] [] [] | + gramadoir | [] [] [] | + grep | [] [] | + grub | [] [] [] | + gsasl | [] [] | + gss | [] | + gst-plugins-bad | [] [] [] [] [] [] | + gst-plugins-base | [] [] [] [] [] [] | + gst-plugins-good | [] [] [] [] [] [] [] | + gst-plugins-ugly | [] [] [] [] [] [] [] | + gstreamer | [] [] [] [] [] [] | + gtick | [] () [] [] | + gtkam | [] [] () [] [] | + gtkorphan | [] [] [] [] | + gtkspell | [] [] [] [] [] [] [] [] | + gutenprint | [] [] [] [] | + hello | [] [] [] [] [] | + help2man | [] [] | + hylafax | [] [] | + idutils | [] [] [] | + indent | [] [] [] [] [] [] [] [] | + iso_15924 | [] () [] [] [] | + iso_3166 | [] [] [] () [] [] [] () [] | + iso_3166_2 | () | + iso_4217 | [] [] [] () [] [] [] | + iso_639 | [] [] [] () [] [] [] | + iso_639_3 | | + jwhois | [] [] | + kbd | [] [] [] [] [] | + keytouch | [] [] [] | + keytouch-editor | [] [] [] | + keytouch-keyboa... | [] [] | + klavaro | [] [] [] [] | + latrine | [] () [] | + ld | [] [] [] | + leafpad | [] [] [] [] [] [] [] | + libc | [] [] [] [] [] | + libexif | [] [] () | + libextractor | | + libgnutls | [] | + libgpewidget | [] [] [] | + libgpg-error | [] [] | + libgphoto2 | [] () | + libgphoto2_port | [] () [] | + libgsasl | [] | + libiconv | [] [] [] [] [] [] | + libidn | [] [] [] [] | + lifelines | [] () | + liferea | [] [] [] [] [] | + lilypond | [] [] [] [] | + linkdr | [] [] [] [] | + lordsawar | [] | + lprng | | + lynx | [] [] [] [] | + m4 | [] [] [] [] [] | + mailfromd | | + mailutils | [] | + make | [] [] [] [] | + man-db | | + man-db-manpages | | + minicom | [] [] [] [] [] | + mkisofs | [] | + myserver | | + nano | [] [] [] [] | + opcodes | [] [] [] | + parted | [] [] | + pies | | + popt | [] [] [] [] [] [] | + psmisc | [] [] [] [] | + pspp | [] | + pwdutils | [] | + radius | [] | + recode | [] [] [] [] [] [] [] | + rosegarden | () () () () | + rpm | [] [] [] | + rush | | + sarg | | + screem | | + scrollkeeper | [] [] [] [] [] [] | + sed | [] [] [] [] [] [] [] | + sharutils | [] [] [] [] [] | + shishi | | + skencil | [] () [] | + solfege | [] [] [] [] | + solfege-manual | [] [] | + soundtracker | [] [] [] | + sp | [] | + sysstat | [] [] [] [] | + tar | [] [] [] [] [] | + texinfo | [] [] [] | + tin | [] [] | + unicode-han-tra... | | + unicode-transla... | | + util-linux-ng | [] [] [] [] [] | + vice | () () | + vmm | [] | + vorbis-tools | [] [] | + wastesedge | [] | + wdiff | [] [] [] | + wget | [] [] [] [] | + wyslij-po | [] | + xchat | [] [] [] [] [] [] | + xdg-user-dirs | [] [] [] [] [] [] [] [] [] | + xkeyboard-config | [] [] [] [] [] [] | + +-------------------------------------------------+ + cs da de el en en_GB en_ZA eo es et eu fa fi + 64 105 117 18 1 8 0 28 89 18 19 0 104 + + fr ga gl gu he hi hr hu hy id is it ja ka kn + +------------------------------------------------+ + a2ps | [] [] [] | + aegis | [] [] | + ant-phone | [] [] | + anubis | [] [] [] | + aspell | [] [] [] [] | + bash | [] [] [] | + bfd | [] [] | + bibshelf | [] [] [] [] | + binutils | [] [] | + bison | [] [] [] | + bison-runtime | [] [] [] [] [] | + bluez-pin | [] [] [] [] [] [] [] | + bombono-dvd | | + buzztard | [] | + cflow | [] [] | + clisp | [] | + coreutils | [] [] [] [] [] | + cpio | [] [] [] | + cppi | [] | + cpplib | [] [] | + cryptsetup | [] [] [] | + dfarc | [] [] | + dialog | [] [] [] [] [] [] [] | + dico | | + diffutils | [] [] [] [] [] [] [] [] | + dink | [] | + doodle | [] [] | + e2fsprogs | [] [] | + enscript | [] [] [] [] | + exif | [] [] [] [] [] | + fetchmail | [] [] [] [] | + findutils | [] [] [] [] [] | + flex | [] [] | + freedink | [] [] | + gas | [] [] | + gawk | [] [] [] [] () [] | + gcal | [] | + gcc | [] | + gettext-examples | [] [] [] [] [] [] | + gettext-runtime | [] [] [] [] [] | + gettext-tools | [] [] [] [] | + gip | [] [] [] [] [] | + gjay | | + gliv | () | + glunarclock | [] [] [] | + gnubiff | () [] () | + gnucash | () () () () [] | + gnuedu | [] [] | + gnulib | [] [] [] [] [] | + gnunet | | + gnunet-gtk | [] | + gnutls | [] [] | + gold | [] | + gpe-aerial | [] [] | + gpe-beam | [] [] [] | + gpe-bluetooth | [] [] [] | + gpe-calendar | [] | + gpe-clock | [] [] [] [] | + gpe-conf | [] [] [] | + gpe-contacts | [] [] [] | + gpe-edit | [] [] | + gpe-filemanager | [] [] [] | + gpe-go | [] [] [] [] | + gpe-login | [] [] | + gpe-ownerinfo | [] [] [] [] | + gpe-package | [] [] | + gpe-sketchbook | [] [] [] | + gpe-su | [] [] [] [] [] | + gpe-taskmanager | [] [] [] [] | + gpe-timesheet | [] [] [] [] | + gpe-today | [] [] [] [] [] [] | + gpe-todo | [] [] | + gphoto2 | [] [] [] [] [] | + gprof | [] [] [] | + gpsdrive | [] [] [] | + gramadoir | [] [] [] | + grep | [] | + grub | [] [] [] | + gsasl | [] [] [] [] | + gss | [] [] [] [] | + gst-plugins-bad | [] [] [] [] | + gst-plugins-base | [] [] [] [] [] | + gst-plugins-good | [] [] [] [] [] | + gst-plugins-ugly | [] [] [] [] [] | + gstreamer | [] [] [] [] | + gtick | [] [] [] [] | + gtkam | [] [] [] [] [] | + gtkorphan | [] [] [] | + gtkspell | [] [] [] [] [] [] [] [] | + gutenprint | [] [] [] | + hello | [] [] | + help2man | [] | + hylafax | [] | + idutils | [] [] [] [] [] | + indent | [] [] [] [] [] [] [] | + iso_15924 | () [] [] | + iso_3166 | () [] [] [] [] [] [] [] [] [] [] | + iso_3166_2 | () [] [] [] | + iso_4217 | () [] [] [] [] | + iso_639 | () [] [] [] [] [] [] [] | + iso_639_3 | () [] [] | + jwhois | [] [] [] [] | + kbd | [] [] | + keytouch | [] [] [] [] [] | + keytouch-editor | [] [] [] [] | + keytouch-keyboa... | [] [] [] [] | + klavaro | [] [] | + latrine | [] [] | + ld | [] [] [] | + leafpad | [] [] [] [] [] [] () | + libc | [] [] [] [] | + libexif | | + libextractor | | + libgnutls | [] [] | + libgpewidget | [] [] [] | + libgpg-error | [] [] | + libgphoto2 | [] [] [] | + libgphoto2_port | [] [] [] | + libgsasl | [] [] [] [] | + libiconv | [] [] [] [] [] | + libidn | [] [] [] | + lifelines | () | + liferea | [] [] [] [] | + lilypond | [] | + linkdr | [] [] [] [] | + lordsawar | | + lprng | [] | + lynx | [] [] [] [] [] | + m4 | [] [] [] [] [] | + mailfromd | | + mailutils | [] [] | + make | [] [] [] [] [] [] [] [] | + man-db | [] [] | + man-db-manpages | [] | + minicom | [] [] [] [] | + mkisofs | [] [] [] | + myserver | | + nano | [] [] [] [] [] | + opcodes | [] [] [] | + parted | [] [] [] [] | + pies | | + popt | [] [] [] [] [] [] [] [] | + psmisc | [] [] | + pspp | | + pwdutils | [] [] | + radius | [] [] | + recode | [] [] [] [] [] [] [] | + rosegarden | () () () () | + rpm | [] [] | + rush | | + sarg | [] | + screem | [] [] | + scrollkeeper | [] [] [] | + sed | [] [] [] [] [] [] [] | + sharutils | [] [] [] [] [] [] | + shishi | [] | + skencil | [] | + solfege | [] [] [] | + solfege-manual | [] [] | + soundtracker | [] [] | + sp | [] () | + sysstat | [] [] [] [] | + tar | [] [] [] [] [] [] | + texinfo | [] [] [] [] | + tin | [] | + unicode-han-tra... | | + unicode-transla... | [] [] | + util-linux-ng | [] [] [] [] [] | + vice | () () () | + vmm | [] | + vorbis-tools | [] | + wastesedge | () () | + wdiff | | + wget | [] [] [] [] [] [] [] | + wyslij-po | [] [] | + xchat | [] [] [] [] [] [] [] [] | + xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] [] | + xkeyboard-config | [] [] [] [] | + +------------------------------------------------+ + fr ga gl gu he hi hr hu hy id is it ja ka kn + 121 53 20 4 8 2 5 53 2 120 5 83 66 0 4 + + ko ku ky lg lt lv mk ml mn mr ms mt nb nds ne + +-----------------------------------------------+ + a2ps | [] | + aegis | | + ant-phone | | + anubis | [] [] | + aspell | [] | + bash | | + bfd | | + bibshelf | [] [] | + binutils | | + bison | [] | + bison-runtime | [] [] [] [] [] | + bluez-pin | [] [] [] [] [] | + bombono-dvd | | + buzztard | | + cflow | | + clisp | | + coreutils | [] | + cpio | | + cppi | | + cpplib | | + cryptsetup | | + dfarc | [] | + dialog | [] [] [] [] [] | + dico | | + diffutils | [] [] | + dink | | + doodle | | + e2fsprogs | | + enscript | | + exif | [] | + fetchmail | | + findutils | | + flex | | + freedink | [] | + gas | | + gawk | | + gcal | | + gcc | | + gettext-examples | [] [] [] [] | + gettext-runtime | [] | + gettext-tools | [] | + gip | [] [] | + gjay | | + gliv | | + glunarclock | [] | + gnubiff | | + gnucash | () () () () | + gnuedu | | + gnulib | | + gnunet | | + gnunet-gtk | | + gnutls | [] | + gold | | + gpe-aerial | [] | + gpe-beam | [] | + gpe-bluetooth | [] [] | + gpe-calendar | [] | + gpe-clock | [] [] [] [] [] | + gpe-conf | [] [] | + gpe-contacts | [] [] | + gpe-edit | [] | + gpe-filemanager | [] [] | + gpe-go | [] [] [] | + gpe-login | [] | + gpe-ownerinfo | [] [] | + gpe-package | [] [] | + gpe-sketchbook | [] [] | + gpe-su | [] [] [] [] [] [] | + gpe-taskmanager | [] [] [] [] [] [] | + gpe-timesheet | [] [] | + gpe-today | [] [] [] [] | + gpe-todo | [] [] | + gphoto2 | | + gprof | [] | + gpsdrive | | + gramadoir | | + grep | | + grub | | + gsasl | | + gss | | + gst-plugins-bad | [] [] | + gst-plugins-base | [] [] | + gst-plugins-good | [] [] | + gst-plugins-ugly | [] [] [] [] [] | + gstreamer | | + gtick | | + gtkam | [] | + gtkorphan | [] [] | + gtkspell | [] [] [] [] [] [] [] | + gutenprint | | + hello | [] [] [] | + help2man | | + hylafax | | + idutils | | + indent | | + iso_15924 | [] [] | + iso_3166 | [] [] () [] [] [] [] [] | + iso_3166_2 | | + iso_4217 | [] [] | + iso_639 | [] [] | + iso_639_3 | [] | + jwhois | [] | + kbd | | + keytouch | [] | + keytouch-editor | [] | + keytouch-keyboa... | [] | + klavaro | [] | + latrine | [] | + ld | | + leafpad | [] [] [] | + libc | [] | + libexif | | + libextractor | | + libgnutls | [] | + libgpewidget | [] [] | + libgpg-error | | + libgphoto2 | | + libgphoto2_port | | + libgsasl | | + libiconv | | + libidn | | + lifelines | | + liferea | | + lilypond | | + linkdr | | + lordsawar | | + lprng | | + lynx | | + m4 | | + mailfromd | | + mailutils | | + make | [] | + man-db | | + man-db-manpages | | + minicom | [] | + mkisofs | | + myserver | | + nano | [] [] | + opcodes | | + parted | | + pies | | + popt | [] [] [] | + psmisc | | + pspp | | + pwdutils | | + radius | | + recode | | + rosegarden | | + rpm | | + rush | | + sarg | | + screem | | + scrollkeeper | [] [] | + sed | | + sharutils | | + shishi | | + skencil | | + solfege | [] | + solfege-manual | | + soundtracker | | + sp | | + sysstat | [] | + tar | [] | + texinfo | [] | + tin | | + unicode-han-tra... | | + unicode-transla... | | + util-linux-ng | | + vice | | + vmm | | + vorbis-tools | | + wastesedge | | + wdiff | | + wget | [] | + wyslij-po | | + xchat | [] [] [] | + xdg-user-dirs | [] [] [] [] [] [] [] [] | + xkeyboard-config | [] [] [] | + +-----------------------------------------------+ + ko ku ky lg lt lv mk ml mn mr ms mt nb nds ne + 20 5 10 1 12 48 4 2 2 4 24 10 19 3 1 + + nl nn or pa pl ps pt pt_BR ro ru rw sk sl sq sr + +---------------------------------------------------+ + a2ps | [] [] [] [] [] [] [] [] | + aegis | [] [] [] | + ant-phone | [] [] | + anubis | [] [] [] | + aspell | [] [] [] [] [] | + bash | [] [] | + bfd | [] | + bibshelf | [] [] | + binutils | [] [] | + bison | [] [] [] | + bison-runtime | [] [] [] [] [] [] [] | + bluez-pin | [] [] [] [] [] [] [] [] | + bombono-dvd | [] () | + buzztard | [] [] | + cflow | [] | + clisp | [] [] | + coreutils | [] [] [] [] [] [] | + cpio | [] [] [] | + cppi | [] | + cpplib | [] | + cryptsetup | [] | + dfarc | [] | + dialog | [] [] [] [] | + dico | [] | + diffutils | [] [] [] [] [] [] | + dink | () | + doodle | [] [] | + e2fsprogs | [] [] | + enscript | [] [] [] [] [] | + exif | [] [] [] () [] | + fetchmail | [] [] [] [] | + findutils | [] [] [] [] [] | + flex | [] [] [] [] [] | + freedink | [] [] | + gas | | + gawk | [] [] [] [] | + gcal | | + gcc | [] | + gettext-examples | [] [] [] [] [] [] [] [] | + gettext-runtime | [] [] [] [] [] [] [] [] [] | + gettext-tools | [] [] [] [] [] [] | + gip | [] [] [] [] [] | + gjay | | + gliv | [] [] [] [] [] [] | + glunarclock | [] [] [] [] [] | + gnubiff | [] () | + gnucash | [] () () () | + gnuedu | [] | + gnulib | [] [] [] [] | + gnunet | | + gnunet-gtk | | + gnutls | [] [] | + gold | | + gpe-aerial | [] [] [] [] [] [] [] | + gpe-beam | [] [] [] [] [] [] [] | + gpe-bluetooth | [] [] | + gpe-calendar | [] [] [] [] | + gpe-clock | [] [] [] [] [] [] [] [] | + gpe-conf | [] [] [] [] [] [] [] | + gpe-contacts | [] [] [] [] [] | + gpe-edit | [] [] [] | + gpe-filemanager | [] [] [] | + gpe-go | [] [] [] [] [] [] [] [] | + gpe-login | [] [] | + gpe-ownerinfo | [] [] [] [] [] [] [] [] | + gpe-package | [] [] | + gpe-sketchbook | [] [] [] [] [] [] [] | + gpe-su | [] [] [] [] [] [] [] [] | + gpe-taskmanager | [] [] [] [] [] [] [] [] | + gpe-timesheet | [] [] [] [] [] [] [] [] | + gpe-today | [] [] [] [] [] [] [] [] | + gpe-todo | [] [] [] [] [] | + gphoto2 | [] [] [] [] [] [] [] [] | + gprof | [] [] [] | + gpsdrive | [] [] | + gramadoir | [] [] | + grep | [] [] [] [] | + grub | [] [] [] | + gsasl | [] [] [] [] | + gss | [] [] [] | + gst-plugins-bad | [] [] [] [] [] | + gst-plugins-base | [] [] [] [] [] | + gst-plugins-good | [] [] [] [] [] | + gst-plugins-ugly | [] [] [] [] [] [] | + gstreamer | [] [] [] [] [] | + gtick | [] [] [] | + gtkam | [] [] [] [] [] [] | + gtkorphan | [] | + gtkspell | [] [] [] [] [] [] [] [] [] [] | + gutenprint | [] [] | + hello | [] [] [] [] | + help2man | [] [] | + hylafax | [] | + idutils | [] [] [] [] [] | + indent | [] [] [] [] [] [] [] | + iso_15924 | [] [] [] [] | + iso_3166 | [] [] [] [] [] () [] [] [] [] [] [] [] [] | + iso_3166_2 | [] [] [] | + iso_4217 | [] [] [] [] [] [] [] [] | + iso_639 | [] [] [] [] [] [] [] [] [] | + iso_639_3 | [] [] | + jwhois | [] [] [] [] | + kbd | [] [] [] | + keytouch | [] [] [] | + keytouch-editor | [] [] [] | + keytouch-keyboa... | [] [] [] | + klavaro | [] [] | + latrine | [] [] | + ld | | + leafpad | [] [] [] [] [] [] [] [] [] | + libc | [] [] [] [] | + libexif | [] [] () [] | + libextractor | | + libgnutls | [] [] | + libgpewidget | [] [] [] | + libgpg-error | [] [] | + libgphoto2 | [] [] | + libgphoto2_port | [] [] [] [] | + libgsasl | [] [] [] [] [] | + libiconv | [] [] [] [] [] | + libidn | [] [] | + lifelines | [] [] | + liferea | [] [] [] [] [] () () [] | + lilypond | [] | + linkdr | [] [] [] | + lordsawar | | + lprng | [] | + lynx | [] [] [] | + m4 | [] [] [] [] [] | + mailfromd | [] | + mailutils | [] | + make | [] [] [] [] | + man-db | [] [] [] | + man-db-manpages | [] [] [] | + minicom | [] [] [] [] | + mkisofs | [] [] [] | + myserver | | + nano | [] [] [] [] | + opcodes | [] [] | + parted | [] [] [] [] | + pies | [] | + popt | [] [] [] [] | + psmisc | [] [] [] | + pspp | [] [] | + pwdutils | [] | + radius | [] [] [] | + recode | [] [] [] [] [] [] [] [] | + rosegarden | () () | + rpm | [] [] [] | + rush | [] [] | + sarg | | + screem | | + scrollkeeper | [] [] [] [] [] [] [] [] | + sed | [] [] [] [] [] [] [] [] [] | + sharutils | [] [] [] [] | + shishi | [] | + skencil | [] [] | + solfege | [] [] [] [] | + solfege-manual | [] [] [] | + soundtracker | [] | + sp | | + sysstat | [] [] [] [] | + tar | [] [] [] [] | + texinfo | [] [] [] [] | + tin | [] | + unicode-han-tra... | | + unicode-transla... | | + util-linux-ng | [] [] [] [] [] | + vice | [] | + vmm | [] | + vorbis-tools | [] [] | + wastesedge | [] | + wdiff | [] [] | + wget | [] [] [] [] [] [] [] | + wyslij-po | [] [] [] | + xchat | [] [] [] [] [] [] [] [] [] | + xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] [] [] [] [] | + xkeyboard-config | [] [] [] [] [] | + +---------------------------------------------------+ + nl nn or pa pl ps pt pt_BR ro ru rw sk sl sq sr + 135 10 4 7 105 1 29 61 47 91 3 55 47 8 37 + + sv sw ta te tg th tr uk vi wa zh_CN zh_HK zh_TW + +---------------------------------------------------+ + a2ps | [] [] [] [] [] | 27 + aegis | [] | 9 + ant-phone | [] [] [] [] | 9 + anubis | [] [] [] [] | 15 + aspell | [] [] [] | 20 + bash | [] [] | 11 + bfd | [] | 6 + bibshelf | [] [] [] | 16 + binutils | [] [] | 8 + bison | [] [] | 12 + bison-runtime | [] [] [] [] [] [] | 29 + bluez-pin | [] [] [] [] [] [] [] [] | 37 + bombono-dvd | [] | 4 + buzztard | [] | 7 + cflow | [] [] [] | 9 + clisp | | 10 + coreutils | [] [] [] [] | 22 + cpio | [] [] [] [] [] [] | 13 + cppi | [] [] | 5 + cpplib | [] [] [] [] [] [] | 13 + cryptsetup | [] [] | 7 + dfarc | [] | 9 + dialog | [] [] [] [] [] [] [] | 30 + dico | [] | 2 + diffutils | [] [] [] [] [] [] | 30 + dink | | 4 + doodle | [] [] | 7 + e2fsprogs | [] [] [] | 11 + enscript | [] [] [] [] | 17 + exif | [] [] [] | 16 + fetchmail | [] [] [] | 17 + findutils | [] [] [] [] [] | 20 + flex | [] [] [] [] | 15 + freedink | [] | 10 + gas | [] | 4 + gawk | [] [] [] [] | 18 + gcal | [] [] | 5 + gcc | [] [] [] | 7 + gettext-examples | [] [] [] [] [] [] [] | 34 + gettext-runtime | [] [] [] [] [] [] [] | 30 + gettext-tools | [] [] [] [] [] [] | 22 + gip | [] [] [] [] | 22 + gjay | [] | 3 + gliv | [] [] [] | 14 + glunarclock | [] [] [] [] [] | 19 + gnubiff | [] [] | 4 + gnucash | () [] () () | 9 + gnuedu | [] [] | 7 + gnulib | [] [] [] [] | 16 + gnunet | [] | 1 + gnunet-gtk | [] [] [] | 5 + gnutls | [] [] [] | 10 + gold | [] | 4 + gpe-aerial | [] [] [] | 18 + gpe-beam | [] [] [] | 19 + gpe-bluetooth | [] [] [] | 13 + gpe-calendar | [] [] [] [] | 12 + gpe-clock | [] [] [] [] [] | 28 + gpe-conf | [] [] [] [] | 20 + gpe-contacts | [] [] [] | 17 + gpe-edit | [] [] [] | 12 + gpe-filemanager | [] [] [] [] | 16 + gpe-go | [] [] [] [] [] | 25 + gpe-login | [] [] [] | 11 + gpe-ownerinfo | [] [] [] [] [] | 25 + gpe-package | [] [] [] | 13 + gpe-sketchbook | [] [] [] | 20 + gpe-su | [] [] [] [] [] | 30 + gpe-taskmanager | [] [] [] [] [] | 29 + gpe-timesheet | [] [] [] [] [] | 25 + gpe-today | [] [] [] [] [] [] | 30 + gpe-todo | [] [] [] [] | 17 + gphoto2 | [] [] [] [] [] | 24 + gprof | [] [] [] | 15 + gpsdrive | [] [] [] | 11 + gramadoir | [] [] [] | 11 + grep | [] [] [] | 10 + grub | [] [] [] | 14 + gsasl | [] [] [] [] | 14 + gss | [] [] [] | 11 + gst-plugins-bad | [] [] [] [] | 22 + gst-plugins-base | [] [] [] [] [] | 24 + gst-plugins-good | [] [] [] [] [] | 25 + gst-plugins-ugly | [] [] [] [] [] | 29 + gstreamer | [] [] [] [] | 22 + gtick | [] [] [] | 13 + gtkam | [] [] [] | 20 + gtkorphan | [] [] [] | 14 + gtkspell | [] [] [] [] [] [] [] [] [] | 45 + gutenprint | [] | 10 + hello | [] [] [] [] [] [] | 21 + help2man | [] [] | 7 + hylafax | [] | 5 + idutils | [] [] [] [] | 17 + indent | [] [] [] [] [] [] | 30 + iso_15924 | () [] () [] [] | 16 + iso_3166 | [] [] () [] [] () [] [] [] () | 53 + iso_3166_2 | () [] () [] | 9 + iso_4217 | [] () [] [] () [] [] | 26 + iso_639 | [] [] [] () [] () [] [] [] [] | 38 + iso_639_3 | [] () | 8 + jwhois | [] [] [] [] [] | 16 + kbd | [] [] [] [] [] | 15 + keytouch | [] [] [] | 16 + keytouch-editor | [] [] [] | 14 + keytouch-keyboa... | [] [] [] | 14 + klavaro | [] | 11 + latrine | [] [] [] | 10 + ld | [] [] [] [] | 11 + leafpad | [] [] [] [] [] [] | 33 + libc | [] [] [] [] [] | 21 + libexif | [] () | 6 + libextractor | [] | 1 + libgnutls | [] [] [] | 9 + libgpewidget | [] [] [] | 14 + libgpg-error | [] [] [] | 9 + libgphoto2 | [] [] | 8 + libgphoto2_port | [] [] [] [] | 13 + libgsasl | [] [] [] | 13 + libiconv | [] [] [] [] | 21 + libidn | () [] [] | 11 + lifelines | [] | 4 + liferea | [] [] [] | 21 + lilypond | [] | 7 + linkdr | [] [] [] [] [] | 17 + lordsawar | | 1 + lprng | [] | 3 + lynx | [] [] [] [] | 17 + m4 | [] [] [] [] | 19 + mailfromd | [] [] | 3 + mailutils | [] | 5 + make | [] [] [] [] | 21 + man-db | [] [] [] | 8 + man-db-manpages | | 4 + minicom | [] [] | 16 + mkisofs | [] [] | 9 + myserver | | 0 + nano | [] [] [] [] | 21 + opcodes | [] [] [] | 11 + parted | [] [] [] [] [] | 15 + pies | [] [] | 3 + popt | [] [] [] [] [] [] | 27 + psmisc | [] [] | 11 + pspp | | 4 + pwdutils | [] [] | 6 + radius | [] [] | 9 + recode | [] [] [] [] | 28 + rosegarden | () | 0 + rpm | [] [] [] | 11 + rush | [] [] | 4 + sarg | | 1 + screem | [] | 3 + scrollkeeper | [] [] [] [] [] | 27 + sed | [] [] [] [] [] | 30 + sharutils | [] [] [] [] [] | 22 + shishi | [] | 3 + skencil | [] [] | 7 + solfege | [] [] [] [] | 16 + solfege-manual | [] | 8 + soundtracker | [] [] [] | 9 + sp | [] | 3 + sysstat | [] [] | 15 + tar | [] [] [] [] [] [] | 23 + texinfo | [] [] [] [] | 16 + tin | | 4 + unicode-han-tra... | | 0 + unicode-transla... | | 2 + util-linux-ng | [] [] [] [] | 20 + vice | () () | 1 + vmm | [] | 4 + vorbis-tools | [] | 6 + wastesedge | | 2 + wdiff | [] [] | 7 + wget | [] [] [] [] [] | 26 + wyslij-po | [] [] | 8 + xchat | [] [] [] [] [] [] | 36 + xdg-user-dirs | [] [] [] [] [] [] [] [] [] | 60 + xkeyboard-config | [] [] [] [] | 25 + +---------------------------------------------------+ + 84 teams sv sw ta te tg th tr uk vi wa zh_CN zh_HK zh_TW + 178 domains 119 1 3 2 0 10 66 50 155 17 97 7 41 2610 + + Some counters in the preceding matrix are higher than the number of +visible blocks let us expect. This is because a few extra PO files are +used for implementing regional variants of languages, or language +dialects. + + For a PO file in the matrix above to be effective, the package to +which it applies should also have been internationalized and +distributed as such by its maintainer. There might be an observable +lag between the mere existence a PO file and its wide availability in a +distribution. + + If May 2010 seems to be old, you may fetch a more recent copy of +this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date +matrix with full percentage details can be found at +`http://translationproject.org/extra/matrix.html'. + +1.6 Using `gettext' in new packages +=================================== + +If you are writing a freely available program and want to +internationalize it you are welcome to use GNU `gettext' in your +package. Of course you have to respect the GNU Library General Public +License which covers the use of the GNU `gettext' library. This means +in particular that even non-free programs can use `libintl' as a shared +library, whereas only free software can use `libintl' as a static +library or use modified versions of `libintl'. + + Once the sources are changed appropriately and the setup can handle +the use of `gettext' the only thing missing are the translations. The +Free Translation Project is also available for packages which are not +developed inside the GNU project. Therefore the information given above +applies also for every other Free Software Project. Contact +`coordinator@translationproject.org' to make the `.pot' files available +to the translation teams. + diff --git a/goaccess++/AUTHORS b/goaccess++/AUTHORS new file mode 100644 index 0000000..288895f --- /dev/null +++ b/goaccess++/AUTHORS @@ -0,0 +1,77 @@ +GoAccess was designed and developed by Gerardo Orellana + +Special thanks to the following individuals for their great contributions: + + * Aaditya Bagga + * Adam Števko + * Adrian + * Alexander Eifler + * Andreas Sommer + * Andreas Weigel + * Andrew Minion + * Antonio Terceiro + * Arnie97 + * Aslak Raanes + * Bjørnar Hansen + * Bo Cai + * Bob Black + * Chilledheart + * Chris Downs + * Christian Hermann + * Christian Moelders + * Christopher Meng + * Daniel (dmilith) Dettlaff + * Daniel Aleksandersen + * David Geistert + * Enrique Becerra + * Florian Forster + * Francisco Azevedo + * Frederic Cambus + * Genki Sugawara + * Jeffery Wilkins + * Jeremy Burks + * Joe Groocock + * Joe Winett + * Joona + * Julian Xhokaxhiu + * Justin Mills + * Kamino Hiroki <37243867+4f8p@users.noreply.github.com> + * Kit Westneat + * Maksim Losev + * Mark J. Berger + * Mathieu Aubin + * Mathieu Thoretton + * Max Christian Pohle + * Michael Vetter + * Nicolas + * Nicolas Le Manchet + * Otto Kekäläinen + * Sean Cross + * Sebastian Wiedenroth + * SjonHortensius + * Steely Wing + * Stoyan Dimov + * Stéphane Péchard + * Tatsuyuki Ishi + * Thomas Gläßle + * Tom Samstag + * Viktor Szépe + * Ville Skyttä + * Vladimir Pavljuchenkov + * Vladimir Pavljuchenkov + * Yuri D'Elia + * Yuriy M. Kaminskiy + * abgit + * as0n + * fqbuild + * holys + * kyle sloan + * m-r-r + * mynameiscfed + * pravdomil + * radoslawc + * radoslawc + * schoonc + * wodev + * woobee + * zeke diff --git a/goaccess++/COPYING b/goaccess++/COPYING new file mode 100644 index 0000000..8da9f1d --- /dev/null +++ b/goaccess++/COPYING @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2009-2016 Gerardo Orellana + +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/goaccess++/ChangeLog b/goaccess++/ChangeLog new file mode 100644 index 0000000..5d0afb1 --- /dev/null +++ b/goaccess++/ChangeLog @@ -0,0 +1,705 @@ +Changes to GoAccess 1.3 - Friday, November 23, 2018 + + - Added ability to store accumulated processing time into DB_GEN_STATS tcb + file via '--accumulated-time' command line option. + - Added additional Apache status codes to the list. + - Added a few feed readers to the list. + - Added 'Android 8 Oreo' to the list of OSs. + - Added 'Android Pie 9' to the list of OSs. + - Added --anonymize-ip command line option to anonymize ip addresses. + - Added --browsers-file command line option to load a list of crawlers from a + text file. + - Added byte unit (PiB) to C formatter and refactored code. + - Added byte unit (PiB) to JS formatter. + - Added Chinese translation (i18n). + - Added French translation (i18n). + - Added '%h' date specifier to the allowed date character specifiers. + - Added "HeadlessChrome" to the list of browsers. + - Added --hide-referer command line option to hide referers from report. + - Added HTTP status code 429 (TOO MANY REQUESTS). + - Added IGNORE_LEVEL_PANEL and IGNORE_LEVEL_REQ definitions. + - Added --ignore-referer-report command line option to hide referers from + output. + - Added Japanese translation (i18n). + - Added macOS 10.14 Mojave to the list of OSs. + - Added "Mastodon" user-agent to the list of crawlers/unix-like. + - Added new fontawesome icons and use angle arrows in HTML paging. + - Added new purple theme to HTML report and default to it. + - Added --no-parsing-spinner command line option to switch off parsing + spinner. + - Added .ogv and ogg static file extension (ogg video, Ogg Vorbis audio). + - Added OS X version numbers when outputting with --real-os. + - Added parsing mechanism in an attempt capture more bots and to include + unspecified bots/crawlers. + - Added --pidfile command line option to the default config file. + - Added Spanish translation (i18n). + - Added SSL support for Docker goaccess build. + - Added support to the WebSocket server for openssl-1.1*. + - Added the ability to show/hide a chart per panel in the HTML report. + - Added transparency to the navigation bar of the HTML report. + - Added "WhatsApp" user-agent to the list of crawlers. + - Changed default db folder so it adds the process id (PID). --db-path is + required now when using --load-from-disk. + - Changed Dockerfile to build from the current source. + - Changed 'hits' to be right-aligned on TUI. + - Changed to use faster slide animations on HTML report. + - Changed wording from 'Bandwidth' to the proper term 'Tx. Amount'. + - Ensure database filenames used by btree are less predictable. + - Ensure HTML templates, CSS and JS files are minified when outputting + report. + - Ensure key phrases from Google are added even when https is used. + - Ensure live report updates data & charts if tab/document has focus. + - Ensure multiple 'Yandex' crawlers are properly parsed. + - Ensure Safari has priority over most crawlers except the ones that are + known to have it. + - Ensure the request protocol on its own is properly parsed. + - Ensure the right number of tests are performed against the given log. + - Ensure user configuration is parsed first when available. + - Ensure wss:// is used when connecting via HTTPS. + - Ensure XFF parser takes into account escaped braces. + - Fixed a regression where fifo-in/out would fail with ENXIO. + - Fixed a regression where it would return EXIT_FAILURE on an empty log. + - Fixed a (ssh) pipeline problem with fgetline()/fgets() when there is a race + for data on stdin. + - Fixed broken X-Forwarded-For (XFF) %~ specifier in certain parsing cases. + - Fixed conf.filenames duplication problem if logs are via pipe. + - Fixed float percent value on JSON/HTML output for locales using decimal comma. + - Fixed issue where it was not possible to establish a Web Socket connection + when attempting to parse and extract HTTP method. + - Fixed issue where log formats with pipe delimiter were not propely parsed. + - Fixed memory leak after config file path has been set (housekeeping). + - Fixed memory leak when adding host to holder introduced in c052d1ea. + - Fixed possible memory leak when hiding specific referrers. + - Fixed several JS jshint warnings. + - Fixed sudo installs on TravisCI. + - Fixed UNDEFINED time range in HTML report when VISITORS panel was ignored. + - Fixed unnecessary closing span tags from template. + - Fixed use-after-free when two color items were found on color_list. + +Changes to GoAccess 1.2 - Tuesday, March 07, 2017 + + - Added a Dockerfile. + - Added Amazon S3 bucket name as a VirtualHost (server block). + - Added a replacement for GNU getline() to dynamically expand line buffer + while maintaining real-time output. + - Added --daemonize command line option to run GoAccess as daemon. + - Added several improvements to the HTML report on small-screen devices. + - Added option to the HTML report to auto-hide tables on small-screen + devices. + - Added --process-and-exit command line option to parse log and exit. + - Added several feed readers to the list of browsers. + - Added "-" single dash per convention to read from the standard input. + - Added support for MaxMind GeoIP2. + - Added the ability to read and follow from a pipe such as + "tail -f access.log | goaccess -" + - Added the ability to specify multiple logs as input sources, e.g.: + "goaccess access.log access.log.1" while maintaining real-time output. + - Added time unit (seconds) to the processed time label in the HTML/terminal + output. + - Added visitors' percent column to the terminal dashboard. + - Changed D3 charts to dim Y-axis on mouseover. + - Changed D3 charts to reflect HTML column sort. + - Changed D3 charts to render only if within the viewport. This improves the + overall real-time HTML performance. + - Changed HTML report tables to render only if within the viewport. + - Changed percentage calculation to be based on the total within each panel. + - Ensure start/end dates are updated real-time in the HTML output. + - Ensure "window.location.hostname" is used as the default WS server host. + In most cases, this should avoid the need for specifying "--ws-url=host". + Simply using "--real-time-html" should suffice. + - Fixed issue on HTML report to avoid outputting scientific notation for all + byte sizes. + - Fixed integer overflow when calculating bar graph length on terminal + output. + - Fixed issue where global config file would override command line arguments. + - Fixed issue where it wouldn't allow loading from disk without specifying a + file when executed from the cron. + - Fixed issue where parser couldn't read some X-Forwarded-For (XFF) formats. + Note that this breaks compatibility with the original implementation of + parsing XFF, but at the same time it gives much more flexibility on different + formats. + - Fixed issue where specifying fifo-in/out wouldn't allow HTML real-time + output. + - Fixed issue where the wrong number of parsed lines upon erroring out was + displayed. + - Fixed issue where the WebSocket server prevented to establish a connection + with a client due to invalid UTF-8 sequences. + - Fixed percent issue when calculating visitors field. + - Updated the list of crawlers. + +Changes to GoAccess 1.1.1 - Wednesday, November 23, 2016 + + - Added data metric's "unique" count on each panel to the JSON/HTML outputs. + - Changed D3 bar charts to use .rangeBands and avoid extra outer padding. + - Fixed mouseover offset position issue on D3 bar charts. + - Fixed possible heap overflow when an invalid status code was parsed and + processed. This also ensures that only valid HTTP status codes are parsed + >=100 or <= 599. + - Fixed sluggish D3 chart re-rendering by changing how x-axis labels are + displayed in the HTML report. + +Changes to GoAccess 1.1 - Tuesday, November 08, 2016 + + - Added a new layout to the HTML report and additional settings and changes. + - Added --crawlers-only command line option to display crawlers/bots only. + - Added --fifo-in and --fifo-out command line options to set websocket FIFO + reader/writer. + - Added --no-html-last-updated command line option. + - Added --num-tests command line option. + - Added --html-prefs command line option to to set default preferences for + the HTML report. + - Added "Amazon S3" Log Format to the list of predefined options. + - Added "Android 7.1 Nougat" to the list of OSs. + - Added "Android Marshmallow 6.0.1" to the list of OSs. + - Added "Android Nougat 7.0" to the list of OSs. + - Added "Feed Wrangler" to the list of feeds. + - Added "Go-http-client" to the list of browsers. + - Added "MicroMessenger" (WeChat) to the list of browsers. + - Added "SemrushBot" to the list of crawlers. + - Added "Remote User" panel to capture HTTP authentication requests. Use %e + within the log-format variable to enable this panel. + - Added tebibyte unit to the byte to string function converter. + - Added the ability to parse reverse proxy logs that have multiple IPs. This + adds the ability to parse the "X-Forwarded-For" field in a reverse proxy + setup. + - Added the ability to show which token didn't match log/date/time pattern. + This also ensures that in the absence of data, its output is not treated as + error but instead it produces an empty report. + - Added the ability to specify a WebSocket protocol (ws|wss) through + --ws-url. + - Added the request query string to the W3C format. + - Added TLS/SSL support to the HTML real-time report. + - Changed browser classification for Google Cloud Clients. + - Changed how "Darwin" OS was reported to display AppName instead. + - Changed default W3C log format to use the URL path instead of full request. + - Changed HTML default number of items on each table to 7. + - Changed request parser to allow empty query strings. + - Changed default HTML output theme to darkBlue. + - Ensure every version of iOS is broken down under the OS panel. + - Ensure latest JSON data is fast-forwarded when connection is opened. + GoAccess now sends the latest JSON data to the client as soon as the + WebSocket connection is opened. + - Ensure localStorage is supported and enabled in the HTML report + - Ensure unknown coutries/continents are listed. + - Fixed D3 chart width overflow issue on Edge. + - Fixed integer to string key conversion for unique visitors. This fixes the + issue where resulting keys would collide with existing keys and thus not + keeping the right visitors count on certain panels. + - Fixed memory leak when unable to URL decode %q specifier. + - Fixed memory leak when unable to URL decode %U specifier. + - Fixed month name abbreviation on app.js. + - Fixed percentage integer overflow with large numbers on 32bits platforms. + - Fixed percent calculation due to integer division rounding to zero. + - Fixed possible code injection when outputting an HTML report. + - Fixed segfault when using options -H or -M without an argument. + - Removed timestamp from the HTML report title tag. + +Changes to GoAccess 1.0.2 - Tuesday, July 05, 2016 + + - Added minor changes to the HTML report stylesheet. + - Added the ability to specify the WebSocket port within --ws-url. + - Added the proper byte swap functions used by Sun Solaris. + - Added the proper default --http-method/protocol values on the config file. + - Changed bar transition to scale delay dynamically to the length of the + dataset. + - Fixed build issue on platforms lacking of open_memstream() by refactoring + the JSON module to use its own memory buffer. + - Fixed issue where the server wouldn't send cached buffer to slow clients. + - Fixed OS X build check of ncursesw. + - Implemented a throttle mechanism for slow clients to avoid caching too much + data on the server-side. + - Removed flickering on D3 line and bar chart redraw. + +Changes to GoAccess 1.0.1 - Friday, June 17, 2016 + + - Added Android version number along with the codename when using --real-os, + e.g., "Lollipop 5.1". + - Added some missing headers and function checks to configure.ac. + - Fixed a regression where it wouldn't allow abbreviated date and time + formats such as %F or %T. + - Fixed build issues on systems running GLIBC older than 2.9, such as RHEL <= 5. + - Fixed issue where it wouldn't send the whole buffer to a socket causing the + real-time-html WebSocket server to progressively consume a lot more memory. + - Fixed memory leak when using getline and follow mode enabled. + - Fixed some buffer initialization issues on read_line() and + perform_tail_follow(). + - Fixed uint types in sha1 files. + +Changes to GoAccess 1.0 - Thursday, June 09, 2016 + + - Added --enable-panel= command line option to display the given + module. + - Added --json-pretty-print command line option to output pretty json. + - Added --log-format= command-line shortcuts for standard log + formats. + - Added --origin command line option to match the origin WebSocket header. + - Added --output= as a shortcut to --output-format. + - Added a complete real-time functionality to the HTML output. + - Added an option to set the max number of items to show per panel. + - Added D3 Visualziations to the HTML dashboard. + - Added metadata metrics to the each of the panels (JSON output) + - Added option to specify time distribution specificity. + - Added the ability to download a JSON file from the HTML report. + - Added the ability to output multiple formats on a single log parse. + - Added the ability to set the date specificity in hours. + - Added the ability to sort all HTML tables on all panels. + - Added the ability to specify a custom CSS and JS file to the HTML report. + - Added user-agents to the JSON output per each host. + - Added "Vivaldi" to the list of browsers. + - Bootstrapify the HTML dashboard. + - Changed configure.ac to use LDFLAGS instead of CFLAGS where applicable. + - Changed default terminal color scheme to 256 Monokai if terminal supports 256 colors. + - Changed GoAccess license to The MIT License (MIT) + - Changed the visitors panel to display its dates continuously instead of top. + - Default to 256 Monokai color scheme if terminal supports 256 colors. + - Default to display HTTP method/protocol (if applicable). + - Display the children's Max. T.S. as the parent's top Max. T.S. + - Ensure the parent's Avg. T.S. displays parent's Cum. T.S. over parent's Hits. + - Fixed color issue when switching from the color scheme dialog. + - Fixed cross platform build issue when ncurses is built with and without + termlib=tinfo. + - Fixed curses header window issue where it wouldn't clear out on small + window sizes. + - Fixed issue where tail mode wouldn't parse full lines using getline(). + - Fixed minor background color issue when using ncurses 6. + - Fixed possible division by zero when calculating percentage. + - Fixed singly link list node removal. + - Fixed still reachable memory leak on GeoIP cleanup (geoip legacy >= 1.4.7). + - Fixed various Valgrind's still reachable memory leaks. + - Removed -Wredundant-decls. + +Changes to GoAccess 0.9.8 - Monday, February 29, 2016 + + - Added a more complete list of static extensions to the config file. + - Added "Android 6.0 Marshmallow" to the list of OSs. + - Added --no-tab-scroll command line option to disable scroll through panels + on TAB. + - Added the first and last log dates to the overall statistics panel. + - Ensure GoAccess links correctly against libtinfo. + - Ensure static content is case-insensitive verified. + - Fixed bandwidth overflow issue (numbers > 2GB on non-x86_64 arch). + - Fixed broken HTML layout when html-method/protocol is missing in config file. + - Refactored parsing and display of available modules/panels. + +Changes to GoAccess 0.9.7 - Monday, December 21, 2015 + + - Added "Squid native" log format to the config file. + - Fixed integer overflow when getting total bandwidth using the on-disk + storage. + - Fixed issue where a timestamp was stored as date under the visitors panel. + - Fixed issue where config dialog fields were not cleared out on select. + - Fixed issue where "Virtual Hosts" menu item wasn't shown in the HTML sidebar. + +Changes to GoAccess 0.9.6 - Tuesday, October 27, 2015 + + - Added --dcf command line option to view the default config file path. + - Added --ignore-status the ability to ignore parsing status codes. + - Added "Darwin" to the list of OSs. + - Fixed segfault when appending data to a log (follow) without virtualhosts. + +Changes to GoAccess 0.9.5 - Thursday, October 22, 2015 + + - Added major performance improvements to the default storage when parsing and + storing data (~%44 less memory, ~37% faster). + - Added the ability to parse virtual hosts and a new panel to display metrics + per virtual host. + - Added the ability to parse HTTP/2 requests. + - Added the ability to use GNU getline() to parse full line requests. + - Added the ability to output debug info if a log file is specified, even + without --enable-debug. + - Added OS X "El Capitan". + - Added WebDav HTTP methods and HTTP status from RFC 2518 and RFC 3253. + - Fixed detection of some Googlebots. + - Fixed issue where time served metrics were not shown when loading persisted + data. + - Fixed linker error on OSX: ld: library not found for -lrt. + - Fixed percentage on the HTML output when excluding IPs. + - Removed GLib dependency and refactored storage functionality. By removing + this dependency, GoAccess is able to store data in a more efficient manner, + for instance, it avoids storing integer data as void* (generic typing), thus + greatly improving memory consumption for integers. + +Changes to GoAccess 0.9.4 - Tuesday, September 08, 2015 + + - Added --all-static-files command line option to parse static files + containing a query string. + - Added --invalid-requests command line option to log invalid requests to a file. + - Added additional overall metric - total valid requests. + - Added "%~" specifier to move forward through a log string until a non-space + char is found. + - Added the ability to parse native Squid access.log format. + - Fixed a few issues in the configuration script. + - Fixed inability to parse color due to a missing POSIX extension. + "ERR:Invalid bg/fg color pairs" + +Changes to GoAccess 0.9.3 - Wednesday, August 26, 2015 + + - Added --no-column-names command line option to disable column name metrics. + - Added a default color palette (Monokai) to the config file. + - Added AWS Elastic Load Balancing to the list of predefined log/date/time + formats. + - Added CloudFlare status codes. + - Added column headers for every enabled metric on each panel. + - Added cumulative time served metric. + - Added "DragonFly" BSD to the list of OSs. + - Added maximum time served metric (slowest running requests). + - Added "Slackbot" to the list of crawlers/browsers. + - Added the ability to parse the query string specifier "%q" from a log file. + - Added the ability to process logs incrementally. + - Added the ability to set custom colors on the terminal output. + - Disabled REFERRERS by default. + - Ensure bandwidth metric is displayed only if %b specifier is parsed. + - Fixed issue where the --sort-panel option wouldn't sort certain panels. + - Fixed several compiler warnings. + - Set predefined static files when no config file is used. + - Updated "Windows 10" user agent from 6.4 (wrong) to 10.0.(actual) + +Changes to GoAccess 0.9.2 - Monday, July 06, 2015 + + - Added ability to fully parse browsers that contain spaces within a token. + - Added multiple user agents to the list of browsers. + - Added the ability to handle time served in milliseconds as a decimal number + `%L`. + - Added the ability to parse a timestamp in microseconds. + - Added the ability to parse Google Cloud Storage access logs. + - Added the ability to set a custom title and header in the HTML report. + - Added "%x" as timestamp log-format specifier. + - Ensure agents" hash table is destroyed upon exiting the program. + - Ensure "Game Systems" are processed correctly. + - Ensure visitors panel header is updated depending if crawlers are parsed or + not. + - Fixed issue where the date value was set as time value in the config + dialog. + - Fixed memory leak in the hits metrics when using the in-memory storage + (GLib). + +Changes to GoAccess 0.9.1 - Tuesday, May 26, 2015 + + - Added --hl-header command line option to highlight active panel. + - Added "Applebot" to the list of web crawlers. + - Added "Microsoft Edge" to the list of browsers. + - Added additional Nginx-specific status codes. + - Ensure dump_struct is used only if using __GLIBC__. + - Ensure goaccess image has an alt attribute on the HTML output for valid + HTML5. + - Ensure the config file path is displayed when something goes wrong (FATAL). + - Ensure there is a character indicator to see which panel is active. + - Fixed Cygwin compile issue attempting to use -rdynamic. + - Fixed issue where a single IP did not get excluded after an IP range. + - Fixed issue where requests showed up in the wrong view even when + --no-query-string was used. + - Fixed issue where some browsers were not recognized or marked as "unknown". + - Fixed memory leak when excluding an IP range. + - Fixed overflows on sort comparison functions. + - Fixed segfault when using on-disk storage and loading persisted data with -a. + - Removed keyphrases menu item from HTML output. + - Split iOS devices from Mac OS X. + +Changes to GoAccess 0.9 - Thursday, March 19, 2015 + + - Added --geoip-database command line option for GeoIP Country/City IPv6. + - Added "Windows 10 (v6.4)" to the real windows user agents. + - Added ability to double decode an HTTP referer and agent. + - Added ability to sort views through the command line on initial load. + - Added additional data values to the backtrace report. + - Added additional graph to represent the visitors metric on the HTML output. + - Added AM_PROG_CC_C_O to configure.ac + - Added "Android Lollipop" to the list of operating systems. + - Added "average time served" metric to all panels. + - Added "bandwidth" metric to all panels. + - Added command line option to disable summary metrics on the CSV output. + - Added numeric formatting to the HTML output to improve readability. + - Added request method specifier to the default W3C log format. + - Added the ability to ignore parsing and displaying given panel(s). + - Added the ability to ignore referer sites from being counted. A good case + scenario is to ignore own domains. i.e., owndomain.tld. This also allows + ignoring hosts using wildcards. For instance, *.mydomain.tld or www.mydomain.* + or www?.mydomain.tld + - Added time/hour distribution module. e.g., 00-23. + - Added "visitors" metrics to all panels. + - Changed AC_PREREQ macro version so it builds on old versions of autoconf. + - Changed GEOIP database load to GEOIP_MEMORY_CACHE for faster lookups. + - Changed maximum number of choices to display per panel to 366 fron 300. + - Ensure config file is read from home dir if unable to open it from + %sysconfdir% path. + - Fixed array overflows when exceeding MAX_* limits on command line options. + - Fixed a SEGFAULT where sscanf could not handle special chars within the + referer. + - Fixed character encoding on geolocation output (ISO-8859 to UTF8). + - Fixed issue on wild cards containing "?" at the end of the string. + - Fixed issue where a "Nothing valid to process" error was triggered when the + number of invalid hits was equal to the number of valid hits. + - Fixed issue where outputting to a file left a zero-byte file in pwd. + - Improved parsing of operating systems. + - Refactored log parser so it allows with ease the addition of new modules. + This also attempts to decouple the core functionality from the rendering + functions. It also gives the flexibility to add children metrics to root + metrics for any module. e.g., Request A was visited by IP1, IP2, IP3, etc. + - Restyled HTML output. + +Changes to GoAccess 0.8.5 - Sunday, September 14, 2014 + + - Fixed SEGFAULT when parsing a malformed request that doesn't have HTTP + status. + +Changes to GoAccess 0.8.4 - Monday, September 08, 2014 + + - Added --444-as-404 command line option to handle nginx non-standard status + code 444 as 404. + - Added --4xx-to-unique-count command line option to count client errors (4xx) + to the unique visitors count. Now by default it omits client errors (4xx) + from being added to the unique visitors count as they are probably not welcomed + visitors. 4xx errors are always counted in panels other than visitors, OS & + browsers. + - Added and updated operating systems, and browsers. + - Added excluded IP hits count to the general statistics panel on all reports. + - Added HTTP nonstandard code "444" to the status code list. + - Fixed compile error due to missing include for type + off_t (gcc 4.1). + - Fixed issue when excluding IPv4/v6 ranges. + - Removed request status field restriction. This allows parsing logs that + contain only a valid date, IPv4/6 and host. + +Changes to GoAccess 0.8.3 - Monday, July 28, 2014 + + - Fixed SEGFAULT when parsing a CLF log format and using --ignore-crawlers. + - Fixed parsing conflict between some Opera browsers and Chrome. + - Fixed parsing of several feed readers that are Firefox/Safari-based. + - Fixed Steam detection. + - Added Huawei to the browser's list and removed it from the OS's list. + +Changes to GoAccess 0.8.2 - Monday, July 20, 2014 + + - Added --version command line option. + - Added --ignore-crawlers command line option to ignore crawlers. + - Added ability to parse dates containing whitespaces in between, + e.g., "Jul 15 20:13:59" (syslog format). + - Added a variety of browsers, game systems, feed readers, and podcasts. + - Added missing up/down arrows to the help section. + - Added the ability to ignore multiple IPv4/v6 and IP ranges. + - Added the PATCH method according to RFC 5789. + - Fixed GeoLocation percent issue for the JSON, CSV and HTML outputs. + - Fixed memory leak when excluding one or multiple IPs. + +Changes to GoAccess 0.8.1 - Monday, June 16, 2014 + + - Added ability to add/remove static files by extension through the config + file. + - Added ability to print backtrace on segmentation fault. + - Escaped JSON strings correctly according to [RFC4627]. + - Fixed encoding issue when extracting keyphrases for some HTTP referers. + - Fixed issue where HTML bar graphs were not shown due to numeric locale. + - Fixed issue with URIs containing "\r?\n" thus breaking the corresponding + output. + - Make sure request string is URL decoded on all outputs. + +Changes to GoAccess 0.8 - Tuesday, May 20, 2014 + + - Added APT-HTTP to the list of browsers. + - Added data persistence and ability to load data from disk. + - Added IE11 to the list of browsers. + - Added IEMobile to the list of browsers. + - Added multiple command line options. + - Added Nagios check_http to the list of browsers. + - Added parsing progress metrics - total requests / requests per second. + - Added the ability to parse a GeoLiteCity.dat to get the city given an IPv4. + - Changed the way the configuration file is parsed. This will parse all + configuration options under ~/.goaccessrc or the specified config file and + will feed getopt_long with the extracted key/value pairs. This also allows the + ability to have comments on the config file which won't be overwritten. + - Ensure autoconf determines the location of ncurses headers. + - Fixed issue where geo_location_data was NULL. + - Fixed issue where GoAccess did not run without a tty allocated to it. + - Fixed potential memory leak on --log-file realpath(). + - Fixed Solaris build errors. + - Implemented an on-memory hash database using Tokyo Cabinet. This + implementation allows GoAccess not to rely on GLib's hash table if one is + needed. + - Implemented large file support using an on-disk B+ Tree database. This + implementation allows GoAccess not to hold everything in memory but instead + it uses an on-disk B+ Tree database. + - Trimmed leading and trailing whitespaces from keyphrases module. + +Changes to GoAccess 0.7.1 - Monday, February 17, 2014 + + - Added --no-color command line option to turn off color output. + - Added --real-os command line option to get real OS names, e.g., + "Android, Windows, Mac". + - Added ability to log debug messages to a file. + - Added ability to parse tab-separated log format strings. + - Added ability to support terminals without colors. + - Added command line option to append HTTP method to request. + - Added command line option to append HTTP protocol to request. + - Added long options to command-line. + - Added missing "Win 9x 4.90" (Windows Me) user-agent. + - Added missing Windows RT user-agent. + - Ensure mouse click does not reset expanded module if it is the same. + - Fixed Amazon CloudFront tab-separated log format. + - Fixed "FreeBSD style" ncursesw built into system. + - Fixed HTML report issue where data cell would not wrap. + - Fixed issue when isatty() could not find a valid file descriptor. + - Fixed SymbianOS user-agent and retrieve its version. + +Changes to GoAccess 0.7 - Monday, December 15, 2013 + + - Added a command line option to ignore request query strings. + - Added additional compiler flags & fixed several warnings. + - Added additional static file extensions. + - Added country per IP to HOSTS module (HTML & JSON). + - Added DEBUG mode to Makefile & -O2 to default release. + - Added GEOLOCATION report to all outputs - includes continents/countries. + - Added IP resolver to HTML and JSON output. + - Added module numbers to each module header. + - Added the ability to output JSON and CSV. + - Added Windows NT 6.3 (Win 8.1) to the list. + - Fixed buffer overflow issue with realpath. + - New HTML report - HTML5 + CSS styles. + - Properly split request line into the three request modules. + +Changes to GoAccess 0.6.1 - Monday, October 07, 2013 + + - Added active module indication by name. + - Added additional crawlers to the list. + - Added custom configuration file option. + - Added human-readable string when unable to open log. + - Added missing include when compiling on OSX 10.6. + - Added optional mouse support to the main dashboard. + - Added the ability to select active module by number (keys). + - Added the rest of HTTP methods according to RFC2616. + - Changed referring site sscanf format to process multiple URLs. + - Changed the default color scheme to monochrome. + - Fixed issue where %T was not processing floating-point numbers. + - Fixed percentage issue for browsers and os modules. + - Fixed SIGSEGV when reading from stdin to stdout. + - Improved performance when expanding a module. + - Reduced memory consumption by decreasing number of dns threads. + - Removed ^UP/^DOWN due to a key mapping conflict. + +Changes to GoAccess 0.6 - Monday, July 15, 2013 + + - Added a bunch of minor fixes and changes. + - Added and updated list of browsers and operating systems. + - Added a predefined log format/date for the Amazon CloudFront (Download + Distribution). + - Added parsing/processing indicators. + - Added the ability to independently sort each module. + - Added the ability to search across the whole dashboard with the option to + use regular expressions. + - Config window now accepts [ENTER] to continue or F10. + - Fixed issue where Opera +15 was identified as Chrome. + - Implemented the ability to parse the time taken to serve the request, in + microseconds and seconds. + - Improved memory usage and better performance in general. + - Moved away from the original pop-up UI to a new expandable dashboard + allowing data to be processed in real-time. + - Sanitized HTML output with html entities for special chars. + - Updated the hosts module so it shows the reverse DNS as a sub node. + +Changes to GoAccess 0.5 - Monday, June 04, 2012 + + - Added ability to output a full stats report to a file. + - Added a key shortcut to scroll top/bottom. + - Added a new include sys/socket.h - BSD + - Added support for IPv6 + - Added the ability to parse a custom format string. + - Fixed google cache key-phrases. + - Fixed issue on empty Google query strings. + - Fixed issue on Opera agents where version was not recognized correctly. + - Fixed other minor fixes and changes. + +Changes to GoAccess 0.4.2 - Monday, January 03, 2011 + + - Added UTF-8 support. Now it should handle properly wide-character/UTF-8. + Run ./configure --enable-utf8 + - Fixed a minor bug when adding monthly totals on visitors subwin. + - Removed -lrt since GoAccess does not link to librt. (OS X doesn't include + librt) + +Changes to GoAccess 0.4.1 - Monday, December 13, 2010 + + - Added more flexibility when resizing the terminal. Should work fine with + the standard 80x24. + - Added the ability to pass a flag to ./configure so GeoIP can be enabled if + needed. + - Implemented a pipeline from stdin, so the input doesn't have to be only a + file. + +Changes to GoAccess 0.4 - Tuesday, November 30, 2010 + + - Added graphs to the unique_visitors subwin. + - Implemented bandwidth per day, and host. + - Implemented list of agents for specific hosts. + - Rewrote hash tables iterative code to avoid the use of GHashTableIter, this + way it works with all GLib > 2.0.0. + - Various bug fixes and code cleanups (mainly in the subwin modules). + +Changes to GoAccess 0.3.3 - Monday, September 27, 2010 + + - Changed tarball's filename. + - Fixed a request size parsing issue. Due to malformed syntax on the HTTP + protocol, bandwidth was reset to 0. Ex. "HEAD /" 400 20392 + - Fixed a segfault when goaccess was executed without any options but with an + additional unknown argument. + +Changes to GoAccess 0.3.2 - Thursday, September 09, 2010 + + - Fixed an agent parsing issue. As a result, operating systems were not + properly counted. + +Changes to GoAccess 0.3.1 - Friday, September 03, 2010 + + - Added a color scheme implementation + +Changes to GoAccess 0.3 - Sunday, August 29, 2010 + + - Added a counter for total requests since initial parse was implemented + - Added a more detailed and comprehensive browser and os report + - Added bandwidth details for requested files + - Added percentage details on modules 2, 3, 4, 5, 10, 11 + - Code cleanups + - Fixed a potential segmentation fault when resizing main window + - Fixed a segmentation fault on pop-up window search if haystack was null + - Fixed invalid entries when parsing status codes + - Implemented a real support for LFS - Handles files larger than 2 GiB on + 32-bit systems + - Implemented support for "vhost_combined" log format + - Changed position of data/graphs depending on # of hits + +Changes to GoAccess 0.2 - Sunday, July 25, 2010 + + - Added a keyphrases report coming from Google search engine. This includes, + raw, cache, and translation queries. + - Fixed a memory leak when invalid entries were parsed + - Fixed a potential buffer overflow. + - Implemented real-time statistics (RTS). Data will be appended as the log + file grows. Equivalent to "tail -f" on Unix systems + - Implemented screen resize functionality + - Simpliflied creation of the "unique visitors" hash-key. + - Simpliflied the "process_unique_data" function + - Various small speed increases & code cleanup + +Changes to GoAccess 0.1.2 - Monday, July 12, 2010 + + - Fixed a segmentation fault when parsing logs with unusual request type. Ex. + "GET HTTP/1.1 HTTP/1.1" + +Changes to GoAccess 0.1.1 - Saturday, July 10, 2010 + + - Added an enhanced error handling + - Added an extra macro on configure.ac to check against GHashTableIter. + ./configure might not check for glib 2.16 that introduced "GHashTableIter". + - Added Glibc LFS + - Cleaned up code a little bit + - Fixed a segmentation fault when displaying the help text on x86_64. + - Fixed assignments in conditions. In case the assignment is actually intended + put extra parenthesis around it. This will shut GCC (and others) up. + - Fixed casts associated with "g_hash_table_iter_next". + - Fixed comparison between signed and unsigned integer types. + - Fixed function declarations. + - Fixed includes. + - Fixed two format strings. (If the error was ever triggered, it'd most + likely lead to a segfault) + +Changes to GoAccess 0.1 - Tuesday, July 06, 2010 + + - Initial release 0.1 diff --git a/goaccess++/INSTALL b/goaccess++/INSTALL new file mode 100644 index 0000000..a1e89e1 --- /dev/null +++ b/goaccess++/INSTALL @@ -0,0 +1,370 @@ +Installation Instructions +************************* + +Copyright (C) 1994-1996, 1999-2002, 2004-2011 Free Software Foundation, +Inc. + + Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. This file is offered as-is, +without warranty of any kind. + +Basic Installation +================== + + Briefly, the shell commands `./configure; make; make install' should +configure, build, and install this package. The following +more-detailed instructions are generic; see the `README' file for +instructions specific to this package. Some packages provide this +`INSTALL' file but do not implement all of the features documented +below. The lack of an optional feature in a given package is not +necessarily a bug. More recommendations for GNU packages can be found +in *note Makefile Conventions: (standards)Makefile Conventions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. Caching is +disabled by default to prevent problems with accidental use of stale +cache files. + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You need `configure.ac' if +you want to change it or regenerate `configure' using a newer version +of `autoconf'. + + The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. + + Running `configure' might take a while. While running, it prints + some messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package, generally using the just-built uninstalled binaries. + + 4. Type `make install' to install the programs and any data files and + documentation. When installing into a prefix owned by root, it is + recommended that the package be configured and built as a regular + user, and only the `make install' phase executed with root + privileges. + + 5. Optionally, type `make installcheck' to repeat any self-tests, but + this time using the binaries in their final installed location. + This target does not install anything. Running this target as a + regular user, particularly if the prior `make install' required + root privileges, verifies that the installation completed + correctly. + + 6. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + + 7. Often, you can also type `make uninstall' to remove the installed + files again. In practice, not all packages have tested that + uninstallation works correctly, even though it is required by the + GNU Coding Standards. + + 8. Some packages, particularly those that use Automake, provide `make + distcheck', which can by used by developers to test that all other + targets like `make install' and `make uninstall' work correctly. + This target is generally not run by end users. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c99 CFLAGS=-g LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you can use GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. This +is known as a "VPATH" build. + + With a non-GNU `make', it is safer to compile the package for one +architecture at a time in the source code directory. After you have +installed the package for one architecture, use `make distclean' before +reconfiguring for another architecture. + + On MacOS X 10.5 and later systems, you can create libraries and +executables that work on multiple system types--known as "fat" or +"universal" binaries--by specifying multiple `-arch' options to the +compiler but only a single `-arch' option to the preprocessor. Like +this: + + ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CPP="gcc -E" CXXCPP="g++ -E" + + This is not guaranteed to produce working output in all cases, you +may have to build one architecture at a time and combine the results +using the `lipo' tool if you have problems. + +Installation Names +================== + + By default, `make install' installs the package's commands under +`/usr/local/bin', include files under `/usr/local/include', etc. You +can specify an installation prefix other than `/usr/local' by giving +`configure' the option `--prefix=PREFIX', where PREFIX must be an +absolute file name. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option `--exec-prefix=PREFIX' to `configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. In general, the +default for these options is expressed in terms of `${prefix}', so that +specifying just `--prefix' will affect all of the other directory +specifications that were not explicitly provided. + + The most portable way to affect installation locations is to pass the +correct locations to `configure'; however, many packages provide one or +both of the following shortcuts of passing variable assignments to the +`make install' command line to change installation locations without +having to reconfigure or recompile. + + The first method involves providing an override variable for each +affected directory. For example, `make install +prefix=/alternate/directory' will choose an alternate location for all +directory configuration variables that were expressed in terms of +`${prefix}'. Any directories that were specified during `configure', +but not in terms of `${prefix}', must each be overridden at install +time for the entire installation to be relocated. The approach of +makefile variable overrides for each directory variable is required by +the GNU Coding Standards, and ideally causes no recompilation. +However, some platforms have known limitations with the semantics of +shared libraries that end up requiring recompilation when using this +method, particularly noticeable in packages that use GNU Libtool. + + The second method involves providing the `DESTDIR' variable. For +example, `make install DESTDIR=/alternate/directory' will prepend +`/alternate/directory' before all installation names. The approach of +`DESTDIR' overrides is not required by the GNU Coding Standards, and +does not work on platforms that have drive letters. On the other hand, +it does better at avoiding recompilation issues, and works well even +when some directory options were not specified in terms of `${prefix}' +at `configure' time. + +Optional Features +================= + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + + Some packages offer the ability to configure how verbose the +execution of `make' will be. For these packages, running `./configure +--enable-silent-rules' sets the default to minimal output, which can be +overridden with `make V=1'; while running `./configure +--disable-silent-rules' sets the default to verbose, which can be +overridden with `make V=0'. + +Particular systems +================== + + On HP-UX, the default C compiler is not ANSI C compatible. If GNU +CC is not installed, it is recommended to use the following options in +order to use an ANSI C compiler: + + ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" + +and if that doesn't work, install pre-built binaries of GCC for HP-UX. + + HP-UX `make' updates targets which have the same time stamps as +their prerequisites, which makes it generally unusable when shipped +generated files such as `configure' are involved. Use GNU `make' +instead. + + On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot +parse its `' header file. The option `-nodtk' can be used as +a workaround. If GNU CC is not installed, it is therefore recommended +to try + + ./configure CC="cc" + +and if that doesn't work, try + + ./configure CC="cc -nodtk" + + On Solaris, don't put `/usr/ucb' early in your `PATH'. This +directory contains several dysfunctional programs; working variants of +these programs are available in `/usr/bin'. So, if you need `/usr/ucb' +in your `PATH', put it _after_ `/usr/bin'. + + On Haiku, software installed for all users goes in `/boot/common', +not `/usr/local'. It is recommended to use the following options: + + ./configure --prefix=/boot/common + +Specifying the System Type +========================== + + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS + KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option `--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + + Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). + +Unfortunately, this technique does not work for `CONFIG_SHELL' due to +an Autoconf bug. Until the bug is fixed you can use this workaround: + + CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash + +`configure' Invocation +====================== + + `configure' recognizes the following options to control how it +operates. + +`--help' +`-h' + Print a summary of all of the options to `configure', and exit. + +`--help=short' +`--help=recursive' + Print a summary of the options unique to this package's + `configure', and exit. The `short' variant lists options used + only in the top level, while the `recursive' variant lists options + also present in any nested packages. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--prefix=DIR' + Use DIR as the installation prefix. *note Installation Names:: + for more details, including other options available for fine-tuning + the installation locations. + +`--no-create' +`-n' + Run the configure checks, but stop before creating any output + files. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/goaccess++/Makefile b/goaccess++/Makefile new file mode 100644 index 0000000..a9a7d09 --- /dev/null +++ b/goaccess++/Makefile @@ -0,0 +1,1268 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# Makefile. Generated from Makefile.in by configure. + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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. + + + + + +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/goaccess +pkgincludedir = $(includedir)/goaccess +pkglibdir = $(libdir)/goaccess +pkglibexecdir = $(libexecdir)/goaccess +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 = x86_64-unknown-linux-gnu +host_triplet = x86_64-unknown-linux-gnu +bin_PROGRAMS = goaccess$(EXEEXT) +noinst_PROGRAMS = bin2c$(EXEEXT) +#am__append_1 = \ +# src/tcabdb.c \ +# src/tcabdb.h \ +# src/tcbtdb.c \ +# src/tcbtdb.h + +am__append_2 = \ + src/khash.h \ + src/gkhash.c \ + src/gkhash.h + +am__append_3 = \ + src/geoip1.c \ + src/geoip1.h + +#am__append_4 = \ +# src/geoip2.c \ +# src/geoip1.h + +subdir = . +DIST_COMMON = README $(am__configure_deps) $(dist_conf_DATA) \ + $(dist_man_MANS) $(dist_noinst_DATA) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(top_srcdir)/configure \ + $(top_srcdir)/src/config.h.in ABOUT-NLS AUTHORS COPYING \ + ChangeLog INSTALL NEWS TODO compile config.guess config.rpath \ + config.sub depcomp install-sh missing +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(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 = $(top_builddir)/src/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" \ + "$(DESTDIR)$(confdir)" +PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) +am__dirstamp = $(am__leading_dot)dirstamp +am_bin2c_OBJECTS = src/bin2c.$(OBJEXT) +bin2c_OBJECTS = $(am_bin2c_OBJECTS) +bin2c_LDADD = $(LDADD) +am__goaccess_SOURCES_DIST = src/base64.c src/base64.h src/browsers.c \ + src/browsers.h src/color.c src/color.h src/commons.c \ + src/commons.h src/csv.c src/csv.h src/error.c src/error.h \ + src/gdashboard.c src/gdashboard.h src/gdns.c src/gdns.h \ + src/gholder.c src/gholder.h src/gmenu.c src/gmenu.h \ + src/goaccess.c src/goaccess.h src/gslist.c src/gslist.h \ + src/gstorage.c src/gstorage.h src/gwsocket.c src/gwsocket.h \ + src/json.c src/json.h src/labels.h src/opesys.c src/opesys.h \ + src/options.c src/options.h src/output.c src/output.h \ + src/parser.c src/parser.h src/settings.c src/settings.h \ + src/sha1.c src/sha1.h src/sort.c src/sort.h src/ui.c src/ui.h \ + src/util.c src/util.h src/websocket.c src/websocket.h \ + src/xmalloc.c src/xmalloc.h src/tcabdb.c src/tcabdb.h \ + src/tcbtdb.c src/tcbtdb.h src/khash.h src/gkhash.c \ + src/gkhash.h src/geoip1.c src/geoip1.h src/geoip2.c +#am__objects_1 = src/tcabdb.$(OBJEXT) src/tcbtdb.$(OBJEXT) +am__objects_2 = src/gkhash.$(OBJEXT) +am__objects_3 = src/geoip1.$(OBJEXT) +#am__objects_4 = src/geoip2.$(OBJEXT) +am_goaccess_OBJECTS = src/base64.$(OBJEXT) src/browsers.$(OBJEXT) \ + src/color.$(OBJEXT) src/commons.$(OBJEXT) src/csv.$(OBJEXT) \ + src/error.$(OBJEXT) src/gdashboard.$(OBJEXT) \ + src/gdns.$(OBJEXT) src/gholder.$(OBJEXT) src/gmenu.$(OBJEXT) \ + src/goaccess.$(OBJEXT) src/gslist.$(OBJEXT) \ + src/gstorage.$(OBJEXT) src/gwsocket.$(OBJEXT) \ + src/json.$(OBJEXT) src/opesys.$(OBJEXT) src/options.$(OBJEXT) \ + src/output.$(OBJEXT) src/parser.$(OBJEXT) \ + src/settings.$(OBJEXT) src/sha1.$(OBJEXT) src/sort.$(OBJEXT) \ + src/ui.$(OBJEXT) src/util.$(OBJEXT) src/websocket.$(OBJEXT) \ + src/xmalloc.$(OBJEXT) $(am__objects_1) $(am__objects_2) \ + $(am__objects_3) $(am__objects_4) +goaccess_OBJECTS = $(am_goaccess_OBJECTS) +goaccess_LDADD = $(LDADD) +DEFAULT_INCLUDES = -I. -I$(top_builddir)/src +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(bin2c_SOURCES) $(goaccess_SOURCES) +DIST_SOURCES = $(bin2c_SOURCES) $(am__goaccess_SOURCES_DIST) +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +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; }; \ + } +man1dir = $(mandir)/man1 +NROFF = nroff +MANS = $(dist_man_MANS) +DATA = $(dist_conf_DATA) $(dist_noinst_DATA) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir dist dist-all distcheck +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +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__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +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 = ${SHELL} /home/djq/goaccess-1.3/missing --run aclocal-1.11 +AMTAR = $${TAR-tar} +AUTOCONF = ${SHELL} /home/djq/goaccess-1.3/missing --run autoconf +AUTOHEADER = ${SHELL} /home/djq/goaccess-1.3/missing --run autoheader +AUTOMAKE = ${SHELL} /home/djq/goaccess-1.3/missing --run automake-1.11 +AWK = mawk +CC = gcc +CCDEPMODE = depmode=gcc3 +CFLAGS = -pthread +CPP = gcc -E +CPPFLAGS = +CYGPATH_W = echo +DEFS = -DLOCALEDIR=\"$(localedir)\" -DHAVE_CONFIG_H +DEPDIR = .deps +ECHO_C = +ECHO_N = -n +ECHO_T = +EGREP = /usr/bin/grep -E +EXEEXT = +GETTEXT_MACRO_VERSION = 0.18 +GMSGFMT = : +GMSGFMT_015 = : +GREP = /usr/bin/grep +INSTALL = /usr/bin/install -c +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_PROGRAM = ${INSTALL} +INSTALL_SCRIPT = ${INSTALL} +INSTALL_STRIP_PROGRAM = $(install_sh) -c -s +INTLLIBS = +INTL_MACOSX_LIBS = +LDFLAGS = +LIBICONV = -liconv +LIBINTL = +LIBOBJS = +LIBS = -lnsl -lncursesw -lGeoIP -lpthread +LTLIBICONV = -liconv +LTLIBINTL = +LTLIBOBJS = +MAKEINFO = ${SHELL} /home/djq/goaccess-1.3/missing --run makeinfo +MKDIR_P = /usr/bin/mkdir -p +MSGFMT = : +MSGFMT_015 = : +MSGMERGE = : +OBJEXT = o +PACKAGE = goaccess +PACKAGE_BUGREPORT = goaccess@prosoftcorp.com +PACKAGE_NAME = goaccess +PACKAGE_STRING = goaccess 1.3 +PACKAGE_TARNAME = goaccess +PACKAGE_URL = http://goaccess.io +PACKAGE_VERSION = 1.3 +PATH_SEPARATOR = : +POSUB = po +POW_LIB = +SED_CHECK = yes +SET_MAKE = +SHELL = /bin/bash +STRIP = +TR_CHECK = yes +USE_NLS = yes +VERSION = 1.3 +XGETTEXT = : +XGETTEXT_015 = : +XGETTEXT_EXTRA_OPTIONS = +abs_builddir = /home/djq/goaccess-1.3 +abs_srcdir = /home/djq/goaccess-1.3 +abs_top_builddir = /home/djq/goaccess-1.3 +abs_top_srcdir = /home/djq/goaccess-1.3 +ac_ct_CC = gcc +am__include = include +am__leading_dot = . +am__quote = +am__tar = $${TAR-tar} chof - "$$tardir" +am__untar = $${TAR-tar} xf - +bindir = ${exec_prefix}/bin +build = x86_64-unknown-linux-gnu +build_alias = +build_cpu = x86_64 +build_os = linux-gnu +build_vendor = unknown +builddir = . +datadir = ${datarootdir} +datarootdir = ${prefix}/share +docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} +dvidir = ${docdir} +exec_prefix = ${prefix} +host = x86_64-unknown-linux-gnu +host_alias = +host_cpu = x86_64 +host_os = linux-gnu +host_vendor = unknown +htmldir = ${docdir} +includedir = ${prefix}/include +infodir = ${datarootdir}/info +install_sh = ${SHELL} /home/djq/goaccess-1.3/install-sh +libdir = ${exec_prefix}/lib +libexecdir = ${exec_prefix}/libexec +localedir = ${datarootdir}/locale +localstatedir = ${prefix}/var +mandir = ${datarootdir}/man +mkdir_p = /usr/bin/mkdir -p +oldincludedir = /usr/include +pdfdir = ${docdir} +prefix = /usr/local +program_transform_name = s,x,x, +psdir = ${docdir} +sbindir = ${exec_prefix}/sbin +sharedstatedir = ${prefix}/com +srcdir = . +sysconfdir = ${prefix}/etc +target_alias = +top_build_prefix = +top_builddir = . +top_srcdir = . +AUTOMAKE_OPTIONS = subdir-objects +dist_noinst_DATA = \ + resources/tpls.html \ + resources/css/app.css \ + resources/css/bootstrap.min.css \ + resources/css/fa.min.css \ + resources/js/app.js \ + resources/js/charts.js \ + resources/js/d3.v3.min.js \ + resources/js/hogan.min.js + +bin2c_SOURCES = src/bin2c.c +BUILT_SOURCES = \ + tpls.h \ + bootstrapcss.h \ + facss.h \ + appcss.h \ + d3js.h \ + hoganjs.h \ + chartsjs.h \ + appjs.h + +CLEANFILES = \ + src/tpls.h \ + src/bootstrapcss.h \ + src/facss.h \ + src/appcss.h \ + src/d3js.h \ + src/hoganjs.h \ + src/chartsjs.h \ + src/appjs.h \ + resources/tpls.html.tmp \ + resources/css/bootstrap.min.css.tmp \ + resources/css/fa.min.css.tmp \ + resources/css/app.css.tmp \ + resources/js/d3.v3.min.js.tmp \ + resources/js/hogan.min.js.tmp \ + resources/js/charts.js.tmp \ + resources/js/app.js.tmp + +confdir = $(sysconfdir)/goaccess +dist_conf_DATA = config/goaccess.conf config/browsers.list +goaccess_SOURCES = src/base64.c src/base64.h src/browsers.c \ + src/browsers.h src/color.c src/color.h src/commons.c \ + src/commons.h src/csv.c src/csv.h src/error.c src/error.h \ + src/gdashboard.c src/gdashboard.h src/gdns.c src/gdns.h \ + src/gholder.c src/gholder.h src/gmenu.c src/gmenu.h \ + src/goaccess.c src/goaccess.h src/gslist.c src/gslist.h \ + src/gstorage.c src/gstorage.h src/gwsocket.c src/gwsocket.h \ + src/json.c src/json.h src/labels.h src/opesys.c src/opesys.h \ + src/options.c src/options.h src/output.c src/output.h \ + src/parser.c src/parser.h src/settings.c src/settings.h \ + src/sha1.c src/sha1.h src/sort.c src/sort.h src/ui.c src/ui.h \ + src/util.c src/util.h src/websocket.c src/websocket.h \ + src/xmalloc.c src/xmalloc.h $(am__append_1) $(am__append_2) \ + $(am__append_3) $(am__append_4) +AM_CFLAGS = -O2 -DSYSCONFDIR=\"$(sysconfdir)\" \ + -Wno-long-long -Wall -W -Wnested-externs \ + -Wformat=2 -Wmissing-prototypes \ + -Wstrict-prototypes -Wmissing-declarations \ + -Wwrite-strings -Wshadow -Wpointer-arith \ + -Wsign-compare -Wbad-function-cast -Winline \ + -Wcast-align -Wextra \ + -Wdeclaration-after-statement \ + -Wno-missing-field-initializers +#AM_CFLAGS = -DDEBUG -O0 -g -DSYSCONFDIR=\"$(sysconfdir)\" \ +# -Wno-long-long -Wall -W -Wnested-externs \ +# -Wformat=2 -Wmissing-prototypes \ +# -Wstrict-prototypes -Wmissing-declarations \ +# -Wwrite-strings -Wshadow -Wpointer-arith \ +# -Wsign-compare -Wbad-function-cast -Winline \ +# -Wcast-align -Wextra -Wdeclaration-after-statement \ +# -Wno-missing-field-initializers +AM_LDFLAGS = -rdynamic +dist_man_MANS = goaccess.1 +SUBDIRS = po +ACLOCAL_AMFLAGS = -I m4 +EXTRA_DIST = config.rpath +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.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) --gnu'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu 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): + +src/config.h: src/stamp-h1 + @if test ! -f $@; then rm -f src/stamp-h1; else :; fi + @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) src/stamp-h1; else :; fi + +src/stamp-h1: $(top_srcdir)/src/config.h.in $(top_builddir)/config.status + @rm -f src/stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status src/config.h +$(top_srcdir)/src/config.h.in: $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f src/stamp-h1 + touch $@ + +distclean-hdr: + -rm -f src/config.h src/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) + +clean-noinstPROGRAMS: + -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) +src/$(am__dirstamp): + @$(MKDIR_P) src + @: > src/$(am__dirstamp) +src/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/$(DEPDIR) + @: > src/$(DEPDIR)/$(am__dirstamp) +src/bin2c.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +bin2c$(EXEEXT): $(bin2c_OBJECTS) $(bin2c_DEPENDENCIES) $(EXTRA_bin2c_DEPENDENCIES) + @rm -f bin2c$(EXEEXT) + $(LINK) $(bin2c_OBJECTS) $(bin2c_LDADD) $(LIBS) +src/base64.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/browsers.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/color.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/commons.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/csv.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/error.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/gdashboard.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/gdns.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/gholder.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/gmenu.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/goaccess.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/gslist.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/gstorage.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/gwsocket.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/json.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/opesys.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/options.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/output.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/parser.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/settings.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/sha1.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/sort.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/ui.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/util.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/websocket.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/xmalloc.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/tcabdb.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/tcbtdb.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/gkhash.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/geoip1.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/geoip2.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +goaccess$(EXEEXT): $(goaccess_OBJECTS) $(goaccess_DEPENDENCIES) $(EXTRA_goaccess_DEPENDENCIES) + @rm -f goaccess$(EXEEXT) + $(LINK) $(goaccess_OBJECTS) $(goaccess_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f src/base64.$(OBJEXT) + -rm -f src/bin2c.$(OBJEXT) + -rm -f src/browsers.$(OBJEXT) + -rm -f src/color.$(OBJEXT) + -rm -f src/commons.$(OBJEXT) + -rm -f src/csv.$(OBJEXT) + -rm -f src/error.$(OBJEXT) + -rm -f src/gdashboard.$(OBJEXT) + -rm -f src/gdns.$(OBJEXT) + -rm -f src/geoip1.$(OBJEXT) + -rm -f src/geoip2.$(OBJEXT) + -rm -f src/gholder.$(OBJEXT) + -rm -f src/gkhash.$(OBJEXT) + -rm -f src/gmenu.$(OBJEXT) + -rm -f src/goaccess.$(OBJEXT) + -rm -f src/gslist.$(OBJEXT) + -rm -f src/gstorage.$(OBJEXT) + -rm -f src/gwsocket.$(OBJEXT) + -rm -f src/json.$(OBJEXT) + -rm -f src/opesys.$(OBJEXT) + -rm -f src/options.$(OBJEXT) + -rm -f src/output.$(OBJEXT) + -rm -f src/parser.$(OBJEXT) + -rm -f src/settings.$(OBJEXT) + -rm -f src/sha1.$(OBJEXT) + -rm -f src/sort.$(OBJEXT) + -rm -f src/tcabdb.$(OBJEXT) + -rm -f src/tcbtdb.$(OBJEXT) + -rm -f src/ui.$(OBJEXT) + -rm -f src/util.$(OBJEXT) + -rm -f src/websocket.$(OBJEXT) + -rm -f src/xmalloc.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +include src/$(DEPDIR)/base64.Po +include src/$(DEPDIR)/bin2c.Po +include src/$(DEPDIR)/browsers.Po +include src/$(DEPDIR)/color.Po +include src/$(DEPDIR)/commons.Po +include src/$(DEPDIR)/csv.Po +include src/$(DEPDIR)/error.Po +include src/$(DEPDIR)/gdashboard.Po +include src/$(DEPDIR)/gdns.Po +include src/$(DEPDIR)/geoip1.Po +include src/$(DEPDIR)/geoip2.Po +include src/$(DEPDIR)/gholder.Po +include src/$(DEPDIR)/gkhash.Po +include src/$(DEPDIR)/gmenu.Po +include src/$(DEPDIR)/goaccess.Po +include src/$(DEPDIR)/gslist.Po +include src/$(DEPDIR)/gstorage.Po +include src/$(DEPDIR)/gwsocket.Po +include src/$(DEPDIR)/json.Po +include src/$(DEPDIR)/opesys.Po +include src/$(DEPDIR)/options.Po +include src/$(DEPDIR)/output.Po +include src/$(DEPDIR)/parser.Po +include src/$(DEPDIR)/settings.Po +include src/$(DEPDIR)/sha1.Po +include src/$(DEPDIR)/sort.Po +include src/$(DEPDIR)/tcabdb.Po +include src/$(DEPDIR)/tcbtdb.Po +include src/$(DEPDIR)/ui.Po +include src/$(DEPDIR)/util.Po +include src/$(DEPDIR)/websocket.Po +include src/$(DEPDIR)/xmalloc.Po + +.c.o: + depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ + $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ + $(am__mv) $$depbase.Tpo $$depbase.Po +# source='$<' object='$@' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(COMPILE) -c -o $@ $< + +.c.obj: + depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ + $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ + $(am__mv) $$depbase.Tpo $$depbase.Po +# source='$<' object='$@' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` +install-man1: $(dist_man_MANS) + @$(NORMAL_INSTALL) + @list1=''; \ + list2='$(dist_man_MANS)'; \ + test -n "$(man1dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ + { for i in $$list1; do echo "$$i"; done; \ + if test -n "$$list2"; then \ + for i in $$list2; do echo "$$i"; done \ + | sed -n '/\.1[a-z]*$$/p'; \ + fi; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) +install-dist_confDATA: $(dist_conf_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_conf_DATA)'; test -n "$(confdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(confdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(confdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(confdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(confdir)" || exit $$?; \ + done + +uninstall-dist_confDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_conf_DATA)'; test -n "$(confdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(confdir)'; $(am__uninstall_files_from_dir) + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + 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 +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + 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" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @list='$(MANS)'; if test -n "$$list"; then \ + list=`for p in $$list; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ + if test -n "$$list" && \ + grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ + echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ + grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ + echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ + echo " typically \`make maintainer-clean' will remove them" >&2; \ + exit 1; \ + else :; fi; \ + else :; fi + $(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 + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || 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__remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__remove_distdir) + +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__remove_distdir) + +dist-lzma: distdir + tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma + $(am__remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__remove_distdir) + +dist-tarZ: distdir + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__remove_distdir) + +dist-shar: distdir + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__remove_distdir) + +dist dist-all: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__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.lzma*) \ + lzma -dc $(distdir).tar.lzma | $(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 + mkdir $(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 --srcdir=.. --prefix="$$dc_install_base" \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + && $(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__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: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-recursive +all-am: Makefile $(PROGRAMS) $(MANS) $(DATA) +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(confdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +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) + -rm -f src/$(DEPDIR)/$(am__dirstamp) + -rm -f src/$(am__dirstamp) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-recursive + +clean-am: clean-binPROGRAMS clean-generic clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf src/$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-dist_confDATA install-man + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: install-man1 + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -rf src/$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-dist_confDATA \ + uninstall-man + +uninstall-man: uninstall-man1 + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all check \ + ctags-recursive install install-am install-strip \ + tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am am--refresh check check-am clean clean-binPROGRAMS \ + clean-generic clean-noinstPROGRAMS ctags ctags-recursive dist \ + dist-all dist-bzip2 dist-gzip dist-lzip dist-lzma 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-dist_confDATA install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-man1 install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs installdirs-am \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ + tags tags-recursive uninstall uninstall-am \ + uninstall-binPROGRAMS uninstall-dist_confDATA uninstall-man \ + uninstall-man1 + + +# Tpls +tpls.h: bin2c$(EXEEXT) resources/tpls.html + cat resources/tpls.html | sed "s/^[[:space:]]*//" | sed "/^$$/d" | tr -d "\r\n" > resources/tpls.html.tmp + ./bin2c resources/tpls.html.tmp src/tpls.h tpls +# ./bin2c resources/tpls.html src/tpls.h tpls +# Bootstrap +bootstrapcss.h: bin2c$(EXEEXT) resources/css/bootstrap.min.css + cat resources/css/bootstrap.min.css | sed "s/^[[:space:]]*//" | sed "/^$$/d" | tr -d "\r\n" > resources/css/bootstrap.min.css.tmp + ./bin2c resources/css/bootstrap.min.css.tmp src/bootstrapcss.h bootstrap_css +# ./bin2c resources/css/bootstrap.min.css src/bootstrapcss.h bootstrap_css +# Font Awesome +facss.h: bin2c$(EXEEXT) resources/css/fa.min.css + cat resources/css/fa.min.css | sed "s/^[[:space:]]*//" | sed "/^$$/d" | tr -d "\r\n" > resources/css/fa.min.css.tmp + ./bin2c resources/css/fa.min.css.tmp src/facss.h fa_css +# ./bin2c resources/css/fa.min.css src/facss.h fa_css +# App.css +appcss.h: bin2c$(EXEEXT) resources/css/app.css + cat resources/css/app.css | sed "s/^[[:space:]]*//" | sed "/^$$/d" | tr -d "\r\n" > resources/css/app.css.tmp + ./bin2c resources/css/app.css.tmp src/appcss.h app_css +# ./bin2c resources/css/app.css src/appcss.h app_css +# D3.js +d3js.h: bin2c$(EXEEXT) resources/js/d3.v3.min.js + cat resources/js/d3.v3.min.js | sed "s/^[[:space:]]*//" | sed "/^$$/d" | tr -d "\r\n" > resources/js/d3.v3.min.js.tmp + ./bin2c resources/js/d3.v3.min.js.tmp src/d3js.h d3_js +# ./bin2c resources/js/d3.v3.min.js src/d3js.h d3_js +# Hogan.js +hoganjs.h: bin2c$(EXEEXT) resources/js/hogan.min.js + cat resources/js/hogan.min.js | sed "s/^[[:space:]]*//" | sed "/^$$/d" | tr -d "\r\n" > resources/js/hogan.min.js.tmp + ./bin2c resources/js/hogan.min.js.tmp src/hoganjs.h hogan_js +# ./bin2c resources/js/hogan.min.js src/hoganjs.h hogan_js +# Charts.js +chartsjs.h: bin2c$(EXEEXT) resources/js/charts.js + cat resources/js/charts.js | sed -E "s@(,|;)[[:space:]]*//..*@\1@g" | sed -E "s@^[[:space:]]*//..*@@g" | sed "s/^[[:space:]]*//" | sed "/^$$/d" | tr -d "\r\n" > resources/js/charts.js.tmp + ./bin2c resources/js/charts.js.tmp src/chartsjs.h charts_js +# ./bin2c resources/js/charts.js src/chartsjs.h charts_js +# App.js +appjs.h: bin2c$(EXEEXT) resources/js/app.js + cat resources/js/app.js | sed -E "s@(,|;)[[:space:]]*//..*@\1@g" | sed -E "s@^[[:space:]]*//..*@@g" | sed "s/^[[:space:]]*//" | sed "/^$$/d" | tr -d "\r\n" > resources/js/app.js.tmp + ./bin2c resources/js/app.js.tmp src/appjs.h app_js +# ./bin2c resources/js/app.js src/appjs.h app_js + +# 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/goaccess++/Makefile.am b/goaccess++/Makefile.am new file mode 100644 index 0000000..ec26f9b --- /dev/null +++ b/goaccess++/Makefile.am @@ -0,0 +1,219 @@ +#AUTOMAKE_OPTIONS = foreign +bin_PROGRAMS = goaccess +AUTOMAKE_OPTIONS = subdir-objects + +dist_noinst_DATA = \ + resources/tpls.html \ + resources/css/app.css \ + resources/css/bootstrap.min.css \ + resources/css/fa.min.css \ + resources/js/app.js \ + resources/js/charts.js \ + resources/js/d3.v3.min.js \ + resources/js/hogan.min.js + +noinst_PROGRAMS = bin2c +bin2c_SOURCES = src/bin2c.c + +BUILT_SOURCES = \ + tpls.h \ + bootstrapcss.h \ + facss.h \ + appcss.h \ + d3js.h \ + hoganjs.h \ + chartsjs.h \ + appjs.h + +CLEANFILES = \ + src/tpls.h \ + src/bootstrapcss.h \ + src/facss.h \ + src/appcss.h \ + src/d3js.h \ + src/hoganjs.h \ + src/chartsjs.h \ + src/appjs.h \ + resources/tpls.html.tmp \ + resources/css/bootstrap.min.css.tmp \ + resources/css/fa.min.css.tmp \ + resources/css/app.css.tmp \ + resources/js/d3.v3.min.js.tmp \ + resources/js/hogan.min.js.tmp \ + resources/js/charts.js.tmp \ + resources/js/app.js.tmp + +# Tpls +tpls.h: bin2c$(EXEEXT) resources/tpls.html +if HAS_SEDTR + cat resources/tpls.html | sed "s/^[[:space:]]*//" | sed "/^$$/d" | tr -d "\r\n" > resources/tpls.html.tmp + ./bin2c resources/tpls.html.tmp src/tpls.h tpls +else + ./bin2c resources/tpls.html src/tpls.h tpls +endif +# Bootstrap +bootstrapcss.h: bin2c$(EXEEXT) resources/css/bootstrap.min.css +if HAS_SEDTR + cat resources/css/bootstrap.min.css | sed "s/^[[:space:]]*//" | sed "/^$$/d" | tr -d "\r\n" > resources/css/bootstrap.min.css.tmp + ./bin2c resources/css/bootstrap.min.css.tmp src/bootstrapcss.h bootstrap_css +else + ./bin2c resources/css/bootstrap.min.css src/bootstrapcss.h bootstrap_css +endif +# Font Awesome +facss.h: bin2c$(EXEEXT) resources/css/fa.min.css +if HAS_SEDTR + cat resources/css/fa.min.css | sed "s/^[[:space:]]*//" | sed "/^$$/d" | tr -d "\r\n" > resources/css/fa.min.css.tmp + ./bin2c resources/css/fa.min.css.tmp src/facss.h fa_css +else + ./bin2c resources/css/fa.min.css src/facss.h fa_css +endif +# App.css +appcss.h: bin2c$(EXEEXT) resources/css/app.css +if HAS_SEDTR + cat resources/css/app.css | sed "s/^[[:space:]]*//" | sed "/^$$/d" | tr -d "\r\n" > resources/css/app.css.tmp + ./bin2c resources/css/app.css.tmp src/appcss.h app_css +else + ./bin2c resources/css/app.css src/appcss.h app_css +endif +# D3.js +d3js.h: bin2c$(EXEEXT) resources/js/d3.v3.min.js +if HAS_SEDTR + cat resources/js/d3.v3.min.js | sed "s/^[[:space:]]*//" | sed "/^$$/d" | tr -d "\r\n" > resources/js/d3.v3.min.js.tmp + ./bin2c resources/js/d3.v3.min.js.tmp src/d3js.h d3_js +else + ./bin2c resources/js/d3.v3.min.js src/d3js.h d3_js +endif +# Hogan.js +hoganjs.h: bin2c$(EXEEXT) resources/js/hogan.min.js +if HAS_SEDTR + cat resources/js/hogan.min.js | sed "s/^[[:space:]]*//" | sed "/^$$/d" | tr -d "\r\n" > resources/js/hogan.min.js.tmp + ./bin2c resources/js/hogan.min.js.tmp src/hoganjs.h hogan_js +else + ./bin2c resources/js/hogan.min.js src/hoganjs.h hogan_js +endif +# Charts.js +chartsjs.h: bin2c$(EXEEXT) resources/js/charts.js +if HAS_SEDTR + cat resources/js/charts.js | sed -E "s@(,|;)[[:space:]]*//..*@\1@g" | sed -E "s@^[[:space:]]*//..*@@g" | sed "s/^[[:space:]]*//" | sed "/^$$/d" | tr -d "\r\n" > resources/js/charts.js.tmp + ./bin2c resources/js/charts.js.tmp src/chartsjs.h charts_js +else + ./bin2c resources/js/charts.js src/chartsjs.h charts_js +endif +# App.js +appjs.h: bin2c$(EXEEXT) resources/js/app.js +if HAS_SEDTR + cat resources/js/app.js | sed -E "s@(,|;)[[:space:]]*//..*@\1@g" | sed -E "s@^[[:space:]]*//..*@@g" | sed "s/^[[:space:]]*//" | sed "/^$$/d" | tr -d "\r\n" > resources/js/app.js.tmp + ./bin2c resources/js/app.js.tmp src/appjs.h app_js +else + ./bin2c resources/js/app.js src/appjs.h app_js +endif + +confdir = $(sysconfdir)/goaccess +dist_conf_DATA = config/goaccess.conf +dist_conf_DATA += config/browsers.list + +goaccess_SOURCES = \ + src/base64.c \ + src/base64.h \ + src/browsers.c \ + src/browsers.h \ + src/color.c \ + src/color.h \ + src/commons.c \ + src/commons.h \ + src/csv.c \ + src/csv.h \ + src/error.c \ + src/error.h \ + src/gdashboard.c \ + src/gdashboard.h \ + src/gdns.c \ + src/gdns.h \ + src/gholder.c \ + src/gholder.h \ + src/gmenu.c \ + src/gmenu.h \ + src/goaccess.c \ + src/goaccess.h \ + src/gslist.c \ + src/gslist.h \ + src/gstorage.c \ + src/gstorage.h \ + src/gwsocket.c \ + src/gwsocket.h \ + src/json.c \ + src/json.h \ + src/labels.h \ + src/opesys.c \ + src/opesys.h \ + src/options.c \ + src/options.h \ + src/output.c \ + src/output.h \ + src/parser.c \ + src/parser.h \ + src/settings.c \ + src/settings.h \ + src/sha1.c \ + src/sha1.h \ + src/sort.c \ + src/sort.h \ + src/ui.c \ + src/ui.h \ + src/util.c \ + src/util.h \ + src/websocket.c \ + src/websocket.h \ + src/xmalloc.c \ + src/xmalloc.h + +if TCB +goaccess_SOURCES += \ + src/tcabdb.c \ + src/tcabdb.h \ + src/tcbtdb.c \ + src/tcbtdb.h +else +goaccess_SOURCES += \ + src/khash.h \ + src/gkhash.c \ + src/gkhash.h +endif + +if GEOIP_LEGACY +goaccess_SOURCES += \ + src/geoip1.c \ + src/geoip1.h +endif + +if GEOIP_MMDB +goaccess_SOURCES += \ + src/geoip2.c \ + src/geoip1.h +endif + +if DEBUG +AM_CFLAGS = -DDEBUG -O0 -g -DSYSCONFDIR=\"$(sysconfdir)\" +else +AM_CFLAGS = -O2 -DSYSCONFDIR=\"$(sysconfdir)\" +endif + +if WITH_RDYNAMIC +AM_LDFLAGS = -rdynamic +endif + +AM_CFLAGS += -Wno-long-long -Wall -W -Wnested-externs -Wformat=2 +AM_CFLAGS += -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations +AM_CFLAGS += -Wwrite-strings -Wshadow -Wpointer-arith -Wsign-compare +AM_CFLAGS += -Wbad-function-cast -Winline -Wcast-align -Wextra +AM_CFLAGS += -Wdeclaration-after-statement -Wno-missing-field-initializers + +dist_man_MANS = goaccess.1 + +SUBDIRS = po + +ACLOCAL_AMFLAGS = -I m4 + +DEFS = -DLOCALEDIR=\"$(localedir)\" @DEFS@ + +EXTRA_DIST = config.rpath diff --git a/goaccess++/Makefile.in b/goaccess++/Makefile.in new file mode 100644 index 0000000..6ac1f92 --- /dev/null +++ b/goaccess++/Makefile.in @@ -0,0 +1,1268 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +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@ +bin_PROGRAMS = goaccess$(EXEEXT) +noinst_PROGRAMS = bin2c$(EXEEXT) +@TCB_TRUE@am__append_1 = \ +@TCB_TRUE@ src/tcabdb.c \ +@TCB_TRUE@ src/tcabdb.h \ +@TCB_TRUE@ src/tcbtdb.c \ +@TCB_TRUE@ src/tcbtdb.h + +@TCB_FALSE@am__append_2 = \ +@TCB_FALSE@ src/khash.h \ +@TCB_FALSE@ src/gkhash.c \ +@TCB_FALSE@ src/gkhash.h + +@GEOIP_LEGACY_TRUE@am__append_3 = \ +@GEOIP_LEGACY_TRUE@ src/geoip1.c \ +@GEOIP_LEGACY_TRUE@ src/geoip1.h + +@GEOIP_MMDB_TRUE@am__append_4 = \ +@GEOIP_MMDB_TRUE@ src/geoip2.c \ +@GEOIP_MMDB_TRUE@ src/geoip1.h + +subdir = . +DIST_COMMON = README $(am__configure_deps) $(dist_conf_DATA) \ + $(dist_man_MANS) $(dist_noinst_DATA) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(top_srcdir)/configure \ + $(top_srcdir)/src/config.h.in ABOUT-NLS AUTHORS COPYING \ + ChangeLog INSTALL NEWS TODO compile config.guess config.rpath \ + config.sub depcomp install-sh missing +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(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 = $(top_builddir)/src/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" \ + "$(DESTDIR)$(confdir)" +PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) +am__dirstamp = $(am__leading_dot)dirstamp +am_bin2c_OBJECTS = src/bin2c.$(OBJEXT) +bin2c_OBJECTS = $(am_bin2c_OBJECTS) +bin2c_LDADD = $(LDADD) +am__goaccess_SOURCES_DIST = src/base64.c src/base64.h src/browsers.c \ + src/browsers.h src/color.c src/color.h src/commons.c \ + src/commons.h src/csv.c src/csv.h src/error.c src/error.h \ + src/gdashboard.c src/gdashboard.h src/gdns.c src/gdns.h \ + src/gholder.c src/gholder.h src/gmenu.c src/gmenu.h \ + src/goaccess.c src/goaccess.h src/gslist.c src/gslist.h \ + src/gstorage.c src/gstorage.h src/gwsocket.c src/gwsocket.h \ + src/json.c src/json.h src/labels.h src/opesys.c src/opesys.h \ + src/options.c src/options.h src/output.c src/output.h \ + src/parser.c src/parser.h src/settings.c src/settings.h \ + src/sha1.c src/sha1.h src/sort.c src/sort.h src/ui.c src/ui.h \ + src/util.c src/util.h src/websocket.c src/websocket.h \ + src/xmalloc.c src/xmalloc.h src/tcabdb.c src/tcabdb.h \ + src/tcbtdb.c src/tcbtdb.h src/khash.h src/gkhash.c \ + src/gkhash.h src/geoip1.c src/geoip1.h src/geoip2.c +@TCB_TRUE@am__objects_1 = src/tcabdb.$(OBJEXT) src/tcbtdb.$(OBJEXT) +@TCB_FALSE@am__objects_2 = src/gkhash.$(OBJEXT) +@GEOIP_LEGACY_TRUE@am__objects_3 = src/geoip1.$(OBJEXT) +@GEOIP_MMDB_TRUE@am__objects_4 = src/geoip2.$(OBJEXT) +am_goaccess_OBJECTS = src/base64.$(OBJEXT) src/browsers.$(OBJEXT) \ + src/color.$(OBJEXT) src/commons.$(OBJEXT) src/csv.$(OBJEXT) \ + src/error.$(OBJEXT) src/gdashboard.$(OBJEXT) \ + src/gdns.$(OBJEXT) src/gholder.$(OBJEXT) src/gmenu.$(OBJEXT) \ + src/goaccess.$(OBJEXT) src/gslist.$(OBJEXT) \ + src/gstorage.$(OBJEXT) src/gwsocket.$(OBJEXT) \ + src/json.$(OBJEXT) src/opesys.$(OBJEXT) src/options.$(OBJEXT) \ + src/output.$(OBJEXT) src/parser.$(OBJEXT) \ + src/settings.$(OBJEXT) src/sha1.$(OBJEXT) src/sort.$(OBJEXT) \ + src/ui.$(OBJEXT) src/util.$(OBJEXT) src/websocket.$(OBJEXT) \ + src/xmalloc.$(OBJEXT) $(am__objects_1) $(am__objects_2) \ + $(am__objects_3) $(am__objects_4) +goaccess_OBJECTS = $(am_goaccess_OBJECTS) +goaccess_LDADD = $(LDADD) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(bin2c_SOURCES) $(goaccess_SOURCES) +DIST_SOURCES = $(bin2c_SOURCES) $(am__goaccess_SOURCES_DIST) +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +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; }; \ + } +man1dir = $(mandir)/man1 +NROFF = nroff +MANS = $(dist_man_MANS) +DATA = $(dist_conf_DATA) $(dist_noinst_DATA) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir dist dist-all distcheck +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +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__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +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@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = -DLOCALEDIR=\"$(localedir)\" @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +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@ +POSUB = @POSUB@ +POW_LIB = @POW_LIB@ +SED_CHECK = @SED_CHECK@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TR_CHECK = @TR_CHECK@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +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 = @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@ +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@ +AUTOMAKE_OPTIONS = subdir-objects +dist_noinst_DATA = \ + resources/tpls.html \ + resources/css/app.css \ + resources/css/bootstrap.min.css \ + resources/css/fa.min.css \ + resources/js/app.js \ + resources/js/charts.js \ + resources/js/d3.v3.min.js \ + resources/js/hogan.min.js + +bin2c_SOURCES = src/bin2c.c +BUILT_SOURCES = \ + tpls.h \ + bootstrapcss.h \ + facss.h \ + appcss.h \ + d3js.h \ + hoganjs.h \ + chartsjs.h \ + appjs.h + +CLEANFILES = \ + src/tpls.h \ + src/bootstrapcss.h \ + src/facss.h \ + src/appcss.h \ + src/d3js.h \ + src/hoganjs.h \ + src/chartsjs.h \ + src/appjs.h \ + resources/tpls.html.tmp \ + resources/css/bootstrap.min.css.tmp \ + resources/css/fa.min.css.tmp \ + resources/css/app.css.tmp \ + resources/js/d3.v3.min.js.tmp \ + resources/js/hogan.min.js.tmp \ + resources/js/charts.js.tmp \ + resources/js/app.js.tmp + +confdir = $(sysconfdir)/goaccess +dist_conf_DATA = config/goaccess.conf config/browsers.list +goaccess_SOURCES = src/base64.c src/base64.h src/browsers.c \ + src/browsers.h src/color.c src/color.h src/commons.c \ + src/commons.h src/csv.c src/csv.h src/error.c src/error.h \ + src/gdashboard.c src/gdashboard.h src/gdns.c src/gdns.h \ + src/gholder.c src/gholder.h src/gmenu.c src/gmenu.h \ + src/goaccess.c src/goaccess.h src/gslist.c src/gslist.h \ + src/gstorage.c src/gstorage.h src/gwsocket.c src/gwsocket.h \ + src/json.c src/json.h src/labels.h src/opesys.c src/opesys.h \ + src/options.c src/options.h src/output.c src/output.h \ + src/parser.c src/parser.h src/settings.c src/settings.h \ + src/sha1.c src/sha1.h src/sort.c src/sort.h src/ui.c src/ui.h \ + src/util.c src/util.h src/websocket.c src/websocket.h \ + src/xmalloc.c src/xmalloc.h $(am__append_1) $(am__append_2) \ + $(am__append_3) $(am__append_4) +@DEBUG_FALSE@AM_CFLAGS = -O2 -DSYSCONFDIR=\"$(sysconfdir)\" \ +@DEBUG_FALSE@ -Wno-long-long -Wall -W -Wnested-externs \ +@DEBUG_FALSE@ -Wformat=2 -Wmissing-prototypes \ +@DEBUG_FALSE@ -Wstrict-prototypes -Wmissing-declarations \ +@DEBUG_FALSE@ -Wwrite-strings -Wshadow -Wpointer-arith \ +@DEBUG_FALSE@ -Wsign-compare -Wbad-function-cast -Winline \ +@DEBUG_FALSE@ -Wcast-align -Wextra \ +@DEBUG_FALSE@ -Wdeclaration-after-statement \ +@DEBUG_FALSE@ -Wno-missing-field-initializers +@DEBUG_TRUE@AM_CFLAGS = -DDEBUG -O0 -g -DSYSCONFDIR=\"$(sysconfdir)\" \ +@DEBUG_TRUE@ -Wno-long-long -Wall -W -Wnested-externs \ +@DEBUG_TRUE@ -Wformat=2 -Wmissing-prototypes \ +@DEBUG_TRUE@ -Wstrict-prototypes -Wmissing-declarations \ +@DEBUG_TRUE@ -Wwrite-strings -Wshadow -Wpointer-arith \ +@DEBUG_TRUE@ -Wsign-compare -Wbad-function-cast -Winline \ +@DEBUG_TRUE@ -Wcast-align -Wextra -Wdeclaration-after-statement \ +@DEBUG_TRUE@ -Wno-missing-field-initializers +@WITH_RDYNAMIC_TRUE@AM_LDFLAGS = -rdynamic +dist_man_MANS = goaccess.1 +SUBDIRS = po +ACLOCAL_AMFLAGS = -I m4 +EXTRA_DIST = config.rpath +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.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) --gnu'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu 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): + +src/config.h: src/stamp-h1 + @if test ! -f $@; then rm -f src/stamp-h1; else :; fi + @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) src/stamp-h1; else :; fi + +src/stamp-h1: $(top_srcdir)/src/config.h.in $(top_builddir)/config.status + @rm -f src/stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status src/config.h +$(top_srcdir)/src/config.h.in: $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f src/stamp-h1 + touch $@ + +distclean-hdr: + -rm -f src/config.h src/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) + +clean-noinstPROGRAMS: + -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) +src/$(am__dirstamp): + @$(MKDIR_P) src + @: > src/$(am__dirstamp) +src/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/$(DEPDIR) + @: > src/$(DEPDIR)/$(am__dirstamp) +src/bin2c.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +bin2c$(EXEEXT): $(bin2c_OBJECTS) $(bin2c_DEPENDENCIES) $(EXTRA_bin2c_DEPENDENCIES) + @rm -f bin2c$(EXEEXT) + $(LINK) $(bin2c_OBJECTS) $(bin2c_LDADD) $(LIBS) +src/base64.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/browsers.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/color.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/commons.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/csv.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/error.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/gdashboard.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/gdns.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/gholder.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/gmenu.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/goaccess.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/gslist.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/gstorage.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/gwsocket.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/json.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/opesys.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/options.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/output.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/parser.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/settings.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/sha1.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/sort.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/ui.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/util.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/websocket.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/xmalloc.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/tcabdb.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/tcbtdb.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/gkhash.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/geoip1.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/geoip2.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +goaccess$(EXEEXT): $(goaccess_OBJECTS) $(goaccess_DEPENDENCIES) $(EXTRA_goaccess_DEPENDENCIES) + @rm -f goaccess$(EXEEXT) + $(LINK) $(goaccess_OBJECTS) $(goaccess_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f src/base64.$(OBJEXT) + -rm -f src/bin2c.$(OBJEXT) + -rm -f src/browsers.$(OBJEXT) + -rm -f src/color.$(OBJEXT) + -rm -f src/commons.$(OBJEXT) + -rm -f src/csv.$(OBJEXT) + -rm -f src/error.$(OBJEXT) + -rm -f src/gdashboard.$(OBJEXT) + -rm -f src/gdns.$(OBJEXT) + -rm -f src/geoip1.$(OBJEXT) + -rm -f src/geoip2.$(OBJEXT) + -rm -f src/gholder.$(OBJEXT) + -rm -f src/gkhash.$(OBJEXT) + -rm -f src/gmenu.$(OBJEXT) + -rm -f src/goaccess.$(OBJEXT) + -rm -f src/gslist.$(OBJEXT) + -rm -f src/gstorage.$(OBJEXT) + -rm -f src/gwsocket.$(OBJEXT) + -rm -f src/json.$(OBJEXT) + -rm -f src/opesys.$(OBJEXT) + -rm -f src/options.$(OBJEXT) + -rm -f src/output.$(OBJEXT) + -rm -f src/parser.$(OBJEXT) + -rm -f src/settings.$(OBJEXT) + -rm -f src/sha1.$(OBJEXT) + -rm -f src/sort.$(OBJEXT) + -rm -f src/tcabdb.$(OBJEXT) + -rm -f src/tcbtdb.$(OBJEXT) + -rm -f src/ui.$(OBJEXT) + -rm -f src/util.$(OBJEXT) + -rm -f src/websocket.$(OBJEXT) + -rm -f src/xmalloc.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/base64.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bin2c.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/browsers.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/color.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/commons.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/csv.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/error.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gdashboard.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gdns.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/geoip1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/geoip2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gholder.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gkhash.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gmenu.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/goaccess.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gslist.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gstorage.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gwsocket.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/json.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/opesys.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/options.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/output.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/parser.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/settings.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/sha1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/sort.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/tcabdb.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/tcbtdb.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/ui.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/util.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/websocket.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/xmalloc.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` +install-man1: $(dist_man_MANS) + @$(NORMAL_INSTALL) + @list1=''; \ + list2='$(dist_man_MANS)'; \ + test -n "$(man1dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ + { for i in $$list1; do echo "$$i"; done; \ + if test -n "$$list2"; then \ + for i in $$list2; do echo "$$i"; done \ + | sed -n '/\.1[a-z]*$$/p'; \ + fi; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) +install-dist_confDATA: $(dist_conf_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_conf_DATA)'; test -n "$(confdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(confdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(confdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(confdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(confdir)" || exit $$?; \ + done + +uninstall-dist_confDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_conf_DATA)'; test -n "$(confdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(confdir)'; $(am__uninstall_files_from_dir) + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + 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 +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + 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" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @list='$(MANS)'; if test -n "$$list"; then \ + list=`for p in $$list; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ + if test -n "$$list" && \ + grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ + echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ + grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ + echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ + echo " typically \`make maintainer-clean' will remove them" >&2; \ + exit 1; \ + else :; fi; \ + else :; fi + $(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 + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || 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__remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__remove_distdir) + +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__remove_distdir) + +dist-lzma: distdir + tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma + $(am__remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__remove_distdir) + +dist-tarZ: distdir + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__remove_distdir) + +dist-shar: distdir + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__remove_distdir) + +dist dist-all: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__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.lzma*) \ + lzma -dc $(distdir).tar.lzma | $(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 + mkdir $(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 --srcdir=.. --prefix="$$dc_install_base" \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + && $(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__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: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-recursive +all-am: Makefile $(PROGRAMS) $(MANS) $(DATA) +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(confdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +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) + -rm -f src/$(DEPDIR)/$(am__dirstamp) + -rm -f src/$(am__dirstamp) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-recursive + +clean-am: clean-binPROGRAMS clean-generic clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf src/$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-dist_confDATA install-man + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: install-man1 + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -rf src/$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-dist_confDATA \ + uninstall-man + +uninstall-man: uninstall-man1 + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all check \ + ctags-recursive install install-am install-strip \ + tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am am--refresh check check-am clean clean-binPROGRAMS \ + clean-generic clean-noinstPROGRAMS ctags ctags-recursive dist \ + dist-all dist-bzip2 dist-gzip dist-lzip dist-lzma 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-dist_confDATA install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-man1 install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs installdirs-am \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ + tags tags-recursive uninstall uninstall-am \ + uninstall-binPROGRAMS uninstall-dist_confDATA uninstall-man \ + uninstall-man1 + + +# Tpls +tpls.h: bin2c$(EXEEXT) resources/tpls.html +@HAS_SEDTR_TRUE@ cat resources/tpls.html | sed "s/^[[:space:]]*//" | sed "/^$$/d" | tr -d "\r\n" > resources/tpls.html.tmp +@HAS_SEDTR_TRUE@ ./bin2c resources/tpls.html.tmp src/tpls.h tpls +@HAS_SEDTR_FALSE@ ./bin2c resources/tpls.html src/tpls.h tpls +# Bootstrap +bootstrapcss.h: bin2c$(EXEEXT) resources/css/bootstrap.min.css +@HAS_SEDTR_TRUE@ cat resources/css/bootstrap.min.css | sed "s/^[[:space:]]*//" | sed "/^$$/d" | tr -d "\r\n" > resources/css/bootstrap.min.css.tmp +@HAS_SEDTR_TRUE@ ./bin2c resources/css/bootstrap.min.css.tmp src/bootstrapcss.h bootstrap_css +@HAS_SEDTR_FALSE@ ./bin2c resources/css/bootstrap.min.css src/bootstrapcss.h bootstrap_css +# Font Awesome +facss.h: bin2c$(EXEEXT) resources/css/fa.min.css +@HAS_SEDTR_TRUE@ cat resources/css/fa.min.css | sed "s/^[[:space:]]*//" | sed "/^$$/d" | tr -d "\r\n" > resources/css/fa.min.css.tmp +@HAS_SEDTR_TRUE@ ./bin2c resources/css/fa.min.css.tmp src/facss.h fa_css +@HAS_SEDTR_FALSE@ ./bin2c resources/css/fa.min.css src/facss.h fa_css +# App.css +appcss.h: bin2c$(EXEEXT) resources/css/app.css +@HAS_SEDTR_TRUE@ cat resources/css/app.css | sed "s/^[[:space:]]*//" | sed "/^$$/d" | tr -d "\r\n" > resources/css/app.css.tmp +@HAS_SEDTR_TRUE@ ./bin2c resources/css/app.css.tmp src/appcss.h app_css +@HAS_SEDTR_FALSE@ ./bin2c resources/css/app.css src/appcss.h app_css +# D3.js +d3js.h: bin2c$(EXEEXT) resources/js/d3.v3.min.js +@HAS_SEDTR_TRUE@ cat resources/js/d3.v3.min.js | sed "s/^[[:space:]]*//" | sed "/^$$/d" | tr -d "\r\n" > resources/js/d3.v3.min.js.tmp +@HAS_SEDTR_TRUE@ ./bin2c resources/js/d3.v3.min.js.tmp src/d3js.h d3_js +@HAS_SEDTR_FALSE@ ./bin2c resources/js/d3.v3.min.js src/d3js.h d3_js +# Hogan.js +hoganjs.h: bin2c$(EXEEXT) resources/js/hogan.min.js +@HAS_SEDTR_TRUE@ cat resources/js/hogan.min.js | sed "s/^[[:space:]]*//" | sed "/^$$/d" | tr -d "\r\n" > resources/js/hogan.min.js.tmp +@HAS_SEDTR_TRUE@ ./bin2c resources/js/hogan.min.js.tmp src/hoganjs.h hogan_js +@HAS_SEDTR_FALSE@ ./bin2c resources/js/hogan.min.js src/hoganjs.h hogan_js +# Charts.js +chartsjs.h: bin2c$(EXEEXT) resources/js/charts.js +@HAS_SEDTR_TRUE@ cat resources/js/charts.js | sed -E "s@(,|;)[[:space:]]*//..*@\1@g" | sed -E "s@^[[:space:]]*//..*@@g" | sed "s/^[[:space:]]*//" | sed "/^$$/d" | tr -d "\r\n" > resources/js/charts.js.tmp +@HAS_SEDTR_TRUE@ ./bin2c resources/js/charts.js.tmp src/chartsjs.h charts_js +@HAS_SEDTR_FALSE@ ./bin2c resources/js/charts.js src/chartsjs.h charts_js +# App.js +appjs.h: bin2c$(EXEEXT) resources/js/app.js +@HAS_SEDTR_TRUE@ cat resources/js/app.js | sed -E "s@(,|;)[[:space:]]*//..*@\1@g" | sed -E "s@^[[:space:]]*//..*@@g" | sed "s/^[[:space:]]*//" | sed "/^$$/d" | tr -d "\r\n" > resources/js/app.js.tmp +@HAS_SEDTR_TRUE@ ./bin2c resources/js/app.js.tmp src/appjs.h app_js +@HAS_SEDTR_FALSE@ ./bin2c resources/js/app.js src/appjs.h app_js + +# 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/goaccess++/NEWS b/goaccess++/NEWS new file mode 100644 index 0000000..072705c --- /dev/null +++ b/goaccess++/NEWS @@ -0,0 +1,80 @@ +Copyright (C) 2009-2018 +Gerardo Orellana + +* Version history: + - 1.3 [Friday, November 23, 2018] + . GoAccess 1.3 Released. See ChangeLog for new features/bug-fixes. + - 1.2 [Tuesday, March 07, 2017] + . GoAccess 1.2 Released. See ChangeLog for new features/bug-fixes. + - 1.1.1 [Wednesday, November 23, 2016] + . GoAccess 1.1.1 Released. See ChangeLog for new features/bug-fixes. + - 1.1 [Tuesday, November 08, 2016] + . GoAccess 1.1 Released. See ChangeLog for new features/bug-fixes. + - 1.0.2 [Tuesday, July 05, 2016] + . GoAccess 1.0.2 Released. See ChangeLog for new features/bug-fixes. + - 1.0.1 [Friday, June 17, 2016] + . GoAccess 1.0.1 Released. See ChangeLog for new features/bug-fixes. + - 1.0 [Thursday, June 09, 2016] + . GoAccess 1.0 Released. See ChangeLog for new features/bug-fixes. + - 0.9.8 [Monday, February 29, 2016] + . GoAccess 0.9.8 Released. See ChangeLog for new features/bug-fixes. + - 0.9.7 [Monday, December 21, 2015] + . GoAccess 0.9.7 Released. See ChangeLog for new features/bug-fixes. + - 0.9.6 [Tuesday, October 27, 2015] + . GoAccess 0.9.6 Released. See ChangeLog for new features/bug-fixes. + - 0.9.5 [Thursday, October 22, 2015] + . GoAccess 0.9.5 Released. See ChangeLog for new features/bug-fixes. + - 0.9.4 [Tuesday, September 08 , 2015] + . GoAccess 0.9.4 Released. See ChangeLog for new features/bug-fixes. + - 0.9.3 [Wednesday, August 28, 2015] + . GoAccess 0.9.3 Released. See ChangeLog for new features/bug-fixes. + - 0.9.2 [Monday, July 06, 2015] + . GoAccess 0.9.2 Released. See ChangeLog for new features/bug-fixes. + - 0.9.1 [Tuesday, May 26, 2015] + . GoAccess 0.9.1 Released. See ChangeLog for new features/bug-fixes. + - 0.9 [Thursday, March 19, 2015] + . GoAccess 0.9 Released. See ChangeLog for new features/bug-fixes. + - 0.8.5 [Sunday, September 14, 2014] + . GoAccess 0.8.5 Released. See ChangeLog for new features/bug-fixes. + - 0.8.4 [Monday, September 08, 2014] + . GoAccess 0.8.4 Released. See ChangeLog for new features/bug-fixes. + - 0.8.3 [Monday, July 28, 2014] + . GoAccess 0.8.3 Released. See ChangeLog for new features/bug-fixes. + - 0.8.2 [Monday, July 21, 2014] + . GoAccess 0.8.2 Released. See ChangeLog for new features/bug-fixes. + - 0.8.1 [Monday, June 16, 2014] + . GoAccess 0.8.1 Released. See ChangeLog for new features/bug-fixes. + - 0.8 [Monday, May 20, 2013] + . GoAccess 0.8 Released. See ChangeLog for new features/bug-fixes. + - 0.7.1 [Monday, February 17, 2014] + . GoAccess 0.7.1 Released. See ChangeLog for new features/bug-fixes. + - 0.7 [Monday, December 16, 2013] + . GoAccess 0.7 Released. See ChangeLog for new features/bug-fixes. + - 0.6.1 [Monday, October 07, 2013] + . GoAccess 0.6.1 Released. See ChangeLog for new features/bug-fixes. + - 0.6 [Monday, July 15, 2013] + . GoAccess 0.6 Released. See ChangeLog for new features/bug-fixes. + - 0.5 [Monday, June 04, 2012] + . GoAccess 0.5 Released. See ChangeLog for new features/bug-fixes. + - 0.4.2 [Monday, January 03, 2011] + . GoAccess 0.4.2 Released. See ChangeLog for new features/bug-fixes. + - 0.4.1 [Monday, December 13, 2010] + . GoAccess 0.4.1 Released. See ChangeLog for new features/bug-fixes. + - 0.4 [Tuesday, November 30, 2010] + . GoAccess 0.4 Released. See ChangeLog for new features/bug-fixes. + - 0.3.3 [Monday, September 27, 2010] + . GoAccess 0.3.3 Released. See ChangeLog for new features/bug-fixes. + - 0.3.2 [Thursday, September 09 2010] + . GoAccess 0.3.2 Released. See ChangeLog for new features/bug-fixes. + - 0.3.1 [Friday, September 03, 2010] + . GoAccess 0.3.1 Released. See ChangeLog for new features/bug-fixes. + - 0.3 [Sunday, August 29, 2010] + . GoAccess 0.3 Released. See ChangeLog for new features/bug-fixes. + - 0.2 [Sunday, July 25, 2010] + . GoAccess 0.2 Released. See ChangeLog for new features/bug-fixes. + - 0.1.2 [Tuesday, July 13, 2010] + . GoAccess 0.1.2 Released. See ChangeLog for new features/bug-fixes. + - 0.1.1 [Saturday, July 10, 2010] + . GoAccess 0.1.1 Released. See ChangeLog for new features/bug-fixes. + - 0.1 [Wednesday, July 07, 2010] + . Welcome to the GoAccess 0.1 Released. diff --git a/goaccess++/README b/goaccess++/README new file mode 100644 index 0000000..c573004 --- /dev/null +++ b/goaccess++/README @@ -0,0 +1,100 @@ +What is it? +------------- +GoAccess is an open source real-time web log analyzer and interactive viewer +that runs in a terminal in *nix systems or through your browser. + +It provides fast and valuable HTTP statistics for system administrators that +require a visual server report on the fly. + +Features +------------------------------- +GoAccess parses the specified web log file and +outputs the data to the X terminal. Features include: + + * Completely Real Time + All panels and metrics are timed to be updated every 200 ms on the terminal + output and every second on the HTML output. + + * No configuration needed + You can just run it against your access log file, pick the log format and + let GoAccess parse the access log and show you the stats. + + * Track Application Response Time + Track the time taken to serve the request. Extremely useful if you want to + track pages that are slowing down your site. + + * Nearly All Web Log Formats + GoAccess allows any custom log format string. Predefined options include, + Apache, Nginx, Amazon S3, Elastic Load Balancing, CloudFront, etc + + * Incremental Log Processing + Need data persistence? GoAccess has the ability to process logs incrementally + through the on-disk B+Tree database. + + * Only one dependency + GoAccess is written in C. To run it, you only need ncurses as a dependency. + That's it. It even has its own Web Socket server - http://gwsocket.io/. + + * Visitors + Determine the amount of hits, visitors, bandwidth, and metrics for slowest + running requests by the hour, or date. + + * Metrics per Virtual Host + Have multiple Virtual Hosts (Server Blocks)? A panel that displays which + virtual host is consuming most of the web server resources. + + * Color Scheme Customizable + Tailor GoAccess to suit your own color taste/schemes. Either through the + terminal, or by simply updating the stylesheet on the HTML output. + + * Support for large datasets + GoAccess features an on-disk B+Tree storage for large datasets where it is not + possible to fit everything in memory. + + * Docker support + GoAccess comes with a default Docker (https://hub.docker.com/r/allinurl/goaccess/) + that will listen for HTTP connections on port 7890. Although, you can still + fully configure it, by using Volume mapping and editing goaccess.conf. + + * and more... visit https://goaccess.io for more details. + + +Why GoAccess? +------------- +GoAccess was designed to be a fast, terminal-based log analyzer. Its core idea +is to quickly analyze and view web server statistics in real time without +needing to use your browser (great if you want to do a quick analysis of your +access log via SSH, or if you simply love working in the terminal). + +While the terminal output is the default output, it has the capability to +generate a complete real-time HTML report, as well as a JSON, and CSV report. + +You can see it more of a monitor command tool than anything else. + +Keys +---- +The user can make use of the following keys: + + * ^F1^ or ^h^ Main help, + * ^F5^ Redraw [main window], + * ^q^ Quit the program, current window or module, + * ^o^ or ^ENTER^ Expand selected module, + * ^[Shift]0-9^ Set selected module to active, + * ^Up^ arrow Scroll up main dashboard, + * ^Down^ arrow Scroll down main dashboard, + * ^j^ Scroll down within expanded module, + * ^k^ Scroll up within expanded module, + * ^c^ Set or change scheme color, + * ^CTRL^ + ^f^ Scroll forward one screen within, + * active module, + * ^CTRL^ + ^b^ Scroll backward one screen within, + * active module, + * ^TAB^ Iterate modules (forward), + * ^SHIFT^ + ^TAB^ Iterate modules (backward), + * ^s^ Sort options for current module, + * ^/^ Search across all modules, + * ^n^ Find position of the next occurrence, + * ^g^ Move to the first item or top of screen, + * ^G^ Move to the last item or bottom of screen, + +Examples can be found by running `man goaccess`. diff --git a/goaccess++/TODO b/goaccess++/TODO new file mode 100644 index 0000000..d9abf21 --- /dev/null +++ b/goaccess++/TODO @@ -0,0 +1,10 @@ +1Copyright (C) 2009-2018 +6erardo Orellana + +For a more comprehensive list of to-do items, please refer to the GitHub site. +https://github.com/allinurl/goaccess/issues + +or visit http://goaccess.io/faq#todo + +If you are interested in working on any of the items listed in there, email +goaccess@prosoftcorp.com or better, open a new issue: diff --git a/goaccess++/aclocal.m4 b/goaccess++/aclocal.m4 new file mode 100644 index 0000000..b04779f --- /dev/null +++ b/goaccess++/aclocal.m4 @@ -0,0 +1,1015 @@ +# generated automatically by aclocal 1.11.6 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2007, 2008, 2009, 2010, 2011 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_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'.])]) + +# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 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. + +# serial 1 + +# 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.11' +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.11.6], [], + [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.11.6])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, 2003, 2005, 2011 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. + +# serial 1 + +# 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, 2000, 2001, 2003, 2004, 2005, 2006, 2008 +# 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. + +# serial 9 + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ(2.52)dnl + ifelse([$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, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, +# 2010, 2011 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. + +# serial 12 + +# 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", "GCJ", or "OBJC". +# 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 + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" 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 8's {/usr,}/bin/sh. + touch 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, +[ --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors]) +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, 2000, 2001, 2002, 2003, 2004, 2005, 2008 +# 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. + +#serial 5 + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Autoconf 2.62 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"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //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' -e 's/\$U/'"$U"'/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, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2008, 2009 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. + +# serial 16 + +# 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. + +# 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.62])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], +[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], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, + [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([AM_PROG_MKDIR_P])dnl +# 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)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl +]) +_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl +dnl The `parallel-tests' driver may need to know about EXEEXT, so add the +dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro +dnl 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 +]) + +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, 2003, 2005, 2008, 2011 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. + +# serial 1 + +# 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, 2005 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. + +# serial 2 + +# 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, 2002, 2003, 2005, 2009 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. + +# serial 4 + +# 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 +]) + +# Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2008 +# 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. + +# serial 6 + +# AM_PROG_CC_C_O +# -------------- +# Like AC_PROG_CC_C_O, but changed for automake. +AC_DEFUN([AM_PROG_CC_C_O], +[AC_REQUIRE([AC_PROG_CC_C_O])dnl +AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +# FIXME: we rely on the cache variable name because +# there is no other way. +set dummy $CC +am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` +eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o +if test "$am_t" != 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 +dnl Make sure AC_PROG_CC is never called again, or it will override our +dnl setting of CC. +m4_define([AC_PROG_CC], + [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])]) +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 +# 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. + +# serial 6 + +# 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 supports --run. +# If it does, 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 --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) + +# Copyright (C) 2003, 2004, 2005, 2006, 2011 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. + +# serial 1 + +# AM_PROG_MKDIR_P +# --------------- +# Check for `mkdir -p'. +AC_DEFUN([AM_PROG_MKDIR_P], +[AC_PREREQ([2.60])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, +dnl while keeping a definition of mkdir_p for backward compatibility. +dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. +dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of +dnl Makefile.ins that do not define MKDIR_P, so we do our own +dnl adjustment using top_builddir (which is defined more often than +dnl MKDIR_P). +AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl +case $mkdir_p in + [[\\/$]]* | ?:[[\\/]]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 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. + +# serial 5 + +# _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])]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 +# 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. + +# serial 5 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# 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 ( + 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 + rm -f conftest.file + 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 + + 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)]) + +# Copyright (C) 2001, 2003, 2005, 2011 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. + +# serial 1 + +# 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, 2008, 2010 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. + +# serial 3 + +# _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, 2005, 2012 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. + +# serial 2 + +# _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}']) +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + [m4_case([$1], [ustar],, [pax],, + [m4_fatal([Unknown tar format])]) +AC_MSG_CHECKING([how to create a $1 tar archive]) +# Loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' +_am_tools=${am_cv_prog_tar_$1-$_am_tools} +# Do not fold the above two line into one, because Tru64 sh and +# Solaris sh will not grok spaces in the rhs of `-'. +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 + +m4_include([m4/gettext.m4]) +m4_include([m4/iconv.m4]) +m4_include([m4/intlmacosx.m4]) +m4_include([m4/lib-ld.m4]) +m4_include([m4/lib-link.m4]) +m4_include([m4/lib-prefix.m4]) +m4_include([m4/nls.m4]) +m4_include([m4/po.m4]) +m4_include([m4/progtest.m4]) diff --git a/goaccess++/bin2c b/goaccess++/bin2c new file mode 100644 index 0000000000000000000000000000000000000000..7a5bd87ad2d946bff151958a06ab975f77f44d01 GIT binary patch literal 17096 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 P{+sneVwO$8#. +# +# 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 + 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/goaccess++/config.guess b/goaccess++/config.guess new file mode 100644 index 0000000..d622a44 --- /dev/null +++ b/goaccess++/config.guess @@ -0,0 +1,1530 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +# 2011, 2012 Free Software Foundation, Inc. + +timestamp='2012-02-10' + +# 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 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, 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 Per Bothner. Please send patches (context +# diff format) to and include a ChangeLog +# entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# 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 + +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 (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, +2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 +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 + +# 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 ;; + *: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 ;; + *: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-gnu`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/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + aarch64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo ${UNAME_MACHINE}-unknown-linux-gnu + 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="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${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-gnu + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo ${UNAME_MACHINE}-unknown-linux-gnueabi + else + echo ${UNAME_MACHINE}-unknown-linux-gnueabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + cris:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-gnu + exit ;; + frv:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + hexagon:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + i*86:Linux:*:*) + LIBC=gnu + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + 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-gnu"; exit; } + ;; + or32:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-gnu + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + 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-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + tile*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; + x86_64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + 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 ;; + 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 + case $UNAME_PROCESSOR in + i386) + eval $set_cc_for_build + 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 + UNAME_PROCESSOR="x86_64" + fi + fi ;; + unknown) UNAME_PROCESSOR=powerpc ;; + esac + 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 + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +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/goaccess++/config.log b/goaccess++/config.log new file mode 100644 index 0000000..4cbbf00 --- /dev/null +++ b/goaccess++/config.log @@ -0,0 +1,1751 @@ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by goaccess configure 1.3, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ ./configure --enable-utf8 --enable-geoip=legacy + +## --------- ## +## Platform. ## +## --------- ## + +hostname = ubuntu +uname -m = x86_64 +uname -r = 5.15.0-105-generic +uname -s = Linux +uname -v = #115~20.04.1-Ubuntu SMP Mon Apr 15 17:33:04 UTC 2024 + +/usr/bin/uname -p = x86_64 +/bin/uname -X = unknown + +/bin/arch = x86_64 +/usr/bin/arch -k = unknown +/usr/convex/getsysinfo = unknown +/usr/bin/hostinfo = unknown +/bin/machine = unknown +/usr/bin/oslevel = unknown +/bin/universe = unknown + +PATH: /usr/local/sbin +PATH: /usr/local/bin +PATH: /usr/sbin +PATH: /usr/bin +PATH: /sbin +PATH: /bin +PATH: /usr/games +PATH: /usr/local/games +PATH: /snap/bin + + +## ----------- ## +## Core tests. ## +## ----------- ## + +configure:2443: checking for a BSD-compatible install +configure:2511: result: /usr/bin/install -c +configure:2522: checking whether build environment is sane +configure:2572: result: yes +configure:2713: checking for a thread-safe mkdir -p +configure:2752: result: /usr/bin/mkdir -p +configure:2765: checking for gawk +configure:2795: result: no +configure:2765: checking for mawk +configure:2781: found /usr/bin/mawk +configure:2792: result: mawk +configure:2803: checking whether make sets $(MAKE) +configure:2825: result: yes +configure:2964: checking for gcc +configure:2980: found /usr/bin/gcc +configure:2991: result: gcc +configure:3220: checking for C compiler version +configure:3229: gcc --version >&5 +gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0 +Copyright (C) 2019 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. + +configure:3240: $? = 0 +configure:3229: gcc -v >&5 +Using built-in specs. +COLLECT_GCC=gcc +COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper +OFFLOAD_TARGET_NAMES=nvptx-none:hsa +OFFLOAD_TARGET_DEFAULT=1 +Target: x86_64-linux-gnu +Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.4.0-1ubuntu1~20.04.2' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-9-9QDOt0/gcc-9-9.4.0/debian/tmp-nvptx/usr,hsa --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu +Thread model: posix +gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2) +configure:3240: $? = 0 +configure:3229: gcc -V >&5 +gcc: error: unrecognized command line option '-V' +gcc: fatal error: no input files +compilation terminated. +configure:3240: $? = 1 +configure:3229: gcc -qversion >&5 +gcc: error: unrecognized command line option '-qversion'; did you mean '--version'? +gcc: fatal error: no input files +compilation terminated. +configure:3240: $? = 1 +configure:3260: checking whether the C compiler works +configure:3282: gcc conftest.c >&5 +configure:3286: $? = 0 +configure:3334: result: yes +configure:3337: checking for C compiler default output file name +configure:3339: result: a.out +configure:3345: checking for suffix of executables +configure:3352: gcc -o conftest conftest.c >&5 +configure:3356: $? = 0 +configure:3378: result: +configure:3400: checking whether we are cross compiling +configure:3408: gcc -o conftest conftest.c >&5 +configure:3412: $? = 0 +configure:3419: ./conftest +configure:3423: $? = 0 +configure:3411: result: no +configure:3416: checking for suffix of object files +configure:3438: gcc -c conftest.c >&5 +configure:3442: $? = 0 +configure:3463: result: o +configure:3467: checking whether we are using the GNU C compiler +configure:3486: gcc -c conftest.c >&5 +configure:3486: $? = 0 +configure:3495: result: yes +configure:3504: checking whether gcc accepts -g +configure:3524: gcc -c -g conftest.c >&5 +configure:3524: $? = 0 +configure:3565: result: yes +configure:3582: checking for gcc option to accept ISO C89 +configure:3645: gcc -c conftest.c >&5 +configure:3645: $? = 0 +configure:3658: result: none needed +configure:3689: checking for style of include used by make +configure:3717: result: GNU +configure:3743: checking dependency style of gcc +configure:3854: result: gcc3 +configure:3870: checking whether gcc and cc understand -c and -o together +configure:3901: gcc -c conftest.c -o conftest2.o >&5 +configure:3905: $? = 0 +configure:3911: gcc -c conftest.c -o conftest2.o >&5 +configure:3915: $? = 0 +configure:3926: cc -c conftest.c >&5 +configure:3930: $? = 0 +configure:3938: cc -c conftest.c -o conftest2.o >&5 +configure:3942: $? = 0 +configure:3948: cc -c conftest.c -o conftest2.o >&5 +configure:3952: $? = 0 +configure:3970: result: yes +configure:3997: checking whether NLS is requested +configure:4006: result: yes +configure:4047: checking for msgfmt +configure:4082: result: no +configure:4088: checking for gmsgfmt +configure:4119: result: : +configure:4170: checking for xgettext +configure:4205: result: no +configure:4248: checking for msgmerge +configure:4282: result: no +configure:4316: checking build system type +configure:4330: result: x86_64-unknown-linux-gnu +configure:4350: checking host system type +configure:4363: result: x86_64-unknown-linux-gnu +configure:4407: checking for ld used by GCC +configure:4471: result: /usr/bin/ld +configure:4478: checking if the linker (/usr/bin/ld) is GNU ld +configure:4491: result: yes +configure:4498: checking for shared library run path origin +configure:4511: result: done +configure:4536: checking how to run the C preprocessor +configure:4567: gcc -E conftest.c +configure:4567: $? = 0 +configure:4581: gcc -E conftest.c +conftest.c:11:10: fatal error: ac_nonexistent.h: No such file or directory + 11 | #include + | ^~~~~~~~~~~~~~~~~~ +compilation terminated. +configure:4581: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "goaccess" +| #define PACKAGE_TARNAME "goaccess" +| #define PACKAGE_VERSION "1.3" +| #define PACKAGE_STRING "goaccess 1.3" +| #define PACKAGE_BUGREPORT "goaccess@prosoftcorp.com" +| #define PACKAGE_URL "http://goaccess.io" +| #define PACKAGE "goaccess" +| #define VERSION "1.3" +| /* end confdefs.h. */ +| #include +configure:4606: result: gcc -E +configure:4626: gcc -E conftest.c +configure:4626: $? = 0 +configure:4640: gcc -E conftest.c +conftest.c:11:10: fatal error: ac_nonexistent.h: No such file or directory + 11 | #include + | ^~~~~~~~~~~~~~~~~~ +compilation terminated. +configure:4640: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "goaccess" +| #define PACKAGE_TARNAME "goaccess" +| #define PACKAGE_VERSION "1.3" +| #define PACKAGE_STRING "goaccess 1.3" +| #define PACKAGE_BUGREPORT "goaccess@prosoftcorp.com" +| #define PACKAGE_URL "http://goaccess.io" +| #define PACKAGE "goaccess" +| #define VERSION "1.3" +| /* end confdefs.h. */ +| #include +configure:4669: checking for grep that handles long lines and -e +configure:4727: result: /usr/bin/grep +configure:4732: checking for egrep +configure:4794: result: /usr/bin/grep -E +configure:5352: checking for CFPreferencesCopyAppValue +configure:5370: gcc -o conftest conftest.c -Wl,-framework -Wl,CoreFoundation >&5 +conftest.c:11:10: fatal error: CoreFoundation/CFPreferences.h: No such file or directory + 11 | #include + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +compilation terminated. +configure:5370: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "goaccess" +| #define PACKAGE_TARNAME "goaccess" +| #define PACKAGE_VERSION "1.3" +| #define PACKAGE_STRING "goaccess 1.3" +| #define PACKAGE_BUGREPORT "goaccess@prosoftcorp.com" +| #define PACKAGE_URL "http://goaccess.io" +| #define PACKAGE "goaccess" +| #define VERSION "1.3" +| /* end confdefs.h. */ +| #include +| int +| main () +| { +| CFPreferencesCopyAppValue(NULL, NULL) +| ; +| return 0; +| } +configure:5379: result: no +configure:5386: checking for CFLocaleCopyCurrent +configure:5404: gcc -o conftest conftest.c -Wl,-framework -Wl,CoreFoundation >&5 +conftest.c:11:10: fatal error: CoreFoundation/CFLocale.h: No such file or directory + 11 | #include + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +compilation terminated. +configure:5404: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "goaccess" +| #define PACKAGE_TARNAME "goaccess" +| #define PACKAGE_VERSION "1.3" +| #define PACKAGE_STRING "goaccess 1.3" +| #define PACKAGE_BUGREPORT "goaccess@prosoftcorp.com" +| #define PACKAGE_URL "http://goaccess.io" +| #define PACKAGE "goaccess" +| #define VERSION "1.3" +| /* end confdefs.h. */ +| #include +| int +| main () +| { +| CFLocaleCopyCurrent(); +| ; +| return 0; +| } +configure:5413: result: no +configure:5462: checking for GNU gettext in libc +configure:5482: gcc -o conftest conftest.c >&5 +configure:5482: $? = 0 +configure:5491: result: yes +configure:6282: checking whether to use NLS +configure:6284: result: yes +configure:6287: checking where the gettext function comes from +configure:6298: result: libc +configure:6357: checking for libintl_dgettext in -lintl +configure:6382: gcc -o conftest conftest.c -lintl >&5 +/usr/bin/ld: cannot find -lintl +collect2: error: ld returned 1 exit status +configure:6382: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "goaccess" +| #define PACKAGE_TARNAME "goaccess" +| #define PACKAGE_VERSION "1.3" +| #define PACKAGE_STRING "goaccess 1.3" +| #define PACKAGE_BUGREPORT "goaccess@prosoftcorp.com" +| #define PACKAGE_URL "http://goaccess.io" +| #define PACKAGE "goaccess" +| #define VERSION "1.3" +| #define ENABLE_NLS 1 +| #define HAVE_GETTEXT 1 +| #define HAVE_DCGETTEXT 1 +| /* 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 libintl_dgettext (); +| int +| main () +| { +| return libintl_dgettext (); +| ; +| return 0; +| } +configure:6391: result: no +configure:6404: checking for pthread_create in -lpthread +configure:6429: gcc -o conftest conftest.c -lpthread >&5 +configure:6429: $? = 0 +configure:6438: result: yes +configure:6478: checking whether to build with rdynamic for GNU ld +configure:6485: result: yes +configure:6668: checking for GeoIP_new in -lGeoIP +configure:6693: gcc -o conftest -pthread conftest.c -lGeoIP -lpthread >&5 +configure:6693: $? = 0 +configure:6702: result: yes +configure:6773: checking for mvaddwstr in -lncursesw +configure:6798: gcc -o conftest -pthread conftest.c -lncursesw -lGeoIP -lpthread >&5 +configure:6798: $? = 0 +configure:6808: result: yes +configure:6821: checking for library containing tputs +configure:6852: gcc -o conftest -pthread conftest.c -lncursesw -lGeoIP -lpthread >&5 +configure:6852: $? = 0 +configure:6869: result: none required +configure:6886: checking for ncursesw/ncurses.h +configure:6886: gcc -c -pthread conftest.c >&5 +configure:6886: $? = 0 +configure:6886: result: yes +configure:6904: checking for ncurses.h +configure:6904: gcc -c -pthread conftest.c >&5 +configure:6904: $? = 0 +configure:6904: result: yes +configure:7314: checking for sed +configure:7330: found /usr/bin/sed +configure:7342: result: yes +configure:7353: checking for tr +configure:7369: found /usr/bin/tr +configure:7381: result: yes +configure:7403: checking for gethostbyname in -lnsl +configure:7428: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +configure:7428: $? = 0 +configure:7437: result: yes +configure:7448: checking for socket in -lsocket +configure:7473: gcc -o conftest -pthread conftest.c -lsocket -lnsl -lncursesw -lGeoIP -lpthread >&5 +/usr/bin/ld: cannot find -lsocket +collect2: error: ld returned 1 exit status +configure:7473: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "goaccess" +| #define PACKAGE_TARNAME "goaccess" +| #define PACKAGE_VERSION "1.3" +| #define PACKAGE_STRING "goaccess 1.3" +| #define PACKAGE_BUGREPORT "goaccess@prosoftcorp.com" +| #define PACKAGE_URL "http://goaccess.io" +| #define PACKAGE "goaccess" +| #define VERSION "1.3" +| #define ENABLE_NLS 1 +| #define HAVE_GETTEXT 1 +| #define HAVE_DCGETTEXT 1 +| #define HAVE_LIBPTHREAD 1 +| #define HAVE_LIBGEOIP 1 +| #define HAVE_GEOLOCATION 1 +| #define HAVE_LIBNCURSESW 1 +| #define HAVE_LIBNCURSESW 1 +| #define HAVE_NCURSESW_NCURSES_H 1 +| #define HAVE_NCURSES_H 1 +| #define HAVE_LIBNSL 1 +| /* 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 socket (); +| int +| main () +| { +| return socket (); +| ; +| return 0; +| } +configure:7482: result: no +configure:7495: checking for ANSI C header files +configure:7515: gcc -c -pthread conftest.c >&5 +configure:7515: $? = 0 +configure:7588: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +configure:7588: $? = 0 +configure:7588: ./conftest +configure:7588: $? = 0 +configure:7599: result: yes +configure:7612: checking for sys/types.h +configure:7612: gcc -c -pthread conftest.c >&5 +configure:7612: $? = 0 +configure:7612: result: yes +configure:7612: checking for sys/stat.h +configure:7612: gcc -c -pthread conftest.c >&5 +configure:7612: $? = 0 +configure:7612: result: yes +configure:7612: checking for stdlib.h +configure:7612: gcc -c -pthread conftest.c >&5 +configure:7612: $? = 0 +configure:7612: result: yes +configure:7612: checking for string.h +configure:7612: gcc -c -pthread conftest.c >&5 +configure:7612: $? = 0 +configure:7612: result: yes +configure:7612: checking for memory.h +configure:7612: gcc -c -pthread conftest.c >&5 +configure:7612: $? = 0 +configure:7612: result: yes +configure:7612: checking for strings.h +configure:7612: gcc -c -pthread conftest.c >&5 +configure:7612: $? = 0 +configure:7612: result: yes +configure:7612: checking for inttypes.h +configure:7612: gcc -c -pthread conftest.c >&5 +configure:7612: $? = 0 +configure:7612: result: yes +configure:7612: checking for stdint.h +configure:7612: gcc -c -pthread conftest.c >&5 +configure:7612: $? = 0 +configure:7612: result: yes +configure:7612: checking for unistd.h +configure:7612: gcc -c -pthread conftest.c >&5 +configure:7612: $? = 0 +configure:7612: result: yes +configure:7626: checking arpa/inet.h usability +configure:7626: gcc -c -pthread conftest.c >&5 +configure:7626: $? = 0 +configure:7626: result: yes +configure:7626: checking arpa/inet.h presence +configure:7626: gcc -E conftest.c +configure:7626: $? = 0 +configure:7626: result: yes +configure:7626: checking for arpa/inet.h +configure:7626: result: yes +configure:7638: checking fcntl.h usability +configure:7638: gcc -c -pthread conftest.c >&5 +configure:7638: $? = 0 +configure:7638: result: yes +configure:7638: checking fcntl.h presence +configure:7638: gcc -E conftest.c +configure:7638: $? = 0 +configure:7638: result: yes +configure:7638: checking for fcntl.h +configure:7638: result: yes +configure:7650: checking for inttypes.h +configure:7650: result: yes +configure:7662: checking limits.h usability +configure:7662: gcc -c -pthread conftest.c >&5 +configure:7662: $? = 0 +configure:7662: result: yes +configure:7662: checking limits.h presence +configure:7662: gcc -E conftest.c +configure:7662: $? = 0 +configure:7662: result: yes +configure:7662: checking for limits.h +configure:7662: result: yes +configure:7674: checking locale.h usability +configure:7674: gcc -c -pthread conftest.c >&5 +configure:7674: $? = 0 +configure:7674: result: yes +configure:7674: checking locale.h presence +configure:7674: gcc -E conftest.c +configure:7674: $? = 0 +configure:7674: result: yes +configure:7674: checking for locale.h +configure:7674: result: yes +configure:7686: checking netdb.h usability +configure:7686: gcc -c -pthread conftest.c >&5 +configure:7686: $? = 0 +configure:7686: result: yes +configure:7686: checking netdb.h presence +configure:7686: gcc -E conftest.c +configure:7686: $? = 0 +configure:7686: result: yes +configure:7686: checking for netdb.h +configure:7686: result: yes +configure:7698: checking netinet/in.h usability +configure:7698: gcc -c -pthread conftest.c >&5 +configure:7698: $? = 0 +configure:7698: result: yes +configure:7698: checking netinet/in.h presence +configure:7698: gcc -E conftest.c +configure:7698: $? = 0 +configure:7698: result: yes +configure:7698: checking for netinet/in.h +configure:7698: result: yes +configure:7710: checking stddef.h usability +configure:7710: gcc -c -pthread conftest.c >&5 +configure:7710: $? = 0 +configure:7710: result: yes +configure:7710: checking stddef.h presence +configure:7710: gcc -E conftest.c +configure:7710: $? = 0 +configure:7710: result: yes +configure:7710: checking for stddef.h +configure:7710: result: yes +configure:7722: checking for stdint.h +configure:7722: result: yes +configure:7734: checking for stdlib.h +configure:7734: result: yes +configure:7746: checking for string.h +configure:7746: result: yes +configure:7758: checking for strings.h +configure:7758: result: yes +configure:7770: checking sys/socket.h usability +configure:7770: gcc -c -pthread conftest.c >&5 +configure:7770: $? = 0 +configure:7770: result: yes +configure:7770: checking sys/socket.h presence +configure:7770: gcc -E conftest.c +configure:7770: $? = 0 +configure:7770: result: yes +configure:7770: checking for sys/socket.h +configure:7770: result: yes +configure:7782: checking sys/time.h usability +configure:7782: gcc -c -pthread conftest.c >&5 +configure:7782: $? = 0 +configure:7782: result: yes +configure:7782: checking sys/time.h presence +configure:7782: gcc -E conftest.c +configure:7782: $? = 0 +configure:7782: result: yes +configure:7782: checking for sys/time.h +configure:7782: result: yes +configure:7794: checking for unistd.h +configure:7794: result: yes +configure:7806: checking for an ANSI C-conforming const +configure:7872: gcc -c -pthread conftest.c >&5 +configure:7872: $? = 0 +configure:7879: result: yes +configure:7887: checking for ptrdiff_t +configure:7887: gcc -c -pthread conftest.c >&5 +configure:7887: $? = 0 +configure:7887: gcc -c -pthread conftest.c >&5 +conftest.c: In function 'main': +conftest.c:83:24: error: expected expression before ')' token + 83 | if (sizeof ((ptrdiff_t))) + | ^ +configure:7887: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "goaccess" +| #define PACKAGE_TARNAME "goaccess" +| #define PACKAGE_VERSION "1.3" +| #define PACKAGE_STRING "goaccess 1.3" +| #define PACKAGE_BUGREPORT "goaccess@prosoftcorp.com" +| #define PACKAGE_URL "http://goaccess.io" +| #define PACKAGE "goaccess" +| #define VERSION "1.3" +| #define ENABLE_NLS 1 +| #define HAVE_GETTEXT 1 +| #define HAVE_DCGETTEXT 1 +| #define HAVE_LIBPTHREAD 1 +| #define HAVE_LIBGEOIP 1 +| #define HAVE_GEOLOCATION 1 +| #define HAVE_LIBNCURSESW 1 +| #define HAVE_LIBNCURSESW 1 +| #define HAVE_NCURSESW_NCURSES_H 1 +| #define HAVE_NCURSES_H 1 +| #define HAVE_LIBNSL 1 +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ARPA_INET_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_LOCALE_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_NETINET_IN_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_SYS_SOCKET_H 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_UNISTD_H 1 +| /* end confdefs.h. */ +| #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 +| int +| main () +| { +| if (sizeof ((ptrdiff_t))) +| return 0; +| ; +| return 0; +| } +configure:7887: result: yes +configure:7897: checking whether struct tm is in sys/time.h or time.h +configure:7917: gcc -c -pthread conftest.c >&5 +configure:7917: $? = 0 +configure:7924: result: time.h +configure:7932: checking for int64_t +configure:7932: gcc -c -pthread conftest.c >&5 +configure:7932: $? = 0 +configure:7932: gcc -c -pthread conftest.c >&5 +conftest.c: In function 'main': +conftest.c:86:53: warning: integer overflow in expression of type 'long int' results in '-9223372036854775808' [-Woverflow] + 86 | < (int64_t) (((((int64_t) 1 << N) << N) - 1) * 2 + 2))]; + | ^ +conftest.c:85:12: error: storage size of 'test_array' isn't constant + 85 | static int test_array [1 - 2 * !((int64_t) (((((int64_t) 1 << N) << N) - 1) * 2 + 1) + | ^~~~~~~~~~ +configure:7932: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "goaccess" +| #define PACKAGE_TARNAME "goaccess" +| #define PACKAGE_VERSION "1.3" +| #define PACKAGE_STRING "goaccess 1.3" +| #define PACKAGE_BUGREPORT "goaccess@prosoftcorp.com" +| #define PACKAGE_URL "http://goaccess.io" +| #define PACKAGE "goaccess" +| #define VERSION "1.3" +| #define ENABLE_NLS 1 +| #define HAVE_GETTEXT 1 +| #define HAVE_DCGETTEXT 1 +| #define HAVE_LIBPTHREAD 1 +| #define HAVE_LIBGEOIP 1 +| #define HAVE_GEOLOCATION 1 +| #define HAVE_LIBNCURSESW 1 +| #define HAVE_LIBNCURSESW 1 +| #define HAVE_NCURSESW_NCURSES_H 1 +| #define HAVE_NCURSES_H 1 +| #define HAVE_LIBNSL 1 +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ARPA_INET_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_LOCALE_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_NETINET_IN_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_SYS_SOCKET_H 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_PTRDIFF_T 1 +| /* end confdefs.h. */ +| #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 +| enum { N = 64 / 2 - 1 }; +| int +| main () +| { +| static int test_array [1 - 2 * !((int64_t) (((((int64_t) 1 << N) << N) - 1) * 2 + 1) +| < (int64_t) (((((int64_t) 1 << N) << N) - 1) * 2 + 2))]; +| test_array [0] = 0; +| return test_array [0]; +| +| ; +| return 0; +| } +configure:7932: result: yes +configure:7943: checking for int8_t +configure:7943: gcc -c -pthread conftest.c >&5 +configure:7943: $? = 0 +configure:7943: gcc -c -pthread conftest.c >&5 +conftest.c: In function 'main': +conftest.c:85:12: error: size of array 'test_array' is negative + 85 | static int test_array [1 - 2 * !((int8_t) (((((int8_t) 1 << N) << N) - 1) * 2 + 1) + | ^~~~~~~~~~ +configure:7943: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "goaccess" +| #define PACKAGE_TARNAME "goaccess" +| #define PACKAGE_VERSION "1.3" +| #define PACKAGE_STRING "goaccess 1.3" +| #define PACKAGE_BUGREPORT "goaccess@prosoftcorp.com" +| #define PACKAGE_URL "http://goaccess.io" +| #define PACKAGE "goaccess" +| #define VERSION "1.3" +| #define ENABLE_NLS 1 +| #define HAVE_GETTEXT 1 +| #define HAVE_DCGETTEXT 1 +| #define HAVE_LIBPTHREAD 1 +| #define HAVE_LIBGEOIP 1 +| #define HAVE_GEOLOCATION 1 +| #define HAVE_LIBNCURSESW 1 +| #define HAVE_LIBNCURSESW 1 +| #define HAVE_NCURSESW_NCURSES_H 1 +| #define HAVE_NCURSES_H 1 +| #define HAVE_LIBNSL 1 +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ARPA_INET_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_LOCALE_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_NETINET_IN_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_SYS_SOCKET_H 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_PTRDIFF_T 1 +| /* end confdefs.h. */ +| #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 +| enum { N = 8 / 2 - 1 }; +| int +| main () +| { +| static int test_array [1 - 2 * !((int8_t) (((((int8_t) 1 << N) << N) - 1) * 2 + 1) +| < (int8_t) (((((int8_t) 1 << N) << N) - 1) * 2 + 2))]; +| test_array [0] = 0; +| return test_array [0]; +| +| ; +| return 0; +| } +configure:7943: result: yes +configure:7954: checking for off_t +configure:7954: gcc -c -pthread conftest.c >&5 +configure:7954: $? = 0 +configure:7954: gcc -c -pthread conftest.c >&5 +conftest.c: In function 'main': +conftest.c:84:20: error: expected expression before ')' token + 84 | if (sizeof ((off_t))) + | ^ +configure:7954: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "goaccess" +| #define PACKAGE_TARNAME "goaccess" +| #define PACKAGE_VERSION "1.3" +| #define PACKAGE_STRING "goaccess 1.3" +| #define PACKAGE_BUGREPORT "goaccess@prosoftcorp.com" +| #define PACKAGE_URL "http://goaccess.io" +| #define PACKAGE "goaccess" +| #define VERSION "1.3" +| #define ENABLE_NLS 1 +| #define HAVE_GETTEXT 1 +| #define HAVE_DCGETTEXT 1 +| #define HAVE_LIBPTHREAD 1 +| #define HAVE_LIBGEOIP 1 +| #define HAVE_GEOLOCATION 1 +| #define HAVE_LIBNCURSESW 1 +| #define HAVE_LIBNCURSESW 1 +| #define HAVE_NCURSESW_NCURSES_H 1 +| #define HAVE_NCURSES_H 1 +| #define HAVE_LIBNSL 1 +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ARPA_INET_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_LOCALE_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_NETINET_IN_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_SYS_SOCKET_H 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_PTRDIFF_T 1 +| /* end confdefs.h. */ +| #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 +| int +| main () +| { +| if (sizeof ((off_t))) +| return 0; +| ; +| return 0; +| } +configure:7954: result: yes +configure:7965: checking for size_t +configure:7965: gcc -c -pthread conftest.c >&5 +configure:7965: $? = 0 +configure:7965: gcc -c -pthread conftest.c >&5 +conftest.c: In function 'main': +conftest.c:84:21: error: expected expression before ')' token + 84 | if (sizeof ((size_t))) + | ^ +configure:7965: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "goaccess" +| #define PACKAGE_TARNAME "goaccess" +| #define PACKAGE_VERSION "1.3" +| #define PACKAGE_STRING "goaccess 1.3" +| #define PACKAGE_BUGREPORT "goaccess@prosoftcorp.com" +| #define PACKAGE_URL "http://goaccess.io" +| #define PACKAGE "goaccess" +| #define VERSION "1.3" +| #define ENABLE_NLS 1 +| #define HAVE_GETTEXT 1 +| #define HAVE_DCGETTEXT 1 +| #define HAVE_LIBPTHREAD 1 +| #define HAVE_LIBGEOIP 1 +| #define HAVE_GEOLOCATION 1 +| #define HAVE_LIBNCURSESW 1 +| #define HAVE_LIBNCURSESW 1 +| #define HAVE_NCURSESW_NCURSES_H 1 +| #define HAVE_NCURSES_H 1 +| #define HAVE_LIBNSL 1 +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ARPA_INET_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_LOCALE_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_NETINET_IN_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_SYS_SOCKET_H 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_PTRDIFF_T 1 +| /* end confdefs.h. */ +| #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 +| int +| main () +| { +| if (sizeof ((size_t))) +| return 0; +| ; +| return 0; +| } +configure:7965: result: yes +configure:7976: checking for uint32_t +configure:7976: gcc -c -pthread conftest.c >&5 +configure:7976: $? = 0 +configure:7976: result: yes +configure:7990: checking for uint64_t +configure:7990: gcc -c -pthread conftest.c >&5 +configure:7990: $? = 0 +configure:7990: result: yes +configure:8004: checking for uint8_t +configure:8004: gcc -c -pthread conftest.c >&5 +configure:8004: $? = 0 +configure:8004: result: yes +configure:8020: checking for _LARGEFILE_SOURCE value needed for large files +configure:8039: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +configure:8039: $? = 0 +configure:8067: result: no +configure:8088: checking for working memcmp +configure:8131: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +configure:8131: $? = 0 +configure:8131: ./conftest +configure:8131: $? = 0 +configure:8141: result: yes +configure:8150: checking whether time.h and sys/time.h may both be included +configure:8170: gcc -c -pthread conftest.c >&5 +configure:8170: $? = 0 +configure:8177: result: yes +configure:8191: checking for sys/time.h +configure:8191: result: yes +configure:8191: checking for unistd.h +configure:8191: result: yes +configure:8212: checking for alarm +configure:8212: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +configure:8212: $? = 0 +configure:8212: result: yes +configure:8225: checking for working mktime +configure:8427: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +configure:8427: $? = 0 +configure:8427: ./conftest +configure:8427: $? = 0 +configure:8437: result: yes +configure:8448: checking whether lstat correctly handles trailing slash +configure:8474: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +configure:8474: $? = 0 +configure:8474: ./conftest +configure:8474: $? = 0 +configure:8491: result: yes +configure:8510: checking whether stat accepts an empty string +configure:8530: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +configure:8530: $? = 0 +configure:8530: ./conftest +configure:8530: $? = 0 +configure:8540: result: no +configure:8558: checking for strftime +configure:8558: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +conftest.c:77:6: warning: conflicting types for built-in function 'strftime'; expected 'long unsigned int(char *, long unsigned int, const char *, const void *)' [-Wbuiltin-declaration-mismatch] + 77 | char strftime (); + | ^~~~~~~~ +conftest.c:65:1: note: 'strftime' is declared in header '' + 64 | # include + 65 | #else +configure:8558: $? = 0 +configure:8558: result: yes +configure:8611: checking for working strtod +configure:8652: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +configure:8652: $? = 0 +configure:8652: ./conftest +configure:8652: $? = 0 +configure:8662: result: yes +configure:8726: checking for floor +configure:8726: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +conftest.c:78:6: warning: conflicting types for built-in function 'floor'; expected 'double(double)' [-Wbuiltin-declaration-mismatch] + 78 | char floor (); + | ^~~~~ +conftest.c:66:1: note: 'floor' is declared in header '' + 65 | # include + 66 | #else +/usr/bin/ld: /tmp/ccTMARdc.o: in function `main': +conftest.c:(.text+0xe): undefined reference to `floor' +collect2: error: ld returned 1 exit status +configure:8726: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "goaccess" +| #define PACKAGE_TARNAME "goaccess" +| #define PACKAGE_VERSION "1.3" +| #define PACKAGE_STRING "goaccess 1.3" +| #define PACKAGE_BUGREPORT "goaccess@prosoftcorp.com" +| #define PACKAGE_URL "http://goaccess.io" +| #define PACKAGE "goaccess" +| #define VERSION "1.3" +| #define ENABLE_NLS 1 +| #define HAVE_GETTEXT 1 +| #define HAVE_DCGETTEXT 1 +| #define HAVE_LIBPTHREAD 1 +| #define HAVE_LIBGEOIP 1 +| #define HAVE_GEOLOCATION 1 +| #define HAVE_LIBNCURSESW 1 +| #define HAVE_LIBNCURSESW 1 +| #define HAVE_NCURSESW_NCURSES_H 1 +| #define HAVE_NCURSES_H 1 +| #define HAVE_LIBNSL 1 +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ARPA_INET_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_LOCALE_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_NETINET_IN_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_SYS_SOCKET_H 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_PTRDIFF_T 1 +| #define HAVE_FSEEKO 1 +| #define TIME_WITH_SYS_TIME 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ALARM 1 +| #define LSTAT_FOLLOWS_SLASHED_SYMLINK 1 +| #define HAVE_STRFTIME 1 +| /* end confdefs.h. */ +| /* Define floor to an innocuous variant, in case declares floor. +| For example, HP-UX 11i declares gettimeofday. */ +| #define floor innocuous_floor +| +| /* System header to define __stub macros and hopefully few prototypes, +| which can conflict with char floor (); below. +| Prefer to if __STDC__ is defined, since +| exists even on freestanding compilers. */ +| +| #ifdef __STDC__ +| # include +| #else +| # include +| #endif +| +| #undef floor +| +| /* 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 floor (); +| /* 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_floor || defined __stub___floor +| choke me +| #endif +| +| int +| main () +| { +| return floor (); +| ; +| return 0; +| } +configure:8726: result: no +configure:8737: checking for gethostbyaddr +configure:8737: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +configure:8737: $? = 0 +configure:8737: result: yes +configure:8748: checking for gethostbyname +configure:8748: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +configure:8748: $? = 0 +configure:8748: result: yes +configure:8759: checking for gettimeofday +configure:8759: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +configure:8759: $? = 0 +configure:8759: result: yes +configure:8770: checking for malloc +configure:8770: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +conftest.c:81:6: warning: conflicting types for built-in function 'malloc'; expected 'void *(long unsigned int)' [-Wbuiltin-declaration-mismatch] + 81 | char malloc (); + | ^~~~~~ +conftest.c:69:1: note: 'malloc' is declared in header '' + 68 | # include + 69 | #else +configure:8770: $? = 0 +configure:8770: result: yes +configure:8781: checking for memmove +configure:8781: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +conftest.c:82:6: warning: conflicting types for built-in function 'memmove'; expected 'void *(void *, const void *, long unsigned int)' [-Wbuiltin-declaration-mismatch] + 82 | char memmove (); + | ^~~~~~~ +conftest.c:70:1: note: 'memmove' is declared in header '' + 69 | # include + 70 | #else +configure:8781: $? = 0 +configure:8781: result: yes +configure:8792: checking for memset +configure:8792: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +conftest.c:83:6: warning: conflicting types for built-in function 'memset'; expected 'void *(void *, int, long unsigned int)' [-Wbuiltin-declaration-mismatch] + 83 | char memset (); + | ^~~~~~ +conftest.c:71:1: note: 'memset' is declared in header '' + 70 | # include + 71 | #else +configure:8792: $? = 0 +configure:8792: result: yes +configure:8803: checking for mkfifo +configure:8803: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +configure:8803: $? = 0 +configure:8803: result: yes +configure:8814: checking for realloc +configure:8814: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +conftest.c:85:6: warning: conflicting types for built-in function 'realloc'; expected 'void *(void *, long unsigned int)' [-Wbuiltin-declaration-mismatch] + 85 | char realloc (); + | ^~~~~~~ +conftest.c:73:1: note: 'realloc' is declared in header '' + 72 | # include + 73 | #else +configure:8814: $? = 0 +configure:8814: result: yes +configure:8825: checking for realpath +configure:8825: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +configure:8825: $? = 0 +configure:8825: result: yes +configure:8836: checking for regcomp +configure:8836: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +configure:8836: $? = 0 +configure:8836: result: yes +configure:8847: checking for select +configure:8847: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +configure:8847: $? = 0 +configure:8847: result: yes +configure:8858: checking for setlocale +configure:8858: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +configure:8858: $? = 0 +configure:8858: result: yes +configure:8869: checking for socket +configure:8869: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +configure:8869: $? = 0 +configure:8869: result: yes +configure:8880: checking for strcasecmp +configure:8880: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +conftest.c:91:6: warning: conflicting types for built-in function 'strcasecmp'; expected 'int(const char *, const char *)' [-Wbuiltin-declaration-mismatch] + 91 | char strcasecmp (); + | ^~~~~~~~~~ +configure:8880: $? = 0 +configure:8880: result: yes +configure:8891: checking for strchr +configure:8891: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +conftest.c:92:6: warning: conflicting types for built-in function 'strchr'; expected 'char *(const char *, int)' [-Wbuiltin-declaration-mismatch] + 92 | char strchr (); + | ^~~~~~ +conftest.c:80:1: note: 'strchr' is declared in header '' + 79 | # include + 80 | #else +configure:8891: $? = 0 +configure:8891: result: yes +configure:8902: checking for strcspn +configure:8902: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +conftest.c:93:6: warning: conflicting types for built-in function 'strcspn'; expected 'long unsigned int(const char *, const char *)' [-Wbuiltin-declaration-mismatch] + 93 | char strcspn (); + | ^~~~~~~ +conftest.c:81:1: note: 'strcspn' is declared in header '' + 80 | # include + 81 | #else +configure:8902: $? = 0 +configure:8902: result: yes +configure:8913: checking for strdup +configure:8913: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +conftest.c:94:6: warning: conflicting types for built-in function 'strdup'; expected 'char *(const char *)' [-Wbuiltin-declaration-mismatch] + 94 | char strdup (); + | ^~~~~~ +configure:8913: $? = 0 +configure:8913: result: yes +configure:8924: checking for strerror +configure:8924: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +configure:8924: $? = 0 +configure:8924: result: yes +configure:8935: checking for strncasecmp +configure:8935: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +conftest.c:96:6: warning: conflicting types for built-in function 'strncasecmp'; expected 'int(const char *, const char *, long unsigned int)' [-Wbuiltin-declaration-mismatch] + 96 | char strncasecmp (); + | ^~~~~~~~~~~ +configure:8935: $? = 0 +configure:8935: result: yes +configure:8946: checking for strpbrk +configure:8946: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +conftest.c:97:6: warning: conflicting types for built-in function 'strpbrk'; expected 'char *(const char *, const char *)' [-Wbuiltin-declaration-mismatch] + 97 | char strpbrk (); + | ^~~~~~~ +conftest.c:85:1: note: 'strpbrk' is declared in header '' + 84 | # include + 85 | #else +configure:8946: $? = 0 +configure:8946: result: yes +configure:8957: checking for strrchr +configure:8957: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +conftest.c:98:6: warning: conflicting types for built-in function 'strrchr'; expected 'char *(const char *, int)' [-Wbuiltin-declaration-mismatch] + 98 | char strrchr (); + | ^~~~~~~ +conftest.c:86:1: note: 'strrchr' is declared in header '' + 85 | # include + 86 | #else +configure:8957: $? = 0 +configure:8957: result: yes +configure:8968: checking for strspn +configure:8968: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +conftest.c:99:6: warning: conflicting types for built-in function 'strspn'; expected 'long unsigned int(const char *, const char *)' [-Wbuiltin-declaration-mismatch] + 99 | char strspn (); + | ^~~~~~ +conftest.c:87:1: note: 'strspn' is declared in header '' + 86 | # include + 87 | #else +configure:8968: $? = 0 +configure:8968: result: yes +configure:8979: checking for strstr +configure:8979: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +conftest.c:100:6: warning: conflicting types for built-in function 'strstr'; expected 'char *(const char *, const char *)' [-Wbuiltin-declaration-mismatch] + 100 | char strstr (); + | ^~~~~~ +conftest.c:88:1: note: 'strstr' is declared in header '' + 87 | # include + 88 | #else +configure:8979: $? = 0 +configure:8979: result: yes +configure:8990: checking for strtol +configure:8990: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +configure:8990: $? = 0 +configure:8990: result: yes +configure:9001: checking for strtoull +configure:9001: gcc -o conftest -pthread conftest.c -lnsl -lncursesw -lGeoIP -lpthread >&5 +configure:9001: $? = 0 +configure:9001: result: yes +configure:9159: creating ./config.status + +## ---------------------- ## +## Running config.status. ## +## ---------------------- ## + +This file was extended by goaccess config.status 1.3, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = + CONFIG_HEADERS = + CONFIG_LINKS = + CONFIG_COMMANDS = + $ ./config.status + +on ubuntu + +config.status:953: creating Makefile +config.status:953: creating po/Makefile.in +config.status:953: creating src/config.h +config.status:1182: executing depfiles commands +config.status:1182: executing po-directories commands + +## ---------------- ## +## Cache variables. ## +## ---------------- ## + +ac_cv_build=x86_64-unknown-linux-gnu +ac_cv_c_compiler_gnu=yes +ac_cv_c_const=yes +ac_cv_c_int64_t=yes +ac_cv_c_int8_t=yes +ac_cv_c_uint32_t=yes +ac_cv_c_uint64_t=yes +ac_cv_c_uint8_t=yes +ac_cv_env_CC_set= +ac_cv_env_CC_value= +ac_cv_env_CFLAGS_set= +ac_cv_env_CFLAGS_value= +ac_cv_env_CPPFLAGS_set= +ac_cv_env_CPPFLAGS_value= +ac_cv_env_CPP_set= +ac_cv_env_CPP_value= +ac_cv_env_LDFLAGS_set= +ac_cv_env_LDFLAGS_value= +ac_cv_env_LIBS_set= +ac_cv_env_LIBS_value= +ac_cv_env_build_alias_set= +ac_cv_env_build_alias_value= +ac_cv_env_host_alias_set= +ac_cv_env_host_alias_value= +ac_cv_env_target_alias_set= +ac_cv_env_target_alias_value= +ac_cv_func_alarm=yes +ac_cv_func_floor=no +ac_cv_func_gethostbyaddr=yes +ac_cv_func_gethostbyname=yes +ac_cv_func_gettimeofday=yes +ac_cv_func_lstat_dereferences_slashed_symlink=yes +ac_cv_func_malloc=yes +ac_cv_func_memcmp_working=yes +ac_cv_func_memmove=yes +ac_cv_func_memset=yes +ac_cv_func_mkfifo=yes +ac_cv_func_realloc=yes +ac_cv_func_realpath=yes +ac_cv_func_regcomp=yes +ac_cv_func_select=yes +ac_cv_func_setlocale=yes +ac_cv_func_socket=yes +ac_cv_func_stat_empty_string_bug=no +ac_cv_func_strcasecmp=yes +ac_cv_func_strchr=yes +ac_cv_func_strcspn=yes +ac_cv_func_strdup=yes +ac_cv_func_strerror=yes +ac_cv_func_strftime=yes +ac_cv_func_strncasecmp=yes +ac_cv_func_strpbrk=yes +ac_cv_func_strrchr=yes +ac_cv_func_strspn=yes +ac_cv_func_strstr=yes +ac_cv_func_strtod=yes +ac_cv_func_strtol=yes +ac_cv_func_strtoull=yes +ac_cv_func_working_mktime=yes +ac_cv_header_arpa_inet_h=yes +ac_cv_header_fcntl_h=yes +ac_cv_header_inttypes_h=yes +ac_cv_header_limits_h=yes +ac_cv_header_locale_h=yes +ac_cv_header_memory_h=yes +ac_cv_header_ncurses_h=yes +ac_cv_header_ncursesw_ncurses_h=yes +ac_cv_header_netdb_h=yes +ac_cv_header_netinet_in_h=yes +ac_cv_header_stdc=yes +ac_cv_header_stddef_h=yes +ac_cv_header_stdint_h=yes +ac_cv_header_stdlib_h=yes +ac_cv_header_string_h=yes +ac_cv_header_strings_h=yes +ac_cv_header_sys_socket_h=yes +ac_cv_header_sys_stat_h=yes +ac_cv_header_sys_time_h=yes +ac_cv_header_sys_types_h=yes +ac_cv_header_time=yes +ac_cv_header_unistd_h=yes +ac_cv_host=x86_64-unknown-linux-gnu +ac_cv_lib_GeoIP_GeoIP_new=yes +ac_cv_lib_intl_libintl_dgettext=no +ac_cv_lib_ncursesw___mvaddwstr=yes +ac_cv_lib_nsl_gethostbyname=yes +ac_cv_lib_pthread_pthread_create=yes +ac_cv_lib_socket_socket=no +ac_cv_objext=o +ac_cv_path_EGREP='/usr/bin/grep -E' +ac_cv_path_GMSGFMT=: +ac_cv_path_GREP=/usr/bin/grep +ac_cv_path_MSGFMT=: +ac_cv_path_MSGMERGE=: +ac_cv_path_XGETTEXT=: +ac_cv_path_install='/usr/bin/install -c' +ac_cv_path_mkdir=/usr/bin/mkdir +ac_cv_prog_AWK=mawk +ac_cv_prog_CPP='gcc -E' +ac_cv_prog_SED_CHECK=yes +ac_cv_prog_TR_CHECK=yes +ac_cv_prog_ac_ct_CC=gcc +ac_cv_prog_cc_c89= +ac_cv_prog_cc_g=yes +ac_cv_prog_cc_gcc_c_o=yes +ac_cv_prog_make_make_set=yes +ac_cv_search_tputs='none required' +ac_cv_struct_tm=time.h +ac_cv_sys_largefile_source=no +ac_cv_type_off_t=yes +ac_cv_type_ptrdiff_t=yes +ac_cv_type_size_t=yes +acl_cv_hardcode_direct=no +acl_cv_hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' +acl_cv_hardcode_libdir_separator= +acl_cv_hardcode_minus_L=no +acl_cv_libext=a +acl_cv_libname_spec='lib$name' +acl_cv_library_names_spec='$libname$shrext' +acl_cv_path_LD=/usr/bin/ld +acl_cv_prog_gnu_ld=yes +acl_cv_rpath=done +acl_cv_shlibext=so +acl_cv_wl=-Wl, +am_cv_CC_dependencies_compiler_type=gcc3 +gt_cv_func_CFLocaleCopyCurrent=no +gt_cv_func_CFPreferencesCopyAppValue=no +gt_cv_func_gnugettext1_libc=yes + +## ----------------- ## +## Output variables. ## +## ----------------- ## + +ACLOCAL='${SHELL} /home/djq/goaccess-1.3/missing --run aclocal-1.11' +AMDEPBACKSLASH='\' +AMDEP_FALSE='#' +AMDEP_TRUE='' +AMTAR='$${TAR-tar}' +AUTOCONF='${SHELL} /home/djq/goaccess-1.3/missing --run autoconf' +AUTOHEADER='${SHELL} /home/djq/goaccess-1.3/missing --run autoheader' +AUTOMAKE='${SHELL} /home/djq/goaccess-1.3/missing --run automake-1.11' +AWK='mawk' +CC='gcc' +CCDEPMODE='depmode=gcc3' +CFLAGS=' -pthread' +CPP='gcc -E' +CPPFLAGS='' +CYGPATH_W='echo' +DEBUG_FALSE='' +DEBUG_TRUE='#' +DEFS='-DHAVE_CONFIG_H' +DEPDIR='.deps' +ECHO_C='' +ECHO_N='-n' +ECHO_T='' +EGREP='/usr/bin/grep -E' +EXEEXT='' +GEOIP_LEGACY_FALSE='#' +GEOIP_LEGACY_TRUE='' +GEOIP_MMDB_FALSE='' +GEOIP_MMDB_TRUE='#' +GETTEXT_MACRO_VERSION='0.18' +GMSGFMT=':' +GMSGFMT_015=':' +GREP='/usr/bin/grep' +HAS_SEDTR_FALSE='#' +HAS_SEDTR_TRUE='' +INSTALL_DATA='${INSTALL} -m 644' +INSTALL_PROGRAM='${INSTALL}' +INSTALL_SCRIPT='${INSTALL}' +INSTALL_STRIP_PROGRAM='$(install_sh) -c -s' +INTLLIBS='' +INTL_MACOSX_LIBS='' +LDFLAGS='' +LIBICONV='-liconv' +LIBINTL='' +LIBOBJS='' +LIBS='-lnsl -lncursesw -lGeoIP -lpthread ' +LTLIBICONV='-liconv' +LTLIBINTL='' +LTLIBOBJS='' +MAKEINFO='${SHELL} /home/djq/goaccess-1.3/missing --run makeinfo' +MKDIR_P='/usr/bin/mkdir -p' +MSGFMT=':' +MSGFMT_015=':' +MSGMERGE=':' +OBJEXT='o' +PACKAGE='goaccess' +PACKAGE_BUGREPORT='goaccess@prosoftcorp.com' +PACKAGE_NAME='goaccess' +PACKAGE_STRING='goaccess 1.3' +PACKAGE_TARNAME='goaccess' +PACKAGE_URL='http://goaccess.io' +PACKAGE_VERSION='1.3' +PATH_SEPARATOR=':' +POSUB='po' +POW_LIB='' +SED_CHECK='yes' +SET_MAKE='' +SHELL='/bin/bash' +STRIP='' +TCB_FALSE='' +TCB_TRUE='#' +TR_CHECK='yes' +USE_NLS='yes' +VERSION='1.3' +WITH_RDYNAMIC_FALSE='#' +WITH_RDYNAMIC_TRUE='' +XGETTEXT=':' +XGETTEXT_015=':' +XGETTEXT_EXTRA_OPTIONS='' +ac_ct_CC='gcc' +am__EXEEXT_FALSE='' +am__EXEEXT_TRUE='#' +am__fastdepCC_FALSE='#' +am__fastdepCC_TRUE='' +am__include='include' +am__isrc='' +am__leading_dot='.' +am__nodep='_no' +am__quote='' +am__tar='$${TAR-tar} chof - "$$tardir"' +am__untar='$${TAR-tar} xf -' +bindir='${exec_prefix}/bin' +build='x86_64-unknown-linux-gnu' +build_alias='' +build_cpu='x86_64' +build_os='linux-gnu' +build_vendor='unknown' +datadir='${datarootdir}' +datarootdir='${prefix}/share' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +dvidir='${docdir}' +exec_prefix='${prefix}' +host='x86_64-unknown-linux-gnu' +host_alias='' +host_cpu='x86_64' +host_os='linux-gnu' +host_vendor='unknown' +htmldir='${docdir}' +includedir='${prefix}/include' +infodir='${datarootdir}/info' +install_sh='${SHELL} /home/djq/goaccess-1.3/install-sh' +libdir='${exec_prefix}/lib' +libexecdir='${exec_prefix}/libexec' +localedir='${datarootdir}/locale' +localstatedir='${prefix}/var' +mandir='${datarootdir}/man' +mkdir_p='/usr/bin/mkdir -p' +oldincludedir='/usr/include' +pdfdir='${docdir}' +prefix='/usr/local' +program_transform_name='s,x,x,' +psdir='${docdir}' +sbindir='${exec_prefix}/sbin' +sharedstatedir='${prefix}/com' +sysconfdir='${prefix}/etc' +target_alias='' + +## ----------- ## +## confdefs.h. ## +## ----------- ## + +/* confdefs.h */ +#define PACKAGE_NAME "goaccess" +#define PACKAGE_TARNAME "goaccess" +#define PACKAGE_VERSION "1.3" +#define PACKAGE_STRING "goaccess 1.3" +#define PACKAGE_BUGREPORT "goaccess@prosoftcorp.com" +#define PACKAGE_URL "http://goaccess.io" +#define PACKAGE "goaccess" +#define VERSION "1.3" +#define ENABLE_NLS 1 +#define HAVE_GETTEXT 1 +#define HAVE_DCGETTEXT 1 +#define HAVE_LIBPTHREAD 1 +#define HAVE_LIBGEOIP 1 +#define HAVE_GEOLOCATION 1 +#define HAVE_LIBNCURSESW 1 +#define HAVE_LIBNCURSESW 1 +#define HAVE_NCURSESW_NCURSES_H 1 +#define HAVE_NCURSES_H 1 +#define HAVE_LIBNSL 1 +#define STDC_HEADERS 1 +#define HAVE_SYS_TYPES_H 1 +#define HAVE_SYS_STAT_H 1 +#define HAVE_STDLIB_H 1 +#define HAVE_STRING_H 1 +#define HAVE_MEMORY_H 1 +#define HAVE_STRINGS_H 1 +#define HAVE_INTTYPES_H 1 +#define HAVE_STDINT_H 1 +#define HAVE_UNISTD_H 1 +#define HAVE_ARPA_INET_H 1 +#define HAVE_FCNTL_H 1 +#define HAVE_INTTYPES_H 1 +#define HAVE_LIMITS_H 1 +#define HAVE_LOCALE_H 1 +#define HAVE_NETDB_H 1 +#define HAVE_NETINET_IN_H 1 +#define HAVE_STDDEF_H 1 +#define HAVE_STDINT_H 1 +#define HAVE_STDLIB_H 1 +#define HAVE_STRING_H 1 +#define HAVE_STRINGS_H 1 +#define HAVE_SYS_SOCKET_H 1 +#define HAVE_SYS_TIME_H 1 +#define HAVE_UNISTD_H 1 +#define HAVE_PTRDIFF_T 1 +#define HAVE_FSEEKO 1 +#define TIME_WITH_SYS_TIME 1 +#define HAVE_SYS_TIME_H 1 +#define HAVE_UNISTD_H 1 +#define HAVE_ALARM 1 +#define LSTAT_FOLLOWS_SLASHED_SYMLINK 1 +#define HAVE_STRFTIME 1 +#define HAVE_GETHOSTBYADDR 1 +#define HAVE_GETHOSTBYNAME 1 +#define HAVE_GETTIMEOFDAY 1 +#define HAVE_MALLOC 1 +#define HAVE_MEMMOVE 1 +#define HAVE_MEMSET 1 +#define HAVE_MKFIFO 1 +#define HAVE_REALLOC 1 +#define HAVE_REALPATH 1 +#define HAVE_REGCOMP 1 +#define HAVE_SELECT 1 +#define HAVE_SETLOCALE 1 +#define HAVE_SOCKET 1 +#define HAVE_STRCASECMP 1 +#define HAVE_STRCHR 1 +#define HAVE_STRCSPN 1 +#define HAVE_STRDUP 1 +#define HAVE_STRERROR 1 +#define HAVE_STRNCASECMP 1 +#define HAVE_STRPBRK 1 +#define HAVE_STRRCHR 1 +#define HAVE_STRSPN 1 +#define HAVE_STRSTR 1 +#define HAVE_STRTOL 1 +#define HAVE_STRTOULL 1 + +configure: exit 0 diff --git a/goaccess++/config.rpath b/goaccess++/config.rpath new file mode 100644 index 0000000..17298f2 --- /dev/null +++ b/goaccess++/config.rpath @@ -0,0 +1,672 @@ +#! /bin/sh +# Output a system dependent set of variables, describing how to set the +# run time search path of shared libraries in an executable. +# +# Copyright 1996-2010 Free Software Foundation, Inc. +# Taken from GNU libtool, 2001 +# Originally by Gordon Matzigkeit , 1996 +# +# 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. +# +# The first argument passed to this file is the canonical host specification, +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld +# should be set by the caller. +# +# The set of defined variables is at the end of this script. + +# Known limitations: +# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer +# than 256 bytes, otherwise the compiler driver will dump core. The only +# known workaround is to choose shorter directory names for the build +# directory and/or the installation directory. + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a +shrext=.so + +host="$1" +host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +# Code taken from libtool.m4's _LT_CC_BASENAME. + +for cc_temp in $CC""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'` + +# Code taken from libtool.m4's _LT_COMPILER_PIC. + +wl= +if test "$GCC" = yes; then + wl='-Wl,' +else + case "$host_os" in + aix*) + wl='-Wl,' + ;; + darwin*) + case $cc_basename in + xlc*) + wl='-Wl,' + ;; + esac + ;; + mingw* | cygwin* | pw32* | os2* | cegcc*) + ;; + hpux9* | hpux10* | hpux11*) + wl='-Wl,' + ;; + irix5* | irix6* | nonstopux*) + wl='-Wl,' + ;; + newsos6) + ;; + linux* | k*bsd*-gnu) + case $cc_basename in + ecc*) + wl='-Wl,' + ;; + icc* | ifort*) + wl='-Wl,' + ;; + lf95*) + wl='-Wl,' + ;; + pgcc | pgf77 | pgf90) + wl='-Wl,' + ;; + ccc*) + wl='-Wl,' + ;; + como) + wl='-lopt=' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + wl='-Wl,' + ;; + esac + ;; + esac + ;; + osf3* | osf4* | osf5*) + wl='-Wl,' + ;; + rdos*) + ;; + solaris*) + wl='-Wl,' + ;; + sunos4*) + wl='-Qoption ld ' + ;; + sysv4 | sysv4.2uw2* | sysv4.3*) + wl='-Wl,' + ;; + sysv4*MP*) + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + wl='-Wl,' + ;; + unicos*) + wl='-Wl,' + ;; + uts4*) + ;; + esac +fi + +# Code taken from libtool.m4's _LT_LINKER_SHLIBS. + +hardcode_libdir_flag_spec= +hardcode_libdir_separator= +hardcode_direct=no +hardcode_minus_L=no + +case "$host_os" in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; +esac + +ld_shlibs=yes +if test "$with_gnu_ld" = yes; then + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + # Unlike libtool, we use -rpath here, not --rpath, since the documented + # option of GNU ld is called -rpath, not --rpath. + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + case "$host_os" in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + fi + ;; + amigaos*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we cannot use + # them. + ld_shlibs=no + ;; + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + cygwin* | mingw* | pw32* | cegcc*) + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + interix[3-9]*) + hardcode_direct=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + gnu* | linux* | k*bsd*-gnu) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + netbsd*) + ;; + solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + else + ld_shlibs=no + fi + ;; + esac + ;; + sunos4*) + hardcode_direct=yes + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + esac + if test "$ld_shlibs" = no; then + hardcode_libdir_flag_spec= + fi +else + case "$host_os" in + aix3*) + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + else + aix_use_runtimelinking=no + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + fi + hardcode_direct=yes + hardcode_libdir_separator=':' + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + fi + # Begin _LT_AC_SYS_LIBPATH_AIX. + echo 'int main () { return 0; }' > conftest.c + ${CC} ${LDFLAGS} conftest.c -o conftest + aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` + if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` + fi + if test -z "$aix_libpath"; then + aix_libpath="/usr/lib:/lib" + fi + rm -f conftest.c conftest + # End _LT_AC_SYS_LIBPATH_AIX. + if test "$aix_use_runtimelinking" = yes; then + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + else + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + fi + fi + ;; + amigaos*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + bsdi[45]*) + ;; + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + libext=lib + ;; + darwin* | rhapsody*) + hardcode_direct=no + if test "$GCC" = yes ; then + : + else + case $cc_basename in + xlc*) + ;; + *) + ld_shlibs=no + ;; + esac + fi + ;; + dgux*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + freebsd1*) + ld_shlibs=no + ;; + freebsd2.2*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + freebsd2*) + hardcode_direct=yes + hardcode_minus_L=yes + ;; + freebsd* | dragonfly*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + hpux9*) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + hpux10*) + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + hpux11*) + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + ;; + *) + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + irix5* | irix6* | nonstopux*) + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + netbsd*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + newsos6) + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + else + case "$host_os" in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs=no + fi + ;; + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + osf3*) + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + osf4* | osf5*) + if test "$GCC" = yes; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + # Both cc and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + ;; + solaris*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + sunos4*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + ;; + sysv4) + case $host_vendor in + sni) + hardcode_direct=yes # is this really true??? + ;; + siemens) + hardcode_direct=no + ;; + motorola) + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + ;; + sysv4.3*) + ;; + sysv4*MP*) + if test -d /usr/nec; then + ld_shlibs=yes + fi + ;; + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + ;; + sysv5* | sco3.2v5* | sco5v6*) + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator=':' + ;; + uts4*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + *) + ld_shlibs=no + ;; + esac +fi + +# Check dynamic linker characteristics +# Code taken from libtool.m4's _LT_SYS_DYNAMIC_LINKER. +# Unlike libtool.m4, here we don't care about _all_ names of the library, but +# only about the one the linker finds when passed -lNAME. This is the last +# element of library_names_spec in libtool.m4, or possibly two of them if the +# linker has special search rules. +library_names_spec= # the last element of library_names_spec in libtool.m4 +libname_spec='lib$name' +case "$host_os" in + aix3*) + library_names_spec='$libname.a' + ;; + aix[4-9]*) + library_names_spec='$libname$shrext' + ;; + amigaos*) + library_names_spec='$libname.a' + ;; + beos*) + library_names_spec='$libname$shrext' + ;; + bsdi[45]*) + library_names_spec='$libname$shrext' + ;; + cygwin* | mingw* | pw32* | cegcc*) + shrext=.dll + library_names_spec='$libname.dll.a $libname.lib' + ;; + darwin* | rhapsody*) + shrext=.dylib + library_names_spec='$libname$shrext' + ;; + dgux*) + library_names_spec='$libname$shrext' + ;; + freebsd1*) + ;; + freebsd* | dragonfly*) + case "$host_os" in + freebsd[123]*) + library_names_spec='$libname$shrext$versuffix' ;; + *) + library_names_spec='$libname$shrext' ;; + esac + ;; + gnu*) + library_names_spec='$libname$shrext' + ;; + hpux9* | hpux10* | hpux11*) + case $host_cpu in + ia64*) + shrext=.so + ;; + hppa*64*) + shrext=.sl + ;; + *) + shrext=.sl + ;; + esac + library_names_spec='$libname$shrext' + ;; + interix[3-9]*) + library_names_spec='$libname$shrext' + ;; + irix5* | irix6* | nonstopux*) + library_names_spec='$libname$shrext' + case "$host_os" in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; + *) libsuff= shlibsuff= ;; + esac + ;; + esac + ;; + linux*oldld* | linux*aout* | linux*coff*) + ;; + linux* | k*bsd*-gnu) + library_names_spec='$libname$shrext' + ;; + knetbsd*-gnu) + library_names_spec='$libname$shrext' + ;; + netbsd*) + library_names_spec='$libname$shrext' + ;; + newsos6) + library_names_spec='$libname$shrext' + ;; + nto-qnx*) + library_names_spec='$libname$shrext' + ;; + openbsd*) + library_names_spec='$libname$shrext$versuffix' + ;; + os2*) + libname_spec='$name' + shrext=.dll + library_names_spec='$libname.a' + ;; + osf3* | osf4* | osf5*) + library_names_spec='$libname$shrext' + ;; + rdos*) + ;; + solaris*) + library_names_spec='$libname$shrext' + ;; + sunos4*) + library_names_spec='$libname$shrext$versuffix' + ;; + sysv4 | sysv4.3*) + library_names_spec='$libname$shrext' + ;; + sysv4*MP*) + library_names_spec='$libname$shrext' + ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + library_names_spec='$libname$shrext' + ;; + uts4*) + library_names_spec='$libname$shrext' + ;; +esac + +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' +escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` +shlibext=`echo "$shrext" | sed -e 's,^\.,,'` +escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` +escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` +escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` + +LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' </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. ## +## ----------------------------------- ## +# 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 goaccess $as_me 1.3, 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` +" + +# Files that config.status was made for. +config_files=" Makefile po/Makefile.in" +config_headers=" src/config.h" +config_commands=" depfiles po-directories" + +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 . +goaccess home page: ." + +ac_cs_config="'--enable-utf8' '--enable-geoip=legacy'" +ac_cs_version="\ +goaccess config.status 1.3 +configured by ./configure, 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='/home/djq/goaccess-1.3' +srcdir='.' +INSTALL='/usr/bin/install -c' +MKDIR_P='/usr/bin/mkdir -p' +AWK='mawk' +test -n "$AWK" || AWK=awk +# 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 + +if $ac_cs_recheck; then + set X /bin/bash './configure' '--enable-utf8' '--enable-geoip=legacy' $ac_configure_extra_args --no-create --no-recursion + shift + $as_echo "running CONFIG_SHELL=/bin/bash $*" >&6 + CONFIG_SHELL='/bin/bash' + export CONFIG_SHELL + exec "$@" +fi + +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 + +# +# INIT-COMMANDS +# +AMDEP_TRUE="" ac_aux_dir="." +# Capture the value of obsolete ALL_LINGUAS because we need it to compute + # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it + # from automake < 1.5. + eval 'OBSOLETE_ALL_LINGUAS''=""' + # Capture the value of LINGUAS because we need it to compute CATALOGS. + LINGUAS="%UNSET%" + + + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "src/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "po-directories") CONFIG_COMMANDS="$CONFIG_COMMANDS po-directories" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; + + *) 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" && +cat >>"$ac_tmp/subs1.awk" <<\_ACAWK && +S["am__EXEEXT_FALSE"]="" +S["am__EXEEXT_TRUE"]="#" +S["LTLIBOBJS"]="" +S["POW_LIB"]="" +S["LIBOBJS"]="" +S["HAS_SEDTR_FALSE"]="#" +S["HAS_SEDTR_TRUE"]="" +S["TR_CHECK"]="yes" +S["SED_CHECK"]="yes" +S["TCB_FALSE"]="" +S["TCB_TRUE"]="#" +S["GEOIP_MMDB_FALSE"]="" +S["GEOIP_MMDB_TRUE"]="#" +S["GEOIP_LEGACY_FALSE"]="#" +S["GEOIP_LEGACY_TRUE"]="" +S["WITH_RDYNAMIC_FALSE"]="#" +S["WITH_RDYNAMIC_TRUE"]="" +S["DEBUG_FALSE"]="" +S["DEBUG_TRUE"]="#" +S["POSUB"]="po" +S["LTLIBINTL"]="" +S["LIBINTL"]="" +S["INTLLIBS"]="" +S["LTLIBICONV"]="-liconv" +S["LIBICONV"]="-liconv" +S["INTL_MACOSX_LIBS"]="" +S["EGREP"]="/usr/bin/grep -E" +S["GREP"]="/usr/bin/grep" +S["CPP"]="gcc -E" +S["host_os"]="linux-gnu" +S["host_vendor"]="unknown" +S["host_cpu"]="x86_64" +S["host"]="x86_64-unknown-linux-gnu" +S["build_os"]="linux-gnu" +S["build_vendor"]="unknown" +S["build_cpu"]="x86_64" +S["build"]="x86_64-unknown-linux-gnu" +S["XGETTEXT_EXTRA_OPTIONS"]="" +S["MSGMERGE"]=":" +S["XGETTEXT_015"]=":" +S["XGETTEXT"]=":" +S["GMSGFMT_015"]=":" +S["MSGFMT_015"]=":" +S["GMSGFMT"]=":" +S["MSGFMT"]=":" +S["GETTEXT_MACRO_VERSION"]="0.18" +S["USE_NLS"]="yes" +S["am__fastdepCC_FALSE"]="#" +S["am__fastdepCC_TRUE"]="" +S["CCDEPMODE"]="depmode=gcc3" +S["am__nodep"]="_no" +S["AMDEPBACKSLASH"]="\\" +S["AMDEP_FALSE"]="#" +S["AMDEP_TRUE"]="" +S["am__quote"]="" +S["am__include"]="include" +S["DEPDIR"]=".deps" +S["OBJEXT"]="o" +S["EXEEXT"]="" +S["ac_ct_CC"]="gcc" +S["CPPFLAGS"]="" +S["LDFLAGS"]="" +S["CFLAGS"]=" -pthread" +S["CC"]="gcc" +S["am__untar"]="$${TAR-tar} xf -" +S["am__tar"]="$${TAR-tar} chof - \"$$tardir\"" +S["AMTAR"]="$${TAR-tar}" +S["am__leading_dot"]="." +S["SET_MAKE"]="" +S["AWK"]="mawk" +S["mkdir_p"]="/usr/bin/mkdir -p" +S["MKDIR_P"]="/usr/bin/mkdir -p" +S["INSTALL_STRIP_PROGRAM"]="$(install_sh) -c -s" +S["STRIP"]="" +S["install_sh"]="${SHELL} /home/djq/goaccess-1.3/install-sh" +S["MAKEINFO"]="${SHELL} /home/djq/goaccess-1.3/missing --run makeinfo" +S["AUTOHEADER"]="${SHELL} /home/djq/goaccess-1.3/missing --run autoheader" +S["AUTOMAKE"]="${SHELL} /home/djq/goaccess-1.3/missing --run automake-1.11" +S["AUTOCONF"]="${SHELL} /home/djq/goaccess-1.3/missing --run autoconf" +S["ACLOCAL"]="${SHELL} /home/djq/goaccess-1.3/missing --run aclocal-1.11" +S["VERSION"]="1.3" +S["PACKAGE"]="goaccess" +S["CYGPATH_W"]="echo" +S["am__isrc"]="" +S["INSTALL_DATA"]="${INSTALL} -m 644" +S["INSTALL_SCRIPT"]="${INSTALL}" +S["INSTALL_PROGRAM"]="${INSTALL}" +S["target_alias"]="" +S["host_alias"]="" +S["build_alias"]="" +S["LIBS"]="-lnsl -lncursesw -lGeoIP -lpthread " +S["ECHO_T"]="" +S["ECHO_N"]="-n" +S["ECHO_C"]="" +S["DEFS"]="-DHAVE_CONFIG_H" +S["mandir"]="${datarootdir}/man" +S["localedir"]="${datarootdir}/locale" +S["libdir"]="${exec_prefix}/lib" +S["psdir"]="${docdir}" +S["pdfdir"]="${docdir}" +S["dvidir"]="${docdir}" +S["htmldir"]="${docdir}" +S["infodir"]="${datarootdir}/info" +S["docdir"]="${datarootdir}/doc/${PACKAGE_TARNAME}" +S["oldincludedir"]="/usr/include" +S["includedir"]="${prefix}/include" +S["localstatedir"]="${prefix}/var" +S["sharedstatedir"]="${prefix}/com" +S["sysconfdir"]="${prefix}/etc" +S["datadir"]="${datarootdir}" +S["datarootdir"]="${prefix}/share" +S["libexecdir"]="${exec_prefix}/libexec" +S["sbindir"]="${exec_prefix}/sbin" +S["bindir"]="${exec_prefix}/bin" +S["program_transform_name"]="s,x,x," +S["prefix"]="/usr/local" +S["exec_prefix"]="${prefix}" +S["PACKAGE_URL"]="http://goaccess.io" +S["PACKAGE_BUGREPORT"]="goaccess@prosoftcorp.com" +S["PACKAGE_STRING"]="goaccess 1.3" +S["PACKAGE_VERSION"]="1.3" +S["PACKAGE_TARNAME"]="goaccess" +S["PACKAGE_NAME"]="goaccess" +S["PATH_SEPARATOR"]=":" +S["SHELL"]="/bin/bash" +_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 +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 +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 { +D["PACKAGE_NAME"]=" \"goaccess\"" +D["PACKAGE_TARNAME"]=" \"goaccess\"" +D["PACKAGE_VERSION"]=" \"1.3\"" +D["PACKAGE_STRING"]=" \"goaccess 1.3\"" +D["PACKAGE_BUGREPORT"]=" \"goaccess@prosoftcorp.com\"" +D["PACKAGE_URL"]=" \"http://goaccess.io\"" +D["PACKAGE"]=" \"goaccess\"" +D["VERSION"]=" \"1.3\"" +D["ENABLE_NLS"]=" 1" +D["HAVE_GETTEXT"]=" 1" +D["HAVE_DCGETTEXT"]=" 1" +D["HAVE_LIBPTHREAD"]=" 1" +D["HAVE_LIBGEOIP"]=" 1" +D["HAVE_GEOLOCATION"]=" 1" +D["HAVE_LIBNCURSESW"]=" 1" +D["HAVE_LIBNCURSESW"]=" 1" +D["HAVE_NCURSESW_NCURSES_H"]=" 1" +D["HAVE_NCURSES_H"]=" 1" +D["HAVE_LIBNSL"]=" 1" +D["STDC_HEADERS"]=" 1" +D["HAVE_SYS_TYPES_H"]=" 1" +D["HAVE_SYS_STAT_H"]=" 1" +D["HAVE_STDLIB_H"]=" 1" +D["HAVE_STRING_H"]=" 1" +D["HAVE_MEMORY_H"]=" 1" +D["HAVE_STRINGS_H"]=" 1" +D["HAVE_INTTYPES_H"]=" 1" +D["HAVE_STDINT_H"]=" 1" +D["HAVE_UNISTD_H"]=" 1" +D["HAVE_ARPA_INET_H"]=" 1" +D["HAVE_FCNTL_H"]=" 1" +D["HAVE_INTTYPES_H"]=" 1" +D["HAVE_LIMITS_H"]=" 1" +D["HAVE_LOCALE_H"]=" 1" +D["HAVE_NETDB_H"]=" 1" +D["HAVE_NETINET_IN_H"]=" 1" +D["HAVE_STDDEF_H"]=" 1" +D["HAVE_STDINT_H"]=" 1" +D["HAVE_STDLIB_H"]=" 1" +D["HAVE_STRING_H"]=" 1" +D["HAVE_STRINGS_H"]=" 1" +D["HAVE_SYS_SOCKET_H"]=" 1" +D["HAVE_SYS_TIME_H"]=" 1" +D["HAVE_UNISTD_H"]=" 1" +D["HAVE_PTRDIFF_T"]=" 1" +D["HAVE_FSEEKO"]=" 1" +D["TIME_WITH_SYS_TIME"]=" 1" +D["HAVE_SYS_TIME_H"]=" 1" +D["HAVE_UNISTD_H"]=" 1" +D["HAVE_ALARM"]=" 1" +D["LSTAT_FOLLOWS_SLASHED_SYMLINK"]=" 1" +D["HAVE_STRFTIME"]=" 1" +D["HAVE_GETHOSTBYADDR"]=" 1" +D["HAVE_GETHOSTBYNAME"]=" 1" +D["HAVE_GETTIMEOFDAY"]=" 1" +D["HAVE_MALLOC"]=" 1" +D["HAVE_MEMMOVE"]=" 1" +D["HAVE_MEMSET"]=" 1" +D["HAVE_MKFIFO"]=" 1" +D["HAVE_REALLOC"]=" 1" +D["HAVE_REALPATH"]=" 1" +D["HAVE_REGCOMP"]=" 1" +D["HAVE_SELECT"]=" 1" +D["HAVE_SETLOCALE"]=" 1" +D["HAVE_SOCKET"]=" 1" +D["HAVE_STRCASECMP"]=" 1" +D["HAVE_STRCHR"]=" 1" +D["HAVE_STRCSPN"]=" 1" +D["HAVE_STRDUP"]=" 1" +D["HAVE_STRERROR"]=" 1" +D["HAVE_STRNCASECMP"]=" 1" +D["HAVE_STRPBRK"]=" 1" +D["HAVE_STRRCHR"]=" 1" +D["HAVE_STRSPN"]=" 1" +D["HAVE_STRSTR"]=" 1" +D["HAVE_STRTOL"]=" 1" +D["HAVE_STRTOULL"]=" 1" + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+[_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ][_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]*([\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 + 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 +# 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;} + ac_datarootdir_hack=' + s&@datadir@&${datarootdir}&g + s&@docdir@&${datarootdir}/doc/${PACKAGE_TARNAME}&g + s&@infodir@&${datarootdir}/info&g + s&@localedir@&${datarootdir}/locale&g + s&@mandir@&${datarootdir}/man&g + s&\${datarootdir}&${prefix}/share&g' ;; +esac +ac_sed_extra="/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +} + +: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"" || { + # Autoconf 2.62 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"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //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' -e 's/\$U/'"$U"'/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 +} + ;; + "po-directories":C) + for ac_file in $CONFIG_FILES; do + # Support "outfile[:infile[:infile...]]" + case "$ac_file" in + *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + esac + # PO directories have a Makefile.in generated from Makefile.in.in. + case "$ac_file" in */Makefile.in) + # Adjust a relative srcdir. + ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` + ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" + ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` + # In autoconf-2.13 it is called $ac_given_srcdir. + # In autoconf-2.50 it is called $srcdir. + test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" + case "$ac_given_srcdir" in + .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; + /*) top_srcdir="$ac_given_srcdir" ;; + *) top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + # Treat a directory as a PO directory if and only if it has a + # POTFILES.in file. This allows packages to have multiple PO + # directories under different names or in different locations. + if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then + rm -f "$ac_dir/POTFILES" + test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" + cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" + POMAKEFILEDEPS="POTFILES.in" + # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend + # on $ac_dir but don't depend on user-specified configuration + # parameters. + if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then + # The LINGUAS file contains the set of available languages. + if test -n "$OBSOLETE_ALL_LINGUAS"; then + test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" + fi + ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` + # Hide the ALL_LINGUAS assigment from automake < 1.5. + eval 'ALL_LINGUAS''=$ALL_LINGUAS_' + POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" + else + # The set of available languages was given in configure.in. + # Hide the ALL_LINGUAS assigment from automake < 1.5. + eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' + fi + # Compute POFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) + # Compute UPDATEPOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) + # Compute DUMMYPOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) + # Compute GMOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) + case "$ac_given_srcdir" in + .) srcdirpre= ;; + *) srcdirpre='$(srcdir)/' ;; + esac + POFILES= + UPDATEPOFILES= + DUMMYPOFILES= + GMOFILES= + for lang in $ALL_LINGUAS; do + POFILES="$POFILES $srcdirpre$lang.po" + UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" + DUMMYPOFILES="$DUMMYPOFILES $lang.nop" + GMOFILES="$GMOFILES $srcdirpre$lang.gmo" + done + # CATALOGS depends on both $ac_dir and the user's LINGUAS + # environment variable. + INST_LINGUAS= + if test -n "$ALL_LINGUAS"; then + for presentlang in $ALL_LINGUAS; do + useit=no + if test "%UNSET%" != "$LINGUAS"; then + desiredlanguages="$LINGUAS" + else + desiredlanguages="$ALL_LINGUAS" + fi + for desiredlang in $desiredlanguages; do + # Use the presentlang catalog if desiredlang is + # a. equal to presentlang, or + # b. a variant of presentlang (because in this case, + # presentlang can be used as a fallback for messages + # which are not translated in the desiredlang catalog). + case "$desiredlang" in + "$presentlang"*) useit=yes;; + esac + done + if test $useit = yes; then + INST_LINGUAS="$INST_LINGUAS $presentlang" + fi + done + fi + CATALOGS= + if test -n "$INST_LINGUAS"; then + for lang in $INST_LINGUAS; do + CATALOGS="$CATALOGS $lang.gmo" + done + fi + test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" + sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" + for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do + if test -f "$f"; then + case "$f" in + *.orig | *.bak | *~) ;; + *) cat "$f" >> "$ac_dir/Makefile" ;; + esac + fi + done + fi + ;; + esac + done ;; + + esac +done # for ac_tag + + +as_fn_exit 0 diff --git a/goaccess++/config.sub b/goaccess++/config.sub new file mode 100644 index 0000000..6205f84 --- /dev/null +++ b/goaccess++/config.sub @@ -0,0 +1,1782 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +# 2011, 2012 Free Software Foundation, Inc. + +timestamp='2012-04-18' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# 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 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, 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. + + +# Please send patches to . Submit a context +# diff and a properly formatted GNU ChangeLog entry. +# +# 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 (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, +2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 +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-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 | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ + | be32 | be64 \ + | bfin \ + | c4x | 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 \ + | le32 | le64 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | 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 \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nds32 | nds32le | nds32be \ + | nios | nios2 \ + | ns16k | ns32k \ + | open8 \ + | 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 | 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-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | be32-* | be64-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* \ + | 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-* \ + | le32-* | le64-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ + | 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-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nds32-* | nds32le-* | nds32be-* \ + | nios-* | nios2-* \ + | 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 + ;; + mingw32) + basic_machine=i386-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=i386-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) + 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* \ + | -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* \ + | -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* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -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 + ;; + -kaos*) + os=-kaos + ;; + -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 + ;; + 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 + ;; + 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: diff --git a/goaccess++/config/browsers.list b/goaccess++/config/browsers.list new file mode 100644 index 0000000..267fa9e --- /dev/null +++ b/goaccess++/config/browsers.list @@ -0,0 +1,102 @@ +# List of browsers and their categories +# e.g., WORD delimited by tab(s) TYPE +# +# **IMPORTANT NOTE**: +# --------------------- +# The SIZE of the list is proportional to the run time. +# Thus, the longer the list, the more time GoAccess will take to parse it. +# +# Also, you should note that the higher the browser/item is on the list, the +# faster the parsing will be. +# +# The list needs to be specified using --browsers-file=. This file is not +# parsed by default. +# +# The items below are sample crawlers, adjust as needed. + +Chef Client Crawlers +Abonti Crawlers +SISTRIX Crawlers +DotBot Crawlers +Speedy Spider Crawlers +Sosospider Crawlers +BPImageWalker Crawlers +DoCoMo Crawlers +GSLFbot Crawlers +YodaoBot Crawlers +AddThis Crawlers +Purebot Crawlers +CCBot Crawlers +findlinks Crawlers +ichiro Crawlers +Linguee Bot Crawlers +Gigabot Crawlers +BacklinkCrawler Crawlers +distilator Crawlers +Aboundex Crawlers +UnwindFetchor Crawlers +SBIder Crawlers +TestNutch Crawlers +DomainCrawler Crawlers +NextGenSearchBot Crawlers +SEOENGWorldBot Crawlers +Cityreview Crawlers +PagePeeker Crawlers +JS-Kit Crawlers +ScreenerBot Crawlers +ShowyouBot Crawlers +SolomonoBot Crawlers +Domnutch Crawlers +MaxPoint Crawlers +NCBot Crawlers +TosCrawler Crawlers +Updownerbot Crawlers +OpenWebSpider Crawlers +WordPress Crawlers +PEAR Crawlers +ZumBot Crawlers +YisouSpider Crawlers +W3C Crawlers +vcheck Crawlers +PercolateCrawler Crawlers +NING Crawlers +gvfs Crawlers +CatchBot Crawlers +Combine Crawlers +A6-Indexer Crawlers +Altresium Crawlers +Comodo Crawlers +crawler4j Crawlers +Cricket Crawlers +EC2LinkFinder Crawlers +envolk Crawlers +GeoHasher Crawlers +HTMLParser Crawlers +MLBot Crawlers +Jaxified Crawlers +LinkWalker Crawlers +nutch Crawlers +PostRank Crawlers +keybase-proofs Crawlers +CommonCrawler Crawlers +X-CAD-SE Crawlers +Safeassign Crawlers +Nmap Crawlers +sqlmap Crawlers +Jorgee Crawlers +PxBroker Crawlers +Seekport Crawlers +adscanner Crawlers +AfD-Verbotsverfahren_JETZT! Crawlers + +Vienna Feeds +Windows-RSS-Platform Feeds +newsbeuter Feeds +Wrangler Feeds +Fever Feeds +Tiny Feeds +FreshRSS Feeds +KrISS Feeds +SimplePie Feeds +Feedsubs Feeds +UniversalFeedParser Feeds diff --git a/goaccess++/config/goaccess.conf b/goaccess++/config/goaccess.conf new file mode 100644 index 0000000..e0ebe34 --- /dev/null +++ b/goaccess++/config/goaccess.conf @@ -0,0 +1,766 @@ +###################################### +# Time Format Options (required) +###################################### +# +# The hour (24-hour clock) [00,23]; leading zeros are permitted but not required. +# The minute [00,59]; leading zeros are permitted but not required. +# The seconds [00,60]; leading zeros are permitted but not required. +# See `man strftime` for more details +# +# The following time format works with any of the +# Apache/NGINX's log formats below. +# +#time-format %H:%M:%S +# +# Google Cloud Storage or +# The time in microseconds since the Unix epoch. +# +#time-format %f + +# Squid native log format +# +#time-format %s + +###################################### +# Date Format Options (required) +###################################### +# +# The date-format variable followed by a space, specifies +# the log format date containing any combination of regular +# characters and special format specifiers. They all begin with a +# percentage (%) sign. See `man strftime` +# +# The following date format works with any of the +# Apache/NGINX's log formats below. +# +#date-format %d/%b/%Y +# +# AWS | Amazon CloudFront (Download Distribution) +# AWS | Elastic Load Balancing +# W3C (IIS) +# +#date-format %Y-%m-%d +# +# Google Cloud Storage or +# The time in microseconds since the Unix epoch. +# +#date-format %f + +# Squid native log format +# +#date-format %s + +###################################### +# Log Format Options (required) +###################################### +# +# The log-format variable followed by a space or \t for +# tab-delimited, specifies the log format string. +# +# NOTE: If the time/date is a timestamp in seconds or microseconds +# %x must be used instead of %d & %t to represent the date & time. + +# NCSA Combined Log Format +#log-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u" + +# NCSA Combined Log Format with Virtual Host +#log-format %v:%^ %h %^[%d:%t %^] "%r" %s %b "%R" "%u" + +# Common Log Format (CLF) +#log-format %h %^[%d:%t %^] "%r" %s %b + +# Common Log Format (CLF) with Virtual Host +#log-format %v:%^ %h %^[%d:%t %^] "%r" %s %b + +# W3C +#log-format %d %t %h %^ %^ %^ %^ %r %^ %s %b %^ %^ %u %R + +# Squid native log format +#log-format %^ %^ %^ %v %^: %x.%^ %~%L %h %^/%s %b %m %U + +# AWS | Amazon CloudFront (Download Distribution) +#log-format %d\t%t\t%^\t%b\t%h\t%m\t%^\t%r\t%s\t%R\t%u\t%^ + +# Google Cloud Storage +#log-format "%x","%h",%^,%^,"%m","%U","%s",%^,"%b","%D",%^,"%R","%u" + +# AWS | Elastic Load Balancing +#log-format %dT%t.%^ %^ %h:%^ %^ %T %^ %^ %^ %s %^ %b "%r" "%u" + +# AWSS3 | Amazon Simple Storage Service (S3) +#log-format %^[%d:%t %^] %h %^"%r" %s %^ %b %^ %L %^ "%R" "%u" + +# Virtualmin Log Format with Virtual Host +#log-format %h %^ %v %^[%d:%t %^] "%r" %s %b "%R" "%u" + +# In addition to specifying the raw log/date/time formats, for +# simplicity, any of the following predefined log format names can be +# supplied to the log/date/time-format variables. GoAccess can also +# handle one predefined name in one variable and another predefined +# name in another variable. +# +#log-format COMBINED +#log-format VCOMBINED +#log-format COMMON +#log-format VCOMMON +#log-format W3C +#log-format SQUID +#log-format CLOUDFRONT +#log-format CLOUDSTORAGE +#log-format AWSELB +#log-format AWSS3 + +###################################### +# UI Options +###################################### + +# Choose among color schemes +# 1 : Monochrome +# 2 : Green +# 3 : Monokai (if 256-colors supported) +# +#color-scheme 3 + +# Prompt log/date configuration window on program start. +# +config-dialog false + +# Color highlight active panel. +# +hl-header true + +# Specify a custom CSS file in the HTML report. +# +#html-custom-css /path/file.css + +# Specify a custom JS file in the HTML report. +# +#html-custom-js /path/file.js + +# Set default HTML preferences. +# +# NOTE: A valid JSON object is required. +# DO NOT USE A MULTILINE JSON OBJECT. +# The parser will only parse the value next to `html-prefs` (single line) +# It allows the ability to customize each panel plot. See example below. +# +#html-prefs {"theme":"bright","perPage":5,"layout":"horizontal","showTables":true,"visitors":{"plot":{"chartType":"bar"}}} + +# Set HTML report page title and header. +# +#html-report-title My Awesome Web Stats + +# Format JSON output using tabs and newlines. +# +json-pretty-print false + +# Turn off colored output. This is the default output on +# terminals that do not support colors. +# true : for no color output +# false : use color-scheme +# +no-color false + +# Don't write column names in the terminal output. By default, it displays +# column names for each available metric in every panel. +# +no-column-names false + +# Disable summary metrics on the CSV output. +# +no-csv-summary false + +# Disable progress metrics. +# +no-progress false + +# Disable scrolling through panels on TAB. +# +no-tab-scroll false + +# Disable progress metrics and parsing spinner. +# +#no-parsing-spinner true + +# Do not show the last updated field displayed in the HTML generated report. +# +#no-html-last-updated true + +# Enable mouse support on main dashboard. +# +with-mouse false + +# Maximum number of items to show per panel. +# Note: Only the CSV and JSON outputs allow a maximum greater than the +# default value of 366. +# +#max-items 366 + +# Custom colors for the terminal output +# Tailor GoAccess to suit your own tastes. +# +# Color Syntax: +# DEFINITION space/tab colorFG#:colorBG# [[attributes,] PANEL] +# +# FG# = foreground color number [-1...255] (-1 = default terminal color) +# BG# = background color number [-1...255] (-1 = default terminal color) +# +# Optionally: +# +# It is possible to apply color attributes, such as: +# bold,underline,normal,reverse,blink. +# Multiple attributes are comma separated +# +# If desired, it is possible to apply custom colors per panel, that is, a +# metric in the REQUESTS panel can be of color A, while the same metric in the +# BROWSERS panel can be of color B. +# +# The following is a 256 color scheme (hybrid palette) +# +#color COLOR_MTRC_HITS color110:color-1 +#color COLOR_MTRC_VISITORS color173:color-1 +#color COLOR_MTRC_DATA color221:color-1 +#color COLOR_MTRC_BW color167:color-1 +#color COLOR_MTRC_AVGTS color143:color-1 +#color COLOR_MTRC_CUMTS color247:color-1 +#color COLOR_MTRC_MAXTS color186:color-1 +#color COLOR_MTRC_PROT color109:color-1 +#color COLOR_MTRC_MTHD color139:color-1 +#color COLOR_MTRC_HITS_PERC color186:color-1 +#color COLOR_MTRC_HITS_PERC_MAX color139:color-1 +#color COLOR_MTRC_HITS_PERC_MAX color139:color-1 VISITORS +#color COLOR_MTRC_HITS_PERC_MAX color139:color-1 OS +#color COLOR_MTRC_HITS_PERC_MAX color139:color-1 BROWSERS +#color COLOR_MTRC_HITS_PERC_MAX color139:color-1 VISIT_TIMES +#color COLOR_MTRC_VISITORS_PERC color186:color-1 +#color COLOR_MTRC_VISITORS_PERC_MAX color139:color-1 +#color COLOR_PANEL_COLS color243:color-1 +#color COLOR_BARS color250:color-1 +#color COLOR_ERROR color231:color167 +#color COLOR_SELECTED color7:color167 +#color COLOR_PANEL_ACTIVE color7:color237 +#color COLOR_PANEL_HEADER color250:color235 +#color COLOR_PANEL_DESC color242:color-1 +#color COLOR_OVERALL_LBLS color243:color-1 +#color COLOR_OVERALL_VALS color167:color-1 +#color COLOR_OVERALL_PATH color186:color-1 +#color COLOR_ACTIVE_LABEL color139:color235 bold underline +#color COLOR_BG color250:color-1 +#color COLOR_DEFAULT color243:color-1 +#color COLOR_PROGRESS color7:color110 + +###################################### +# Server Options +###################################### + +# Specify IP address to bind server to. +# +#addr 0.0.0.0 + +# Run GoAccess as daemon (if --real-time-html enabled). +# +#daemonize false + +# Ensure clients send the specified origin header upon the WebSocket +# handshake. +# +#origin http://example.org + +# The port to which the connection is being attempted to connect. +# By default GoAccess' WebSocket server listens on port 7890 +# See man page or http://gwsocket.io for details. +# +#port 7890 + +# Write the PID to a file when used along the daemonize option. +# +#pid-file /var/run/goaccess.pid + +# Enable real-time HTML output. +# +#real-time-html true + +# Path to TLS/SSL certificate. +# Note that ssl-cert and ssl-key need to be used to enable TLS/SSL. +# +#ssl-cert /path/ssl/domain.crt + +# Path to TLS/SSL private key. +# Note that ssl-cert and ssl-key need to be used to enable TLS/SSL. +# +#ssl-key /path/ssl/domain.key + +# URL to which the WebSocket server responds. This is the URL supplied +# to the WebSocket constructor on the client side. +# +# Optionally, it is possible to specify the WebSocket URI scheme, such as ws:// +# or wss:// for unencrypted and encrypted connections. +# e.g., ws-url wss://goaccess.io +# +# If GoAccess is running behind a proxy, you could set the client side +# to connect to a different port by specifying the host followed by a +# colon and the port. +# e.g., ws-url goaccess.io:9999 +# +# By default, it will attempt to connect to localhost. If GoAccess is +# running on a remote server, the host of the remote server should be +# specified here. Also, make sure it is a valid host and NOT an http +# address. +# +#ws-url goaccess.io + +# Path to read named pipe (FIFO). +# +#fifo-in /tmp/wspipein.fifo + +# Path to write named pipe (FIFO). +# +#fifo-in /tmp/wspipeout.fifo + +###################################### +# File Options +###################################### + +# Specify the path to the input log file. If set, it will take +# priority over -f from the command line. +# +#log-file /var/log/apache2/access.log + +# Send all debug messages to the specified file. +# +#debug-file debug.log + +# Specify a custom configuration file to use. If set, it will take +# priority over the global configuration file (if any). +# +#config-file + +# Log invalid requests to the specified file. +# +#invalid-requests + +# Do not load the global configuration file. +# +#no-global-config false + +###################################### +# Parse Options +###################################### + +# Enable a list of user-agents by host. For faster parsing, do not +# enable this flag. +# +agent-list false + +# Enable IP resolver on HTML|JSON|CSV output. +# +with-output-resolver false + +# Exclude an IPv4 or IPv6 from being counted. +# Ranges can be included as well using a dash in between +# the IPs (start-end). +# +#exclude-ip 127.0.0.1 +#exclude-ip 192.168.0.1-192.168.0.100 +#exclude-ip ::1 +#exclude-ip 0:0:0:0:0:ffff:808:804-0:0:0:0:0:ffff:808:808 + +# Include HTTP request method if found. This will create a +# request key containing the request method + the actual request. +# +# [default: yes] +# +http-method yes + +# Include HTTP request protocol if found. This will create a +# request key containing the request protocol + the actual request. +# +# [default: yes] +# +http-protocol yes + +# Write output to stdout given one of the following files and the +# corresponding extension for the output format: +# +# /path/file.csv - Comma-separated values (CSV) +# /path/file.json - JSON (JavaScript Object Notation) +# /path/file.html - HTML +# +# output /path/file.html + +# Ignore request's query string. +# i.e., www.google.com/page.htm?query => www.google.com/page.htm +# +# Note: Removing the query string can greatly decrease memory +# consumption, especially on timestamped requests. +# +no-query-string false + +# Disable IP resolver on terminal output. +# +no-term-resolver false + +# Treat non-standard status code 444 as 404. +# +444-as-404 false + +# Add 4xx client errors to the unique visitors count. +# +4xx-to-unique-count false + +# Store accumulated processing time from parsing day-by-day logs. +# Only if configured with --enable-tcb=btree +# +#accumulated-time false + +# IP address anonymization +# The IP anonymization option sets the last octet of IPv4 user IP addresses and +# the last 80 bits of IPv6 addresses to zeros. +# e.g., 192.168.20.100 => 192.168.20.0 +# e.g., 2a03:2880:2110:df07:face:b00c::1 => 2a03:2880:2110:df07:: +# +#anonymize-ip false + +# Include static files that contain a query string in the static files +# panel. +# e.g., /fonts/fontawesome-webfont.woff?v=4.0.3 +# +all-static-files false + +# Include an additional delimited list of browsers/crawlers/feeds etc. +# See config/browsers.list for an example or +# https://raw.githubusercontent.com/allinurl/goaccess/master/config/browsers.list +# +#browsers-file + +# Date specificity. Possible values: `date` (default), or `hr`. +# +#date-spec hr + +# Decode double-encoded values. +# +double-decode false + +# Enable parsing/displaying the given panel. +# +#enable-panel VISITORS +#enable-panel REQUESTS +#enable-panel REQUESTS_STATIC +#enable-panel NOT_FOUND +#enable-panel HOSTS +#enable-panel OS +#enable-panel BROWSERS +#enable-panel VISIT_TIMES +#enable-panel VIRTUAL_HOSTS +#enable-panel REFERRERS +#enable-panel REFERRING_SITES +#enable-panel KEYPHRASES +#enable-panel STATUS_CODES +#enable-panel REMOTE_USER +#enable-panel GEO_LOCATION + +# Hide a referer but still count it. Wild cards are allowed. i.e., *.bing.com +# +#hide-referer *.google.com +#hide-referer bing.com + +# Hour specificity. Possible values: `hr` (default), or `min` (tenth +# of a minute). +# +#hour-spec min + +# Ignore crawlers from being counted. +# This will ignore robots listed under browsers.c +# Note that it will count them towards the total +# number of requests, but excluded from any of the panels. +# +ignore-crawlers false + +# Parse and display crawlers only. +# This will ignore robots listed under browsers.c +# Note that it will count them towards the total +# number of requests, but excluded from any of the panels. +# +crawlers-only false + +# Ignore static file requests. +# req : Only ignore request from valid requests +# panels : Ignore request from panels. +# Note that it will count them towards the total number of requests +# ignore-statics req + +# Ignore parsing and displaying the given panel. +# +#ignore-panel VISITORS +#ignore-panel REQUESTS +#ignore-panel REQUESTS_STATIC +#ignore-panel NOT_FOUND +#ignore-panel HOSTS +#ignore-panel OS +#ignore-panel BROWSERS +#ignore-panel VISIT_TIMES +#ignore-panel VIRTUAL_HOSTS +ignore-panel REFERRERS +#ignore-panel REFERRING_SITES +ignore-panel KEYPHRASES +#ignore-panel STATUS_CODES +#ignore-panel REMOTE_USER +#ignore-panel GEO_LOCATION + +# Ignore referers from being counted. +# This supports wild cards. For instance, +# '*' matches 0 or more characters (including spaces) +# '?' matches exactly one character +# +#ignore-referer *.domain.com +#ignore-referer ww?.domain.* + +# Ignore parsing and displaying one or multiple status code(s) +# +#ignore-status 400 +#ignore-status 502 + +# Number of lines from the access log to test against the provided +# log/date/time format. By default, the parser is set to test 10 +# lines. If set to 0, the parser won't test any lines and will parse +# the whole access log. +# +#num-tests 10 + +# Parse log and exit without outputting data. +# +#process-and-exit false + +# Display real OS names. e.g, Windows XP, Snow Leopard. +# +real-os true + +# Sort panel on initial load. +# Sort options are separated by comma. +# Options are in the form: PANEL,METRIC,ORDER +# +# Available metrics: +# BY_HITS - Sort by hits +# BY_VISITORS - Sort by unique visitors +# BY_DATA - Sort by data +# BY_BW - Sort by bandwidth +# BY_AVGTS - Sort by average time served +# BY_CUMTS - Sort by cumulative time served +# BY_MAXTS - Sort by maximum time served +# BY_PROT - Sort by http protocol +# BY_MTHD - Sort by http method +# Available orders: +# ASC +# DESC +# +#sort-panel VISITORS,BY_DATA,ASC +#sort-panel REQUESTS,BY_HITS,ASC +#sort-panel REQUESTS_STATIC,BY_HITS,ASC +#sort-panel NOT_FOUND,BY_HITS,ASC +#sort-panel HOSTS,BY_HITS,ASC +#sort-panel OS,BY_HITS,ASC +#sort-panel BROWSERS,BY_HITS,ASC +#sort-panel VISIT_TIMES,BY_DATA,DESC +#sort-panel VIRTUAL_HOSTS,BY_HITS,ASC +#sort-panel REFERRERS,BY_HITS,ASC +#sort-panel REFERRING_SITES,BY_HITS,ASC +#sort-panel KEYPHRASES,BY_HITS,ASC +#sort-panel STATUS_CODES,BY_HITS,ASC +#sort-panel REMOTE_USER,BY_HITS,ASC +#sort-panel GEO_LOCATION,BY_HITS,ASC + +# Consider the following extensions as static files +# The actual '.' is required and extensions are case sensitive +# For a full list, uncomment the less common static extensions below. +# +static-file .css +static-file .js +static-file .jpg +static-file .png +static-file .gif +static-file .ico +static-file .jpeg +static-file .pdf +static-file .csv +static-file .mpeg +static-file .mpg +static-file .swf +static-file .woff +static-file .woff2 +static-file .xls +static-file .xlsx +static-file .doc +static-file .docx +static-file .ppt +static-file .pptx +static-file .txt +static-file .zip +static-file .ogg +static-file .mp3 +static-file .mp4 +static-file .exe +static-file .iso +static-file .gz +static-file .rar +static-file .svg +static-file .bmp +static-file .tar +static-file .tgz +static-file .tiff +static-file .tif +static-file .ttf +static-file .flv +#static-file .less +#static-file .ac3 +#static-file .avi +#static-file .bz2 +#static-file .class +#static-file .cue +#static-file .dae +#static-file .dat +#static-file .dts +#static-file .ejs +#static-file .eot +#static-file .eps +#static-file .img +#static-file .jar +#static-file .map +#static-file .mid +#static-file .midi +#static-file .ogv +#static-file .webm +#static-file .mkv +#static-file .odp +#static-file .ods +#static-file .odt +#static-file .otf +#static-file .pict +#static-file .pls +#static-file .ps +#static-file .qt +#static-file .rm +#static-file .svgz +#static-file .wav +#static-file .webp + +###################################### +# GeoIP Options +# Only if configured with --enable-geoip +###################################### + +# Standard GeoIP database for less memory usage. +# +#std-geoip false + +# Specify path to GeoIP database file. i.e., GeoLiteCity.dat +# .dat file needs to be downloaded from maxmind.com. +# +# For IPv4 City database: +# wget -N http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz +# gunzip GeoLiteCity.dat.gz +# +# For IPv6 City database: +# wget -N http://geolite.maxmind.com/download/geoip/database/GeoLiteCityv6-beta/GeoLiteCityv6.dat.gz +# gunzip GeoLiteCityv6.dat.gz +# +# For IPv6 Country database: +# wget -N http://geolite.maxmind.com/download/geoip/database/GeoIPv6.dat.gz +# gunzip GeoIPv6.dat.gz +# +# For GeoIP2 City database: +# wget -N http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz +# gunzip GeoLite2-City.mmdb.gz +# +# For GeoIP2 Country database: +# wget -N http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz +# gunzip GeoLite2-Country.mmdb.gz +# +# Note: `geoip-city-data` is an alias of `geoip-database` +# +#geoip-database /usr/local/share/GeoIP/GeoLiteCity.dat + +###################################### +# Tokyo Cabinet Options +# Only if configured with --enable-tcb=btree +###################################### + +# GoAccess has the ability to process logs incrementally through the on-disk +# B+Tree database. +# +# It works in the following way: +# - A data set must be persisted first with --keep-db-files, then the same data +# set can be loaded with --load-from-disk. +# - If new data is passed (piped or through a log file), it will append it to +# the original data set. +# - To preserve the data at all times, --keep-db-files must be used. +# - If --load-from-disk is used without --keep-db-files, database files will be +# deleted upon closing the program. + +# On-disk B+ Tree +# Persist parsed data into disk. This should be set to +# the first dataset prior to use `load-from-disk`. +# Setting it to false will delete all database files +# when exiting the program. +#keep-db-files true + +# On-disk B+ Tree +# Load previously stored data from disk. +# Database files need to exist. See `keep-db-files`. +#load-from-disk false + +# On-disk B+ Tree +# Path where the on-disk database files are stored. +# The default value is the /tmp/ directory +# Note the trailing forward-slash. +# +#db-path /tmp/ + +# On-disk B+ Tree +# Set the size in bytes of the extra mapped memory. +# The default value is 0. +# +#xmmap 0 + +# On-disk B+ Tree +# Max number of leaf nodes to be cached. +# Specifies the maximum number of leaf nodes to be cached. +# If it is not more than 0, the default value is specified. +# The default value is 1024. +# +#cache-lcnum 1024 + +# On-disk B+ Tree +# Specifies the maximum number of non-leaf nodes to be cached. +# If it is not more than 0, the default value is specified. +# The default value is 512. +# +#cache-ncnum 512 + +# On-disk B+ Tree +# Specifies the number of members in each leaf page. +# If it is not more than 0, the default value is specified. +# The default value is 128. +# +#tune-lmemb 128 + +# On-disk B+ Tree +# Specifies the number of members in each non-leaf page. +# If it is not more than 0, the default value is specified. +# The default value is 256. +# +#tune-nmemb 256 + +# On-disk B+ Tree +# Specifies the number of elements of the bucket array. +# If it is not more than 0, the default value is specified. +# The default value is 32749. +# Suggested size of the bucket array is about from 1 to 4 +# times of the number of all pages to be stored. +# +#tune-bnum 32749 + +# On-disk B+ Tree +# Specifies that each page is compressed with ZLIB|BZ2 encoding. +# Disabled by default. +# +#compression zlib diff --git a/goaccess++/configure b/goaccess++/configure new file mode 100644 index 0000000..2829f1f --- /dev/null +++ b/goaccess++/configure @@ -0,0 +1,10655 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for goaccess 1.3. +# +# 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 +$0: goaccess@prosoftcorp.com about your system, including +$0: any error possibly output before this message. Then +$0: install a modern shell, or manually run the script +$0: 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='goaccess' +PACKAGE_TARNAME='goaccess' +PACKAGE_VERSION='1.3' +PACKAGE_STRING='goaccess 1.3' +PACKAGE_BUGREPORT='goaccess@prosoftcorp.com' +PACKAGE_URL='http://goaccess.io' + +ac_unique_file="src/goaccess.c" +gt_needs= +# 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_header_list= +ac_func_list= +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +POW_LIB +LIBOBJS +HAS_SEDTR_FALSE +HAS_SEDTR_TRUE +TR_CHECK +SED_CHECK +TCB_FALSE +TCB_TRUE +GEOIP_MMDB_FALSE +GEOIP_MMDB_TRUE +GEOIP_LEGACY_FALSE +GEOIP_LEGACY_TRUE +WITH_RDYNAMIC_FALSE +WITH_RDYNAMIC_TRUE +DEBUG_FALSE +DEBUG_TRUE +POSUB +LTLIBINTL +LIBINTL +INTLLIBS +LTLIBICONV +LIBICONV +INTL_MACOSX_LIBS +EGREP +GREP +CPP +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +XGETTEXT_EXTRA_OPTIONS +MSGMERGE +XGETTEXT_015 +XGETTEXT +GMSGFMT_015 +MSGFMT_015 +GMSGFMT +MSGFMT +GETTEXT_MACRO_VERSION +USE_NLS +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__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_dependency_tracking +enable_nls +with_gnu_ld +enable_rpath +with_libiconv_prefix +with_libintl_prefix +enable_debug +with_openssl +enable_geoip +with_getline +enable_utf8 +enable_tcb +enable_zlib +enable_bzip +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +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 goaccess 1.3 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/goaccess] + --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 + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of goaccess 1.3:";; + 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] + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors + --disable-nls do not use Native Language Support + --disable-rpath do not hardcode runtime library paths + --enable-debug Create a debug build. Default is disabled + --enable-geoip Enable GeoIP country lookup. Default is disabled + --enable-utf8 Enable ncurses library that handles wide characters + --enable-tcb Enable TokyoCabinet database. Default is disabled + --disable-zlib Build without ZLIB compression + --disable-bzip Build without BZIP2 compression + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-gnu-ld assume the C compiler uses GNU ld default=no + --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib + --without-libiconv-prefix don't search for libiconv in includedir and libdir + --with-libintl-prefix[=DIR] search for libintl in DIR/include and DIR/lib + --without-libintl-prefix don't search for libintl in includedir and libdir + --with-openssl build with OpenSSL support + --with-getline Build using dynamic line buffer. + +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 + 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 . +goaccess home page: . +_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 +goaccess configure 1.3 +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_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_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_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 goaccess@prosoftcorp.com ## +## --------------------------------------- ##" + ) | 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_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_find_intX_t LINENO BITS VAR +# ----------------------------------- +# Finds a signed integer type with width BITS, setting cache variable VAR +# accordingly. +ac_fn_c_find_intX_t () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for int$2_t" >&5 +$as_echo_n "checking for int$2_t... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + # Order is important - never check a type that is potentially smaller + # than half of the expected target width. + for ac_type in int$2_t 'int' 'long int' \ + 'long long int' 'short int' 'signed char'; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default + enum { N = $2 / 2 - 1 }; +int +main () +{ +static int test_array [1 - 2 * !(0 < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1))]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default + enum { N = $2 / 2 - 1 }; +int +main () +{ +static int test_array [1 - 2 * !(($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1) + < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 2))]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + case $ac_type in #( + int$2_t) : + eval "$3=yes" ;; #( + *) : + eval "$3=\$ac_type" ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if eval test \"x\$"$3"\" = x"no"; then : + +else + break +fi + done +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_find_intX_t + +# ac_fn_c_find_uintX_t LINENO BITS VAR +# ------------------------------------ +# Finds an unsigned integer type with width BITS, setting cache variable VAR +# accordingly. +ac_fn_c_find_uintX_t () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5 +$as_echo_n "checking for uint$2_t... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + # Order is important - never check a type that is potentially smaller + # than half of the expected target width. + for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \ + 'unsigned long long int' 'unsigned short int' 'unsigned char'; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + case $ac_type in #( + uint$2_t) : + eval "$3=yes" ;; #( + *) : + eval "$3=\$ac_type" ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if eval test \"x\$"$3"\" = x"no"; then : + +else + break +fi + done +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_find_uintX_t + +# 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 goaccess $as_me 1.3, 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 + +gt_needs="$gt_needs " +as_fn_append ac_header_list " sys/time.h" +as_fn_append ac_header_list " unistd.h" +as_fn_append ac_func_list " alarm" +# 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.11' + +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; } +# Just in case +sleep 1 +echo timestamp > conftest.file +# 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 ( + 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 + rm -f conftest.file + 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 + + 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; } +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 --run true"; then + am_missing_run="$MISSING --run " +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; } + +mkdir_p="$MKDIR_P" +case $mkdir_p in + [\\/$]* | ?:[\\/]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac + +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 + +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='goaccess' + VERSION='1.3' + + +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"} + +# 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}' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + + +ac_config_headers="$ac_config_headers src/config.h" + + +# Use empty CFLAGS by default so autoconf does not add +# CFLAGS="-O2 -g" +# NOTE: Needs to go after AC_INIT and before AC_PROG_CC to select an +# empty default instead. +: ${CFLAGS=""} + +# 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 +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 8's {/usr,}/bin/sh. + touch 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 + + +if test "x$CC" != xcc; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5 +$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } +else + { $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; } +fi +set dummy $CC; ac_cc=`$as_echo "$2" | + sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` +if eval \${ac_cv_prog_cc_${ac_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. +# We do the test twice because some compilers refuse to overwrite an +# existing .o file with -o, though they will create one. +ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' +rm -f conftest2.* +if { { 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; } && + test -f conftest2.$ac_objext && { { 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 + eval ac_cv_prog_cc_${ac_cc}_c_o=yes + if test "x$CC" != xcc; then + # Test first that cc exists at all. + if { ac_try='cc -c conftest.$ac_ext >&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_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' + rm -f conftest2.* + if { { 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; } && + test -f conftest2.$ac_objext && { { 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 + # cc works too. + : + else + # cc exists but doesn't like -o. + eval ac_cv_prog_cc_${ac_cc}_c_o=no + fi + fi + fi +else + eval ac_cv_prog_cc_${ac_cc}_c_o=no +fi +rm -f core conftest* + +fi +if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; 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_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h + +fi + +# FIXME: we rely on the cache variable name because +# there is no other way. +set dummy $CC +am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` +eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o +if test "$am_t" != 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 + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 +$as_echo_n "checking whether NLS is requested... " >&6; } + # Check whether --enable-nls was given. +if test "${enable_nls+set}" = set; then : + enableval=$enable_nls; USE_NLS=$enableval +else + USE_NLS=yes +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 +$as_echo "$USE_NLS" >&6; } + + + + + GETTEXT_MACRO_VERSION=0.18 + + + + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Find out how to test for executable files. Don't use a zero-byte file, +# as systems may use methods other than mode bits to determine executability. +cat >conf$$.file <<_ASEOF +#! /bin/sh +exit 0 +_ASEOF +chmod +x conf$$.file +if test -x conf$$.file >/dev/null 2>&1; then + ac_executable_p="test -x" +else + ac_executable_p="test -f" +fi +rm -f conf$$.file + +# Extract the first word of "msgfmt", so it can be a program name with args. +set dummy msgfmt; 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_MSGFMT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case "$MSGFMT" in + [\\/]* | ?:[\\/]*) + ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. + ;; + *) + ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$ac_save_IFS" + test -z "$ac_dir" && ac_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then + echo "$as_me: trying $ac_dir/$ac_word..." >&5 + if $ac_dir/$ac_word --statistics /dev/null >&5 2>&1 && + (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext" + break 2 + fi + fi + done + done + IFS="$ac_save_IFS" + test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":" + ;; +esac +fi +MSGFMT="$ac_cv_path_MSGFMT" +if test "$MSGFMT" != ":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 +$as_echo "$MSGFMT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + # Extract the first word of "gmsgfmt", so it can be a program name with args. +set dummy gmsgfmt; 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_GMSGFMT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $GMSGFMT in + [\\/]* | ?:[\\/]*) + ac_cv_path_GMSGFMT="$GMSGFMT" # 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_GMSGFMT="$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 + + test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" + ;; +esac +fi +GMSGFMT=$ac_cv_path_GMSGFMT +if test -n "$GMSGFMT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 +$as_echo "$GMSGFMT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; + *) MSGFMT_015=$MSGFMT ;; + esac + + case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; + *) GMSGFMT_015=$GMSGFMT ;; + esac + + + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Find out how to test for executable files. Don't use a zero-byte file, +# as systems may use methods other than mode bits to determine executability. +cat >conf$$.file <<_ASEOF +#! /bin/sh +exit 0 +_ASEOF +chmod +x conf$$.file +if test -x conf$$.file >/dev/null 2>&1; then + ac_executable_p="test -x" +else + ac_executable_p="test -f" +fi +rm -f conf$$.file + +# Extract the first word of "xgettext", so it can be a program name with args. +set dummy xgettext; 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_XGETTEXT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case "$XGETTEXT" in + [\\/]* | ?:[\\/]*) + ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. + ;; + *) + ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$ac_save_IFS" + test -z "$ac_dir" && ac_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then + echo "$as_me: trying $ac_dir/$ac_word..." >&5 + if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&5 2>&1 && + (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext" + break 2 + fi + fi + done + done + IFS="$ac_save_IFS" + test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" + ;; +esac +fi +XGETTEXT="$ac_cv_path_XGETTEXT" +if test "$XGETTEXT" != ":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 +$as_echo "$XGETTEXT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + rm -f messages.po + + case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; + *) XGETTEXT_015=$XGETTEXT ;; + esac + + + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Find out how to test for executable files. Don't use a zero-byte file, +# as systems may use methods other than mode bits to determine executability. +cat >conf$$.file <<_ASEOF +#! /bin/sh +exit 0 +_ASEOF +chmod +x conf$$.file +if test -x conf$$.file >/dev/null 2>&1; then + ac_executable_p="test -x" +else + ac_executable_p="test -f" +fi +rm -f conf$$.file + +# Extract the first word of "msgmerge", so it can be a program name with args. +set dummy msgmerge; 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_MSGMERGE+:} false; then : + $as_echo_n "(cached) " >&6 +else + case "$MSGMERGE" in + [\\/]* | ?:[\\/]*) + ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. + ;; + *) + ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$ac_save_IFS" + test -z "$ac_dir" && ac_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then + echo "$as_me: trying $ac_dir/$ac_word..." >&5 + if $ac_dir/$ac_word --update -q /dev/null /dev/null >&5 2>&1; then + ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext" + break 2 + fi + fi + done + done + IFS="$ac_save_IFS" + test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":" + ;; +esac +fi +MSGMERGE="$ac_cv_path_MSGMERGE" +if test "$MSGMERGE" != ":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5 +$as_echo "$MSGMERGE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$localedir" || localedir='${datadir}/locale' + + + test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= + + + ac_config_commands="$ac_config_commands po-directories" + + + + if test "X$prefix" = "XNONE"; then + acl_final_prefix="$ac_default_prefix" + else + acl_final_prefix="$prefix" + fi + if test "X$exec_prefix" = "XNONE"; then + acl_final_exec_prefix='${prefix}' + else + acl_final_exec_prefix="$exec_prefix" + fi + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" + prefix="$acl_save_prefix" + +# 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 + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by GCC" >&5 +$as_echo_n "checking for ld used by GCC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | [A-Za-z]:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${acl_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + acl_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break ;; + *) + test "$with_gnu_ld" != yes && break ;; + esac + fi + done + IFS="$ac_save_ifs" +else + acl_cv_path_LD="$LD" # Let the user override the test with a path. +fi +fi + +LD="$acl_cv_path_LD" +if test -n "$LD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${acl_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU ld's only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$acl_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$acl_cv_prog_gnu_ld + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5 +$as_echo_n "checking for shared library run path origin... " >&6; } +if ${acl_cv_rpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + + CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ + ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh + . ./conftest.sh + rm -f ./conftest.sh + acl_cv_rpath=done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5 +$as_echo "$acl_cv_rpath" >&6; } + wl="$acl_cv_wl" + acl_libext="$acl_cv_libext" + acl_shlibext="$acl_cv_shlibext" + acl_libname_spec="$acl_cv_libname_spec" + acl_library_names_spec="$acl_cv_library_names_spec" + acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" + acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" + acl_hardcode_direct="$acl_cv_hardcode_direct" + acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" + # Check whether --enable-rpath was given. +if test "${enable_rpath+set}" = set; then : + enableval=$enable_rpath; : +else + enable_rpath=yes +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 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" + + + + + acl_libdirstem=lib + acl_libdirstem2= + case "$host_os" in + solaris*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit host" >&5 +$as_echo_n "checking for 64-bit host... " >&6; } +if ${gl_cv_solaris_64bit+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef _LP64 +sixtyfour bits +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "sixtyfour bits" >/dev/null 2>&1; then : + gl_cv_solaris_64bit=yes +else + gl_cv_solaris_64bit=no +fi +rm -f conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_solaris_64bit" >&5 +$as_echo "$gl_cv_solaris_64bit" >&6; } + if test $gl_cv_solaris_64bit = yes; then + acl_libdirstem=lib/64 + case "$host_cpu" in + sparc*) acl_libdirstem2=lib/sparcv9 ;; + i*86 | x86_64) acl_libdirstem2=lib/amd64 ;; + esac + fi + ;; + *) + searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` + if test -n "$searchpath"; then + acl_save_IFS="${IFS= }"; IFS=":" + for searchdir in $searchpath; do + if test -d "$searchdir"; then + case "$searchdir" in + */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; + */../ | */.. ) + # Better ignore directories of this form. They are misleading. + ;; + *) searchdir=`cd "$searchdir" && pwd` + case "$searchdir" in + */lib64 ) acl_libdirstem=lib64 ;; + esac ;; + esac + fi + done + IFS="$acl_save_IFS" + fi + ;; + esac + test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem" + + + + + + + + + + + + + use_additional=yes + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + +# Check whether --with-libiconv-prefix was given. +if test "${with_libiconv_prefix+set}" = set; then : + withval=$with_libiconv_prefix; + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + else + additional_includedir="$withval/include" + additional_libdir="$withval/$acl_libdirstem" + if test "$acl_libdirstem2" != "$acl_libdirstem" \ + && ! test -d "$withval/$acl_libdirstem"; then + additional_libdir="$withval/$acl_libdirstem2" + fi + fi + fi + +fi + + LIBICONV= + LTLIBICONV= + INCICONV= + LIBICONV_PREFIX= + HAVE_LIBICONV= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='iconv ' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value" + else + : + fi + else + found_dir= + found_la= + found_so= + found_a= + eval libname=\"$acl_libname_spec\" # typically: libname=lib$name + if test -n "$acl_shlibext"; then + shrext=".$acl_shlibext" # typically: shrext=.so + else + shrext= + fi + if test $use_additional = yes; then + dir="$additional_libdir" + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + if test "$enable_rpath" = no \ + || test "X$found_dir" = "X/usr/$acl_libdirstem" \ + || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + if test "$acl_hardcode_direct" = yes; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + haveit= + for x in $LDFLAGS $LIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir" + fi + if test "$acl_hardcode_minus_L" != no; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a" + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name" + fi + fi + additional_includedir= + case "$found_dir" in + */$acl_libdirstem | */$acl_libdirstem/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` + if test "$name" = 'iconv'; then + LIBICONV_PREFIX="$basedir" + fi + additional_includedir="$basedir/include" + ;; + */$acl_libdirstem2 | */$acl_libdirstem2/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` + if test "$name" = 'iconv'; then + LIBICONV_PREFIX="$basedir" + fi + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INCICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + if test -n "$found_la"; then + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ + && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ + || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + LIBICONV="${LIBICONV}${LIBICONV:+ }$dep" + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep" + ;; + esac + done + fi + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$acl_hardcode_libdir_separator"; then + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" + done + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" + else + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + for found_dir in $ltrpathdirs; do + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir" + done + fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5 +$as_echo_n "checking for CFPreferencesCopyAppValue... " >&6; } +if ${gt_cv_func_CFPreferencesCopyAppValue+:} false; then : + $as_echo_n "(cached) " >&6 +else + gt_save_LIBS="$LIBS" + LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +CFPreferencesCopyAppValue(NULL, NULL) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gt_cv_func_CFPreferencesCopyAppValue=yes +else + gt_cv_func_CFPreferencesCopyAppValue=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$gt_save_LIBS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5 +$as_echo "$gt_cv_func_CFPreferencesCopyAppValue" >&6; } + if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then + +$as_echo "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyCurrent" >&5 +$as_echo_n "checking for CFLocaleCopyCurrent... " >&6; } +if ${gt_cv_func_CFLocaleCopyCurrent+:} false; then : + $as_echo_n "(cached) " >&6 +else + gt_save_LIBS="$LIBS" + LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +CFLocaleCopyCurrent(); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gt_cv_func_CFLocaleCopyCurrent=yes +else + gt_cv_func_CFLocaleCopyCurrent=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$gt_save_LIBS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyCurrent" >&5 +$as_echo "$gt_cv_func_CFLocaleCopyCurrent" >&6; } + if test $gt_cv_func_CFLocaleCopyCurrent = yes; then + +$as_echo "#define HAVE_CFLOCALECOPYCURRENT 1" >>confdefs.h + + fi + INTL_MACOSX_LIBS= + if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then + INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" + fi + + + + + + + LIBINTL= + LTLIBINTL= + POSUB= + + case " $gt_needs " in + *" need-formatstring-macros "*) gt_api_version=3 ;; + *" need-ngettext "*) gt_api_version=2 ;; + *) gt_api_version=1 ;; + esac + gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" + gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" + + if test "$USE_NLS" = "yes"; then + gt_use_preinstalled_gnugettext=no + + + if test $gt_api_version -ge 3; then + gt_revision_test_code=' +#ifndef __GNU_GETTEXT_SUPPORTED_REVISION +#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) +#endif +typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; +' + else + gt_revision_test_code= + fi + if test $gt_api_version -ge 2; then + gt_expression_test_code=' + * ngettext ("", "", 0)' + else + gt_expression_test_code= + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libc" >&5 +$as_echo_n "checking for GNU gettext in libc... " >&6; } +if eval \${$gt_func_gnugettext_libc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +$gt_revision_test_code +extern int _nl_msg_cat_cntr; +extern int *_nl_domain_bindings; +int +main () +{ +bindtextdomain ("", ""); +return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$gt_func_gnugettext_libc=yes" +else + eval "$gt_func_gnugettext_libc=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$gt_func_gnugettext_libc + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + + if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then + + + + + + am_save_CPPFLAGS="$CPPFLAGS" + + for element in $INCICONV; do + haveit= + for x in $CPPFLAGS; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" + fi + done + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 +$as_echo_n "checking for iconv... " >&6; } +if ${am_cv_func_iconv+:} false; then : + $as_echo_n "(cached) " >&6 +else + + am_cv_func_iconv="no, consider installing GNU libiconv" + am_cv_lib_iconv=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +int +main () +{ +iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + am_cv_func_iconv=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test "$am_cv_func_iconv" != yes; then + am_save_LIBS="$LIBS" + LIBS="$LIBS $LIBICONV" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +int +main () +{ +iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + am_cv_lib_iconv=yes + am_cv_func_iconv=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$am_save_LIBS" + fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5 +$as_echo "$am_cv_func_iconv" >&6; } + if test "$am_cv_func_iconv" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5 +$as_echo_n "checking for working iconv... " >&6; } +if ${am_cv_func_iconv_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + + am_save_LIBS="$LIBS" + if test $am_cv_lib_iconv = yes; then + LIBS="$LIBS $LIBICONV" + fi + if test "$cross_compiling" = yes; then : + case "$host_os" in + aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; + *) am_cv_func_iconv_works="guessing yes" ;; + esac +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +int main () +{ + /* Test against AIX 5.1 bug: Failures are not distinguishable from successful + returns. */ + { + iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); + if (cd_utf8_to_88591 != (iconv_t)(-1)) + { + static const char input[] = "\342\202\254"; /* EURO SIGN */ + char buf[10]; + const char *inptr = input; + size_t inbytesleft = strlen (input); + char *outptr = buf; + size_t outbytesleft = sizeof (buf); + size_t res = iconv (cd_utf8_to_88591, + (char **) &inptr, &inbytesleft, + &outptr, &outbytesleft); + if (res == 0) + return 1; + } + } + /* Test against Solaris 10 bug: Failures are not distinguishable from + successful returns. */ + { + iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646"); + if (cd_ascii_to_88591 != (iconv_t)(-1)) + { + static const char input[] = "\263"; + char buf[10]; + const char *inptr = input; + size_t inbytesleft = strlen (input); + char *outptr = buf; + size_t outbytesleft = sizeof (buf); + size_t res = iconv (cd_ascii_to_88591, + (char **) &inptr, &inbytesleft, + &outptr, &outbytesleft); + if (res == 0) + return 1; + } + } +#if 0 /* This bug could be worked around by the caller. */ + /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ + { + iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); + if (cd_88591_to_utf8 != (iconv_t)(-1)) + { + static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; + char buf[50]; + const char *inptr = input; + size_t inbytesleft = strlen (input); + char *outptr = buf; + size_t outbytesleft = sizeof (buf); + size_t res = iconv (cd_88591_to_utf8, + (char **) &inptr, &inbytesleft, + &outptr, &outbytesleft); + if ((int)res > 0) + return 1; + } + } +#endif + /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is + provided. */ + if (/* Try standardized names. */ + iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) + /* Try IRIX, OSF/1 names. */ + && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) + /* Try AIX names. */ + && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) + /* Try HP-UX names. */ + && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) + return 1; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + am_cv_func_iconv_works=yes +else + am_cv_func_iconv_works=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + LIBS="$am_save_LIBS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5 +$as_echo "$am_cv_func_iconv_works" >&6; } + case "$am_cv_func_iconv_works" in + *no) am_func_iconv=no am_cv_lib_iconv=no ;; + *) am_func_iconv=yes ;; + esac + else + am_func_iconv=no am_cv_lib_iconv=no + fi + if test "$am_func_iconv" = yes; then + +$as_echo "#define HAVE_ICONV 1" >>confdefs.h + + fi + if test "$am_cv_lib_iconv" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5 +$as_echo_n "checking how to link with libiconv... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5 +$as_echo "$LIBICONV" >&6; } + else + CPPFLAGS="$am_save_CPPFLAGS" + LIBICONV= + LTLIBICONV= + fi + + + + + + + + + + + + use_additional=yes + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + +# Check whether --with-libintl-prefix was given. +if test "${with_libintl_prefix+set}" = set; then : + withval=$with_libintl_prefix; + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + else + additional_includedir="$withval/include" + additional_libdir="$withval/$acl_libdirstem" + if test "$acl_libdirstem2" != "$acl_libdirstem" \ + && ! test -d "$withval/$acl_libdirstem"; then + additional_libdir="$withval/$acl_libdirstem2" + fi + fi + fi + +fi + + LIBINTL= + LTLIBINTL= + INCINTL= + LIBINTL_PREFIX= + HAVE_LIBINTL= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='intl ' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value" + else + : + fi + else + found_dir= + found_la= + found_so= + found_a= + eval libname=\"$acl_libname_spec\" # typically: libname=lib$name + if test -n "$acl_shlibext"; then + shrext=".$acl_shlibext" # typically: shrext=.so + else + shrext= + fi + if test $use_additional = yes; then + dir="$additional_libdir" + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIBINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + if test "$enable_rpath" = no \ + || test "X$found_dir" = "X/usr/$acl_libdirstem" \ + || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" + else + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + if test "$acl_hardcode_direct" = yes; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" + else + if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + haveit= + for x in $LDFLAGS $LIBINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir" + fi + if test "$acl_hardcode_minus_L" != no; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" + else + LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a" + else + LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name" + fi + fi + additional_includedir= + case "$found_dir" in + */$acl_libdirstem | */$acl_libdirstem/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` + if test "$name" = 'intl'; then + LIBINTL_PREFIX="$basedir" + fi + additional_includedir="$basedir/include" + ;; + */$acl_libdirstem2 | */$acl_libdirstem2/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` + if test "$name" = 'intl'; then + LIBINTL_PREFIX="$basedir" + fi + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INCINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + if test -n "$found_la"; then + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ + && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ + || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIBINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIBINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + LIBINTL="${LIBINTL}${LIBINTL:+ }$dep" + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep" + ;; + esac + done + fi + else + LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$acl_hardcode_libdir_separator"; then + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" + done + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" + else + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + for found_dir in $ltrpathdirs; do + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir" + done + fi + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libintl" >&5 +$as_echo_n "checking for GNU gettext in libintl... " >&6; } +if eval \${$gt_func_gnugettext_libintl+:} false; then : + $as_echo_n "(cached) " >&6 +else + gt_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $INCINTL" + gt_save_LIBS="$LIBS" + LIBS="$LIBS $LIBINTL" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +$gt_revision_test_code +extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias (const char *); +int +main () +{ +bindtextdomain ("", ""); +return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("") + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$gt_func_gnugettext_libintl=yes" +else + eval "$gt_func_gnugettext_libintl=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then + LIBS="$LIBS $LIBICONV" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +$gt_revision_test_code +extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias (const char *); +int +main () +{ +bindtextdomain ("", ""); +return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("") + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + LIBINTL="$LIBINTL $LIBICONV" + LTLIBINTL="$LTLIBINTL $LTLIBICONV" + eval "$gt_func_gnugettext_libintl=yes" + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + fi + CPPFLAGS="$gt_save_CPPFLAGS" + LIBS="$gt_save_LIBS" +fi +eval ac_res=\$$gt_func_gnugettext_libintl + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + fi + + if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ + || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ + && test "$PACKAGE" != gettext-runtime \ + && test "$PACKAGE" != gettext-tools; }; then + gt_use_preinstalled_gnugettext=yes + else + LIBINTL= + LTLIBINTL= + INCINTL= + fi + + + + if test -n "$INTL_MACOSX_LIBS"; then + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" + LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" + fi + fi + + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + +$as_echo "#define ENABLE_NLS 1" >>confdefs.h + + else + USE_NLS=no + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use NLS" >&5 +$as_echo_n "checking whether to use NLS... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 +$as_echo "$USE_NLS" >&6; } + if test "$USE_NLS" = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking where the gettext function comes from" >&5 +$as_echo_n "checking where the gettext function comes from... " >&6; } + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then + gt_source="external libintl" + else + gt_source="libc" + fi + else + gt_source="included intl directory" + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_source" >&5 +$as_echo "$gt_source" >&6; } + fi + + if test "$USE_NLS" = "yes"; then + + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libintl" >&5 +$as_echo_n "checking how to link with libintl... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBINTL" >&5 +$as_echo "$LIBINTL" >&6; } + + for element in $INCINTL; do + haveit= + for x in $CPPFLAGS; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" + fi + done + + fi + + +$as_echo "#define HAVE_GETTEXT 1" >>confdefs.h + + +$as_echo "#define HAVE_DCGETTEXT 1" >>confdefs.h + + fi + + POSUB=po + fi + + + + INTLLIBS="$LIBINTL" + + + + + + + +# Fix `undefined reference to `libintl_gettext'` on docker: +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libintl_dgettext in -lintl" >&5 +$as_echo_n "checking for libintl_dgettext in -lintl... " >&6; } +if ${ac_cv_lib_intl_libintl_dgettext+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lintl $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 libintl_dgettext (); +int +main () +{ +return libintl_dgettext (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_intl_libintl_dgettext=yes +else + ac_cv_lib_intl_libintl_dgettext=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_intl_libintl_dgettext" >&5 +$as_echo "$ac_cv_lib_intl_libintl_dgettext" >&6; } +if test "x$ac_cv_lib_intl_libintl_dgettext" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBINTL 1 +_ACEOF + + LIBS="-lintl $LIBS" + +fi + + +# pthread +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5 +$as_echo_n "checking for pthread_create in -lpthread... " >&6; } +if ${ac_cv_lib_pthread_pthread_create+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpthread $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 pthread_create (); +int +main () +{ +return pthread_create (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_pthread_pthread_create=yes +else + ac_cv_lib_pthread_pthread_create=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_pthread_pthread_create" >&5 +$as_echo "$ac_cv_lib_pthread_pthread_create" >&6; } +if test "x$ac_cv_lib_pthread_pthread_create" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBPTHREAD 1 +_ACEOF + + LIBS="-lpthread $LIBS" + +else + as_fn_error $? "pthread is missing" "$LINENO" 5 +fi + +CFLAGS="$CFLAGS -pthread" + +# DEBUG +# Check whether --enable-debug was given. +if test "${enable_debug+set}" = set; then : + enableval=$enable_debug; debug="$enableval" +else + debug=no +fi + + +if test "$debug" = "yes"; then + +$as_echo "#define _DEBUG 1" >>confdefs.h + +fi + if test "x$debug" = "xyes"; then + DEBUG_TRUE= + DEBUG_FALSE='#' +else + DEBUG_TRUE='#' + DEBUG_FALSE= +fi + + +# Handle rdynamic only on systems using GNU ld + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build with rdynamic for GNU ld" >&5 +$as_echo_n "checking whether to build with rdynamic for GNU ld... " >&6; } +with_rdyanimc=yes +case "$host_os" in + *darwin*|*cygwin*|*aix*|*mingw*) with_rdyanimc=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_rdyanimc" >&5 +$as_echo "$with_rdyanimc" >&6; } + if test "x$with_rdyanimc" = "xyes"; then + WITH_RDYNAMIC_TRUE= + WITH_RDYNAMIC_FALSE='#' +else + WITH_RDYNAMIC_TRUE='#' + WITH_RDYNAMIC_FALSE= +fi + + +# Build with OpenSSL + +# Check whether --with-openssl was given. +if test "${with_openssl+set}" = set; then : + withval=$with_openssl; openssl="$withval" +else + openssl="no" +fi + + +if test "$openssl" = 'yes'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SSL_CTX_new in -lssl" >&5 +$as_echo_n "checking for SSL_CTX_new in -lssl... " >&6; } +if ${ac_cv_lib_ssl_SSL_CTX_new+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lssl $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 SSL_CTX_new (); +int +main () +{ +return SSL_CTX_new (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_ssl_SSL_CTX_new=yes +else + ac_cv_lib_ssl_SSL_CTX_new=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_ssl_SSL_CTX_new" >&5 +$as_echo "$ac_cv_lib_ssl_SSL_CTX_new" >&6; } +if test "x$ac_cv_lib_ssl_SSL_CTX_new" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBSSL 1 +_ACEOF + + LIBS="-lssl $LIBS" + +else + as_fn_error $? "ssl library missing" "$LINENO" 5 +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CRYPTO_free in -lcrypto" >&5 +$as_echo_n "checking for CRYPTO_free in -lcrypto... " >&6; } +if ${ac_cv_lib_crypto_CRYPTO_free+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lcrypto $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 CRYPTO_free (); +int +main () +{ +return CRYPTO_free (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_crypto_CRYPTO_free=yes +else + ac_cv_lib_crypto_CRYPTO_free=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_crypto_CRYPTO_free" >&5 +$as_echo "$ac_cv_lib_crypto_CRYPTO_free" >&6; } +if test "x$ac_cv_lib_crypto_CRYPTO_free" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBCRYPTO 1 +_ACEOF + + LIBS="-lcrypto $LIBS" + +else + as_fn_error $? "crypto library missing" "$LINENO" 5 +fi + +fi + +# GeoIP +# Check whether --enable-geoip was given. +if test "${enable_geoip+set}" = set; then : + enableval=$enable_geoip; geoip="$enableval" +else + geoip=no +fi + + +geolocation="N/A" +if test "$geoip" = "mmdb"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MMDB_open in -lmaxminddb" >&5 +$as_echo_n "checking for MMDB_open in -lmaxminddb... " >&6; } +if ${ac_cv_lib_maxminddb_MMDB_open+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lmaxminddb $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 MMDB_open (); +int +main () +{ +return MMDB_open (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_maxminddb_MMDB_open=yes +else + ac_cv_lib_maxminddb_MMDB_open=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_maxminddb_MMDB_open" >&5 +$as_echo "$ac_cv_lib_maxminddb_MMDB_open" >&6; } +if test "x$ac_cv_lib_maxminddb_MMDB_open" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBMAXMINDDB 1 +_ACEOF + + LIBS="-lmaxminddb $LIBS" + +else + as_fn_error $? " + *** Missing development files for libmaxminddb library. + " "$LINENO" 5 +fi + + geolocation="GeoIP2" + +$as_echo "#define HAVE_GEOLOCATION 1" >>confdefs.h + +elif test "$geoip" = "legacy"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GeoIP_new in -lGeoIP" >&5 +$as_echo_n "checking for GeoIP_new in -lGeoIP... " >&6; } +if ${ac_cv_lib_GeoIP_GeoIP_new+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lGeoIP $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 GeoIP_new (); +int +main () +{ +return GeoIP_new (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_GeoIP_GeoIP_new=yes +else + ac_cv_lib_GeoIP_GeoIP_new=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_GeoIP_GeoIP_new" >&5 +$as_echo "$ac_cv_lib_GeoIP_GeoIP_new" >&6; } +if test "x$ac_cv_lib_GeoIP_GeoIP_new" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBGEOIP 1 +_ACEOF + + LIBS="-lGeoIP $LIBS" + +else + as_fn_error $? " + *** Missing development files for the GeoIP library + " "$LINENO" 5 +fi + + geolocation="GeoIP Legacy" + +$as_echo "#define HAVE_GEOLOCATION 1" >>confdefs.h + +fi + if test "x$geoip" = "xlegacy"; then + GEOIP_LEGACY_TRUE= + GEOIP_LEGACY_FALSE='#' +else + GEOIP_LEGACY_TRUE='#' + GEOIP_LEGACY_FALSE= +fi + + if test "x$geoip" = "xmmdb"; then + GEOIP_MMDB_TRUE= + GEOIP_MMDB_FALSE='#' +else + GEOIP_MMDB_TRUE='#' + GEOIP_MMDB_FALSE= +fi + + +# GNU getline / POSIX.1-2008 + +# Check whether --with-getline was given. +if test "${with_getline+set}" = set; then : + withval=$with_getline; with_getline=$withval +else + with_getline=no +fi + + +if test "$with_getline" = "yes"; then + +$as_echo "#define WITH_GETLINE 1" >>confdefs.h + +fi + +# UTF8 +# Check whether --enable-utf8 was given. +if test "${enable_utf8+set}" = set; then : + enableval=$enable_utf8; utf8="$enableval" +else + utf8=no +fi + + +if test "$utf8" = "yes"; then + libncursesw=ncursesw + # Simply called libncurses on OS X + case "$host_os" in + *darwin*) libncursesw=ncurses + ;; + esac + + as_ac_Lib=`$as_echo "ac_cv_lib_$libncursesw''_mvaddwstr" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for mvaddwstr in -l$libncursesw" >&5 +$as_echo_n "checking for mvaddwstr in -l$libncursesw... " >&6; } +if eval \${$as_ac_Lib+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-l$libncursesw $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 mvaddwstr (); +int +main () +{ +return mvaddwstr (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$as_ac_Lib=yes" +else + eval "$as_ac_Lib=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_LIB$libncursesw" | $as_tr_cpp` 1 +_ACEOF + + LIBS="-l$libncursesw $LIBS" + +else + as_fn_error $? "*** Missing development libraries for ncursesw" "$LINENO" 5 +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing tputs" >&5 +$as_echo_n "checking for library containing tputs... " >&6; } +if ${ac_cv_search_tputs+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_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 tputs (); +int +main () +{ +return tputs (); + ; + return 0; +} +_ACEOF +for ac_lib in '' tinfow; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_tputs=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_tputs+:} false; then : + break +fi +done +if ${ac_cv_search_tputs+:} false; then : + +else + ac_cv_search_tputs=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_tputs" >&5 +$as_echo "$ac_cv_search_tputs" >&6; } +ac_res=$ac_cv_search_tputs +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +else + as_fn_error $? "Cannot find a library providing tputs" "$LINENO" 5 +fi + + +$as_echo "#define HAVE_LIBNCURSESW 1" >>confdefs.h + + + have_ncurses="yes" + for ac_header in ncursesw/ncurses.h +do : + ac_fn_c_check_header_compile "$LINENO" "ncursesw/ncurses.h" "ac_cv_header_ncursesw_ncurses_h" " + #ifdef HAVE_NCURSESW_NCURSES_H + #include + #endif + +" +if test "x$ac_cv_header_ncursesw_ncurses_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_NCURSESW_NCURSES_H 1 +_ACEOF + have_ncurses=yes +fi + +done + + + for ac_header in ncurses.h +do : + ac_fn_c_check_header_compile "$LINENO" "ncurses.h" "ac_cv_header_ncurses_h" " + #ifdef HAVE_NCURSES_H + #include + #endif + +" +if test "x$ac_cv_header_ncurses_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_NCURSES_H 1 +_ACEOF + have_ncurses=yes +fi + +done + + + if test "$have_ncurses" != "yes"; then + as_fn_error $? "Missing ncursesw header file" "$LINENO" 5 + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for refresh in -lncurses" >&5 +$as_echo_n "checking for refresh in -lncurses... " >&6; } +if ${ac_cv_lib_ncurses_refresh+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lncurses $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 refresh (); +int +main () +{ +return refresh (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_ncurses_refresh=yes +else + ac_cv_lib_ncurses_refresh=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_ncurses_refresh" >&5 +$as_echo "$ac_cv_lib_ncurses_refresh" >&6; } +if test "x$ac_cv_lib_ncurses_refresh" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBNCURSES 1 +_ACEOF + + LIBS="-lncurses $LIBS" + +else + as_fn_error $? "*** Missing development libraries for ncurses" "$LINENO" 5 +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing tputs" >&5 +$as_echo_n "checking for library containing tputs... " >&6; } +if ${ac_cv_search_tputs+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_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 tputs (); +int +main () +{ +return tputs (); + ; + return 0; +} +_ACEOF +for ac_lib in '' tinfo; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_tputs=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_tputs+:} false; then : + break +fi +done +if ${ac_cv_search_tputs+:} false; then : + +else + ac_cv_search_tputs=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_tputs" >&5 +$as_echo "$ac_cv_search_tputs" >&6; } +ac_res=$ac_cv_search_tputs +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +else + as_fn_error $? "Cannot find a library providing tputs" "$LINENO" 5 +fi + + + have_ncurses="yes" + for ac_header in ncurses/ncurses.h +do : + ac_fn_c_check_header_compile "$LINENO" "ncurses/ncurses.h" "ac_cv_header_ncurses_ncurses_h" " + #ifdef HAVE_NCURSES_NCURSES_H + #include + #endif + +" +if test "x$ac_cv_header_ncurses_ncurses_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_NCURSES_NCURSES_H 1 +_ACEOF + have_ncurses=yes +fi + +done + + + for ac_header in ncurses.h +do : + ac_fn_c_check_header_compile "$LINENO" "ncurses.h" "ac_cv_header_ncurses_h" " + #ifdef HAVE_NCURSES_H + #include + #endif + +" +if test "x$ac_cv_header_ncurses_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_NCURSES_H 1 +_ACEOF + have_ncurses=yes +fi + +done + + + for ac_header in curses.h +do : + ac_fn_c_check_header_compile "$LINENO" "curses.h" "ac_cv_header_curses_h" " + #ifdef HAVE_CURSES_H + #include + #endif + +" +if test "x$ac_cv_header_curses_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_CURSES_H 1 +_ACEOF + have_ncurses=yes +fi + +done + + + if test "$have_ncurses" != "yes"; then + as_fn_error $? "Missing ncursesw header file" "$LINENO" 5 + fi +fi + +# Tokyo Cabinet +# Check whether --enable-tcb was given. +if test "${enable_tcb+set}" = set; then : + enableval=$enable_tcb; tcb="$enableval" +else + tcb=no +fi + + +WITH_TC=no +if test "$tcb" = "memhash"; then + WITH_TC=yes + +$as_echo "#define TCB_MEMHASH 1" >>confdefs.h + +elif test "$tcb" = "btree"; then + +$as_echo "#define TCB_BTREE 1" >>confdefs.h + + WITH_TC=yes +fi + +if test "$WITH_TC" = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tchdbnew in -ltokyocabinet" >&5 +$as_echo_n "checking for tchdbnew in -ltokyocabinet... " >&6; } +if ${ac_cv_lib_tokyocabinet_tchdbnew+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ltokyocabinet $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 tchdbnew (); +int +main () +{ +return tchdbnew (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_tokyocabinet_tchdbnew=yes +else + ac_cv_lib_tokyocabinet_tchdbnew=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_tokyocabinet_tchdbnew" >&5 +$as_echo "$ac_cv_lib_tokyocabinet_tchdbnew" >&6; } +if test "x$ac_cv_lib_tokyocabinet_tchdbnew" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBTOKYOCABINET 1 +_ACEOF + + LIBS="-ltokyocabinet $LIBS" + +else + as_fn_error $? "*** Missing development libraries for Tokyo Cabinet Database" "$LINENO" 5 +fi + + + # Check whether --enable-zlib was given. +if test "${enable_zlib+set}" = set; then : + enableval=$enable_zlib; zlib="$enableval" +else + zlib=yes +fi + + + if test "$zlib" = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gzread in -lz" >&5 +$as_echo_n "checking for gzread in -lz... " >&6; } +if ${ac_cv_lib_z_gzread+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lz $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 gzread (); +int +main () +{ +return gzread (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_z_gzread=yes +else + ac_cv_lib_z_gzread=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_z_gzread" >&5 +$as_echo "$ac_cv_lib_z_gzread" >&6; } +if test "x$ac_cv_lib_z_gzread" = xyes; then : + Z_FLAG=-lz +else + as_fn_error $? " + *** zlib is required. If zlib compression is not needed + *** you can use --disable-zlib. + *** Debian based distributions zlib1g-dev + *** Red Hat based distributions zlib-devel + " "$LINENO" 5 +fi + + +$as_echo "#define HAVE_ZLIB 1" >>confdefs.h + + LDFLAGS="$LDFLAGS $Z_FLAG" + fi + + # Check whether --enable-bzip was given. +if test "${enable_bzip+set}" = set; then : + enableval=$enable_bzip; bz2="$enableval" +else + bz2=yes +fi + + + if test "$bz2" = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BZ2_bzopen in -lbz2" >&5 +$as_echo_n "checking for BZ2_bzopen in -lbz2... " >&6; } +if ${ac_cv_lib_bz2_BZ2_bzopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbz2 $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 BZ2_bzopen (); +int +main () +{ +return BZ2_bzopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_bz2_BZ2_bzopen=yes +else + ac_cv_lib_bz2_BZ2_bzopen=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_bz2_BZ2_bzopen" >&5 +$as_echo "$ac_cv_lib_bz2_BZ2_bzopen" >&6; } +if test "x$ac_cv_lib_bz2_BZ2_bzopen" = xyes; then : + BZ2_FLAG=-lbz2 +else + as_fn_error $? " + *** BZIP2 is required. If BZIP2 compression is not needed + *** you can use --disable-bzip. + *** Debian based distributions libbz2-dev + *** Red Hat based distributions bzip2-devel + " "$LINENO" 5 +fi + + +$as_echo "#define HAVE_BZ2 1" >>confdefs.h + + LDFLAGS="$LDFLAGS $BZ2_FLAG" + fi + + case "$host_os" in + *darwin*|*bsd*) + LDFLAGS="$LDFLAGS -ltokyocabinet -lc" + ;; + *) + LDFLAGS="$LDFLAGS -ltokyocabinet -lrt -lc" + ;; + esac +fi + if test "$WITH_TC" = "yes"; then + TCB_TRUE= + TCB_FALSE='#' +else + TCB_TRUE='#' + TCB_FALSE= +fi + + +if test "$tcb" = "memhash"; then + storage="In-memory Hash Database (Tokyo Cabinet)" +elif test "$tcb" = "btree"; then + storage="On-disk B+ Tree Database (Tokyo Cabinet)" +else + storage="In-memory Hash Database (Default)" +fi + +HAS_SEDTR=no +# Extract the first word of "sed", so it can be a program name with args. +set dummy sed; 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_SED_CHECK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$SED_CHECK"; then + ac_cv_prog_SED_CHECK="$SED_CHECK" # 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_SED_CHECK="yes" + $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 + + test -z "$ac_cv_prog_SED_CHECK" && ac_cv_prog_SED_CHECK="no" +fi +fi +SED_CHECK=$ac_cv_prog_SED_CHECK +if test -n "$SED_CHECK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SED_CHECK" >&5 +$as_echo "$SED_CHECK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +if test x"$SED_CHECK" == x"yes" ; then + # Extract the first word of "tr", so it can be a program name with args. +set dummy tr; 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_TR_CHECK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$TR_CHECK"; then + ac_cv_prog_TR_CHECK="$TR_CHECK" # 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_TR_CHECK="yes" + $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 + + test -z "$ac_cv_prog_TR_CHECK" && ac_cv_prog_TR_CHECK="no" +fi +fi +TR_CHECK=$ac_cv_prog_TR_CHECK +if test -n "$TR_CHECK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TR_CHECK" >&5 +$as_echo "$TR_CHECK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test x"$TR_CHECK" == x"yes" ; then + HAS_SEDTR=yes + fi +fi + if test "x$HAS_SEDTR" = xyes; then + HAS_SEDTR_TRUE= + HAS_SEDTR_FALSE='#' +else + HAS_SEDTR_TRUE='#' + HAS_SEDTR_FALSE= +fi + + +# Solaris +{ $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 : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBNSL 1 +_ACEOF + + LIBS="-lnsl $LIBS" + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket in -lsocket" >&5 +$as_echo_n "checking for socket in -lsocket... " >&6; } +if ${ac_cv_lib_socket_socket+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $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 socket (); +int +main () +{ +return socket (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_socket_socket=yes +else + ac_cv_lib_socket_socket=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_socket" >&5 +$as_echo "$ac_cv_lib_socket_socket" >&6; } +if test "x$ac_cv_lib_socket_socket" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBSOCKET 1 +_ACEOF + + LIBS="-lsocket $LIBS" + +fi + + +# Checks for header files. +{ $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 arpa/inet.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "arpa/inet.h" "ac_cv_header_arpa_inet_h" "$ac_includes_default" +if test "x$ac_cv_header_arpa_inet_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_ARPA_INET_H 1 +_ACEOF + +fi + +done + +for ac_header in fcntl.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "fcntl.h" "ac_cv_header_fcntl_h" "$ac_includes_default" +if test "x$ac_cv_header_fcntl_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_FCNTL_H 1 +_ACEOF + +fi + +done + +for ac_header in inttypes.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "inttypes.h" "ac_cv_header_inttypes_h" "$ac_includes_default" +if test "x$ac_cv_header_inttypes_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_INTTYPES_H 1 +_ACEOF + +fi + +done + +for ac_header in limits.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "limits.h" "ac_cv_header_limits_h" "$ac_includes_default" +if test "x$ac_cv_header_limits_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIMITS_H 1 +_ACEOF + +fi + +done + +for ac_header in locale.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default" +if test "x$ac_cv_header_locale_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LOCALE_H 1 +_ACEOF + +fi + +done + +for ac_header in netdb.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "netdb.h" "ac_cv_header_netdb_h" "$ac_includes_default" +if test "x$ac_cv_header_netdb_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_NETDB_H 1 +_ACEOF + +fi + +done + +for ac_header in netinet/in.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "netinet/in.h" "ac_cv_header_netinet_in_h" "$ac_includes_default" +if test "x$ac_cv_header_netinet_in_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_NETINET_IN_H 1 +_ACEOF + +fi + +done + +for ac_header in stddef.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "stddef.h" "ac_cv_header_stddef_h" "$ac_includes_default" +if test "x$ac_cv_header_stddef_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STDDEF_H 1 +_ACEOF + +fi + +done + +for ac_header in stdint.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" +if test "x$ac_cv_header_stdint_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STDINT_H 1 +_ACEOF + +fi + +done + +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 + +for ac_header in string.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default" +if test "x$ac_cv_header_string_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STRING_H 1 +_ACEOF + +fi + +done + +for ac_header in strings.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "strings.h" "ac_cv_header_strings_h" "$ac_includes_default" +if test "x$ac_cv_header_strings_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STRINGS_H 1 +_ACEOF + +fi + +done + +for ac_header in sys/socket.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/socket.h" "ac_cv_header_sys_socket_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_socket_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SYS_SOCKET_H 1 +_ACEOF + +fi + +done + +for ac_header in sys/time.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/time.h" "ac_cv_header_sys_time_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_time_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SYS_TIME_H 1 +_ACEOF + +fi + +done + +for ac_header in unistd.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default" +if test "x$ac_cv_header_unistd_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_UNISTD_H 1 +_ACEOF + +fi + +done + + +# Checks for typedefs, structures, and compiler characteristics. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 +$as_echo_n "checking for an ANSI C-conforming const... " >&6; } +if ${ac_cv_c_const+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + +#ifndef __cplusplus + /* Ultrix mips cc rejects this sort of thing. */ + typedef int charset[2]; + const charset cs = { 0, 0 }; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *pcpcc; + char **ppc; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + pcpcc = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++pcpcc; + ppc = (char**) pcpcc; + pcpcc = (char const *const *) ppc; + { /* SCO 3.2v4 cc rejects this sort of thing. */ + char tx; + char *t = &tx; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + if (s) return 0; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + } + { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; } bx; + struct s *b = &bx; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + if (!foo) return 0; + } + return !cs[0] && !zero.x; +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_const=yes +else + ac_cv_c_const=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 +$as_echo "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +$as_echo "#define const /**/" >>confdefs.h + +fi + +ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default" +if test "x$ac_cv_type_ptrdiff_t" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_PTRDIFF_T 1 +_ACEOF + + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 +$as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } +if ${ac_cv_struct_tm+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include + +int +main () +{ +struct tm tm; + int *p = &tm.tm_sec; + return !p; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_struct_tm=time.h +else + ac_cv_struct_tm=sys/time.h +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 +$as_echo "$ac_cv_struct_tm" >&6; } +if test $ac_cv_struct_tm = sys/time.h; then + +$as_echo "#define TM_IN_SYS_TIME 1" >>confdefs.h + +fi + +ac_fn_c_find_intX_t "$LINENO" "64" "ac_cv_c_int64_t" +case $ac_cv_c_int64_t in #( + no|yes) ;; #( + *) + +cat >>confdefs.h <<_ACEOF +#define int64_t $ac_cv_c_int64_t +_ACEOF +;; +esac + +ac_fn_c_find_intX_t "$LINENO" "8" "ac_cv_c_int8_t" +case $ac_cv_c_int8_t in #( + no|yes) ;; #( + *) + +cat >>confdefs.h <<_ACEOF +#define int8_t $ac_cv_c_int8_t +_ACEOF +;; +esac + +ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default" +if test "x$ac_cv_type_off_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define off_t long int +_ACEOF + +fi + +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 + +ac_fn_c_find_uintX_t "$LINENO" "32" "ac_cv_c_uint32_t" +case $ac_cv_c_uint32_t in #( + no|yes) ;; #( + *) + +$as_echo "#define _UINT32_T 1" >>confdefs.h + + +cat >>confdefs.h <<_ACEOF +#define uint32_t $ac_cv_c_uint32_t +_ACEOF +;; + esac + +ac_fn_c_find_uintX_t "$LINENO" "64" "ac_cv_c_uint64_t" +case $ac_cv_c_uint64_t in #( + no|yes) ;; #( + *) + +$as_echo "#define _UINT64_T 1" >>confdefs.h + + +cat >>confdefs.h <<_ACEOF +#define uint64_t $ac_cv_c_uint64_t +_ACEOF +;; + esac + +ac_fn_c_find_uintX_t "$LINENO" "8" "ac_cv_c_uint8_t" +case $ac_cv_c_uint8_t in #( + no|yes) ;; #( + *) + +$as_echo "#define _UINT8_T 1" >>confdefs.h + + +cat >>confdefs.h <<_ACEOF +#define uint8_t $ac_cv_c_uint8_t +_ACEOF +;; + esac + + +# Checks for library functions. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE_SOURCE value needed for large files" >&5 +$as_echo_n "checking for _LARGEFILE_SOURCE value needed for large files... " >&6; } +if ${ac_cv_sys_largefile_source+:} false; then : + $as_echo_n "(cached) " >&6 +else + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include /* for off_t */ + #include +int +main () +{ +int (*fp) (FILE *, off_t, int) = fseeko; + return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_sys_largefile_source=no; break +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _LARGEFILE_SOURCE 1 +#include /* for off_t */ + #include +int +main () +{ +int (*fp) (FILE *, off_t, int) = fseeko; + return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_sys_largefile_source=1; break +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_cv_sys_largefile_source=unknown + break +done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_source" >&5 +$as_echo "$ac_cv_sys_largefile_source" >&6; } +case $ac_cv_sys_largefile_source in #( + no | unknown) ;; + *) +cat >>confdefs.h <<_ACEOF +#define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source +_ACEOF +;; +esac +rm -rf conftest* + +# We used to try defining _XOPEN_SOURCE=500 too, to work around a bug +# in glibc 2.1.3, but that breaks too many other things. +# If you want fseeko and ftello with glibc, upgrade to a fixed glibc. +if test $ac_cv_sys_largefile_source != unknown; then + +$as_echo "#define HAVE_FSEEKO 1" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working memcmp" >&5 +$as_echo_n "checking for working memcmp... " >&6; } +if ${ac_cv_func_memcmp_working+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_func_memcmp_working=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + + /* Some versions of memcmp are not 8-bit clean. */ + char c0 = '\100', c1 = '\200', c2 = '\201'; + if (memcmp(&c0, &c2, 1) >= 0 || memcmp(&c1, &c2, 1) >= 0) + return 1; + + /* The Next x86 OpenStep bug shows up only when comparing 16 bytes + or more and with at least one buffer not starting on a 4-byte boundary. + William Lewis provided this test program. */ + { + char foo[21]; + char bar[21]; + int i; + for (i = 0; i < 4; i++) + { + char *a = foo + i; + char *b = bar + i; + strcpy (a, "--------01111111"); + strcpy (b, "--------10000000"); + if (memcmp (a, b, 16) >= 0) + return 1; + } + return 0; + } + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_func_memcmp_working=yes +else + ac_cv_func_memcmp_working=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_memcmp_working" >&5 +$as_echo "$ac_cv_func_memcmp_working" >&6; } +test $ac_cv_func_memcmp_working = no && case " $LIBOBJS " in + *" memcmp.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS memcmp.$ac_objext" + ;; +esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 +$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } +if ${ac_cv_header_time+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include + +int +main () +{ +if ((struct tm *) 0) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_time=yes +else + ac_cv_header_time=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 +$as_echo "$ac_cv_header_time" >&6; } +if test $ac_cv_header_time = yes; then + +$as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h + +fi + + + + + for ac_header in $ac_header_list +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_func in $ac_func_list +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 + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mktime" >&5 +$as_echo_n "checking for working mktime... " >&6; } +if ${ac_cv_func_working_mktime+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_func_working_mktime=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Test program from Paul Eggert and Tony Leneis. */ +#ifdef TIME_WITH_SYS_TIME +# include +# include +#else +# ifdef HAVE_SYS_TIME_H +# include +# else +# include +# endif +#endif + +#include +#include + +#ifdef HAVE_UNISTD_H +# include +#endif + +#ifndef HAVE_ALARM +# define alarm(X) /* empty */ +#endif + +/* Work around redefinition to rpl_putenv by other config tests. */ +#undef putenv + +static time_t time_t_max; +static time_t time_t_min; + +/* Values we'll use to set the TZ environment variable. */ +static const char *tz_strings[] = { + (const char *) 0, "TZ=GMT0", "TZ=JST-9", + "TZ=EST+3EDT+2,M10.1.0/00:00:00,M2.3.0/00:00:00" +}; +#define N_STRINGS (sizeof (tz_strings) / sizeof (tz_strings[0])) + +/* Return 0 if mktime fails to convert a date in the spring-forward gap. + Based on a problem report from Andreas Jaeger. */ +static int +spring_forward_gap () +{ + /* glibc (up to about 1998-10-07) failed this test. */ + struct tm tm; + + /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0" + instead of "TZ=America/Vancouver" in order to detect the bug even + on systems that don't support the Olson extension, or don't have the + full zoneinfo tables installed. */ + putenv ((char*) "TZ=PST8PDT,M4.1.0,M10.5.0"); + + tm.tm_year = 98; + tm.tm_mon = 3; + tm.tm_mday = 5; + tm.tm_hour = 2; + tm.tm_min = 0; + tm.tm_sec = 0; + tm.tm_isdst = -1; + return mktime (&tm) != (time_t) -1; +} + +static int +mktime_test1 (time_t now) +{ + struct tm *lt; + return ! (lt = localtime (&now)) || mktime (lt) == now; +} + +static int +mktime_test (time_t now) +{ + return (mktime_test1 (now) + && mktime_test1 ((time_t) (time_t_max - now)) + && mktime_test1 ((time_t) (time_t_min + now))); +} + +static int +irix_6_4_bug () +{ + /* Based on code from Ariel Faigon. */ + struct tm tm; + tm.tm_year = 96; + tm.tm_mon = 3; + tm.tm_mday = 0; + tm.tm_hour = 0; + tm.tm_min = 0; + tm.tm_sec = 0; + tm.tm_isdst = -1; + mktime (&tm); + return tm.tm_mon == 2 && tm.tm_mday == 31; +} + +static int +bigtime_test (int j) +{ + struct tm tm; + time_t now; + tm.tm_year = tm.tm_mon = tm.tm_mday = tm.tm_hour = tm.tm_min = tm.tm_sec = j; + now = mktime (&tm); + if (now != (time_t) -1) + { + struct tm *lt = localtime (&now); + if (! (lt + && lt->tm_year == tm.tm_year + && lt->tm_mon == tm.tm_mon + && lt->tm_mday == tm.tm_mday + && lt->tm_hour == tm.tm_hour + && lt->tm_min == tm.tm_min + && lt->tm_sec == tm.tm_sec + && lt->tm_yday == tm.tm_yday + && lt->tm_wday == tm.tm_wday + && ((lt->tm_isdst < 0 ? -1 : 0 < lt->tm_isdst) + == (tm.tm_isdst < 0 ? -1 : 0 < tm.tm_isdst)))) + return 0; + } + return 1; +} + +static int +year_2050_test () +{ + /* The correct answer for 2050-02-01 00:00:00 in Pacific time, + ignoring leap seconds. */ + unsigned long int answer = 2527315200UL; + + struct tm tm; + time_t t; + tm.tm_year = 2050 - 1900; + tm.tm_mon = 2 - 1; + tm.tm_mday = 1; + tm.tm_hour = tm.tm_min = tm.tm_sec = 0; + tm.tm_isdst = -1; + + /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0" + instead of "TZ=America/Vancouver" in order to detect the bug even + on systems that don't support the Olson extension, or don't have the + full zoneinfo tables installed. */ + putenv ((char*) "TZ=PST8PDT,M4.1.0,M10.5.0"); + + t = mktime (&tm); + + /* Check that the result is either a failure, or close enough + to the correct answer that we can assume the discrepancy is + due to leap seconds. */ + return (t == (time_t) -1 + || (0 < t && answer - 120 <= t && t <= answer + 120)); +} + +int +main () +{ + time_t t, delta; + int i, j; + + /* This test makes some buggy mktime implementations loop. + Give up after 60 seconds; a mktime slower than that + isn't worth using anyway. */ + alarm (60); + + for (;;) + { + t = (time_t_max << 1) + 1; + if (t <= time_t_max) + break; + time_t_max = t; + } + time_t_min = - ((time_t) ~ (time_t) 0 == (time_t) -1) - time_t_max; + + delta = time_t_max / 997; /* a suitable prime number */ + for (i = 0; i < N_STRINGS; i++) + { + if (tz_strings[i]) + putenv ((char*) tz_strings[i]); + + for (t = 0; t <= time_t_max - delta; t += delta) + if (! mktime_test (t)) + return 1; + if (! (mktime_test ((time_t) 1) + && mktime_test ((time_t) (60 * 60)) + && mktime_test ((time_t) (60 * 60 * 24)))) + return 1; + + for (j = 1; ; j <<= 1) + if (! bigtime_test (j)) + return 1; + else if (INT_MAX / 2 < j) + break; + if (! bigtime_test (INT_MAX)) + return 1; + } + return ! (irix_6_4_bug () && spring_forward_gap () && year_2050_test ()); +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_func_working_mktime=yes +else + ac_cv_func_working_mktime=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_working_mktime" >&5 +$as_echo "$ac_cv_func_working_mktime" >&6; } +if test $ac_cv_func_working_mktime = no; then + case " $LIBOBJS " in + *" mktime.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS mktime.$ac_objext" + ;; +esac + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lstat correctly handles trailing slash" >&5 +$as_echo_n "checking whether lstat correctly handles trailing slash... " >&6; } +if ${ac_cv_func_lstat_dereferences_slashed_symlink+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -f conftest.sym conftest.file +echo >conftest.file +if test "$as_ln_s" = "ln -s" && ln -s conftest.file conftest.sym; then + if test "$cross_compiling" = yes; then : + ac_cv_func_lstat_dereferences_slashed_symlink=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +struct stat sbuf; + /* Linux will dereference the symlink and fail, as required by POSIX. + That is better in the sense that it means we will not + have to compile and use the lstat wrapper. */ + return lstat ("conftest.sym/", &sbuf) == 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_func_lstat_dereferences_slashed_symlink=yes +else + ac_cv_func_lstat_dereferences_slashed_symlink=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +else + # If the `ln -s' command failed, then we probably don't even + # have an lstat function. + ac_cv_func_lstat_dereferences_slashed_symlink=no +fi +rm -f conftest.sym conftest.file + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_lstat_dereferences_slashed_symlink" >&5 +$as_echo "$ac_cv_func_lstat_dereferences_slashed_symlink" >&6; } + +test $ac_cv_func_lstat_dereferences_slashed_symlink = yes && + +cat >>confdefs.h <<_ACEOF +#define LSTAT_FOLLOWS_SLASHED_SYMLINK 1 +_ACEOF + + +if test "x$ac_cv_func_lstat_dereferences_slashed_symlink" = xno; then + case " $LIBOBJS " in + *" lstat.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS lstat.$ac_objext" + ;; +esac + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stat accepts an empty string" >&5 +$as_echo_n "checking whether stat accepts an empty string... " >&6; } +if ${ac_cv_func_stat_empty_string_bug+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_func_stat_empty_string_bug=yes +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +struct stat sbuf; + return stat ("", &sbuf) == 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_func_stat_empty_string_bug=no +else + ac_cv_func_stat_empty_string_bug=yes +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_stat_empty_string_bug" >&5 +$as_echo "$ac_cv_func_stat_empty_string_bug" >&6; } +if test $ac_cv_func_stat_empty_string_bug = yes; then + case " $LIBOBJS " in + *" stat.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS stat.$ac_objext" + ;; +esac + + +cat >>confdefs.h <<_ACEOF +#define HAVE_STAT_EMPTY_STRING_BUG 1 +_ACEOF + +fi + +for ac_func in strftime +do : + ac_fn_c_check_func "$LINENO" "strftime" "ac_cv_func_strftime" +if test "x$ac_cv_func_strftime" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STRFTIME 1 +_ACEOF + +else + # strftime is in -lintl on SCO UNIX. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for strftime in -lintl" >&5 +$as_echo_n "checking for strftime in -lintl... " >&6; } +if ${ac_cv_lib_intl_strftime+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lintl $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 strftime (); +int +main () +{ +return strftime (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_intl_strftime=yes +else + ac_cv_lib_intl_strftime=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_intl_strftime" >&5 +$as_echo "$ac_cv_lib_intl_strftime" >&6; } +if test "x$ac_cv_lib_intl_strftime" = xyes; then : + $as_echo "#define HAVE_STRFTIME 1" >>confdefs.h + +LIBS="-lintl $LIBS" +fi + +fi +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strtod" >&5 +$as_echo_n "checking for working strtod... " >&6; } +if ${ac_cv_func_strtod+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_func_strtod=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +$ac_includes_default +#ifndef strtod +double strtod (); +#endif +int +main() +{ + { + /* Some versions of Linux strtod mis-parse strings with leading '+'. */ + char *string = " +69"; + char *term; + double value; + value = strtod (string, &term); + if (value != 69 || term != (string + 4)) + return 1; + } + + { + /* Under Solaris 2.4, strtod returns the wrong value for the + terminating character under some conditions. */ + char *string = "NaN"; + char *term; + strtod (string, &term); + if (term != string && *(term - 1) == 0) + return 1; + } + return 0; +} + +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_func_strtod=yes +else + ac_cv_func_strtod=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_strtod" >&5 +$as_echo "$ac_cv_func_strtod" >&6; } +if test $ac_cv_func_strtod = no; then + case " $LIBOBJS " in + *" strtod.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strtod.$ac_objext" + ;; +esac + +ac_fn_c_check_func "$LINENO" "pow" "ac_cv_func_pow" +if test "x$ac_cv_func_pow" = xyes; then : + +fi + +if test $ac_cv_func_pow = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pow in -lm" >&5 +$as_echo_n "checking for pow in -lm... " >&6; } +if ${ac_cv_lib_m_pow+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lm $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 pow (); +int +main () +{ +return pow (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_m_pow=yes +else + ac_cv_lib_m_pow=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_m_pow" >&5 +$as_echo "$ac_cv_lib_m_pow" >&6; } +if test "x$ac_cv_lib_m_pow" = xyes; then : + POW_LIB=-lm +else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot find library containing definition of pow" >&5 +$as_echo "$as_me: WARNING: cannot find library containing definition of pow" >&2;} +fi + +fi + +fi + +for ac_func in floor +do : + ac_fn_c_check_func "$LINENO" "floor" "ac_cv_func_floor" +if test "x$ac_cv_func_floor" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_FLOOR 1 +_ACEOF + +fi +done + +for ac_func in gethostbyaddr +do : + ac_fn_c_check_func "$LINENO" "gethostbyaddr" "ac_cv_func_gethostbyaddr" +if test "x$ac_cv_func_gethostbyaddr" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GETHOSTBYADDR 1 +_ACEOF + +fi +done + +for ac_func in gethostbyname +do : + ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" +if test "x$ac_cv_func_gethostbyname" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GETHOSTBYNAME 1 +_ACEOF + +fi +done + +for ac_func in gettimeofday +do : + ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" +if test "x$ac_cv_func_gettimeofday" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GETTIMEOFDAY 1 +_ACEOF + +fi +done + +for ac_func in malloc +do : + ac_fn_c_check_func "$LINENO" "malloc" "ac_cv_func_malloc" +if test "x$ac_cv_func_malloc" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_MALLOC 1 +_ACEOF + +fi +done + +for ac_func in memmove +do : + ac_fn_c_check_func "$LINENO" "memmove" "ac_cv_func_memmove" +if test "x$ac_cv_func_memmove" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_MEMMOVE 1 +_ACEOF + +fi +done + +for ac_func in memset +do : + ac_fn_c_check_func "$LINENO" "memset" "ac_cv_func_memset" +if test "x$ac_cv_func_memset" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_MEMSET 1 +_ACEOF + +fi +done + +for ac_func in mkfifo +do : + ac_fn_c_check_func "$LINENO" "mkfifo" "ac_cv_func_mkfifo" +if test "x$ac_cv_func_mkfifo" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_MKFIFO 1 +_ACEOF + +fi +done + +for ac_func in realloc +do : + ac_fn_c_check_func "$LINENO" "realloc" "ac_cv_func_realloc" +if test "x$ac_cv_func_realloc" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_REALLOC 1 +_ACEOF + +fi +done + +for ac_func in realpath +do : + ac_fn_c_check_func "$LINENO" "realpath" "ac_cv_func_realpath" +if test "x$ac_cv_func_realpath" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_REALPATH 1 +_ACEOF + +fi +done + +for ac_func in regcomp +do : + ac_fn_c_check_func "$LINENO" "regcomp" "ac_cv_func_regcomp" +if test "x$ac_cv_func_regcomp" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_REGCOMP 1 +_ACEOF + +fi +done + +for ac_func in select +do : + ac_fn_c_check_func "$LINENO" "select" "ac_cv_func_select" +if test "x$ac_cv_func_select" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SELECT 1 +_ACEOF + +fi +done + +for ac_func in setlocale +do : + ac_fn_c_check_func "$LINENO" "setlocale" "ac_cv_func_setlocale" +if test "x$ac_cv_func_setlocale" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SETLOCALE 1 +_ACEOF + +fi +done + +for ac_func in socket +do : + ac_fn_c_check_func "$LINENO" "socket" "ac_cv_func_socket" +if test "x$ac_cv_func_socket" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SOCKET 1 +_ACEOF + +fi +done + +for ac_func in strcasecmp +do : + ac_fn_c_check_func "$LINENO" "strcasecmp" "ac_cv_func_strcasecmp" +if test "x$ac_cv_func_strcasecmp" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STRCASECMP 1 +_ACEOF + +fi +done + +for ac_func in strchr +do : + ac_fn_c_check_func "$LINENO" "strchr" "ac_cv_func_strchr" +if test "x$ac_cv_func_strchr" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STRCHR 1 +_ACEOF + +fi +done + +for ac_func in strcspn +do : + ac_fn_c_check_func "$LINENO" "strcspn" "ac_cv_func_strcspn" +if test "x$ac_cv_func_strcspn" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STRCSPN 1 +_ACEOF + +fi +done + +for ac_func in strdup +do : + ac_fn_c_check_func "$LINENO" "strdup" "ac_cv_func_strdup" +if test "x$ac_cv_func_strdup" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STRDUP 1 +_ACEOF + +fi +done + +for ac_func in strerror +do : + ac_fn_c_check_func "$LINENO" "strerror" "ac_cv_func_strerror" +if test "x$ac_cv_func_strerror" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STRERROR 1 +_ACEOF + +fi +done + +for ac_func in strncasecmp +do : + ac_fn_c_check_func "$LINENO" "strncasecmp" "ac_cv_func_strncasecmp" +if test "x$ac_cv_func_strncasecmp" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STRNCASECMP 1 +_ACEOF + +fi +done + +for ac_func in strpbrk +do : + ac_fn_c_check_func "$LINENO" "strpbrk" "ac_cv_func_strpbrk" +if test "x$ac_cv_func_strpbrk" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STRPBRK 1 +_ACEOF + +fi +done + +for ac_func in strrchr +do : + ac_fn_c_check_func "$LINENO" "strrchr" "ac_cv_func_strrchr" +if test "x$ac_cv_func_strrchr" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STRRCHR 1 +_ACEOF + +fi +done + +for ac_func in strspn +do : + ac_fn_c_check_func "$LINENO" "strspn" "ac_cv_func_strspn" +if test "x$ac_cv_func_strspn" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STRSPN 1 +_ACEOF + +fi +done + +for ac_func in strstr +do : + ac_fn_c_check_func "$LINENO" "strstr" "ac_cv_func_strstr" +if test "x$ac_cv_func_strstr" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STRSTR 1 +_ACEOF + +fi +done + +for ac_func in strtol +do : + ac_fn_c_check_func "$LINENO" "strtol" "ac_cv_func_strtol" +if test "x$ac_cv_func_strtol" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STRTOL 1 +_ACEOF + +fi +done + +for ac_func in strtoull +do : + ac_fn_c_check_func "$LINENO" "strtoull" "ac_cv_func_strtoull" +if test "x$ac_cv_func_strtoull" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STRTOULL 1 +_ACEOF + +fi +done + + +ac_config_files="$ac_config_files Makefile po/Makefile.in" + +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 + + + 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 +if test -z "${DEBUG_TRUE}" && test -z "${DEBUG_FALSE}"; then + as_fn_error $? "conditional \"DEBUG\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WITH_RDYNAMIC_TRUE}" && test -z "${WITH_RDYNAMIC_FALSE}"; then + as_fn_error $? "conditional \"WITH_RDYNAMIC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GEOIP_LEGACY_TRUE}" && test -z "${GEOIP_LEGACY_FALSE}"; then + as_fn_error $? "conditional \"GEOIP_LEGACY\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GEOIP_MMDB_TRUE}" && test -z "${GEOIP_MMDB_FALSE}"; then + as_fn_error $? "conditional \"GEOIP_MMDB\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${TCB_TRUE}" && test -z "${TCB_FALSE}"; then + as_fn_error $? "conditional \"TCB\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAS_SEDTR_TRUE}" && test -z "${HAS_SEDTR_FALSE}"; then + as_fn_error $? "conditional \"HAS_SEDTR\" 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 goaccess $as_me 1.3, 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 . +goaccess home page: ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +goaccess config.status 1.3 +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" +# Capture the value of obsolete ALL_LINGUAS because we need it to compute + # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it + # from automake < 1.5. + eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' + # Capture the value of LINGUAS because we need it to compute CATALOGS. + LINGUAS="${LINGUAS-%UNSET%}" + + +_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 + "src/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "po-directories") CONFIG_COMMANDS="$CONFIG_COMMANDS po-directories" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; + + *) 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"" || { + # Autoconf 2.62 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"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //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' -e 's/\$U/'"$U"'/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 +} + ;; + "po-directories":C) + for ac_file in $CONFIG_FILES; do + # Support "outfile[:infile[:infile...]]" + case "$ac_file" in + *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + esac + # PO directories have a Makefile.in generated from Makefile.in.in. + case "$ac_file" in */Makefile.in) + # Adjust a relative srcdir. + ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` + ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" + ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` + # In autoconf-2.13 it is called $ac_given_srcdir. + # In autoconf-2.50 it is called $srcdir. + test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" + case "$ac_given_srcdir" in + .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; + /*) top_srcdir="$ac_given_srcdir" ;; + *) top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + # Treat a directory as a PO directory if and only if it has a + # POTFILES.in file. This allows packages to have multiple PO + # directories under different names or in different locations. + if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then + rm -f "$ac_dir/POTFILES" + test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" + cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" + POMAKEFILEDEPS="POTFILES.in" + # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend + # on $ac_dir but don't depend on user-specified configuration + # parameters. + if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then + # The LINGUAS file contains the set of available languages. + if test -n "$OBSOLETE_ALL_LINGUAS"; then + test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" + fi + ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` + # Hide the ALL_LINGUAS assigment from automake < 1.5. + eval 'ALL_LINGUAS''=$ALL_LINGUAS_' + POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" + else + # The set of available languages was given in configure.in. + # Hide the ALL_LINGUAS assigment from automake < 1.5. + eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' + fi + # Compute POFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) + # Compute UPDATEPOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) + # Compute DUMMYPOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) + # Compute GMOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) + case "$ac_given_srcdir" in + .) srcdirpre= ;; + *) srcdirpre='$(srcdir)/' ;; + esac + POFILES= + UPDATEPOFILES= + DUMMYPOFILES= + GMOFILES= + for lang in $ALL_LINGUAS; do + POFILES="$POFILES $srcdirpre$lang.po" + UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" + DUMMYPOFILES="$DUMMYPOFILES $lang.nop" + GMOFILES="$GMOFILES $srcdirpre$lang.gmo" + done + # CATALOGS depends on both $ac_dir and the user's LINGUAS + # environment variable. + INST_LINGUAS= + if test -n "$ALL_LINGUAS"; then + for presentlang in $ALL_LINGUAS; do + useit=no + if test "%UNSET%" != "$LINGUAS"; then + desiredlanguages="$LINGUAS" + else + desiredlanguages="$ALL_LINGUAS" + fi + for desiredlang in $desiredlanguages; do + # Use the presentlang catalog if desiredlang is + # a. equal to presentlang, or + # b. a variant of presentlang (because in this case, + # presentlang can be used as a fallback for messages + # which are not translated in the desiredlang catalog). + case "$desiredlang" in + "$presentlang"*) useit=yes;; + esac + done + if test $useit = yes; then + INST_LINGUAS="$INST_LINGUAS $presentlang" + fi + done + fi + CATALOGS= + if test -n "$INST_LINGUAS"; then + for lang in $INST_LINGUAS; do + CATALOGS="$CATALOGS $lang.gmo" + done + fi + test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" + sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" + for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do + if test -f "$f"; then + case "$f" in + *.orig | *.bak | *~) ;; + *) cat "$f" >> "$ac_dir/Makefile" ;; + esac + fi + done + fi + ;; + esac + 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 + + +cat << EOF + +Your build configuration: + + Prefix : $prefix + Package : $PACKAGE_NAME + Version : $VERSION + Compiler flags : $CFLAGS + Linker flags : $LIBS $LDFLAGS + Dynamic buffer : $with_getline + Geolocation : $geolocation + Storage method : $storage + TLS/SSL : $openssl + Bugs : $PACKAGE_BUGREPORT + +EOF diff --git a/goaccess++/configure.ac b/goaccess++/configure.ac new file mode 100644 index 0000000..9c5822c --- /dev/null +++ b/goaccess++/configure.ac @@ -0,0 +1,309 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ(2.59) +AC_INIT([goaccess], [1.3], [goaccess@prosoftcorp.com], [], [http://goaccess.io]) +AM_INIT_AUTOMAKE +AC_CONFIG_SRCDIR([src/goaccess.c]) +AC_CONFIG_HEADERS([src/config.h]) + +# Use empty CFLAGS by default so autoconf does not add +# CFLAGS="-O2 -g" +# NOTE: Needs to go after AC_INIT and before AC_PROG_CC to select an +# empty default instead. +: ${CFLAGS=""} + +# Checks for programs. +AC_PROG_CC +AM_PROG_CC_C_O + +AM_GNU_GETTEXT([external]) +AM_GNU_GETTEXT_VERSION([0.18]) +# Fix `undefined reference to `libintl_gettext'` on docker: +AC_CHECK_LIB([intl], [libintl_dgettext]) + +# pthread +AC_CHECK_LIB([pthread], [pthread_create], [], [AC_MSG_ERROR([pthread is missing])]) +CFLAGS="$CFLAGS -pthread" + +# DEBUG +AC_ARG_ENABLE(debug, [ --enable-debug Create a debug build. Default is disabled], + [debug="$enableval"], debug=no) + +if test "$debug" = "yes"; then + AC_DEFINE([_DEBUG], 1, [Debug option]) +fi +AM_CONDITIONAL([DEBUG], [test "x$debug" = "xyes"]) + +# Handle rdynamic only on systems using GNU ld +AC_CANONICAL_HOST +AC_MSG_CHECKING([whether to build with rdynamic for GNU ld]) +with_rdyanimc=yes +case "$host_os" in + *darwin*|*cygwin*|*aix*|*mingw*) with_rdyanimc=no + ;; +esac +AC_MSG_RESULT([$with_rdyanimc]) +AM_CONDITIONAL([WITH_RDYNAMIC], [test "x$with_rdyanimc" = "xyes"]) + +# Build with OpenSSL +AC_ARG_WITH([openssl],AC_HELP_STRING([--with-openssl], [build with OpenSSL support]), + [openssl="$withval"],[openssl="no"]) + +if test "$openssl" = 'yes'; then + AC_CHECK_LIB([ssl], [SSL_CTX_new],,[AC_MSG_ERROR([ssl library missing])]) + AC_CHECK_LIB([crypto], [CRYPTO_free],,[AC_MSG_ERROR([crypto library missing])]) +fi + +# GeoIP +AC_ARG_ENABLE(geoip, [ --enable-geoip Enable GeoIP country lookup. Default is disabled], + [geoip="$enableval"], geoip=no) + +geolocation="N/A" +if test "$geoip" = "mmdb"; then + AC_CHECK_LIB([maxminddb], [MMDB_open], [], [AC_MSG_ERROR([ + *** Missing development files for libmaxminddb library. + ])]) + geolocation="GeoIP2" + AC_DEFINE([HAVE_GEOLOCATION], 1, [Build using GeoIP.]) +elif test "$geoip" = "legacy"; then + AC_CHECK_LIB([GeoIP], [GeoIP_new], [], [AC_MSG_ERROR([ + *** Missing development files for the GeoIP library + ])]) + geolocation="GeoIP Legacy" + AC_DEFINE([HAVE_GEOLOCATION], 1, [Build using GeoIP.]) +fi +AM_CONDITIONAL([GEOIP_LEGACY], [test "x$geoip" = "xlegacy"]) +AM_CONDITIONAL([GEOIP_MMDB], [test "x$geoip" = "xmmdb"]) + +# GNU getline / POSIX.1-2008 +AC_ARG_WITH(getline, [ --with-getline Build using dynamic line buffer.], + [with_getline=$withval], [with_getline=no]) + +if test "$with_getline" = "yes"; then + AC_DEFINE([WITH_GETLINE], 1, [Build using GNU getline.]) +fi + +# UTF8 +AC_ARG_ENABLE(utf8, [ --enable-utf8 Enable ncurses library that handles wide characters], + [utf8="$enableval"], utf8=no) + +if test "$utf8" = "yes"; then + libncursesw=ncursesw + # Simply called libncurses on OS X + case "$host_os" in + *darwin*) libncursesw=ncurses + ;; + esac + + AC_CHECK_LIB([$libncursesw], [mvaddwstr], [], + [AC_MSG_ERROR([*** Missing development libraries for ncursesw])]) + AC_SEARCH_LIBS([tputs], [tinfow], ,[AC_MSG_ERROR([Cannot find a library providing tputs])]) + AC_DEFINE([HAVE_LIBNCURSESW], [1], ["ncursesw is present."]) + + have_ncurses="yes" + AC_CHECK_HEADERS([ncursesw/ncurses.h],[have_ncurses=yes], [], [ + #ifdef HAVE_NCURSESW_NCURSES_H + #include + #endif + ]) + + AC_CHECK_HEADERS([ncurses.h],[have_ncurses=yes], [], [ + #ifdef HAVE_NCURSES_H + #include + #endif + ]) + + if test "$have_ncurses" != "yes"; then + AC_MSG_ERROR([Missing ncursesw header file]) + fi +else + AC_CHECK_LIB([ncurses], [refresh], [], + [AC_MSG_ERROR([*** Missing development libraries for ncurses])]) + AC_SEARCH_LIBS([tputs], [tinfo], ,[AC_MSG_ERROR([Cannot find a library providing tputs])]) + + have_ncurses="yes" + AC_CHECK_HEADERS([ncurses/ncurses.h],[have_ncurses=yes], [], [ + #ifdef HAVE_NCURSES_NCURSES_H + #include + #endif + ]) + + AC_CHECK_HEADERS([ncurses.h],[have_ncurses=yes], [], [ + #ifdef HAVE_NCURSES_H + #include + #endif + ]) + + AC_CHECK_HEADERS([curses.h],[have_ncurses=yes], [], [ + #ifdef HAVE_CURSES_H + #include + #endif + ]) + + if test "$have_ncurses" != "yes"; then + AC_MSG_ERROR([Missing ncursesw header file]) + fi +fi + +# Tokyo Cabinet +AC_ARG_ENABLE(tcb, [ --enable-tcb Enable TokyoCabinet database. Default is disabled], + [tcb="$enableval"], tcb=no) + +WITH_TC=no +if test "$tcb" = "memhash"; then + WITH_TC=yes + AC_DEFINE([TCB_MEMHASH], [1], ["Build using on-memory hash database"]) +elif test "$tcb" = "btree"; then + AC_DEFINE([TCB_BTREE], [1], ["Build using on-disk B+ Tree database"]) + WITH_TC=yes +fi + +if test "$WITH_TC" = "yes"; then + AC_CHECK_LIB([tokyocabinet], [tchdbnew], [], + [AC_MSG_ERROR([*** Missing development libraries for Tokyo Cabinet Database])]) + + AC_ARG_ENABLE([zlib], [ --disable-zlib Build without ZLIB compression], + [zlib="$enableval"], zlib=yes) + + if test "$zlib" = "yes"; then + AC_CHECK_LIB(z, gzread, [Z_FLAG=-lz], AC_MSG_ERROR([ + *** zlib is required. If zlib compression is not needed + *** you can use --disable-zlib. + *** Debian based distributions zlib1g-dev + *** Red Hat based distributions zlib-devel + ])) + AC_DEFINE([HAVE_ZLIB], [1], ["Build using ZLIB"]) + LDFLAGS="$LDFLAGS $Z_FLAG" + fi + + AC_ARG_ENABLE([bzip], [ --disable-bzip Build without BZIP2 compression], + [bz2="$enableval"], bz2=yes) + + if test "$bz2" = "yes"; then + AC_CHECK_LIB(bz2, BZ2_bzopen, [BZ2_FLAG=-lbz2], AC_MSG_ERROR([ + *** BZIP2 is required. If BZIP2 compression is not needed + *** you can use --disable-bzip. + *** Debian based distributions libbz2-dev + *** Red Hat based distributions bzip2-devel + ])) + AC_DEFINE([HAVE_BZ2], [1], ["Build using BZ2"]) + LDFLAGS="$LDFLAGS $BZ2_FLAG" + fi + + case "$host_os" in + *darwin*|*bsd*) + LDFLAGS="$LDFLAGS -ltokyocabinet -lc" + ;; + *) + LDFLAGS="$LDFLAGS -ltokyocabinet -lrt -lc" + ;; + esac +fi +AM_CONDITIONAL([TCB], [test "$WITH_TC" = "yes"]) + +if test "$tcb" = "memhash"; then + storage="In-memory Hash Database (Tokyo Cabinet)" +elif test "$tcb" = "btree"; then + storage="On-disk B+ Tree Database (Tokyo Cabinet)" +else + storage="In-memory Hash Database (Default)" +fi + +HAS_SEDTR=no +AC_CHECK_PROG([SED_CHECK],[sed],[yes],[no]) +if test x"$SED_CHECK" == x"yes" ; then + AC_CHECK_PROG([TR_CHECK],[tr],[yes],[no]) + if test x"$TR_CHECK" == x"yes" ; then + HAS_SEDTR=yes + fi +fi +AM_CONDITIONAL([HAS_SEDTR], [test "x$HAS_SEDTR" = xyes]) + +# Solaris +AC_CHECK_LIB([nsl], [gethostbyname]) +AC_CHECK_LIB([socket], [socket]) + +# Checks for header files. +AC_HEADER_STDC +AC_CHECK_HEADERS([arpa/inet.h]) +AC_CHECK_HEADERS([fcntl.h]) +AC_CHECK_HEADERS([inttypes.h]) +AC_CHECK_HEADERS([limits.h]) +AC_CHECK_HEADERS([locale.h]) +AC_CHECK_HEADERS([netdb.h]) +AC_CHECK_HEADERS([netinet/in.h]) +AC_CHECK_HEADERS([stddef.h]) +AC_CHECK_HEADERS([stdint.h]) +AC_CHECK_HEADERS([stdlib.h]) +AC_CHECK_HEADERS([string.h]) +AC_CHECK_HEADERS([strings.h]) +AC_CHECK_HEADERS([sys/socket.h]) +AC_CHECK_HEADERS([sys/time.h]) +AC_CHECK_HEADERS([unistd.h]) + +# Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST +AC_CHECK_TYPES([ptrdiff_t]) +AC_STRUCT_TM +AC_TYPE_INT64_T +AC_TYPE_INT8_T +AC_TYPE_OFF_T +AC_TYPE_SIZE_T +AC_TYPE_UINT32_T +AC_TYPE_UINT64_T +AC_TYPE_UINT8_T + +# Checks for library functions. +AC_FUNC_FSEEKO +AC_FUNC_MEMCMP +AC_FUNC_MKTIME +AC_FUNC_STAT +AC_FUNC_STRFTIME +AC_FUNC_STRTOD +AC_CHECK_FUNCS([floor]) +AC_CHECK_FUNCS([gethostbyaddr]) +AC_CHECK_FUNCS([gethostbyname]) +AC_CHECK_FUNCS([gettimeofday]) +AC_CHECK_FUNCS([malloc]) +AC_CHECK_FUNCS([memmove]) +AC_CHECK_FUNCS([memset]) +AC_CHECK_FUNCS([mkfifo]) +AC_CHECK_FUNCS([realloc]) +AC_CHECK_FUNCS([realpath]) +AC_CHECK_FUNCS([regcomp]) +AC_CHECK_FUNCS([select]) +AC_CHECK_FUNCS([setlocale]) +AC_CHECK_FUNCS([socket]) +AC_CHECK_FUNCS([strcasecmp]) +AC_CHECK_FUNCS([strchr]) +AC_CHECK_FUNCS([strcspn]) +AC_CHECK_FUNCS([strdup]) +AC_CHECK_FUNCS([strerror]) +AC_CHECK_FUNCS([strncasecmp]) +AC_CHECK_FUNCS([strpbrk]) +AC_CHECK_FUNCS([strrchr]) +AC_CHECK_FUNCS([strspn]) +AC_CHECK_FUNCS([strstr]) +AC_CHECK_FUNCS([strtol]) +AC_CHECK_FUNCS([strtoull]) + +AC_CONFIG_FILES([Makefile po/Makefile.in]) +AC_OUTPUT + +cat << EOF + +Your build configuration: + + Prefix : $prefix + Package : $PACKAGE_NAME + Version : $VERSION + Compiler flags : $CFLAGS + Linker flags : $LIBS $LDFLAGS + Dynamic buffer : $with_getline + Geolocation : $geolocation + Storage method : $storage + TLS/SSL : $openssl + Bugs : $PACKAGE_BUGREPORT + +EOF diff --git a/goaccess++/depcomp b/goaccess++/depcomp new file mode 100644 index 0000000..25a39e6 --- /dev/null +++ b/goaccess++/depcomp @@ -0,0 +1,708 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2012-03-27.16; # UTC + +# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010, +# 2011, 2012 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 + +# A tabulation character. +tab=' ' +# A newline character. +nl=' +' + +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" + +# 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 informations. + 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 -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## 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). +## - 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 -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +## 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. + tr ' ' "$nl" < "$tmpdepfile" | +## 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. + 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 -eq 0; then : + else + 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 + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#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. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + 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 -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependent.h'. + # Do two passes, one to just change these to + # '$object: dependent.h' and one to simply 'dependent.h:'. + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +icc) + # Intel's C compiler anf tcc (Tiny C Compiler) understand '-MD -MF file'. + # However on + # $CC -MD -MF foo.d -c -o sub/foo.o sub/foo.c + # ICC 7.0 will fill foo.d with something like + # foo.o: sub/foo.c + # foo.o: sub/foo.h + # which is wrong. We want + # sub/foo.o: sub/foo.c + # sub/foo.o: sub/foo.h + # sub/foo.c: + # sub/foo.h: + # ICC 7.1 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using '\': + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + # tcc 0.9.26 (FIXME still under development at the moment of writing) + # will emit a similar output, but also prepend the continuation lines + # with horizontal tabulation characters. + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + 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 -e "s/^[ $tab][ $tab]*/ /" -e "s,^[^:]*:,$object :," \ + < "$tmpdepfile" > "$depfile" + sed ' + s/[ '"$tab"'][ '"$tab"']*/ /g + s/^ *// + s/ *\\*$// + s/^[^:]*: *// + /^$/d + /:$/d + s/$/ :/ + ' < "$tmpdepfile" >> "$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. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + 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 -eq 0; then : + else + 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,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" + # Add 'dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + echo "#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. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + + if test "$libtool" = yes; then + # With Tru64 cc, shared objects can also be used to make a + # static library. This mechanism is used in libtool 1.4 series to + # handle both shared and static libraries in a single compilation. + # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. + # + # With libtool 1.5 this exception was removed, and libtool now + # 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.libs/$base.lo.d # libtool 1.4 + tmpdepfile2=$dir$base.o.d # libtool 1.5 + tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 + tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.o.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + tmpdepfile4=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +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" = 0; then : + else + 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" + 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" + tr ' ' "$nl" < "$tmpdepfile" | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + 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" + sed '1,2d' "$tmpdepfile" | tr ' ' "$nl" | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + 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/goaccess++/goaccess b/goaccess++/goaccess new file mode 100644 index 0000000000000000000000000000000000000000..66ff7bf34ccb0a4bd9048cebb998afba60eb6eb6 GIT binary patch literal 707704 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

hHwrB_065q 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 #vJ z5AL@eQrDdEuO+n<`Bfde2Zq5w%Z#2kI=Gf1zJ{kaL>yZenP>!W%+y-MDd(+IWcjwPXk9EfWf=TTtaHSuHNKr%$&`7gRwOWE zyIP-OwEZsE_{>{iXxM~TpVYROqm%48HUQF{6N4o#*!@N95&G=}lo^^MHm)gmnr%

4qy6~KtPMiq`cyLD3ZAN%w{E3ZkPL>cbz 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 z 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%0Ay=ey{aBJjelf6)(h>IA3(l+50P&} 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 TN3Hxz9+v$2cc)a|oB#g+^oHU< literal 0 HcmV?d00001 diff --git a/goaccess++/goaccess.1 b/goaccess++/goaccess.1 new file mode 100644 index 0000000..78d35ee --- /dev/null +++ b/goaccess++/goaccess.1 @@ -0,0 +1,1166 @@ +.TH goaccess 1 "NOVEMBER 2018" Linux "User Manuals" +.SH NAME +goaccess \- fast web log analyzer and interactive viewer. +.SH SYNOPSIS +.LP +.B goaccess [filename] [options...] [-c][-M][-H][-q][-d][...] +.SH DESCRIPTION +.B goaccess +GoAccess is an open source real-time web log analyzer and interactive viewer +that runs in a +.I terminal +in *nix systems or through your +.I browser. +.P +It provides fast and valuable HTTP statistics for system administrators that +require a visual server report on the fly. +.P +GoAccess parses the specified web log file and outputs the data to the X +terminal. Features include: + +.IP "General Statistics:" +This panel gives a summary of several metrics, such as the number of valid and +invalid requests, time taken to analyze the dataset, unique visitors, requested +files, static files (CSS, ICO, JPG, etc) HTTP referrers, 404s, size of the +parsed log file and bandwidth consumption. +.IP "Unique visitors" +This panel shows metrics such as hits, unique visitors and cumulative bandwidth +per date. HTTP requests containing the same IP, the same date, and the same +user agent are considered a unique visitor. By default, it includes web +crawlers/spiders. +.IP +Optionally, date specificity can be set to the hour level using +.I --date-spec=hr +which will display dates such as 05/Jun/2016:16. This is great if you want to +track your daily traffic at the hour level. +.IP "Requested files" +This panel displays the most requested files on your web server. It shows hits, +unique visitors, and percentage, along with the cumulative bandwidth, protocol, +and the request method used. +.IP "Requested static files" +Lists the most frequently static files such as: JPG, CSS, SWF, JS, GIF, and PNG +file types, along with the same metrics as the last panel. Additional static +files can be added to the configuration file. +.IP "404 or Not Found" +Displays the same metrics as the previous request panels, however, its data +contains all pages that were not found on the server, or commonly known as 404 +status code. +.IP "Hosts" +This panel has detailed information on the hosts themselves. This is great for +spotting aggressive crawlers and identifying who's eating your bandwidth. + +Expanding the panel can display more information such as host's reverse DNS +lookup result, country of origin and city. If the +.I -a +argument is enabled, a list of user agents can be displayed by selecting the +desired IP address, and then pressing ENTER. +.IP "Operating Systems" +This panel will report which operating system the host used when it hit the +server. It attempts to provide the most specific version of each operating +system. +.IP "Browsers" +This panel will report which browser the host used when it hit the server. It +attempts to provide the most specific version of each browser. +.IP "Visit Times" +This panel will display an hourly report. This option displays 24 data points, +one for each hour of the day. +.IP +Optionally, hour specificity can be set to the tenth of an hour level using +.I --hour-spec=min +which will display hours as 16:4 This is great if you want to spot peaks of +traffic on your server. +.IP "Virtual Hosts" +This panel will display all the different virtual hosts parsed from the access +log. This panel is displayed if +.I %v +is used within the log-format string. +.IP "Referrers URLs" +If the host in question accessed the site via another resource, or was +linked/diverted to you from another host, the URL they were referred from will +be provided in this panel. See `--ignore-panel` in your configuration file to +enable it. +.I disabled +by default. +.IP "Referring Sites" +This panel will display only the host part but not the whole URL. The URL where +the request came from. +.IP "Keyphrases" +It reports keyphrases used on Google search, Google cache, and Google translate +that have lead to your web server. At present, it only supports Google search +queries via HTTP. See `--ignore-panel` in your configuration file to enable it. +.I disabled +by default. +.IP "Geo Location" +Determines where an IP address is geographically located. Statistics are broken +down by continent and country. It needs to be compiled with GeoLocation +support. +.IP "HTTP Status Codes" +The values of the numeric status code to HTTP requests. +.IP "Remote User (HTTP authentication)" +This is the userid of the person requesting the document as determined by HTTP +authentication. If the document is not password protected, this part will be +"-" just like the previous one. This panel is not enabled unless +.I %e +is given within the log-format variable. + +.P +.I NOTE: +Optionally and if configured, all panels can display the average time taken to +serve the request. + +.SH STORAGE +.P +There are three storage options that can be used with GoAccess. Choosing one +will depend on your environment and needs. +.TP +Default Hash Tables +In-memory storage provides better performance at the cost of limiting the +dataset size to the amount of available physical memory. By default GoAccess +uses in-memory hash tables. If your dataset can fit in memory, then this will +perform fine. It has very good memory usage and pretty good performance. +.TP +Tokyo Cabinet On-Disk B+ Tree +Use this storage method for large datasets where it is not possible to fit +everything in memory. The B+ tree database is slower than any of the hash +databases since data has to be committed to disk. However, using an SSD greatly +increases the performance. You may also use this storage method if you need +data persistence to quickly load statistics at a later date. +.TP +Tokyo Cabinet In-memory Hash Database +An alternative to the default hash tables. It uses generic typing and thus it's +performance in terms of memory and speed is average. +.SH CONFIGURATION +.P +Multiple options can be used to configure GoAccess. For a complete up-to-date +list of configure options, run +.I ./configure --help +.TP +\fB\-\-enable-debug +Compile with debugging symbols and turn off compiler optimizations. +.TP +\fB\-\-enable-utf8 +Compile with wide character support. Ncursesw is required. +.TP +\fB\-\-enable-geoip= +Compile with GeoLocation support. MaxMind's GeoIP is required. +.I legacy +will utilize the original GeoIP databases. +.I mmdb +will utilize the enhanced GeoIP2 databases. +.TP +\fB\-\-enable-tcb= +Compile with Tokyo Cabinet storage support. +.I memhash +will utilize Tokyo Cabinet's on-memory hash database. +.I btree +will utilize Tokyo Cabinet's on-disk B+ Tree database. +.TP +\fB\-\-disable-zlib +Disable zlib compression on B+ Tree database. +.TP +\fB\-\-disable-bzip +Disable bzip2 compression on B+ Tree database. +.TP +\fB\-\-with-getline +Dynamically expands line buffer in order to parse full line requests instead of +using a fixed size buffer of 4096. +.TP +\fB\-\-with-openssl +Compile GoAccess with OpenSSL support for its WebSocket server. +.SH OPTIONS +.P +The following options can be supplied to the command or specified in the +configuration file. If specified in the configuration file, long options need +to be used without prepending -- and without using the equal sign =. +.SS +LOG/DATE/TIME FORMAT +.TP +\fB\-\-time-format= +The time-format variable followed by a space, specifies the log format time +containing either a name of a predefined format (see options below) or any +combination of regular characters and special format specifiers. +.IP +They all begin with a percentage (%) sign. See `man strftime`. +.I %T or %H:%M:%S. +.IP +Note that if a timestamp is given in microseconds, +.I %f +must be used as time-format +.TP +\fB\-\-date-format= +The date-format variable followed by a space, specifies the log format time +containing either a name of a predefined format (see options below) or any +combination of regular characters and special format specifiers. +.IP +They all begin with a percentage (%) sign. See `man strftime`. +.I %Y-%m-%d. +.IP +Note that if a timestamp is given in microseconds, +.I +%f +must be used as date-format +.TP +\fB\-\-log-format= +The log-format variable followed by a space or +.I \\\\t +for tab-delimited, specifies the log format string. + +Note that if there are spaces within the format, the string needs to be +enclosed in single/double quotes. Inner quotes need to be escaped. +.IP +In addition to specifying the raw log/date/time formats, for simplicity, any of +the following predefined log format names can be supplied to the +log/date/time-format variables. GoAccess can also handle one predefined name in +one variable and another predefined name in another variable. +.IP + COMBINED - Combined Log Format, + VCOMBINED - Combined Log Format with Virtual Host, + COMMON - Common Log Format, + VCOMMON - Common Log Format with Virtual Host, + W3C - W3C Extended Log File Format, + SQUID - Native Squid Log Format, + CLOUDFRONT - Amazon CloudFront Web Distribution, + CLOUDSTORAGE - Google Cloud Storage, + AWSELB - Amazon Elastic Load Balancing, + AWSS3 - Amazon Simple Storage Service (S3) +.IP +.I Note: +Piping data into GoAccess won't prompt a log/date/time configuration dialog, +you will need to previously define it in your configuration file or in the +command line. +.SS +USER INTERFACE OPTIONS +.TP +\fB\-c \-\-config-dialog +Prompt log/time/date configuration window on program start. Only when curses is +initialized. +.TP +\fB\-i \-\-hl-header +Color highlight active terminal panel. +.TP +\fB\-m \-\-with-mouse +Enable mouse support on main terminal dashboard. +.TP +\fB\-\-\-color= +Specify custom colors for the terminal output. + +.I Color Syntax + DEFINITION space/tab colorFG#:colorBG# [attributes,PANEL] + + FG# = foreground color [-1...255] (-1 = default term color) + BG# = background color [-1...255] (-1 = default term color) + +Optionally, it is possible to apply color attributes (multiple attributes are +comma separated), such as: +.I bold, +.I underline, +.I normal, +.I reverse, +.I blink + +If desired, it is possible to apply custom colors per panel, that is, a metric +in the REQUESTS panel can be of color A, while the same metric in the BROWSERS +panel can be of color B. + +.I Available color definitions: + COLOR_MTRC_HITS + COLOR_MTRC_VISITORS + COLOR_MTRC_DATA + COLOR_MTRC_BW + COLOR_MTRC_AVGTS + COLOR_MTRC_CUMTS + COLOR_MTRC_MAXTS + COLOR_MTRC_PROT + COLOR_MTRC_MTHD + COLOR_MTRC_HITS_PERC + COLOR_MTRC_HITS_PERC_MAX + COLOR_MTRC_VISITORS_PERC + COLOR_MTRC_VISITORS_PERC_MAX + COLOR_PANEL_COLS + COLOR_BARS + COLOR_ERROR + COLOR_SELECTED + COLOR_PANEL_ACTIVE + COLOR_PANEL_HEADER + COLOR_PANEL_DESC + COLOR_OVERALL_LBLS + COLOR_OVERALL_VALS + COLOR_OVERALL_PATH + COLOR_ACTIVE_LABEL + COLOR_BG + COLOR_DEFAULT + COLOR_PROGRESS + +See configuration file for a sample color scheme. +.TP +\fB\-\-color-scheme=<1|2|3> +Choose among color schemes. +.I 1 +for the default grey scheme. +.I 2 +for the green scheme. +.I 3 +for the Monokai scheme (shown only if terminal supports 256 colors). +.TP +\fB\-\-crawlers-only +Parse and display only crawlers (bots). +.TP +\fB\-\-html-custom-css= +Specifies a custom CSS file path to load in the HTML report. +.TP +\fB\-\-html-custom-js= +Specifies a custom JS file path to load in the HTML report. +.TP +\fB\-\-html-report-title= +Set HTML report page title and header. +.TP +\fB\-\-html-prefs=<JSON> +Set HTML report default preferences. Supply a valid JSON object containing the +HTML preferences. It allows the ability to customize each panel plot. See +example below. +.IP +.I Note: +The JSON object passed needs to be a one line JSON string. For instance, +.IP +\-\-html-prefs='{"theme":"bright","perPage":5,"layout":"horizontal","showTables":true,"visitors":{"plot":{"chartType":"bar"}}}' +.TP +\fB\-\-json-pretty-print +Format JSON output using tabs and newlines. +.IP +.I Note: +This is not recommended when outputting a real-time HTML report since the +WebSocket payload will much much larger. +.TP +\fB\-\-max-items=<number> +The maximum number of items to display per panel. The maximum can be a number +between 1 and n. +.IP +.I Note: +Only the CSV and JSON output allow a maximum number greater than the default +value of 366 (or 50 in the real-time HTML output) items per panel. +.TP +\fB\-\-no-color +Turn off colored output. This is the default output on terminals that do not +support colors. +.TP +\fB\-\-no-column-names +Don't write column names in the terminal output. By default, it displays column +names for each available metric in every panel. +.TP +\fB\-\-no-csv-summary +Disable summary metrics on the CSV output. +.TP +\fB\-\-no-progress +Disable progress metrics [total requests/requests per second]. +.TP +\fB\-\-no-tab-scroll +Disable scrolling through panels when TAB is pressed or when a panel is +selected using a numeric key. +.TP +\fB\-\-no-html-last-updated +Do not show the last updated field displayed in the HTML generated report. +.TP +\fB\-\-no-parsing-spinner +Do now show the progress metrics and parsing spinner. +.SS +SERVER OPTIONS +.TP +\fB\-\-addr +Specify IP address to bind the server to. Otherwise it binds to 0.0.0.0. +.IP +Usually there is no need to specify the address, unless you intentionally would +like to bind the server to a different address within your server. +.TP +\fB\-\-daemonize +Run GoAccess as daemon (only if \fB\-\-real-time-html enabled). +.IP +Note: It's important to make use of absolute paths across GoAccess' +configuration. +.TP +\fB\-\-origin=<url> +Ensure clients send the specified origin header upon the WebSocket handshake. +.TP +\fB\-\-pid-file=<path/goaccess.pid> +Write the daemon PID to a file when used along the --daemonize option. +.TP +\fB\-\-port=<port> +Specify the port to use. By default GoAccess' WebSocket server listens on port +7890. +.TP +\fB\-\-real-time-html +Enable real-time HTML output. +.IP +GoAccess uses its own WebSocket server to push the data from the server to the +client. See http://gwsocket.io for more details how the WebSocket server works. +.TP +\fB\-\-ws-url=<[scheme://]url[:port]> +URL to which the WebSocket server responds. This is the URL supplied to the +WebSocket constructor on the client side. +.IP +Optionally, it is possible to specify the WebSocket URI scheme, such as +.I ws:// +or +.I wss:// +for unencrypted and encrypted connections. e.g., +.I +wss://goaccess.io +.IP +If GoAccess is running behind a proxy, you could set the client side to connect +to a different port by specifying the host followed by a colon and the port. +e.g., +.I goaccess.io:9999 +. e.g., +.IP +By default, it will attempt to connect to the generated report's hostname. If +GoAccess is running on a remote server, the host of the remote server should be +specified here. Also, make sure it is a valid host and NOT an http address. +.TP +\fB\-\-fifo-in=<path/file> +Creates a named pipe (FIFO) that reads from on the given path/file. +.TP +\fB\-\-fifo-out=<path/file> +Creates a named pipe (FIFO) that writes to the given path/file. +.TP +\fB\-\-ssl-cert=<cert.crt> +Path to TLS/SSL certificate. In order to enable TLS/SSL support, GoAccess +requires that \-\-ssl-cert and \-\-ssl-key are used. + +Only if configured using --with-openssl +.TP +\fB\-\-ssl-key=<priv.key> +Path to TLS/SSL private key. In order to enable TLS/SSL support, GoAccess +requires that \-\-ssl-cert and \-\-ssl-key are used. + +Only if configured using --with-openssl +.SS +FILE OPTIONS +.TP +\fB\-f \-\-log-file=<logfile> +Specify the path to the input log file. If set in the config file, it will take +priority over -f from the command line. +.TP +\fB\-S \-\-log-size=<bytes> +Specify the log size in bytes. This is useful when piping in logs for +processing in which the log size can be explicitly set. +.TP +\fB\-l \-\-debug-file=<debugfile> +Send all debug messages to the specified file. +.TP +\fB\-p \-\-config-file=<configfile> +Specify a custom configuration file to use. If set, it will take priority over +the global configuration file (if any). +.TP +\fB\-\-invalid-requests=<filename> +Log invalid requests to the specified file. +.TP +\fB\-\-no-global-config +Do not load the global configuration file. This directory should normally be +/usr/local/etc, unless specified with +.I --sysconfdir=/dir. +See --dcf option for finding the default configuration file. +.SS +PARSE OPTIONS +.TP +\fB\-a \-\-agent-list +Enable a list of user-agents by host. For faster parsing, do not enable this +flag. +.TP +\fB\-d \-\-with-output-resolver +Enable IP resolver on HTML|JSON output. +.TP +\fB\-e \-\-exclude-ip=<IP|IP-range> +Exclude an IPv4 or IPv6 from being counted. +Ranges can be included as well using a dash in between the IPs (start-end). +.IP +.I Examples: + exclude-ip 127.0.0.1 + exclude-ip 192.168.0.1-192.168.0.100 + exclude-ip ::1 + exclude-ip 0:0:0:0:0:ffff:808:804-0:0:0:0:0:ffff:808:808 +.TP +\fB\-H \-\-http-protocol=<yes|no> +Set/unset HTTP request protocol. This will create a request key containing the +request protocol + the actual request. +.TP +\fB\-M \-\-http-method=<yes|no> +Set/unset HTTP request method. This will create a request key containing the +request method + the actual request. +.TP +\fB\-o \-\-output=<path/file.[json|csv|html]> +Write output to stdout given one of the following files and the corresponding +extension for the output format: +.IP + /path/file.csv - Comma-separated values (CSV) + /path/file.json - JSON (JavaScript Object Notation) + /path/file.html - HTML +.TP +\fB\-q \-\-no-query-string +Ignore request's query string. i.e., www.google.com/page.htm?query => +www.google.com/page.htm. +.IP +.I Note: +Removing the query string can greatly decrease memory consumption, especially +on timestamped requests. +.TP +\fB\-r \-\-no-term-resolver +Disable IP resolver on terminal output. +.TP +\fB\-\-444-as-404 +Treat non-standard status code 444 as 404. +.TP +\fB\-\-4xx-to-unique-count +Add 4xx client errors to the unique visitors count. +.TP +\fB\-\-accumulated-time +Store accumulated processing time from parsing day-by-day logs. + +Only if configured with --enable-tcb=btree +.TP +\fB\-\-anonymize-ip +Anonymize the client IP address. The IP anonymization option sets the last +octet of IPv4 user IP addresses and the last 80 bits of IPv6 addresses to +zeros. +e.g., 192.168.20.100 => 192.168.20.0 +e.g., 2a03:2880:2110:df07:face:b00c::1 => 2a03:2880:2110:df07:: +.TP +\fB\-\-all-static-files +Include static files that contain a query string. e.g., +/fonts/fontawesome-webfont.woff?v=4.0.3 +.TP +\fB\-\-browsers-file=<path> +Include an additional delimited list of browsers/crawlers/feeds etc. +See config/browsers.list for an example or +https://raw.githubusercontent.com/allinurl/goaccess/master/config/browsers.list +.TP +\fB\-\-date-spec=<date|hr> +Set the date specificity to either date (default) or hr to display hours +appended to the date. +.IP +This is used in the visitors panel. It's useful for tracking visitors at the +hour level. For instance, an hour specificity would yield to display traffic as +18/Dec/2010:19 +.TP +\fB\-\-double-decode +Decode double-encoded values. This includes, user-agent, request, and referer. +.TP +\fB\-\-enable-panel=<PANEL> +Enable parsing and displaying the given panel. +.IP +.I Available panels: + VISITORS + REQUESTS + REQUESTS_STATIC + NOT_FOUND + HOSTS + OS + BROWSERS + VISIT_TIMES + VIRTUAL_HOSTS + REFERRERS + REFERRING_SITES + KEYPHRASES + STATUS_CODES + REMOTE_USER + GEO_LOCATION +.TP +\fB\-\-hide-referer=<NEEDLE> +Hide a referer but still count it. Wild cards are allowed in the needle. i.e., +*.bing.com. +.TP +\fB\-\-hour-spec=<hr|min> +Set the time specificity to either hour (default) or min to display the tenth +of an hour appended to the hour. +.IP +This is used in the time distribution panel. It's useful for tracking peaks of +traffic on your server at specific times. +.TP +\fB\-\-ignore-crawlers +Ignore crawlers from being counted. +.TP +\fB\-\-ignore-panel=<PANEL> +Ignore parsing and displaying the given panel. +.IP +.I Available panels: + VISITORS + REQUESTS + REQUESTS_STATIC + NOT_FOUND + HOSTS + OS + BROWSERS + VISIT_TIMES + VIRTUAL_HOSTS + REFERRERS + REFERRING_SITES + KEYPHRASES + STATUS_CODES + REMOTE_USER +.TP +\fB\-\-ignore-referer=<referer> +Ignore referers from being counted. Wildcards allowed. e.g., +.I +*.domain.com +.I +ww?.domain.* +.TP +\fB\-\-ignore-status=<CODE> +Ignore parsing and displaying one or multiple status code(s). For multiple +status codes, use this option multiple times. +.TP +\fB\-\-num-tests=<number> +Number of lines from the access log to test against the provided log/date/time +format. By default, the parser is set to test 10 lines. If set to 0, the parser +won't test any lines and will parse the whole access log. If a line matches the +given log/date/time format before it reaches +.I <number>, +the parser will consider the log to be valid, otherwise GoAccess will return +EXIT_FAILURE and display the relevant error messages. +.TP +\fB\-\-process-and-exit +Parse log and exit without outputting data. Useful if we are looking to only +add new data to the on-disk database without outputting to a file or a +terminal. +.TP +\fB\-\-real-os +Display real OS names. e.g, Windows XP, Snow Leopard. +.TP +\fB\-\-sort-panel=<PANEL,FIELD,ORDER> +Sort panel on initial load. Sort options are separated by comma. Options are in +the form: PANEL,METRIC,ORDER +.IP +.I Available metrics: + BY_HITS - Sort by hits + BY_VISITORS - Sort by unique visitors + BY_DATA - Sort by data + BY_BW - Sort by bandwidth + BY_AVGTS - Sort by average time served + BY_CUMTS - Sort by cumulative time served + BY_MAXTS - Sort by maximum time served + BY_PROT - Sort by http protocol + BY_MTHD - Sort by http method +.IP +.I Available orders: + ASC + DESC +.TP +\fB\-\-static-file=<extension> +Add static file extension. e.g.: +.I .mp3 +Extensions are case sensitive. +.SS +GEOLOCATION OPTIONS +.TP +\fB\-g \-\-std-geoip +Standard GeoIP database for less memory usage. +.TP +\fB\-\-geoip-database=<geofile> +Specify path to GeoIP database file. i.e., GeoLiteCity.dat. + +If using GeoIP2, you will need to download the GeoLite2 City or Country +database from MaxMind.com and use the option --geoip-database to specify the +database. You can also get updated database files for GeoIP legacy, you can +find these as GeoLite Legacy Databases from MaxMind.com. IPv4 and IPv6 files +are supported as well. For updated DB URLs, please see the default GoAccess +configuration file. + +.I Note: +--geoip-city-data is an alias of --geoip-database. +.SS +OTHER OPTIONS +.TP +\fB\-h \-\-help +The help. +.TP +\fB\-s \-\-storage +Display current storage method. i.e., B+ Tree, Hash. +.TP +\fB\-V \-\-version +Display version information and exit. +.TP +\fB\-\-dcf +Display the path of the default config file when `-p` is not used. +.SS +ON-DISK STORAGE OPTIONS +.TP +\fB\-\-keep-db-files +Persist parsed data into disk. If database files exist, files will be +overwritten. This should be set to the first dataset. Setting it to false will +delete all database files when exiting the program. See examples below. + +Only if configured with --enable-tcb=btree +.TP +\fB\-\-load-from-disk +Load previously stored data from disk. If reading persisted data only, the +database files need to exist. See +.I keep-db-files +and examples below. + +Only if configured with --enable-tcb=btree +.TP +\fB\-\-db-path=<dir> +Path where the on-disk database files are stored. The default value is the +.I /tmp/goaccess<PID> +directory (created on-demand). + +Only if configured with --enable-tcb=btree +.TP +\fB\-\-xmmap=<num> +Set the size in bytes of the extra mapped memory. The default value is 0. + +Only if configured with --enable-tcb=btree +.TP +\fB\-\-cache-lcnum=<num> +Specifies the maximum number of leaf nodes to be cached. If it is not more than +0, the default value is specified. The default value is 1024. Setting a larger +value will increase speed performance, however, memory consumption will +increase. Lower value will decrease memory consumption. + +Only if configured with --enable-tcb=btree +.TP +\fB\-\-cache-ncnum=<num> +Specifies the maximum number of non-leaf nodes to be cached. If it is not more +than 0, the default value is specified. The default value is 512. + +Only if configured with --enable-tcb=btree +.TP +\fB\-\-tune-lmemb=<num> +Specifies the number of members in each leaf page. If it is not more than 0, +the default value is specified. The default value is 128. + +Only if configured with --enable-tcb=btree +.TP +\fB\-\-tune-nmemb=<num> +Specifies the number of members in each non-leaf page. If it is not more than +0, the default value is specified. The default value is 256. + +Only if configured with --enable-tcb=btree +.TP +\fB\-\-tune-bnum=<num> +Specifies the number of elements of the bucket array. If it is not more than 0, +the default value is specified. The default value is 32749. Suggested size of +the bucket array is about from 1 to 4 times of the number of all pages to be +stored. + +Only if configured with --enable-tcb=btree +.TP +\fB\-\-compression=<zlib|bz2> +Specifies that each page is compressed with ZLIB|BZ2 encoding. + +Only if configured with --enable-tcb=btree + +.SH CUSTOM LOG/DATE FORMAT +GoAccess can parse virtually any web log format. +.P +Predefined options include, Common Log Format (CLF), Combined Log Format +(XLF/ELF), including virtual host, Amazon CloudFront (Download Distribution), +Google Cloud Storage and W3C format (IIS). +.P +GoAccess allows any custom format string as well. +.P +There are two ways to configure the log format. +The easiest is to run GoAccess with +.I -c +to prompt a configuration window. Otherwise, it can be configured under +~/.goaccessrc or the %sysconfdir%. +.IP "time-format" +The +.I time-format +variable followed by a space, specifies the log format time +containing any combination of regular characters and special format specifiers. +They all begin with a percentage (%) sign. See `man strftime`. +.I %T or %H:%M:%S. +.IP +.I Note: +If a timestamp is given in microseconds, +.I +%f +must be used as +.I +time-format +.IP "date-format" +The +.I date-format +variable followed by a space, specifies the log format date containing any +combination of regular characters and special format specifiers. They all begin +with a percentage (%) sign. See `man strftime`. e.g., +.I %Y-%m-%d. +.IP +.I Note: +If a timestamp is given in microseconds, +.I +%f +must be used as +.I +date-format +.IP "log-format" +The +.I log-format +variable followed by a space or +.I \\\\t +, specifies the log format string. +.IP %x +A date and time field matching the +.I time-format +and +.I date-format +variables. This is used when given a timestamp or the date & time are +concatenated as a single string (e.g., 1501647332 or 20170801235000) instead of +the date and time being in two separated variables. +.IP %t +time field matching the +.I time-format +variable. +.IP %d +date field matching the +.I date-format +variable. +.IP %v +The canonical Server Name of the server serving the request (Virtual Host). +.IP %e +This is the userid of the person requesting the document as determined by HTTP +authentication. +.IP %h +host (the client IP address, either IPv4 or IPv6) +.IP %r +The request line from the client. This requires specific delimiters around the +request (as single quotes, double quotes, or anything else) to be parsable. If +not, we have to use a combination of special format specifiers as %m %U %H. +.IP %q +The query string. +.IP %m +The request method. +.IP %U +The URL path requested. + +.I Note: +If the query string is in %U, there is no need to use +.I %q. +However, if the URL path, does not include any query string, you may use +.I %q +and the query string will be appended to the request. +.IP %H +The request protocol. +.IP %s +The status code that the server sends back to the client. +.IP %b +The size of the object returned to the client. +.IP %R +The "Referrer" HTTP request header. +.IP %u +The user-agent HTTP request header. +.IP %D +The time taken to serve the request, in microseconds as a decimal number. +.IP %T +The time taken to serve the request, in seconds with milliseconds resolution. +.IP %L +The time taken to serve the request, in milliseconds as a decimal number. +.IP %^ +Ignore this field. +.IP %~ +Move forward through the log string until a non-space (!isspace) char is found. +.IP ~h +The host (the client IP address, either IPv4 or IPv6) in a X-Forwarded-For (XFF) field. + +It uses a special specifier which consists of a tilde before the host +specifier, followed by the character(s) that delimit the XFF field, which are +enclosed by curly braces (i.e., ~h{," }) + +For example, ~h{," } is used in order to parse "11.25.11.53, 17.68.33.17" field +which is delimited by a double quote, a comma, and a space. +.P +.I Note: +In order to get the average, cumulative and maximum time served in GoAccess, +you will need to start logging response times in your web server. In Nginx you +can add +.I $request_time +to your log format, or +.I %D +in Apache. +.P +.I Important: +If multiple time served specifiers are used at the same time, the first option +specified in the format string will take priority over the other specifiers. +.P +GoAccess +.I requires +the following fields: +.IP +.I %h +a valid IPv4/6 +.IP +.I %d +a valid date +.IP +.I %r +the request +.SH INTERACTIVE MENU +.IP "F1 or h" +Main help. +.IP "F5" +Redraw main window. +.IP "q" +Quit the program, current window or collapse active module +.IP "o or ENTER" +Expand selected module or open window +.IP "0-9 and Shift + 0" +Set selected module to active +.IP "j" +Scroll down within expanded module +.IP "k" +Scroll up within expanded module +.IP "c" +Set or change scheme color. +.IP "TAB" +Forward iteration of modules. Starts from current active module. +.IP "SHIFT + TAB" +Backward iteration of modules. Starts from current active module. +.IP "^f" +Scroll forward one screen within an active module. +.IP "^b" +Scroll backward one screen within an active module. +.IP "s" +Sort options for active module +.IP "/" +Search across all modules (regex allowed) +.IP "n" +Find the position of the next occurrence across all modules. +.IP "g" +Move to the first item or top of screen. +.IP "G" +Move to the last item or bottom of screen. +.SH EXAMPLES +.I Note: +Piping data into GoAccess won't prompt a log/date/time configuration dialog, +you will need to previously define it in your configuration file or in the +command line. + +.SS +DIFFERENT OUTPUTS +.P +To output to a terminal and generate an interactive report: +.IP +# goaccess access.log +.P +To generate an HTML report: +.IP +# goaccess access.log -a -o report.html +.P +To generate a JSON report: +.IP +# goaccess access.log -a -d -o report.json +.P +To generate a CSV file: +.IP +# goaccess access.log --no-csv-summary -o report.csv +.P +GoAccess also allows great flexibility for real-time filtering and parsing. For +instance, to quickly diagnose issues by monitoring logs since goaccess was +started: +.IP +# tail -f access.log | goaccess - +.P +And even better, to filter while maintaining opened a pipe to preserve +real-time analysis, we can make use of +.I tail -f +and +a matching pattern tool such as +.I grep, awk, sed, +etc: +.IP +# tail -f access.log | grep -i --line-buffered 'firefox' | goaccess --log-format=COMBINED - +.P +or to parse from the beginning of the file while maintaining the pipe opened +and applying a filter +.IP +# tail -f -n +0 access.log | grep -i --line-buffered 'firefox' | goaccess --log-format=COMBINED -o report.html --real-time-html - +.SS +MULTIPLE LOG FILES +.P +There are several ways to parse multiple logs with GoAccess. The simplest is to +pass multiple log files to the command line: +.IP +# goaccess access.log access.log.1 +.P +It's even possible to parse files from a pipe while reading regular files: +.IP +# cat access.log.2 | goaccess access.log access.log.1 - +.P +.I Note +that the single dash is appended to the command line to let GoAccess know that +it should read from the pipe. +.P +Now if we want to add more flexibility to GoAccess, we can do a series of +pipes. For instance, if we would like to process all compressed log files +.I access.log.*.gz +in addition to the current log file, we can do: +.IP +# zcat access.log.*.gz | goaccess access.log - +.P +.I Note: +On Mac OS X, use gunzip -c instead of zcat. +.SS +REAL TIME HTML OUTPUT +.P +GoAccess has the ability to output real-time data in the HTML report. You can +even email the HTML file since it is composed of a single file with no external +file dependencies, how neat is that! +.P +The process of generating a real-time HTML report is very similar to the +process of creating a static report. Only --real-time-html is needed to make it +real-time. +.IP +# goaccess access.log -o /usr/share/nginx/html/site/report.html --real-time-html +.P +By default, GoAccess will use the host name of the generated report. +Optionally, you can specify the URL to which the client's browser will connect +to. See https://goaccess.io/faq for a more detailed example. +.IP +# goaccess access.log -o report.html --real-time-html --ws-url=goaccess.io +.P +By default, GoAccess listens on port 7890, to use a different port other than +7890, you can specify it as (make sure the port is opened): +.IP +# goaccess access.log -o report.html --real-time-html --port=9870 +.P +And to bind the WebSocket server to a different address other than 0.0.0.0, you +can specify it as: +.IP +# goaccess access.log -o report.html --real-time-html --addr=127.0.0.1 +.P +.I Note: +To output real time data over a TLS/SSL connection, you need to use +.I --ssl-cert=<cert.crt> +and +.I --ssl-key=<priv.key>. +.SS +WORKING WITH DATES +.P +Another useful pipe would be filtering dates out of the web log +.P +The following will get all HTTP requests starting on 05/Dec/2010 until the end +of the file. +.IP +# sed -n '/05\/Dec\/2010/,$ p' access.log | goaccess -a - +.P +or using relative dates such as yesterdays or tomorrows day: +.IP +# sed -n '/'$(date '+%d\/%b\/%Y' -d '1 week ago')'/,$ p' access.log | goaccess -a - +.P +If we want to parse only a certain time-frame from DATE a to DATE b, we can do: +.IP +# sed -n '/5\/Nov\/2010/,/5\/Dec\/2010/ p' access.log | goaccess -a - +.SS +VIRTUAL HOSTS +.P +Assuming your log contains the virtual host (server blocks) field. For +instance: +.IP +vhost.com:80 10.131.40.139 - - [02/Mar/2016:08:14:04 -0600] "GET /shop/bag-p-20 +HTTP/1.1" 200 6715 "-" "Apache (internal dummy connection)" +.P +And you would like to append the virtual host to the request in order to see +which virtual host the top urls belong to +.IP +awk '$8=$1$8' access.log | goaccess -a - +.P +To exclude a list of virtual hosts you can do the following: +.IP +# grep -v "`cat exclude_vhost_list_file`" vhost_access.log | goaccess - +.SS +FILES & STATUS CODES +.P +To parse specific pages, e.g., page views, html, htm, php, etc. within a +request: +.IP +# awk '$7~/\.html|\.htm|\.php/' access.log | goaccess - +.P +Note, +.I $7 +is the request field for the common and combined log format, (without Virtual +Host), if your log includes Virtual Host, then you probably want to use +.I $8 +instead. It's best to check which field you are shooting for, e.g.: +.IP +# tail -10 access.log | awk '{print $8}' +.P +Or to parse a specific status code, e.g., 500 (Internal Server Error): +.IP +# awk '$9~/500/' access.log | goaccess - +.SS +SERVER +.P +Also, it is worth pointing out that if we want to run GoAccess at lower +priority, we can run it as: +.IP +# nice -n 19 goaccess -f access.log -a +.P +and if you don't want to install it on your server, you can still run it from +your local machine: +.IP +# ssh root@server 'cat /var/log/apache2/access.log' | goaccess -a - +.SS +INCREMENTAL LOG PROCESSING +.P +GoAccess has the ability to process logs incrementally through the on-disk +B+Tree database. It works in the following way: + +.nr step 1 1 +.IP \n[step] 3 +A dataset must be persisted first with +.I --keep-db-files, +then the same dataset can be loaded with +.I --load-from-disk. +.IP \n+[step] +If new data is passed (piped or through a log file), it will append it to the +original dataset. +.IP \n+[step] +To preserve the data at all times, +.I --keep-db-files +must be used. +.IP \n+[step] +If +.I --load-from-disk +is used without +.I --keep-db-files, +database files will be deleted upon closing the program. +.P +For instance: +.IP +// last month access log +.br +goaccess access.log.1 --keep-db-files +.P +then, load it with +.IP +// append this month access log, and preserve new data +.br +goaccess access.log --load-from-disk --keep-db-files +.P +To read persisted data only (without parsing new data) +.IP +goaccess --load-from-disk --keep-db-files +.P +.SH NOTES +Each active panel has a total of 366 items or 50 in the real-time HTML report. +The number of items is customizable using +.I max-items +However, only the CSV and JSON output allow a maximum number greater than the +default value of 366 items per panel. +.P +When analyzing the same log file twice using the on-disk B+Tree and using +.I --keep-db-files +and +.I --load-from-disk +on each run, GoAccess will count each entry twice. Issue #334 will address this +issue. +.P +A hit is a request (line in the access log), e.g., 10 requests = 10 hits. HTTP +requests with the same IP, date, and user agent are considered a unique visit. +.SH BUGS +If you think you have found a bug, please send me an email to +.I goaccess@prosoftcorp.com +or use the issue tracker in https://github.com/allinurl/goaccess/issues +.SH AUTHOR +Gerardo Orellana <goaccess@prosoftcorp.com> +For more details about it, or new releases, please visit +https://goaccess.io diff --git a/goaccess++/install-sh b/goaccess++/install-sh new file mode 100644 index 0000000..a9244eb --- /dev/null +++ b/goaccess++/install-sh @@ -0,0 +1,527 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2011-01-19.21; # 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-writeable 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/goaccess++/m4/gettext.m4 b/goaccess++/m4/gettext.m4 new file mode 100644 index 0000000..f84e6a5 --- /dev/null +++ b/goaccess++/m4/gettext.m4 @@ -0,0 +1,383 @@ +# gettext.m4 serial 63 (gettext-0.18) +dnl Copyright (C) 1995-2010 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000. +dnl Bruno Haible <haible@clisp.cons.org>, 2000-2006, 2008-2010. + +dnl Macro to add for using GNU gettext. + +dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]). +dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The +dnl default (if it is not specified or empty) is 'no-libtool'. +dnl INTLSYMBOL should be 'external' for packages with no intl directory, +dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory. +dnl If INTLSYMBOL is 'use-libtool', then a libtool library +dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static, +dnl depending on --{enable,disable}-{shared,static} and on the presence of +dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library +dnl $(top_builddir)/intl/libintl.a will be created. +dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext +dnl implementations (in libc or libintl) without the ngettext() function +dnl will be ignored. If NEEDSYMBOL is specified and is +dnl 'need-formatstring-macros', then GNU gettext implementations that don't +dnl support the ISO C 99 <inttypes.h> formatstring macros will be ignored. +dnl INTLDIR is used to find the intl libraries. If empty, +dnl the value `$(top_builddir)/intl/' is used. +dnl +dnl The result of the configuration is one of three cases: +dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled +dnl and used. +dnl Catalog format: GNU --> install in $(datadir) +dnl Catalog extension: .mo after installation, .gmo in source tree +dnl 2) GNU gettext has been found in the system's C library. +dnl Catalog format: GNU --> install in $(datadir) +dnl Catalog extension: .mo after installation, .gmo in source tree +dnl 3) No internationalization, always use English msgid. +dnl Catalog format: none +dnl Catalog extension: none +dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur. +dnl The use of .gmo is historical (it was needed to avoid overwriting the +dnl GNU format catalogs when building on a platform with an X/Open gettext), +dnl but we keep it in order not to force irrelevant filename changes on the +dnl maintainers. +dnl +AC_DEFUN([AM_GNU_GETTEXT], +[ + dnl Argument checking. + ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], , + [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT +])])])])]) + ifelse(ifelse([$1], [], [old])[]ifelse([$1], [no-libtool], [old]), [old], + [AC_DIAGNOSE([obsolete], [Use of AM_GNU_GETTEXT without [external] argument is deprecated.])]) + ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], , + [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT +])])])]) + define([gt_included_intl], + ifelse([$1], [external], + ifdef([AM_GNU_GETTEXT_][INTL_SUBDIR], [yes], [no]), + [yes])) + define([gt_libtool_suffix_prefix], ifelse([$1], [use-libtool], [l], [])) + gt_NEEDS_INIT + AM_GNU_GETTEXT_NEED([$2]) + + AC_REQUIRE([AM_PO_SUBDIRS])dnl + ifelse(gt_included_intl, yes, [ + AC_REQUIRE([AM_INTL_SUBDIR])dnl + ]) + + dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + + dnl Sometimes libintl requires libiconv, so first search for libiconv. + dnl Ideally we would do this search only after the + dnl if test "$USE_NLS" = "yes"; then + dnl if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then + dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT + dnl the configure script would need to contain the same shell code + dnl again, outside any 'if'. There are two solutions: + dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'. + dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE. + dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not + dnl documented, we avoid it. + ifelse(gt_included_intl, yes, , [ + AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) + ]) + + dnl Sometimes, on MacOS X, libintl requires linking with CoreFoundation. + gt_INTL_MACOSX + + dnl Set USE_NLS. + AC_REQUIRE([AM_NLS]) + + ifelse(gt_included_intl, yes, [ + BUILD_INCLUDED_LIBINTL=no + USE_INCLUDED_LIBINTL=no + ]) + LIBINTL= + LTLIBINTL= + POSUB= + + dnl Add a version number to the cache macros. + case " $gt_needs " in + *" need-formatstring-macros "*) gt_api_version=3 ;; + *" need-ngettext "*) gt_api_version=2 ;; + *) gt_api_version=1 ;; + esac + gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" + gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" + + dnl If we use NLS figure out what method + if test "$USE_NLS" = "yes"; then + gt_use_preinstalled_gnugettext=no + ifelse(gt_included_intl, yes, [ + AC_MSG_CHECKING([whether included gettext is requested]) + AC_ARG_WITH([included-gettext], + [ --with-included-gettext use the GNU gettext library included here], + nls_cv_force_use_gnu_gettext=$withval, + nls_cv_force_use_gnu_gettext=no) + AC_MSG_RESULT([$nls_cv_force_use_gnu_gettext]) + + nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" + if test "$nls_cv_force_use_gnu_gettext" != "yes"; then + ]) + dnl User does not insist on using GNU NLS library. Figure out what + dnl to use. If GNU gettext is available we use this. Else we have + dnl to fall back to GNU NLS library. + + if test $gt_api_version -ge 3; then + gt_revision_test_code=' +#ifndef __GNU_GETTEXT_SUPPORTED_REVISION +#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) +#endif +changequote(,)dnl +typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; +changequote([,])dnl +' + else + gt_revision_test_code= + fi + if test $gt_api_version -ge 2; then + gt_expression_test_code=' + * ngettext ("", "", 0)' + else + gt_expression_test_code= + fi + + AC_CACHE_CHECK([for GNU gettext in libc], [$gt_func_gnugettext_libc], + [AC_TRY_LINK([#include <libintl.h> +$gt_revision_test_code +extern int _nl_msg_cat_cntr; +extern int *_nl_domain_bindings;], + [bindtextdomain ("", ""); +return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings], + [eval "$gt_func_gnugettext_libc=yes"], + [eval "$gt_func_gnugettext_libc=no"])]) + + if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then + dnl Sometimes libintl requires libiconv, so first search for libiconv. + ifelse(gt_included_intl, yes, , [ + AM_ICONV_LINK + ]) + dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL + dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv]) + dnl because that would add "-liconv" to LIBINTL and LTLIBINTL + dnl even if libiconv doesn't exist. + AC_LIB_LINKFLAGS_BODY([intl]) + AC_CACHE_CHECK([for GNU gettext in libintl], + [$gt_func_gnugettext_libintl], + [gt_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $INCINTL" + gt_save_LIBS="$LIBS" + LIBS="$LIBS $LIBINTL" + dnl Now see whether libintl exists and does not depend on libiconv. + AC_TRY_LINK([#include <libintl.h> +$gt_revision_test_code +extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias (const char *);], + [bindtextdomain ("", ""); +return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")], + [eval "$gt_func_gnugettext_libintl=yes"], + [eval "$gt_func_gnugettext_libintl=no"]) + dnl Now see whether libintl exists and depends on libiconv. + if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then + LIBS="$LIBS $LIBICONV" + AC_TRY_LINK([#include <libintl.h> +$gt_revision_test_code +extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias (const char *);], + [bindtextdomain ("", ""); +return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")], + [LIBINTL="$LIBINTL $LIBICONV" + LTLIBINTL="$LTLIBINTL $LTLIBICONV" + eval "$gt_func_gnugettext_libintl=yes" + ]) + fi + CPPFLAGS="$gt_save_CPPFLAGS" + LIBS="$gt_save_LIBS"]) + fi + + dnl If an already present or preinstalled GNU gettext() is found, + dnl use it. But if this macro is used in GNU gettext, and GNU + dnl gettext is already preinstalled in libintl, we update this + dnl libintl. (Cf. the install rule in intl/Makefile.in.) + if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ + || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ + && test "$PACKAGE" != gettext-runtime \ + && test "$PACKAGE" != gettext-tools; }; then + gt_use_preinstalled_gnugettext=yes + else + dnl Reset the values set by searching for libintl. + LIBINTL= + LTLIBINTL= + INCINTL= + fi + + ifelse(gt_included_intl, yes, [ + if test "$gt_use_preinstalled_gnugettext" != "yes"; then + dnl GNU gettext is not found in the C library. + dnl Fall back on included GNU gettext library. + nls_cv_use_gnu_gettext=yes + fi + fi + + if test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Mark actions used to generate GNU NLS library. + BUILD_INCLUDED_LIBINTL=yes + USE_INCLUDED_LIBINTL=yes + LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV $LIBTHREAD" + LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV $LTLIBTHREAD" + LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` + fi + + CATOBJEXT= + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Mark actions to use GNU gettext tools. + CATOBJEXT=.gmo + fi + ]) + + if test -n "$INTL_MACOSX_LIBS"; then + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Some extra flags are needed during linking. + LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" + LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" + fi + fi + + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + AC_DEFINE([ENABLE_NLS], [1], + [Define to 1 if translation of program messages to the user's native language + is requested.]) + else + USE_NLS=no + fi + fi + + AC_MSG_CHECKING([whether to use NLS]) + AC_MSG_RESULT([$USE_NLS]) + if test "$USE_NLS" = "yes"; then + AC_MSG_CHECKING([where the gettext function comes from]) + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then + gt_source="external libintl" + else + gt_source="libc" + fi + else + gt_source="included intl directory" + fi + AC_MSG_RESULT([$gt_source]) + fi + + if test "$USE_NLS" = "yes"; then + + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then + AC_MSG_CHECKING([how to link with libintl]) + AC_MSG_RESULT([$LIBINTL]) + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL]) + fi + + dnl For backward compatibility. Some packages may be using this. + AC_DEFINE([HAVE_GETTEXT], [1], + [Define if the GNU gettext() function is already present or preinstalled.]) + AC_DEFINE([HAVE_DCGETTEXT], [1], + [Define if the GNU dcgettext() function is already present or preinstalled.]) + fi + + dnl We need to process the po/ directory. + POSUB=po + fi + + ifelse(gt_included_intl, yes, [ + dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL + dnl to 'yes' because some of the testsuite requires it. + if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then + BUILD_INCLUDED_LIBINTL=yes + fi + + dnl Make all variables we use known to autoconf. + AC_SUBST([BUILD_INCLUDED_LIBINTL]) + AC_SUBST([USE_INCLUDED_LIBINTL]) + AC_SUBST([CATOBJEXT]) + + dnl For backward compatibility. Some configure.ins may be using this. + nls_cv_header_intl= + nls_cv_header_libgt= + + dnl For backward compatibility. Some Makefiles may be using this. + DATADIRNAME=share + AC_SUBST([DATADIRNAME]) + + dnl For backward compatibility. Some Makefiles may be using this. + INSTOBJEXT=.mo + AC_SUBST([INSTOBJEXT]) + + dnl For backward compatibility. Some Makefiles may be using this. + GENCAT=gencat + AC_SUBST([GENCAT]) + + dnl For backward compatibility. Some Makefiles may be using this. + INTLOBJS= + if test "$USE_INCLUDED_LIBINTL" = yes; then + INTLOBJS="\$(GETTOBJS)" + fi + AC_SUBST([INTLOBJS]) + + dnl Enable libtool support if the surrounding package wishes it. + INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix + AC_SUBST([INTL_LIBTOOL_SUFFIX_PREFIX]) + ]) + + dnl For backward compatibility. Some Makefiles may be using this. + INTLLIBS="$LIBINTL" + AC_SUBST([INTLLIBS]) + + dnl Make all documented variables known to autoconf. + AC_SUBST([LIBINTL]) + AC_SUBST([LTLIBINTL]) + AC_SUBST([POSUB]) +]) + + +dnl gt_NEEDS_INIT ensures that the gt_needs variable is initialized. +m4_define([gt_NEEDS_INIT], +[ + m4_divert_text([DEFAULTS], [gt_needs=]) + m4_define([gt_NEEDS_INIT], []) +]) + + +dnl Usage: AM_GNU_GETTEXT_NEED([NEEDSYMBOL]) +AC_DEFUN([AM_GNU_GETTEXT_NEED], +[ + m4_divert_text([INIT_PREPARE], [gt_needs="$gt_needs $1"]) +]) + + +dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) +AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) diff --git a/goaccess++/m4/iconv.m4 b/goaccess++/m4/iconv.m4 new file mode 100644 index 0000000..f46ff14 --- /dev/null +++ b/goaccess++/m4/iconv.m4 @@ -0,0 +1,199 @@ +# iconv.m4 serial 9 (gettext-0.18) +dnl Copyright (C) 2000-2002, 2007-2010 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], +[ + dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + + dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV + dnl accordingly. + AC_LIB_LINKFLAGS_BODY([iconv]) +]) + +AC_DEFUN([AM_ICONV_LINK], +[ + dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and + dnl those with the standalone portable GNU libiconv installed). + AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles + + dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV + dnl accordingly. + AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) + + dnl Add $INCICONV to CPPFLAGS before performing the following checks, + dnl because if the user has installed libiconv and not disabled its use + dnl via --without-libiconv-prefix, he wants to use it. The first + dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed. + am_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) + + AC_CACHE_CHECK([for iconv], [am_cv_func_iconv], [ + am_cv_func_iconv="no, consider installing GNU libiconv" + am_cv_lib_iconv=no + AC_TRY_LINK([#include <stdlib.h> +#include <iconv.h>], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + [am_cv_func_iconv=yes]) + if test "$am_cv_func_iconv" != yes; then + am_save_LIBS="$LIBS" + LIBS="$LIBS $LIBICONV" + AC_TRY_LINK([#include <stdlib.h> +#include <iconv.h>], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + [am_cv_lib_iconv=yes] + [am_cv_func_iconv=yes]) + LIBS="$am_save_LIBS" + fi + ]) + if test "$am_cv_func_iconv" = yes; then + AC_CACHE_CHECK([for working iconv], [am_cv_func_iconv_works], [ + dnl This tests against bugs in AIX 5.1, HP-UX 11.11, Solaris 10. + am_save_LIBS="$LIBS" + if test $am_cv_lib_iconv = yes; then + LIBS="$LIBS $LIBICONV" + fi + AC_TRY_RUN([ +#include <iconv.h> +#include <string.h> +int main () +{ + /* Test against AIX 5.1 bug: Failures are not distinguishable from successful + returns. */ + { + iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); + if (cd_utf8_to_88591 != (iconv_t)(-1)) + { + static const char input[] = "\342\202\254"; /* EURO SIGN */ + char buf[10]; + const char *inptr = input; + size_t inbytesleft = strlen (input); + char *outptr = buf; + size_t outbytesleft = sizeof (buf); + size_t res = iconv (cd_utf8_to_88591, + (char **) &inptr, &inbytesleft, + &outptr, &outbytesleft); + if (res == 0) + return 1; + } + } + /* Test against Solaris 10 bug: Failures are not distinguishable from + successful returns. */ + { + iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646"); + if (cd_ascii_to_88591 != (iconv_t)(-1)) + { + static const char input[] = "\263"; + char buf[10]; + const char *inptr = input; + size_t inbytesleft = strlen (input); + char *outptr = buf; + size_t outbytesleft = sizeof (buf); + size_t res = iconv (cd_ascii_to_88591, + (char **) &inptr, &inbytesleft, + &outptr, &outbytesleft); + if (res == 0) + return 1; + } + } +#if 0 /* This bug could be worked around by the caller. */ + /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ + { + iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); + if (cd_88591_to_utf8 != (iconv_t)(-1)) + { + static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; + char buf[50]; + const char *inptr = input; + size_t inbytesleft = strlen (input); + char *outptr = buf; + size_t outbytesleft = sizeof (buf); + size_t res = iconv (cd_88591_to_utf8, + (char **) &inptr, &inbytesleft, + &outptr, &outbytesleft); + if ((int)res > 0) + return 1; + } + } +#endif + /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is + provided. */ + if (/* Try standardized names. */ + iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) + /* Try IRIX, OSF/1 names. */ + && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) + /* Try AIX names. */ + && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) + /* Try HP-UX names. */ + && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) + return 1; + return 0; +}], [am_cv_func_iconv_works=yes], [am_cv_func_iconv_works=no], + [case "$host_os" in + aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; + *) am_cv_func_iconv_works="guessing yes" ;; + esac]) + LIBS="$am_save_LIBS" + ]) + case "$am_cv_func_iconv_works" in + *no) am_func_iconv=no am_cv_lib_iconv=no ;; + *) am_func_iconv=yes ;; + esac + else + am_func_iconv=no am_cv_lib_iconv=no + fi + if test "$am_func_iconv" = yes; then + AC_DEFINE([HAVE_ICONV], [1], + [Define if you have the iconv() function and it works.]) + fi + if test "$am_cv_lib_iconv" = yes; then + AC_MSG_CHECKING([how to link with libiconv]) + AC_MSG_RESULT([$LIBICONV]) + else + dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV + dnl either. + CPPFLAGS="$am_save_CPPFLAGS" + LIBICONV= + LTLIBICONV= + fi + AC_SUBST([LIBICONV]) + AC_SUBST([LTLIBICONV]) +]) + +AC_DEFUN([AM_ICONV], +[ + AM_ICONV_LINK + if test "$am_cv_func_iconv" = yes; then + AC_MSG_CHECKING([for iconv declaration]) + AC_CACHE_VAL([am_cv_proto_iconv], [ + AC_TRY_COMPILE([ +#include <stdlib.h> +#include <iconv.h> +extern +#ifdef __cplusplus +"C" +#endif +#if defined(__STDC__) || defined(__cplusplus) +size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); +#else +size_t iconv(); +#endif +], [], [am_cv_proto_iconv_arg1=""], [am_cv_proto_iconv_arg1="const"]) + am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) + am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` + AC_MSG_RESULT([ + $am_cv_proto_iconv]) + AC_DEFINE_UNQUOTED([ICONV_CONST], [$am_cv_proto_iconv_arg1], + [Define as const if the declaration of iconv() needs const.]) + fi +]) diff --git a/goaccess++/m4/intlmacosx.m4 b/goaccess++/m4/intlmacosx.m4 new file mode 100644 index 0000000..dd91025 --- /dev/null +++ b/goaccess++/m4/intlmacosx.m4 @@ -0,0 +1,51 @@ +# intlmacosx.m4 serial 3 (gettext-0.18) +dnl Copyright (C) 2004-2010 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Checks for special options needed on MacOS X. +dnl Defines INTL_MACOSX_LIBS. +AC_DEFUN([gt_INTL_MACOSX], +[ + dnl Check for API introduced in MacOS X 10.2. + AC_CACHE_CHECK([for CFPreferencesCopyAppValue], + [gt_cv_func_CFPreferencesCopyAppValue], + [gt_save_LIBS="$LIBS" + LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" + AC_TRY_LINK([#include <CoreFoundation/CFPreferences.h>], + [CFPreferencesCopyAppValue(NULL, NULL)], + [gt_cv_func_CFPreferencesCopyAppValue=yes], + [gt_cv_func_CFPreferencesCopyAppValue=no]) + LIBS="$gt_save_LIBS"]) + if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then + AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], [1], + [Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in the CoreFoundation framework.]) + fi + dnl Check for API introduced in MacOS X 10.3. + AC_CACHE_CHECK([for CFLocaleCopyCurrent], [gt_cv_func_CFLocaleCopyCurrent], + [gt_save_LIBS="$LIBS" + LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" + AC_TRY_LINK([#include <CoreFoundation/CFLocale.h>], [CFLocaleCopyCurrent();], + [gt_cv_func_CFLocaleCopyCurrent=yes], + [gt_cv_func_CFLocaleCopyCurrent=no]) + LIBS="$gt_save_LIBS"]) + if test $gt_cv_func_CFLocaleCopyCurrent = yes; then + AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], [1], + [Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the CoreFoundation framework.]) + fi + INTL_MACOSX_LIBS= + if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then + INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" + fi + AC_SUBST([INTL_MACOSX_LIBS]) +]) diff --git a/goaccess++/m4/lib-ld.m4 b/goaccess++/m4/lib-ld.m4 new file mode 100644 index 0000000..ebb3052 --- /dev/null +++ b/goaccess++/m4/lib-ld.m4 @@ -0,0 +1,110 @@ +# lib-ld.m4 serial 4 (gettext-0.18) +dnl Copyright (C) 1996-2003, 2009-2010 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl Subroutines of libtool.m4, +dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision +dnl with libtool.m4. + +dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no. +AC_DEFUN([AC_LIB_PROG_LD_GNU], +[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], [acl_cv_prog_gnu_ld], +[# I'd rather use --version here, but apparently some GNU ld's only accept -v. +case `$LD -v 2>&1 </dev/null` in +*GNU* | *'with BFD'*) + acl_cv_prog_gnu_ld=yes ;; +*) + acl_cv_prog_gnu_ld=no ;; +esac]) +with_gnu_ld=$acl_cv_prog_gnu_ld +]) + +dnl From libtool-1.4. Sets the variable LD. +AC_DEFUN([AC_LIB_PROG_LD], +[AC_ARG_WITH([gnu-ld], +[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]], +test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no) +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by GCC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]* | [A-Za-z]:[\\/]*)] + [re_direlt='/[^/][^/]*/\.\./'] + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL([acl_cv_path_LD], +[if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + acl_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break ;; + *) + test "$with_gnu_ld" != yes && break ;; + esac + fi + done + IFS="$ac_save_ifs" +else + acl_cv_path_LD="$LD" # Let the user override the test with a path. +fi]) +LD="$acl_cv_path_LD" +if test -n "$LD"; then + AC_MSG_RESULT([$LD]) +else + AC_MSG_RESULT([no]) +fi +test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) +AC_LIB_PROG_LD_GNU +]) diff --git a/goaccess++/m4/lib-link.m4 b/goaccess++/m4/lib-link.m4 new file mode 100644 index 0000000..c73bd8e --- /dev/null +++ b/goaccess++/m4/lib-link.m4 @@ -0,0 +1,774 @@ +# lib-link.m4 serial 21 (gettext-0.18) +dnl Copyright (C) 2001-2010 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +AC_PREREQ([2.54]) + +dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and +dnl augments the CPPFLAGS variable. +dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname +dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. +AC_DEFUN([AC_LIB_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + pushdef([Name],[translit([$1],[./-], [___])]) + pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + ac_cv_lib[]Name[]_libs="$LIB[]NAME" + ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" + ac_cv_lib[]Name[]_cppflags="$INC[]NAME" + ac_cv_lib[]Name[]_prefix="$LIB[]NAME[]_PREFIX" + ]) + LIB[]NAME="$ac_cv_lib[]Name[]_libs" + LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" + INC[]NAME="$ac_cv_lib[]Name[]_cppflags" + LIB[]NAME[]_PREFIX="$ac_cv_lib[]Name[]_prefix" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + AC_SUBST([LIB]NAME[_PREFIX]) + dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the + dnl results of this search when this library appears as a dependency. + HAVE_LIB[]NAME=yes + popdef([NAME]) + popdef([Name]) +]) + +dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode, [missing-message]) +dnl searches for libname and the libraries corresponding to explicit and +dnl implicit dependencies, together with the specified include files and +dnl the ability to compile and link the specified testcode. The missing-message +dnl defaults to 'no' and may contain additional hints for the user. +dnl If found, it sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} +dnl and LTLIB${NAME} variables and augments the CPPFLAGS variable, and +dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs +dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. +dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname +dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. +AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + pushdef([Name],[translit([$1],[./-], [___])]) + pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + + dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME + dnl accordingly. + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + + dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, + dnl because if the user has installed lib[]Name and not disabled its use + dnl via --without-lib[]Name-prefix, he wants to use it. + ac_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + + AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ + ac_save_LIBS="$LIBS" + dnl If $LIB[]NAME contains some -l options, add it to the end of LIBS, + dnl because these -l options might require -L options that are present in + dnl LIBS. -l options benefit only from the -L options listed before it. + dnl Otherwise, add it to the front of LIBS, because it may be a static + dnl library that depends on another static library that is present in LIBS. + dnl Static libraries benefit only from the static libraries listed after + dnl it. + case " $LIB[]NAME" in + *" -l"*) LIBS="$LIBS $LIB[]NAME" ;; + *) LIBS="$LIB[]NAME $LIBS" ;; + esac + AC_TRY_LINK([$3], [$4], + [ac_cv_lib[]Name=yes], + [ac_cv_lib[]Name='m4_if([$5], [], [no], [[$5]])']) + LIBS="$ac_save_LIBS" + ]) + if test "$ac_cv_lib[]Name" = yes; then + HAVE_LIB[]NAME=yes + AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the lib][$1 library.]) + AC_MSG_CHECKING([how to link with lib[]$1]) + AC_MSG_RESULT([$LIB[]NAME]) + else + HAVE_LIB[]NAME=no + dnl If $LIB[]NAME didn't lead to a usable library, we don't need + dnl $INC[]NAME either. + CPPFLAGS="$ac_save_CPPFLAGS" + LIB[]NAME= + LTLIB[]NAME= + LIB[]NAME[]_PREFIX= + fi + AC_SUBST([HAVE_LIB]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + AC_SUBST([LIB]NAME[_PREFIX]) + popdef([NAME]) + popdef([Name]) +]) + +dnl Determine the platform dependent parameters needed to use rpath: +dnl acl_libext, +dnl acl_shlibext, +dnl acl_hardcode_libdir_flag_spec, +dnl acl_hardcode_libdir_separator, +dnl acl_hardcode_direct, +dnl acl_hardcode_minus_L. +AC_DEFUN([AC_LIB_RPATH], +[ + dnl Tell automake >= 1.10 to complain if config.rpath is missing. + m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])]) + AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS + AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld + AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host + AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir + AC_CACHE_CHECK([for shared library run path origin], [acl_cv_rpath], [ + CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ + ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh + . ./conftest.sh + rm -f ./conftest.sh + acl_cv_rpath=done + ]) + wl="$acl_cv_wl" + acl_libext="$acl_cv_libext" + acl_shlibext="$acl_cv_shlibext" + acl_libname_spec="$acl_cv_libname_spec" + acl_library_names_spec="$acl_cv_library_names_spec" + acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" + acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" + acl_hardcode_direct="$acl_cv_hardcode_direct" + acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" + dnl Determine whether the user wants rpath handling at all. + AC_ARG_ENABLE([rpath], + [ --disable-rpath do not hardcode runtime library paths], + :, enable_rpath=yes) +]) + +dnl AC_LIB_FROMPACKAGE(name, package) +dnl declares that libname comes from the given package. The configure file +dnl will then not have a --with-libname-prefix option but a +dnl --with-package-prefix option. Several libraries can come from the same +dnl package. This declaration must occur before an AC_LIB_LINKFLAGS or similar +dnl macro call that searches for libname. +AC_DEFUN([AC_LIB_FROMPACKAGE], +[ + pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + define([acl_frompackage_]NAME, [$2]) + popdef([NAME]) + pushdef([PACK],[$2]) + pushdef([PACKUP],[translit(PACK,[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + define([acl_libsinpackage_]PACKUP, + m4_ifdef([acl_libsinpackage_]PACKUP, [acl_libsinpackage_]PACKUP[[, ]],)[lib$1]) + popdef([PACKUP]) + popdef([PACK]) +]) + +dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. +dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found +dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem. +AC_DEFUN([AC_LIB_LINKFLAGS_BODY], +[ + AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) + pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + pushdef([PACK],[m4_ifdef([acl_frompackage_]NAME, [acl_frompackage_]NAME, lib[$1])]) + pushdef([PACKUP],[translit(PACK,[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + pushdef([PACKLIBS],[m4_ifdef([acl_frompackage_]NAME, [acl_libsinpackage_]PACKUP, lib[$1])]) + dnl Autoconf >= 2.61 supports dots in --with options. + pushdef([P_A_C_K],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[translit(PACK,[.],[_])],PACK)]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_ARG_WITH(P_A_C_K[-prefix], +[[ --with-]]P_A_C_K[[-prefix[=DIR] search for ]PACKLIBS[ in DIR/include and DIR/lib + --without-]]P_A_C_K[[-prefix don't search for ]PACKLIBS[ in includedir and libdir]], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/$acl_libdirstem" + if test "$acl_libdirstem2" != "$acl_libdirstem" \ + && ! test -d "$withval/$acl_libdirstem"; then + additional_libdir="$withval/$acl_libdirstem2" + fi + fi + fi +]) + dnl Search the library and its dependencies in $additional_libdir and + dnl $LDFLAGS. Using breadth-first-seach. + LIB[]NAME= + LTLIB[]NAME= + INC[]NAME= + LIB[]NAME[]_PREFIX= + dnl HAVE_LIB${NAME} is an indicator that LIB${NAME}, LTLIB${NAME} have been + dnl computed. So it has to be reset here. + HAVE_LIB[]NAME= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='$1 $2' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + dnl See if it was already located by an earlier AC_LIB_LINKFLAGS + dnl or AC_LIB_HAVE_LINKFLAGS call. + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" + else + dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined + dnl that this library doesn't exist. So just drop it. + : + fi + else + dnl Search the library lib$name in $additional_libdir and $LDFLAGS + dnl and the already constructed $LIBNAME/$LTLIBNAME. + found_dir= + found_la= + found_so= + found_a= + eval libname=\"$acl_libname_spec\" # typically: libname=lib$name + if test -n "$acl_shlibext"; then + shrext=".$acl_shlibext" # typically: shrext=.so + else + shrext= + fi + if test $use_additional = yes; then + dir="$additional_libdir" + dnl The same code as in the loop below: + dnl First look for a shared library. + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + dnl Then look for a static library. + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + dnl First look for a shared library. + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + dnl Then look for a static library. + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + dnl Found the library. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + dnl Linking with a shared library. We attempt to hardcode its + dnl directory into the executable's runpath, unless it's the + dnl standard /usr/lib. + if test "$enable_rpath" = no \ + || test "X$found_dir" = "X/usr/$acl_libdirstem" \ + || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then + dnl No hardcoding is needed. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + dnl The hardcoding into $LIBNAME is system dependent. + if test "$acl_hardcode_direct" = yes; then + dnl Using DIR/libNAME.so during linking hardcodes DIR into the + dnl resulting binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + dnl Rely on "-L$found_dir". + dnl But don't add it if it's already contained in the LDFLAGS + dnl or the already constructed $LIBNAME + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" + fi + if test "$acl_hardcode_minus_L" != no; then + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH + dnl here, because this doesn't fit in flags passed to the + dnl compiler. So give up. No hardcoding. This affects only + dnl very old systems. + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + dnl Linking with a static library. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" + else + dnl We shouldn't come here, but anyway it's good to have a + dnl fallback. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" + fi + fi + dnl Assume the include files are nearby. + additional_includedir= + case "$found_dir" in + */$acl_libdirstem | */$acl_libdirstem/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` + if test "$name" = '$1'; then + LIB[]NAME[]_PREFIX="$basedir" + fi + additional_includedir="$basedir/include" + ;; + */$acl_libdirstem2 | */$acl_libdirstem2/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` + if test "$name" = '$1'; then + LIB[]NAME[]_PREFIX="$basedir" + fi + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + dnl Potentially add $additional_includedir to $INCNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/include, + dnl 2. if it's /usr/local/include and we are using GCC on Linux, + dnl 3. if it's already present in $CPPFLAGS or the already + dnl constructed $INCNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INC[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + dnl Really add $additional_includedir to $INCNAME. + INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + dnl Look for dependencies. + if test -n "$found_la"; then + dnl Read the .la file. It defines the variables + dnl dlname, library_names, old_library, dependency_libs, current, + dnl age, revision, installed, dlopen, dlpreopen, libdir. + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + dnl We use only dependency_libs. + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/lib, + dnl 2. if it's /usr/local/lib and we are using GCC on Linux, + dnl 3. if it's already present in $LDFLAGS or the already + dnl constructed $LIBNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ + && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ + || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LIBNAME. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LTLIBNAME. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + dnl Handle this in the next round. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + dnl Handle this in the next round. Throw away the .la's + dnl directory; it is already contained in a preceding -L + dnl option. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + dnl Most likely an immediate library name. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" + ;; + esac + done + fi + else + dnl Didn't find the library; assume it is in the system directories + dnl known to the linker and runtime loader. (All the system + dnl directories known to the linker should also be known to the + dnl runtime loader, otherwise the system is severely misconfigured.) + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$acl_hardcode_libdir_separator"; then + dnl Weird platform: only the last -rpath option counts, the user must + dnl pass all path elements in one option. We can arrange that for a + dnl single library, but not when more than one $LIBNAMEs are used. + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" + done + dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl. + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + else + dnl The -rpath options are cumulative. + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + dnl When using libtool, the option that works for both libraries and + dnl executables is -R. The -R options are cumulative. + for found_dir in $ltrpathdirs; do + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" + done + fi + popdef([P_A_C_K]) + popdef([PACKLIBS]) + popdef([PACKUP]) + popdef([PACK]) + popdef([NAME]) +]) + +dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, +dnl unless already present in VAR. +dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes +dnl contains two or three consecutive elements that belong together. +AC_DEFUN([AC_LIB_APPENDTOVAR], +[ + for element in [$2]; do + haveit= + for x in $[$1]; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + [$1]="${[$1]}${[$1]:+ }$element" + fi + done +]) + +dnl For those cases where a variable contains several -L and -l options +dnl referring to unknown libraries and directories, this macro determines the +dnl necessary additional linker options for the runtime path. +dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL]) +dnl sets LDADDVAR to linker options needed together with LIBSVALUE. +dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed, +dnl otherwise linking without libtool is assumed. +AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS], +[ + AC_REQUIRE([AC_LIB_RPATH]) + AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) + $1= + if test "$enable_rpath" != no; then + if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then + dnl Use an explicit option to hardcode directories into the resulting + dnl binary. + rpathdirs= + next= + for opt in $2; do + if test -n "$next"; then + dir="$next" + dnl No need to hardcode the standard /usr/lib. + if test "X$dir" != "X/usr/$acl_libdirstem" \ + && test "X$dir" != "X/usr/$acl_libdirstem2"; then + rpathdirs="$rpathdirs $dir" + fi + next= + else + case $opt in + -L) next=yes ;; + -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'` + dnl No need to hardcode the standard /usr/lib. + if test "X$dir" != "X/usr/$acl_libdirstem" \ + && test "X$dir" != "X/usr/$acl_libdirstem2"; then + rpathdirs="$rpathdirs $dir" + fi + next= ;; + *) next= ;; + esac + fi + done + if test "X$rpathdirs" != "X"; then + if test -n ""$3""; then + dnl libtool is used for linking. Use -R options. + for dir in $rpathdirs; do + $1="${$1}${$1:+ }-R$dir" + done + else + dnl The linker is used for linking directly. + if test -n "$acl_hardcode_libdir_separator"; then + dnl Weird platform: only the last -rpath option counts, the user + dnl must pass all path elements in one option. + alldirs= + for dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir" + done + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + $1="$flag" + else + dnl The -rpath options are cumulative. + for dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$dir" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + $1="${$1}${$1:+ }$flag" + done + fi + fi + fi + fi + fi + AC_SUBST([$1]) +]) diff --git a/goaccess++/m4/lib-prefix.m4 b/goaccess++/m4/lib-prefix.m4 new file mode 100644 index 0000000..1601cea --- /dev/null +++ b/goaccess++/m4/lib-prefix.m4 @@ -0,0 +1,224 @@ +# lib-prefix.m4 serial 7 (gettext-0.18) +dnl Copyright (C) 2001-2005, 2008-2010 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and +dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't +dnl require excessive bracketing. +ifdef([AC_HELP_STRING], +[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])], +[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])]) + +dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed +dnl to access previously installed libraries. The basic assumption is that +dnl a user will want packages to use other packages he previously installed +dnl with the same --prefix option. +dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate +dnl libraries, but is otherwise very convenient. +AC_DEFUN([AC_LIB_PREFIX], +[ + AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AC_CANONICAL_HOST]) + AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_LIB_ARG_WITH([lib-prefix], +[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib + --without-lib-prefix don't search for libraries in includedir and libdir], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/$acl_libdirstem" + fi + fi +]) + if test $use_additional = yes; then + dnl Potentially add $additional_includedir to $CPPFLAGS. + dnl But don't add it + dnl 1. if it's the standard /usr/include, + dnl 2. if it's already present in $CPPFLAGS, + dnl 3. if it's /usr/local/include and we are using GCC on Linux, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + for x in $CPPFLAGS; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + dnl Really add $additional_includedir to $CPPFLAGS. + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" + fi + fi + fi + fi + dnl Potentially add $additional_libdir to $LDFLAGS. + dnl But don't add it + dnl 1. if it's the standard /usr/lib, + dnl 2. if it's already present in $LDFLAGS, + dnl 3. if it's /usr/local/lib and we are using GCC on Linux, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then + haveit= + for x in $LDFLAGS; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LDFLAGS. + LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" + fi + fi + fi + fi + fi +]) + +dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, +dnl acl_final_exec_prefix, containing the values to which $prefix and +dnl $exec_prefix will expand at the end of the configure script. +AC_DEFUN([AC_LIB_PREPARE_PREFIX], +[ + dnl Unfortunately, prefix and exec_prefix get only finally determined + dnl at the end of configure. + if test "X$prefix" = "XNONE"; then + acl_final_prefix="$ac_default_prefix" + else + acl_final_prefix="$prefix" + fi + if test "X$exec_prefix" = "XNONE"; then + acl_final_exec_prefix='${prefix}' + else + acl_final_exec_prefix="$exec_prefix" + fi + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" + prefix="$acl_save_prefix" +]) + +dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the +dnl variables prefix and exec_prefix bound to the values they will have +dnl at the end of the configure script. +AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], +[ + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + $1 + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" +]) + +dnl AC_LIB_PREPARE_MULTILIB creates +dnl - a variable acl_libdirstem, containing the basename of the libdir, either +dnl "lib" or "lib64" or "lib/64", +dnl - a variable acl_libdirstem2, as a secondary possible value for +dnl acl_libdirstem, either the same as acl_libdirstem or "lib/sparcv9" or +dnl "lib/amd64". +AC_DEFUN([AC_LIB_PREPARE_MULTILIB], +[ + dnl There is no formal standard regarding lib and lib64. + dnl On glibc systems, the current practice is that on a system supporting + dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under + dnl $prefix/lib64 and 32-bit libraries go under $prefix/lib. We determine + dnl the compiler's default mode by looking at the compiler's library search + dnl path. If at least one of its elements ends in /lib64 or points to a + dnl directory whose absolute pathname ends in /lib64, we assume a 64-bit ABI. + dnl Otherwise we use the default, namely "lib". + dnl On Solaris systems, the current practice is that on a system supporting + dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under + dnl $prefix/lib/64 (which is a symlink to either $prefix/lib/sparcv9 or + dnl $prefix/lib/amd64) and 32-bit libraries go under $prefix/lib. + AC_REQUIRE([AC_CANONICAL_HOST]) + acl_libdirstem=lib + acl_libdirstem2= + case "$host_os" in + solaris*) + dnl See Solaris 10 Software Developer Collection > Solaris 64-bit Developer's Guide > The Development Environment + dnl <http://docs.sun.com/app/docs/doc/816-5138/dev-env?l=en&a=view>. + dnl "Portable Makefiles should refer to any library directories using the 64 symbolic link." + dnl But we want to recognize the sparcv9 or amd64 subdirectory also if the + dnl symlink is missing, so we set acl_libdirstem2 too. + AC_CACHE_CHECK([for 64-bit host], [gl_cv_solaris_64bit], + [AC_EGREP_CPP([sixtyfour bits], [ +#ifdef _LP64 +sixtyfour bits +#endif + ], [gl_cv_solaris_64bit=yes], [gl_cv_solaris_64bit=no]) + ]) + if test $gl_cv_solaris_64bit = yes; then + acl_libdirstem=lib/64 + case "$host_cpu" in + sparc*) acl_libdirstem2=lib/sparcv9 ;; + i*86 | x86_64) acl_libdirstem2=lib/amd64 ;; + esac + fi + ;; + *) + searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` + if test -n "$searchpath"; then + acl_save_IFS="${IFS= }"; IFS=":" + for searchdir in $searchpath; do + if test -d "$searchdir"; then + case "$searchdir" in + */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; + */../ | */.. ) + # Better ignore directories of this form. They are misleading. + ;; + *) searchdir=`cd "$searchdir" && pwd` + case "$searchdir" in + */lib64 ) acl_libdirstem=lib64 ;; + esac ;; + esac + fi + done + IFS="$acl_save_IFS" + fi + ;; + esac + test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem" +]) diff --git a/goaccess++/m4/nls.m4 b/goaccess++/m4/nls.m4 new file mode 100644 index 0000000..003704c --- /dev/null +++ b/goaccess++/m4/nls.m4 @@ -0,0 +1,32 @@ +# nls.m4 serial 5 (gettext-0.18) +dnl Copyright (C) 1995-2003, 2005-2006, 2008-2010 Free Software Foundation, +dnl Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000. +dnl Bruno Haible <haible@clisp.cons.org>, 2000-2003. + +AC_PREREQ([2.50]) + +AC_DEFUN([AM_NLS], +[ + AC_MSG_CHECKING([whether NLS is requested]) + dnl Default is enabled NLS + AC_ARG_ENABLE([nls], + [ --disable-nls do not use Native Language Support], + USE_NLS=$enableval, USE_NLS=yes) + AC_MSG_RESULT([$USE_NLS]) + AC_SUBST([USE_NLS]) +]) diff --git a/goaccess++/m4/po.m4 b/goaccess++/m4/po.m4 new file mode 100644 index 0000000..47f36a4 --- /dev/null +++ b/goaccess++/m4/po.m4 @@ -0,0 +1,449 @@ +# po.m4 serial 17 (gettext-0.18) +dnl Copyright (C) 1995-2010 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000. +dnl Bruno Haible <haible@clisp.cons.org>, 2000-2003. + +AC_PREREQ([2.50]) + +dnl Checks for all prerequisites of the po subdirectory. +AC_DEFUN([AM_PO_SUBDIRS], +[ + AC_REQUIRE([AC_PROG_MAKE_SET])dnl + AC_REQUIRE([AC_PROG_INSTALL])dnl + AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake + AC_REQUIRE([AM_NLS])dnl + + dnl Release version of the gettext macros. This is used to ensure that + dnl the gettext macros and po/Makefile.in.in are in sync. + AC_SUBST([GETTEXT_MACRO_VERSION], [0.18]) + + dnl Perform the following tests also if --disable-nls has been given, + dnl because they are needed for "make dist" to work. + + dnl Search for GNU msgfmt in the PATH. + dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. + dnl The second test excludes FreeBSD msgfmt. + AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, + [$ac_dir/$ac_word --statistics /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && + (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], + :) + AC_PATH_PROG([GMSGFMT], [gmsgfmt], [$MSGFMT]) + + dnl Test whether it is GNU msgfmt >= 0.15. +changequote(,)dnl + case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; + *) MSGFMT_015=$MSGFMT ;; + esac +changequote([,])dnl + AC_SUBST([MSGFMT_015]) +changequote(,)dnl + case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; + *) GMSGFMT_015=$GMSGFMT ;; + esac +changequote([,])dnl + AC_SUBST([GMSGFMT_015]) + + dnl Search for GNU xgettext 0.12 or newer in the PATH. + dnl The first test excludes Solaris xgettext and early GNU xgettext versions. + dnl The second test excludes FreeBSD xgettext. + AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, + [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && + (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], + :) + dnl Remove leftover from FreeBSD xgettext call. + rm -f messages.po + + dnl Test whether it is GNU xgettext >= 0.15. +changequote(,)dnl + case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; + *) XGETTEXT_015=$XGETTEXT ;; + esac +changequote([,])dnl + AC_SUBST([XGETTEXT_015]) + + dnl Search for GNU msgmerge 0.11 or newer in the PATH. + AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge, + [$ac_dir/$ac_word --update -q /dev/null /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1], :) + + dnl Installation directories. + dnl Autoconf >= 2.60 defines localedir. For older versions of autoconf, we + dnl have to define it here, so that it can be used in po/Makefile. + test -n "$localedir" || localedir='${datadir}/locale' + AC_SUBST([localedir]) + + dnl Support for AM_XGETTEXT_OPTION. + test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= + AC_SUBST([XGETTEXT_EXTRA_OPTIONS]) + + AC_CONFIG_COMMANDS([po-directories], [[ + for ac_file in $CONFIG_FILES; do + # Support "outfile[:infile[:infile...]]" + case "$ac_file" in + *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + esac + # PO directories have a Makefile.in generated from Makefile.in.in. + case "$ac_file" in */Makefile.in) + # Adjust a relative srcdir. + ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` + ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" + ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` + # In autoconf-2.13 it is called $ac_given_srcdir. + # In autoconf-2.50 it is called $srcdir. + test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" + case "$ac_given_srcdir" in + .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; + /*) top_srcdir="$ac_given_srcdir" ;; + *) top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + # Treat a directory as a PO directory if and only if it has a + # POTFILES.in file. This allows packages to have multiple PO + # directories under different names or in different locations. + if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then + rm -f "$ac_dir/POTFILES" + test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" + cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" + POMAKEFILEDEPS="POTFILES.in" + # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend + # on $ac_dir but don't depend on user-specified configuration + # parameters. + if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then + # The LINGUAS file contains the set of available languages. + if test -n "$OBSOLETE_ALL_LINGUAS"; then + test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" + fi + ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` + # Hide the ALL_LINGUAS assigment from automake < 1.5. + eval 'ALL_LINGUAS''=$ALL_LINGUAS_' + POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" + else + # The set of available languages was given in configure.in. + # Hide the ALL_LINGUAS assigment from automake < 1.5. + eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' + fi + # Compute POFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) + # Compute UPDATEPOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) + # Compute DUMMYPOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) + # Compute GMOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) + case "$ac_given_srcdir" in + .) srcdirpre= ;; + *) srcdirpre='$(srcdir)/' ;; + esac + POFILES= + UPDATEPOFILES= + DUMMYPOFILES= + GMOFILES= + for lang in $ALL_LINGUAS; do + POFILES="$POFILES $srcdirpre$lang.po" + UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" + DUMMYPOFILES="$DUMMYPOFILES $lang.nop" + GMOFILES="$GMOFILES $srcdirpre$lang.gmo" + done + # CATALOGS depends on both $ac_dir and the user's LINGUAS + # environment variable. + INST_LINGUAS= + if test -n "$ALL_LINGUAS"; then + for presentlang in $ALL_LINGUAS; do + useit=no + if test "%UNSET%" != "$LINGUAS"; then + desiredlanguages="$LINGUAS" + else + desiredlanguages="$ALL_LINGUAS" + fi + for desiredlang in $desiredlanguages; do + # Use the presentlang catalog if desiredlang is + # a. equal to presentlang, or + # b. a variant of presentlang (because in this case, + # presentlang can be used as a fallback for messages + # which are not translated in the desiredlang catalog). + case "$desiredlang" in + "$presentlang"*) useit=yes;; + esac + done + if test $useit = yes; then + INST_LINGUAS="$INST_LINGUAS $presentlang" + fi + done + fi + CATALOGS= + if test -n "$INST_LINGUAS"; then + for lang in $INST_LINGUAS; do + CATALOGS="$CATALOGS $lang.gmo" + done + fi + test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" + sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" + for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do + if test -f "$f"; then + case "$f" in + *.orig | *.bak | *~) ;; + *) cat "$f" >> "$ac_dir/Makefile" ;; + esac + fi + done + fi + ;; + esac + done]], + [# Capture the value of obsolete ALL_LINGUAS because we need it to compute + # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it + # from automake < 1.5. + eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' + # Capture the value of LINGUAS because we need it to compute CATALOGS. + LINGUAS="${LINGUAS-%UNSET%}" + ]) +]) + +dnl Postprocesses a Makefile in a directory containing PO files. +AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE], +[ + # When this code is run, in config.status, two variables have already been + # set: + # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in, + # - LINGUAS is the value of the environment variable LINGUAS at configure + # time. + +changequote(,)dnl + # Adjust a relative srcdir. + ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` + ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" + ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` + # In autoconf-2.13 it is called $ac_given_srcdir. + # In autoconf-2.50 it is called $srcdir. + test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" + case "$ac_given_srcdir" in + .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; + /*) top_srcdir="$ac_given_srcdir" ;; + *) top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + + # Find a way to echo strings without interpreting backslash. + if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then + gt_echo='echo' + else + if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then + gt_echo='printf %s\n' + else + echo_func () { + cat <<EOT +$* +EOT + } + gt_echo='echo_func' + fi + fi + + # A sed script that extracts the value of VARIABLE from a Makefile. + sed_x_variable=' +# Test if the hold space is empty. +x +s/P/P/ +x +ta +# Yes it was empty. Look if we have the expected variable definition. +/^[ ]*VARIABLE[ ]*=/{ + # Seen the first line of the variable definition. + s/^[ ]*VARIABLE[ ]*=// + ba +} +bd +:a +# Here we are processing a line from the variable definition. +# Remove comment, more precisely replace it with a space. +s/#.*$/ / +# See if the line ends in a backslash. +tb +:b +s/\\$// +# Print the line, without the trailing backslash. +p +tc +# There was no trailing backslash. The end of the variable definition is +# reached. Clear the hold space. +s/^.*$// +x +bd +:c +# A trailing backslash means that the variable definition continues in the +# next line. Put a nonempty string into the hold space to indicate this. +s/^.*$/P/ +x +:d +' +changequote([,])dnl + + # Set POTFILES to the value of the Makefile variable POTFILES. + sed_x_POTFILES=`$gt_echo "$sed_x_variable" | sed -e '/^ *#/d' -e 's/VARIABLE/POTFILES/g'` + POTFILES=`sed -n -e "$sed_x_POTFILES" < "$ac_file"` + # Compute POTFILES_DEPS as + # $(foreach file, $(POTFILES), $(top_srcdir)/$(file)) + POTFILES_DEPS= + for file in $POTFILES; do + POTFILES_DEPS="$POTFILES_DEPS "'$(top_srcdir)/'"$file" + done + POMAKEFILEDEPS="" + + if test -n "$OBSOLETE_ALL_LINGUAS"; then + test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" + fi + if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then + # The LINGUAS file contains the set of available languages. + ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` + POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" + else + # Set ALL_LINGUAS to the value of the Makefile variable LINGUAS. + sed_x_LINGUAS=`$gt_echo "$sed_x_variable" | sed -e '/^ *#/d' -e 's/VARIABLE/LINGUAS/g'` + ALL_LINGUAS_=`sed -n -e "$sed_x_LINGUAS" < "$ac_file"` + fi + # Hide the ALL_LINGUAS assigment from automake < 1.5. + eval 'ALL_LINGUAS''=$ALL_LINGUAS_' + # Compute POFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) + # Compute UPDATEPOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) + # Compute DUMMYPOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) + # Compute GMOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) + # Compute PROPERTIESFILES + # as $(foreach lang, $(ALL_LINGUAS), $(top_srcdir)/$(DOMAIN)_$(lang).properties) + # Compute CLASSFILES + # as $(foreach lang, $(ALL_LINGUAS), $(top_srcdir)/$(DOMAIN)_$(lang).class) + # Compute QMFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).qm) + # Compute MSGFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(frob $(lang)).msg) + # Compute RESOURCESDLLFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(frob $(lang))/$(DOMAIN).resources.dll) + case "$ac_given_srcdir" in + .) srcdirpre= ;; + *) srcdirpre='$(srcdir)/' ;; + esac + POFILES= + UPDATEPOFILES= + DUMMYPOFILES= + GMOFILES= + PROPERTIESFILES= + CLASSFILES= + QMFILES= + MSGFILES= + RESOURCESDLLFILES= + for lang in $ALL_LINGUAS; do + POFILES="$POFILES $srcdirpre$lang.po" + UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" + DUMMYPOFILES="$DUMMYPOFILES $lang.nop" + GMOFILES="$GMOFILES $srcdirpre$lang.gmo" + PROPERTIESFILES="$PROPERTIESFILES \$(top_srcdir)/\$(DOMAIN)_$lang.properties" + CLASSFILES="$CLASSFILES \$(top_srcdir)/\$(DOMAIN)_$lang.class" + QMFILES="$QMFILES $srcdirpre$lang.qm" + frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'` + MSGFILES="$MSGFILES $srcdirpre$frobbedlang.msg" + frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'` + RESOURCESDLLFILES="$RESOURCESDLLFILES $srcdirpre$frobbedlang/\$(DOMAIN).resources.dll" + done + # CATALOGS depends on both $ac_dir and the user's LINGUAS + # environment variable. + INST_LINGUAS= + if test -n "$ALL_LINGUAS"; then + for presentlang in $ALL_LINGUAS; do + useit=no + if test "%UNSET%" != "$LINGUAS"; then + desiredlanguages="$LINGUAS" + else + desiredlanguages="$ALL_LINGUAS" + fi + for desiredlang in $desiredlanguages; do + # Use the presentlang catalog if desiredlang is + # a. equal to presentlang, or + # b. a variant of presentlang (because in this case, + # presentlang can be used as a fallback for messages + # which are not translated in the desiredlang catalog). + case "$desiredlang" in + "$presentlang"*) useit=yes;; + esac + done + if test $useit = yes; then + INST_LINGUAS="$INST_LINGUAS $presentlang" + fi + done + fi + CATALOGS= + JAVACATALOGS= + QTCATALOGS= + TCLCATALOGS= + CSHARPCATALOGS= + if test -n "$INST_LINGUAS"; then + for lang in $INST_LINGUAS; do + CATALOGS="$CATALOGS $lang.gmo" + JAVACATALOGS="$JAVACATALOGS \$(DOMAIN)_$lang.properties" + QTCATALOGS="$QTCATALOGS $lang.qm" + frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'` + TCLCATALOGS="$TCLCATALOGS $frobbedlang.msg" + frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'` + CSHARPCATALOGS="$CSHARPCATALOGS $frobbedlang/\$(DOMAIN).resources.dll" + done + fi + + sed -e "s|@POTFILES_DEPS@|$POTFILES_DEPS|g" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@PROPERTIESFILES@|$PROPERTIESFILES|g" -e "s|@CLASSFILES@|$CLASSFILES|g" -e "s|@QMFILES@|$QMFILES|g" -e "s|@MSGFILES@|$MSGFILES|g" -e "s|@RESOURCESDLLFILES@|$RESOURCESDLLFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@JAVACATALOGS@|$JAVACATALOGS|g" -e "s|@QTCATALOGS@|$QTCATALOGS|g" -e "s|@TCLCATALOGS@|$TCLCATALOGS|g" -e "s|@CSHARPCATALOGS@|$CSHARPCATALOGS|g" -e 's,^#distdir:,distdir:,' < "$ac_file" > "$ac_file.tmp" + if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then + # Add dependencies that cannot be formulated as a simple suffix rule. + for lang in $ALL_LINGUAS; do + frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'` + cat >> "$ac_file.tmp" <<EOF +$frobbedlang.msg: $lang.po + @echo "\$(MSGFMT) -c --tcl -d \$(srcdir) -l $lang $srcdirpre$lang.po"; \ + \$(MSGFMT) -c --tcl -d "\$(srcdir)" -l $lang $srcdirpre$lang.po || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; } +EOF + done + fi + if grep -l '@CSHARPCATALOGS@' "$ac_file" > /dev/null; then + # Add dependencies that cannot be formulated as a simple suffix rule. + for lang in $ALL_LINGUAS; do + frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'` + cat >> "$ac_file.tmp" <<EOF +$frobbedlang/\$(DOMAIN).resources.dll: $lang.po + @echo "\$(MSGFMT) -c --csharp -d \$(srcdir) -l $lang $srcdirpre$lang.po -r \$(DOMAIN)"; \ + \$(MSGFMT) -c --csharp -d "\$(srcdir)" -l $lang $srcdirpre$lang.po -r "\$(DOMAIN)" || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; } +EOF + done + fi + if test -n "$POMAKEFILEDEPS"; then + cat >> "$ac_file.tmp" <<EOF +Makefile: $POMAKEFILEDEPS +EOF + fi + mv "$ac_file.tmp" "$ac_file" +]) + +dnl Initializes the accumulator used by AM_XGETTEXT_OPTION. +AC_DEFUN([AM_XGETTEXT_OPTION_INIT], +[ + XGETTEXT_EXTRA_OPTIONS= +]) + +dnl Registers an option to be passed to xgettext in the po subdirectory. +AC_DEFUN([AM_XGETTEXT_OPTION], +[ + AC_REQUIRE([AM_XGETTEXT_OPTION_INIT]) + XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS $1" +]) diff --git a/goaccess++/m4/progtest.m4 b/goaccess++/m4/progtest.m4 new file mode 100644 index 0000000..2d804ac --- /dev/null +++ b/goaccess++/m4/progtest.m4 @@ -0,0 +1,92 @@ +# progtest.m4 serial 6 (gettext-0.18) +dnl Copyright (C) 1996-2003, 2005, 2008-2010 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper <drepper@cygnus.com>, 1996. + +AC_PREREQ([2.50]) + +# Search path for a program which passes the given test. + +dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, +dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) +AC_DEFUN([AM_PATH_PROG_WITH_TEST], +[ +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Find out how to test for executable files. Don't use a zero-byte file, +# as systems may use methods other than mode bits to determine executability. +cat >conf$$.file <<_ASEOF +#! /bin/sh +exit 0 +_ASEOF +chmod +x conf$$.file +if test -x conf$$.file >/dev/null 2>&1; then + ac_executable_p="test -x" +else + ac_executable_p="test -f" +fi +rm -f conf$$.file + +# Extract the first word of "$2", so it can be a program name with args. +set dummy $2; ac_word=[$]2 +AC_MSG_CHECKING([for $ac_word]) +AC_CACHE_VAL([ac_cv_path_$1], +[case "[$]$1" in + [[\\/]]* | ?:[[\\/]]*) + ac_cv_path_$1="[$]$1" # Let the user override the test with a path. + ;; + *) + ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in ifelse([$5], , $PATH, [$5]); do + IFS="$ac_save_IFS" + test -z "$ac_dir" && ac_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then + echo "$as_me: trying $ac_dir/$ac_word..." >&AS_MESSAGE_LOG_FD + if [$3]; then + ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext" + break 2 + fi + fi + done + done + IFS="$ac_save_IFS" +dnl If no 4th arg is given, leave the cache variable unset, +dnl so AC_PATH_PROGS will keep looking. +ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" +])dnl + ;; +esac])dnl +$1="$ac_cv_path_$1" +if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then + AC_MSG_RESULT([$][$1]) +else + AC_MSG_RESULT([no]) +fi +AC_SUBST([$1])dnl +]) diff --git a/goaccess++/missing b/goaccess++/missing new file mode 100644 index 0000000..86a8fc3 --- /dev/null +++ b/goaccess++/missing @@ -0,0 +1,331 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. + +scriptversion=2012-01-06.13; # UTC + +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, +# 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. +# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 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 <http://www.gnu.org/licenses/>. + +# 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 + +run=: +sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' +sed_minuso='s/.* -o \([^ ]*\).*/\1/p' + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.ac; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +msg="missing on your system" + +case $1 in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + # Exit code 63 means version mismatch. This often happens + # when the user try to use an ancient version of a tool on + # a file that requires a minimum version. In this case we + # we should proceed has if the program had been absent, or + # if --run hadn't been passed. + if test $? = 63; then + run=: + msg="probably too old" + fi + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + --run try to run the given command, and emulate it if it fails + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + autom4te touch the output file, or create a stub one + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + help2man touch the output file + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + yacc create \`y.tab.[ch]', if possible, from existing .[ch] + +Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and +\`g' are ignored when checking the name. + +Send bug reports to <bug-automake@gnu.org>." + 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 + +# normalize program name to check for. +program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + +# Now exit if we have it, but it failed. Also exit now if we +# don't have it and --version was passed (most likely to detect +# the program). This is about non-GNU programs, so use $1 not +# $program. +case $1 in + lex*|yacc*) + # Not GNU programs, they don't have --version. + ;; + + *) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + # Could not run --version or --help. This is probably someone + # running `$TOOL --version' or `$TOOL --help' to check whether + # $TOOL exists and not knowing $TOOL uses missing. + exit 1 + fi + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case $program in + aclocal*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acinclude.m4' or \`${configure_ac}'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`${configure_ac}'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acconfig.h' or \`${configure_ac}'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case $f in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + autom4te*) + echo 1>&2 "\ +WARNING: \`$1' is needed, but is $msg. + You might have modified some files without having the + proper tools for further handling them. + You can get \`$1' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison*|yacc*) + echo 1>&2 "\ +WARNING: \`$1' $msg. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if test $# -ne 1; then + eval LASTARG=\${$#} + case $LASTARG in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if test ! -f y.tab.h; then + echo >y.tab.h + fi + if test ! -f y.tab.c; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex*|flex*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if test $# -ne 1; then + eval LASTARG=\${$#} + case $LASTARG in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if test ! -f lex.yy.c; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit $? + fi + ;; + + makeinfo*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + # The file to touch is that specified with -o ... + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -z "$file"; then + # ... or it is the one specified with @setfilename ... + infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n ' + /^@setfilename/{ + s/.* \([^ ]*\) *$/\1/ + p + q + }' $infile` + # ... or it is derived from the source name (dir/f.texi becomes f.info) + test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info + fi + # If the file does not exist, the user really needs makeinfo; + # let's fail without touching anything. + test -f $file || exit 1 + touch $file + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and is $msg. + You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequisites for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 + +# 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/goaccess++/po/LINGUAS b/goaccess++/po/LINGUAS new file mode 100644 index 0000000..9595d03 --- /dev/null +++ b/goaccess++/po/LINGUAS @@ -0,0 +1,4 @@ +fr +es +zh_CN +ja diff --git a/goaccess++/po/Makefile b/goaccess++/po/Makefile new file mode 100644 index 0000000..c310cb8 --- /dev/null +++ b/goaccess++/po/Makefile @@ -0,0 +1,571 @@ +# Makefile for PO directory in any package using GNU gettext. +# Copyright (C) 1995-1997, 2000-2007, 2009-2010 by Ulrich Drepper <drepper@gnu.ai.mit.edu> +# +# This file can be copied and used freely without restrictions. It can +# be used in projects which are not available under the GNU General Public +# License but which still want to provide support for the GNU gettext +# functionality. +# Please note that the actual code of GNU gettext is covered by the GNU +# General Public License and is *not* in the public domain. +# +# Origin: gettext-0.18 +GETTEXT_MACRO_VERSION = 0.18 + +PACKAGE = goaccess +VERSION = 1.3 +PACKAGE_BUGREPORT = goaccess@prosoftcorp.com + +SHELL = /bin/sh + + +srcdir = . +top_srcdir = .. + + +prefix = /usr/local +exec_prefix = ${prefix} +datarootdir = ${prefix}/share +datadir = ${datarootdir} +localedir = ${datarootdir}/locale +gettextsrcdir = $(datadir)/gettext/po + +INSTALL = /usr/bin/install -c +INSTALL_DATA = ${INSTALL} -m 644 + +# We use $(mkdir_p). +# In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as +# "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions, +# ${SHELL} /home/djq/goaccess-1.3/install-sh does not start with $(SHELL), so we add it. +# In automake >= 1.10, /usr/bin/mkdir -p is derived from ${MKDIR_P}, which is defined +# either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake +# versions, $(mkinstalldirs) and $(install_sh) are unused. +mkinstalldirs = $(SHELL) ${SHELL} /home/djq/goaccess-1.3/install-sh -d +install_sh = $(SHELL) ${SHELL} /home/djq/goaccess-1.3/install-sh +MKDIR_P = /usr/bin/mkdir -p +mkdir_p = /usr/bin/mkdir -p + +GMSGFMT_ = : +GMSGFMT_no = : +GMSGFMT_yes = : +GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT)) +MSGFMT_ = : +MSGFMT_no = : +MSGFMT_yes = : +MSGFMT = $(MSGFMT_$(USE_MSGCTXT)) +XGETTEXT_ = : +XGETTEXT_no = : +XGETTEXT_yes = : +XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT)) +MSGMERGE = msgmerge +MSGMERGE_UPDATE = : --update +MSGINIT = msginit +MSGCONV = msgconv +MSGFILTER = msgfilter + +POFILES = fr.po es.po zh_CN.po ja.po +GMOFILES = fr.gmo es.gmo zh_CN.gmo ja.gmo +UPDATEPOFILES = fr.po-update es.po-update zh_CN.po-update ja.po-update +DUMMYPOFILES = fr.nop es.nop zh_CN.nop ja.nop +DISTFILES.common = Makefile.in.in remove-potcdate.sin \ +$(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) +DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \ +$(POFILES) $(GMOFILES) \ +$(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) + +POTFILES = \ + ../src/labels.h + +CATALOGS = fr.gmo es.gmo zh_CN.gmo ja.gmo + +# Makevars gets inserted here. (Don't remove this line!) +# Makefile variables for PO directory in any package using GNU gettext. + +# Usually the message domain is the same as the package name. +DOMAIN = $(PACKAGE) + +# These two variables depend on the location of this directory. +subdir = po +top_builddir = .. +AM_CPPFLAGS = -I. -I$(srcdir) + +# These options get passed to xgettext. +XGETTEXT_OPTIONS = --from-code=UTF-8 --keyword=_ --keyword=N_ + +# This is the copyright holder that gets inserted into the header of the +# $(DOMAIN).pot file. Set this to the copyright holder of the surrounding +# package. (Note that the msgstr strings, extracted from the package's +# sources, belong to the copyright holder of the package.) Translators are +# expected to transfer the copyright for their translations to this person +# or entity, or to disclaim their copyright. The empty string stands for +# the public domain; in this case the translators are expected to disclaim +# their copyright. +COPYRIGHT_HOLDER = Free Software Foundation, Inc. + +# This tells whether or not to prepend "GNU " prefix to the package +# name that gets inserted into the header of the $(DOMAIN).pot file. +# Possible values are "yes", "no", or empty. If it is empty, try to +# detect it automatically by scanning the files in $(top_srcdir) for +# "GNU packagename" string. +PACKAGE_GNU = + +# This is the email address or URL to which the translators shall report +# bugs in the untranslated strings: +# - Strings which are not entire sentences, see the maintainer guidelines +# in the GNU gettext documentation, section 'Preparing Strings'. +# - Strings which use unclear terms or require additional context to be +# understood. +# - Strings which make invalid assumptions about notation of date, time or +# money. +# - Pluralisation problems. +# - Incorrect English spelling. +# - Incorrect formatting. +# It can be your email address, or a mailing list address where translators +# can write to without being subscribed, or the URL of a web page through +# which the translators can contact you. +MSGID_BUGS_ADDRESS = hello@goaccess.io + +# This is the list of locale categories, beyond LC_MESSAGES, for which the +# message catalogs shall be used. It is usually empty. +EXTRA_LOCALE_CATEGORIES = + +# This tells whether the $(DOMAIN).pot file contains messages with an 'msgctxt' +# context. Possible values are "yes" and "no". Set this to yes if the +# package uses functions taking also a message context, like pgettext(), or +# if in $(XGETTEXT_OPTIONS) you define keywords with a context argument. +USE_MSGCTXT = no + +# These options get passed to msgmerge. +# Useful options are in particular: +# --previous to keep previous msgids of translated messages, +# --quiet to reduce the verbosity. +MSGMERGE_OPTIONS = + +# These options get passed to msginit. +# If you want to disable line wrapping when writing PO files, add +# --no-wrap to MSGMERGE_OPTIONS, XGETTEXT_OPTIONS, and +# MSGINIT_OPTIONS. +MSGINIT_OPTIONS = + +# This tells whether or not to regenerate a PO file when $(DOMAIN).pot +# has changed. Possible values are "yes" and "no". Set this to no if +# the POT file is checked in the repository and the version control +# program ignores timestamps. +PO_DEPENDS_ON_POT = yes + +# This tells whether or not to forcibly update $(DOMAIN).pot and +# regenerate PO files on "make dist". Possible values are "yes" and +# "no". Set this to no if the POT file and PO files are maintained +# externally. +DIST_DEPENDS_ON_UPDATE_PO = yes + +.SUFFIXES: +.SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update + +.po.mo: + @echo "$(MSGFMT) -c -o $@ $<"; \ + $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ + +.po.gmo: + @lang=`echo $* | sed -e 's,.*/,,'`; \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o $${lang}.gmo $${lang}.po"; \ + cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo + +.sin.sed: + sed -e '/^#/d' $< > t-$@ + mv t-$@ $@ + + +all: check-macro-version all-yes + +all-yes: stamp-po +all-no: + +# Ensure that the gettext macros and this Makefile.in.in are in sync. +check-macro-version: + @test "$(GETTEXT_MACRO_VERSION)" = "0.18" \ + || { echo "*** error: gettext infrastructure mismatch: using a Makefile.in.in from gettext version $(GETTEXT_MACRO_VERSION) but the autoconf macros are from gettext version 0.18" 1>&2; \ + exit 1; \ + } + +# $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no +# internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because +# we don't want to bother translators with empty POT files). We assume that +# LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty. +# In this case, stamp-po is a nop (i.e. a phony target). + +# stamp-po is a timestamp denoting the last time at which the CATALOGS have +# been loosely updated. Its purpose is that when a developer or translator +# checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS, +# "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent +# invocations of "make" will do nothing. This timestamp would not be necessary +# if updating the $(CATALOGS) would always touch them; however, the rule for +# $(POFILES) has been designed to not touch files that don't need to be +# changed. +stamp-po: $(srcdir)/$(DOMAIN).pot + test ! -f $(srcdir)/$(DOMAIN).pot || \ + test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES) + @test ! -f $(srcdir)/$(DOMAIN).pot || { \ + echo "touch stamp-po" && \ + echo timestamp > stamp-poT && \ + mv stamp-poT stamp-po; \ + } + +# Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', +# otherwise packages like GCC can not be built if only parts of the source +# have been downloaded. + +# This target rebuilds $(DOMAIN).pot; it is an expensive operation. +# Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. +$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed + if LC_ALL=C grep 'GNU goaccess' $(top_srcdir)/* 2>/dev/null | grep -v 'libtool:' >/dev/null; then \ + package_gnu='GNU '; \ + else \ + package_gnu=''; \ + fi; \ + if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \ + msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \ + else \ + msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \ + fi; \ + case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \ + $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ + --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \ + --files-from=$(srcdir)/POTFILES.in \ + --copyright-holder='$(COPYRIGHT_HOLDER)' \ + --msgid-bugs-address="$$msgid_bugs_address" \ + ;; \ + *) \ + $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ + --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \ + --files-from=$(srcdir)/POTFILES.in \ + --copyright-holder='$(COPYRIGHT_HOLDER)' \ + --package-name="$${package_gnu}goaccess" \ + --package-version='1.3' \ + --msgid-bugs-address="$$msgid_bugs_address" \ + ;; \ + esac + test ! -f $(DOMAIN).po || { \ + if test -f $(srcdir)/$(DOMAIN).pot; then \ + sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ + sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ + if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ + rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ + else \ + rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ + mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ + fi; \ + else \ + mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ + fi; \ + } + +# This rule has no dependencies: we don't need to update $(DOMAIN).pot at +# every "make" invocation, only create it when it is missing. +# Only "make $(DOMAIN).pot-update" or "make dist" will force an update. +$(srcdir)/$(DOMAIN).pot: + $(MAKE) $(DOMAIN).pot-update + +# This target rebuilds a PO file if $(DOMAIN).pot has changed. +# Note that a PO file is not touched if it doesn't need to be changed. +$(POFILES): $(srcdir)/$(DOMAIN).pot + @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ + if test -f "$(srcdir)/$${lang}.po"; then \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot"; \ + cd $(srcdir) \ + && { case `$(MSGMERGE_UPDATE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \ + $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) $${lang}.po $(DOMAIN).pot;; \ + *) \ + $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot;; \ + esac; \ + }; \ + else \ + $(MAKE) $${lang}.po-create; \ + fi + + +install: install-exec install-data +install-exec: +install-data: install-data-yes + if test "$(PACKAGE)" = "gettext-tools"; then \ + $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ + for file in $(DISTFILES.common) Makevars.template; do \ + $(INSTALL_DATA) $(srcdir)/$$file \ + $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + for file in Makevars; do \ + rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + else \ + : ; \ + fi +install-data-no: all +install-data-yes: all + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + dir=$(localedir)/$$lang/LC_MESSAGES; \ + $(mkdir_p) $(DESTDIR)$$dir; \ + if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ + $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ + echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ + for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ + if test -n "$$lc"; then \ + if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ + link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ + mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ + for file in *; do \ + if test -f $$file; then \ + ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ + fi; \ + done); \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + else \ + if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ + :; \ + else \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + fi; \ + fi; \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ + ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ + cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ + fi; \ + done; \ + done + +install-strip: install + +installdirs: installdirs-exec installdirs-data +installdirs-exec: +installdirs-data: installdirs-data-yes + if test "$(PACKAGE)" = "gettext-tools"; then \ + $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ + else \ + : ; \ + fi +installdirs-data-no: +installdirs-data-yes: + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + dir=$(localedir)/$$lang/LC_MESSAGES; \ + $(mkdir_p) $(DESTDIR)$$dir; \ + for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ + if test -n "$$lc"; then \ + if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ + link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ + mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ + for file in *; do \ + if test -f $$file; then \ + ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ + fi; \ + done); \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + else \ + if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ + :; \ + else \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + fi; \ + fi; \ + fi; \ + done; \ + done + +# Define this as empty until I found a useful application. +installcheck: + +uninstall: uninstall-exec uninstall-data +uninstall-exec: +uninstall-data: uninstall-data-yes + if test "$(PACKAGE)" = "gettext-tools"; then \ + for file in $(DISTFILES.common) Makevars.template; do \ + rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + else \ + : ; \ + fi +uninstall-data-no: +uninstall-data-yes: + catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + done; \ + done + +check: all + +info dvi ps pdf html tags TAGS ctags CTAGS ID: + +mostlyclean: + rm -f remove-potcdate.sed + rm -f stamp-poT + rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po + rm -fr *.o + +clean: mostlyclean + +distclean: clean + rm -f Makefile Makefile.in POTFILES *.mo + +maintainer-clean: distclean + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + rm -f stamp-po $(GMOFILES) + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) +dist distdir: + $(MAKE) update-po + @$(MAKE) dist2 +# This is a separate target because 'update-po' must be executed before. +dist2: stamp-po $(DISTFILES) + dists="$(DISTFILES)"; \ + if test "$(PACKAGE)" = "gettext-tools"; then \ + dists="$$dists Makevars.template"; \ + fi; \ + if test -f $(srcdir)/$(DOMAIN).pot; then \ + dists="$$dists $(DOMAIN).pot stamp-po"; \ + fi; \ + if test -f $(srcdir)/ChangeLog; then \ + dists="$$dists ChangeLog"; \ + fi; \ + for i in 0 1 2 3 4 5 6 7 8 9; do \ + if test -f $(srcdir)/ChangeLog.$$i; then \ + dists="$$dists ChangeLog.$$i"; \ + fi; \ + done; \ + if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ + for file in $$dists; do \ + if test -f $$file; then \ + cp -p $$file $(distdir) || exit 1; \ + else \ + cp -p $(srcdir)/$$file $(distdir) || exit 1; \ + fi; \ + done + +update-po: Makefile + $(MAKE) $(DOMAIN).pot-update + test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES) + $(MAKE) update-gmo + +# General rule for creating PO files. + +.nop.po-create: + @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \ + echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \ + exit 1 + +# General rule for updating PO files. + +.nop.po-update: + @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ + if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \ + tmpdir=`pwd`; \ + echo "$$lang:"; \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}$(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ + cd $(srcdir); \ + if { case `$(MSGMERGE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \ + $(MSGMERGE) $(MSGMERGE_OPTIONS) -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \ + *) \ + $(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \ + esac; \ + }; then \ + if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ + rm -f $$tmpdir/$$lang.new.po; \ + else \ + if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ + :; \ + else \ + echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ + exit 1; \ + fi; \ + fi; \ + else \ + echo "msgmerge for $$lang.po failed!" 1>&2; \ + rm -f $$tmpdir/$$lang.new.po; \ + fi + +$(DUMMYPOFILES): + +update-gmo: Makefile $(GMOFILES) + @: + +# Recreate Makefile by invoking config.status. Explicitly invoke the shell, +# because execution permission bits may not work on the current file system. +# Use /bin/bash, which is the shell determined by autoconf for the use by its +# scripts, not $(SHELL) which is hardwired to /bin/sh and may be deficient. +Makefile: Makefile.in.in Makevars $(top_builddir)/config.status POTFILES.in LINGUAS + cd $(top_builddir) \ + && /bin/bash ./config.status $(subdir)/$@.in po-directories + +force: + +# Tell versions [3.59,3.63) of GNU make not to export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: +# Special Makefile rules for English message catalogs with quotation marks. + +DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot + +.SUFFIXES: .insert-header .po-update-en + +en@quot.po-create: + $(MAKE) en@quot.po-update +en@boldquot.po-create: + $(MAKE) en@boldquot.po-update + +en@quot.po-update: en@quot.po-update-en +en@boldquot.po-update: en@boldquot.po-update-en + +.insert-header.po-update-en: + @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \ + if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \ + tmpdir=`pwd`; \ + echo "$$lang:"; \ + ll=`echo $$lang | sed -e 's/@.*//'`; \ + LC_ALL=C; export LC_ALL; \ + cd $(srcdir); \ + if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$lang -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \ + if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ + rm -f $$tmpdir/$$lang.new.po; \ + else \ + if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ + :; \ + else \ + echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ + exit 1; \ + fi; \ + fi; \ + else \ + echo "creation of $$lang.po failed!" 1>&2; \ + rm -f $$tmpdir/$$lang.new.po; \ + fi + +en@quot.insert-header: insert-header.sin + sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header + +en@boldquot.insert-header: insert-header.sin + sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header + +mostlyclean: mostlyclean-quot +mostlyclean-quot: + rm -f *.insert-header diff --git a/goaccess++/po/Makefile.in b/goaccess++/po/Makefile.in new file mode 100644 index 0000000..a2ce276 --- /dev/null +++ b/goaccess++/po/Makefile.in @@ -0,0 +1,444 @@ +# Makefile for PO directory in any package using GNU gettext. +# Copyright (C) 1995-1997, 2000-2007, 2009-2010 by Ulrich Drepper <drepper@gnu.ai.mit.edu> +# +# This file can be copied and used freely without restrictions. It can +# be used in projects which are not available under the GNU General Public +# License but which still want to provide support for the GNU gettext +# functionality. +# Please note that the actual code of GNU gettext is covered by the GNU +# General Public License and is *not* in the public domain. +# +# Origin: gettext-0.18 +GETTEXT_MACRO_VERSION = 0.18 + +PACKAGE = goaccess +VERSION = 1.3 +PACKAGE_BUGREPORT = goaccess@prosoftcorp.com + +SHELL = /bin/sh + + +srcdir = . +top_srcdir = .. + + +prefix = /usr/local +exec_prefix = ${prefix} +datarootdir = ${prefix}/share +datadir = ${datarootdir} +localedir = ${datarootdir}/locale +gettextsrcdir = $(datadir)/gettext/po + +INSTALL = /usr/bin/install -c +INSTALL_DATA = ${INSTALL} -m 644 + +# We use $(mkdir_p). +# In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as +# "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions, +# ${SHELL} /home/djq/goaccess-1.3/install-sh does not start with $(SHELL), so we add it. +# In automake >= 1.10, /usr/bin/mkdir -p is derived from ${MKDIR_P}, which is defined +# either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake +# versions, $(mkinstalldirs) and $(install_sh) are unused. +mkinstalldirs = $(SHELL) ${SHELL} /home/djq/goaccess-1.3/install-sh -d +install_sh = $(SHELL) ${SHELL} /home/djq/goaccess-1.3/install-sh +MKDIR_P = /usr/bin/mkdir -p +mkdir_p = /usr/bin/mkdir -p + +GMSGFMT_ = : +GMSGFMT_no = : +GMSGFMT_yes = : +GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT)) +MSGFMT_ = : +MSGFMT_no = : +MSGFMT_yes = : +MSGFMT = $(MSGFMT_$(USE_MSGCTXT)) +XGETTEXT_ = : +XGETTEXT_no = : +XGETTEXT_yes = : +XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT)) +MSGMERGE = msgmerge +MSGMERGE_UPDATE = : --update +MSGINIT = msginit +MSGCONV = msgconv +MSGFILTER = msgfilter + +POFILES = @POFILES@ +GMOFILES = @GMOFILES@ +UPDATEPOFILES = @UPDATEPOFILES@ +DUMMYPOFILES = @DUMMYPOFILES@ +DISTFILES.common = Makefile.in.in remove-potcdate.sin \ +$(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) +DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \ +$(POFILES) $(GMOFILES) \ +$(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) + +POTFILES = \ + +CATALOGS = @CATALOGS@ + +# Makevars gets inserted here. (Don't remove this line!) + +.SUFFIXES: +.SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update + +.po.mo: + @echo "$(MSGFMT) -c -o $@ $<"; \ + $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ + +.po.gmo: + @lang=`echo $* | sed -e 's,.*/,,'`; \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o $${lang}.gmo $${lang}.po"; \ + cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo + +.sin.sed: + sed -e '/^#/d' $< > t-$@ + mv t-$@ $@ + + +all: check-macro-version all-yes + +all-yes: stamp-po +all-no: + +# Ensure that the gettext macros and this Makefile.in.in are in sync. +check-macro-version: + @test "$(GETTEXT_MACRO_VERSION)" = "0.18" \ + || { echo "*** error: gettext infrastructure mismatch: using a Makefile.in.in from gettext version $(GETTEXT_MACRO_VERSION) but the autoconf macros are from gettext version 0.18" 1>&2; \ + exit 1; \ + } + +# $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no +# internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because +# we don't want to bother translators with empty POT files). We assume that +# LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty. +# In this case, stamp-po is a nop (i.e. a phony target). + +# stamp-po is a timestamp denoting the last time at which the CATALOGS have +# been loosely updated. Its purpose is that when a developer or translator +# checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS, +# "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent +# invocations of "make" will do nothing. This timestamp would not be necessary +# if updating the $(CATALOGS) would always touch them; however, the rule for +# $(POFILES) has been designed to not touch files that don't need to be +# changed. +stamp-po: $(srcdir)/$(DOMAIN).pot + test ! -f $(srcdir)/$(DOMAIN).pot || \ + test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES) + @test ! -f $(srcdir)/$(DOMAIN).pot || { \ + echo "touch stamp-po" && \ + echo timestamp > stamp-poT && \ + mv stamp-poT stamp-po; \ + } + +# Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', +# otherwise packages like GCC can not be built if only parts of the source +# have been downloaded. + +# This target rebuilds $(DOMAIN).pot; it is an expensive operation. +# Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. +$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed + if LC_ALL=C grep 'GNU goaccess' $(top_srcdir)/* 2>/dev/null | grep -v 'libtool:' >/dev/null; then \ + package_gnu='GNU '; \ + else \ + package_gnu=''; \ + fi; \ + if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \ + msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \ + else \ + msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \ + fi; \ + case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \ + $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ + --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \ + --files-from=$(srcdir)/POTFILES.in \ + --copyright-holder='$(COPYRIGHT_HOLDER)' \ + --msgid-bugs-address="$$msgid_bugs_address" \ + ;; \ + *) \ + $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ + --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \ + --files-from=$(srcdir)/POTFILES.in \ + --copyright-holder='$(COPYRIGHT_HOLDER)' \ + --package-name="$${package_gnu}goaccess" \ + --package-version='1.3' \ + --msgid-bugs-address="$$msgid_bugs_address" \ + ;; \ + esac + test ! -f $(DOMAIN).po || { \ + if test -f $(srcdir)/$(DOMAIN).pot; then \ + sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ + sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ + if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ + rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ + else \ + rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ + mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ + fi; \ + else \ + mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ + fi; \ + } + +# This rule has no dependencies: we don't need to update $(DOMAIN).pot at +# every "make" invocation, only create it when it is missing. +# Only "make $(DOMAIN).pot-update" or "make dist" will force an update. +$(srcdir)/$(DOMAIN).pot: + $(MAKE) $(DOMAIN).pot-update + +# This target rebuilds a PO file if $(DOMAIN).pot has changed. +# Note that a PO file is not touched if it doesn't need to be changed. +$(POFILES): $(srcdir)/$(DOMAIN).pot + @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ + if test -f "$(srcdir)/$${lang}.po"; then \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot"; \ + cd $(srcdir) \ + && { case `$(MSGMERGE_UPDATE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \ + $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) $${lang}.po $(DOMAIN).pot;; \ + *) \ + $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot;; \ + esac; \ + }; \ + else \ + $(MAKE) $${lang}.po-create; \ + fi + + +install: install-exec install-data +install-exec: +install-data: install-data-yes + if test "$(PACKAGE)" = "gettext-tools"; then \ + $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ + for file in $(DISTFILES.common) Makevars.template; do \ + $(INSTALL_DATA) $(srcdir)/$$file \ + $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + for file in Makevars; do \ + rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + else \ + : ; \ + fi +install-data-no: all +install-data-yes: all + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + dir=$(localedir)/$$lang/LC_MESSAGES; \ + $(mkdir_p) $(DESTDIR)$$dir; \ + if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ + $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ + echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ + for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ + if test -n "$$lc"; then \ + if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ + link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ + mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ + for file in *; do \ + if test -f $$file; then \ + ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ + fi; \ + done); \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + else \ + if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ + :; \ + else \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + fi; \ + fi; \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ + ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ + cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ + fi; \ + done; \ + done + +install-strip: install + +installdirs: installdirs-exec installdirs-data +installdirs-exec: +installdirs-data: installdirs-data-yes + if test "$(PACKAGE)" = "gettext-tools"; then \ + $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ + else \ + : ; \ + fi +installdirs-data-no: +installdirs-data-yes: + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + dir=$(localedir)/$$lang/LC_MESSAGES; \ + $(mkdir_p) $(DESTDIR)$$dir; \ + for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ + if test -n "$$lc"; then \ + if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ + link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ + mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ + for file in *; do \ + if test -f $$file; then \ + ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ + fi; \ + done); \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + else \ + if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ + :; \ + else \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + fi; \ + fi; \ + fi; \ + done; \ + done + +# Define this as empty until I found a useful application. +installcheck: + +uninstall: uninstall-exec uninstall-data +uninstall-exec: +uninstall-data: uninstall-data-yes + if test "$(PACKAGE)" = "gettext-tools"; then \ + for file in $(DISTFILES.common) Makevars.template; do \ + rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + else \ + : ; \ + fi +uninstall-data-no: +uninstall-data-yes: + catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + done; \ + done + +check: all + +info dvi ps pdf html tags TAGS ctags CTAGS ID: + +mostlyclean: + rm -f remove-potcdate.sed + rm -f stamp-poT + rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po + rm -fr *.o + +clean: mostlyclean + +distclean: clean + rm -f Makefile Makefile.in POTFILES *.mo + +maintainer-clean: distclean + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + rm -f stamp-po $(GMOFILES) + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) +dist distdir: + $(MAKE) update-po + @$(MAKE) dist2 +# This is a separate target because 'update-po' must be executed before. +dist2: stamp-po $(DISTFILES) + dists="$(DISTFILES)"; \ + if test "$(PACKAGE)" = "gettext-tools"; then \ + dists="$$dists Makevars.template"; \ + fi; \ + if test -f $(srcdir)/$(DOMAIN).pot; then \ + dists="$$dists $(DOMAIN).pot stamp-po"; \ + fi; \ + if test -f $(srcdir)/ChangeLog; then \ + dists="$$dists ChangeLog"; \ + fi; \ + for i in 0 1 2 3 4 5 6 7 8 9; do \ + if test -f $(srcdir)/ChangeLog.$$i; then \ + dists="$$dists ChangeLog.$$i"; \ + fi; \ + done; \ + if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ + for file in $$dists; do \ + if test -f $$file; then \ + cp -p $$file $(distdir) || exit 1; \ + else \ + cp -p $(srcdir)/$$file $(distdir) || exit 1; \ + fi; \ + done + +update-po: Makefile + $(MAKE) $(DOMAIN).pot-update + test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES) + $(MAKE) update-gmo + +# General rule for creating PO files. + +.nop.po-create: + @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \ + echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \ + exit 1 + +# General rule for updating PO files. + +.nop.po-update: + @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ + if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \ + tmpdir=`pwd`; \ + echo "$$lang:"; \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}$(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ + cd $(srcdir); \ + if { case `$(MSGMERGE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \ + $(MSGMERGE) $(MSGMERGE_OPTIONS) -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \ + *) \ + $(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \ + esac; \ + }; then \ + if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ + rm -f $$tmpdir/$$lang.new.po; \ + else \ + if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ + :; \ + else \ + echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ + exit 1; \ + fi; \ + fi; \ + else \ + echo "msgmerge for $$lang.po failed!" 1>&2; \ + rm -f $$tmpdir/$$lang.new.po; \ + fi + +$(DUMMYPOFILES): + +update-gmo: Makefile $(GMOFILES) + @: + +# Recreate Makefile by invoking config.status. Explicitly invoke the shell, +# because execution permission bits may not work on the current file system. +# Use /bin/bash, which is the shell determined by autoconf for the use by its +# scripts, not $(SHELL) which is hardwired to /bin/sh and may be deficient. +Makefile: Makefile.in.in Makevars $(top_builddir)/config.status @POMAKEFILEDEPS@ + cd $(top_builddir) \ + && /bin/bash ./config.status $(subdir)/$@.in po-directories + +force: + +# Tell versions [3.59,3.63) of GNU make not to export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/goaccess++/po/Makefile.in.in b/goaccess++/po/Makefile.in.in new file mode 100644 index 0000000..83d8838 --- /dev/null +++ b/goaccess++/po/Makefile.in.in @@ -0,0 +1,444 @@ +# Makefile for PO directory in any package using GNU gettext. +# Copyright (C) 1995-1997, 2000-2007, 2009-2010 by Ulrich Drepper <drepper@gnu.ai.mit.edu> +# +# This file can be copied and used freely without restrictions. It can +# be used in projects which are not available under the GNU General Public +# License but which still want to provide support for the GNU gettext +# functionality. +# Please note that the actual code of GNU gettext is covered by the GNU +# General Public License and is *not* in the public domain. +# +# Origin: gettext-0.18 +GETTEXT_MACRO_VERSION = 0.18 + +PACKAGE = @PACKAGE@ +VERSION = @VERSION@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + +SHELL = /bin/sh +@SET_MAKE@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +datarootdir = @datarootdir@ +datadir = @datadir@ +localedir = @localedir@ +gettextsrcdir = $(datadir)/gettext/po + +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ + +# We use $(mkdir_p). +# In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as +# "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions, +# @install_sh@ does not start with $(SHELL), so we add it. +# In automake >= 1.10, @mkdir_p@ is derived from ${MKDIR_P}, which is defined +# either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake +# versions, $(mkinstalldirs) and $(install_sh) are unused. +mkinstalldirs = $(SHELL) @install_sh@ -d +install_sh = $(SHELL) @install_sh@ +MKDIR_P = @MKDIR_P@ +mkdir_p = @mkdir_p@ + +GMSGFMT_ = @GMSGFMT@ +GMSGFMT_no = @GMSGFMT@ +GMSGFMT_yes = @GMSGFMT_015@ +GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT)) +MSGFMT_ = @MSGFMT@ +MSGFMT_no = @MSGFMT@ +MSGFMT_yes = @MSGFMT_015@ +MSGFMT = $(MSGFMT_$(USE_MSGCTXT)) +XGETTEXT_ = @XGETTEXT@ +XGETTEXT_no = @XGETTEXT@ +XGETTEXT_yes = @XGETTEXT_015@ +XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT)) +MSGMERGE = msgmerge +MSGMERGE_UPDATE = @MSGMERGE@ --update +MSGINIT = msginit +MSGCONV = msgconv +MSGFILTER = msgfilter + +POFILES = @POFILES@ +GMOFILES = @GMOFILES@ +UPDATEPOFILES = @UPDATEPOFILES@ +DUMMYPOFILES = @DUMMYPOFILES@ +DISTFILES.common = Makefile.in.in remove-potcdate.sin \ +$(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) +DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \ +$(POFILES) $(GMOFILES) \ +$(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) + +POTFILES = \ + +CATALOGS = @CATALOGS@ + +# Makevars gets inserted here. (Don't remove this line!) + +.SUFFIXES: +.SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update + +.po.mo: + @echo "$(MSGFMT) -c -o $@ $<"; \ + $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ + +.po.gmo: + @lang=`echo $* | sed -e 's,.*/,,'`; \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o $${lang}.gmo $${lang}.po"; \ + cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo + +.sin.sed: + sed -e '/^#/d' $< > t-$@ + mv t-$@ $@ + + +all: check-macro-version all-@USE_NLS@ + +all-yes: stamp-po +all-no: + +# Ensure that the gettext macros and this Makefile.in.in are in sync. +check-macro-version: + @test "$(GETTEXT_MACRO_VERSION)" = "@GETTEXT_MACRO_VERSION@" \ + || { echo "*** error: gettext infrastructure mismatch: using a Makefile.in.in from gettext version $(GETTEXT_MACRO_VERSION) but the autoconf macros are from gettext version @GETTEXT_MACRO_VERSION@" 1>&2; \ + exit 1; \ + } + +# $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no +# internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because +# we don't want to bother translators with empty POT files). We assume that +# LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty. +# In this case, stamp-po is a nop (i.e. a phony target). + +# stamp-po is a timestamp denoting the last time at which the CATALOGS have +# been loosely updated. Its purpose is that when a developer or translator +# checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS, +# "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent +# invocations of "make" will do nothing. This timestamp would not be necessary +# if updating the $(CATALOGS) would always touch them; however, the rule for +# $(POFILES) has been designed to not touch files that don't need to be +# changed. +stamp-po: $(srcdir)/$(DOMAIN).pot + test ! -f $(srcdir)/$(DOMAIN).pot || \ + test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES) + @test ! -f $(srcdir)/$(DOMAIN).pot || { \ + echo "touch stamp-po" && \ + echo timestamp > stamp-poT && \ + mv stamp-poT stamp-po; \ + } + +# Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', +# otherwise packages like GCC can not be built if only parts of the source +# have been downloaded. + +# This target rebuilds $(DOMAIN).pot; it is an expensive operation. +# Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. +$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed + if LC_ALL=C grep 'GNU @PACKAGE@' $(top_srcdir)/* 2>/dev/null | grep -v 'libtool:' >/dev/null; then \ + package_gnu='GNU '; \ + else \ + package_gnu=''; \ + fi; \ + if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \ + msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \ + else \ + msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \ + fi; \ + case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \ + $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ + --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \ + --files-from=$(srcdir)/POTFILES.in \ + --copyright-holder='$(COPYRIGHT_HOLDER)' \ + --msgid-bugs-address="$$msgid_bugs_address" \ + ;; \ + *) \ + $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ + --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \ + --files-from=$(srcdir)/POTFILES.in \ + --copyright-holder='$(COPYRIGHT_HOLDER)' \ + --package-name="$${package_gnu}@PACKAGE@" \ + --package-version='@VERSION@' \ + --msgid-bugs-address="$$msgid_bugs_address" \ + ;; \ + esac + test ! -f $(DOMAIN).po || { \ + if test -f $(srcdir)/$(DOMAIN).pot; then \ + sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ + sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ + if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ + rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ + else \ + rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ + mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ + fi; \ + else \ + mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ + fi; \ + } + +# This rule has no dependencies: we don't need to update $(DOMAIN).pot at +# every "make" invocation, only create it when it is missing. +# Only "make $(DOMAIN).pot-update" or "make dist" will force an update. +$(srcdir)/$(DOMAIN).pot: + $(MAKE) $(DOMAIN).pot-update + +# This target rebuilds a PO file if $(DOMAIN).pot has changed. +# Note that a PO file is not touched if it doesn't need to be changed. +$(POFILES): $(srcdir)/$(DOMAIN).pot + @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ + if test -f "$(srcdir)/$${lang}.po"; then \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot"; \ + cd $(srcdir) \ + && { case `$(MSGMERGE_UPDATE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \ + $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) $${lang}.po $(DOMAIN).pot;; \ + *) \ + $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot;; \ + esac; \ + }; \ + else \ + $(MAKE) $${lang}.po-create; \ + fi + + +install: install-exec install-data +install-exec: +install-data: install-data-@USE_NLS@ + if test "$(PACKAGE)" = "gettext-tools"; then \ + $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ + for file in $(DISTFILES.common) Makevars.template; do \ + $(INSTALL_DATA) $(srcdir)/$$file \ + $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + for file in Makevars; do \ + rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + else \ + : ; \ + fi +install-data-no: all +install-data-yes: all + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + dir=$(localedir)/$$lang/LC_MESSAGES; \ + $(mkdir_p) $(DESTDIR)$$dir; \ + if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ + $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ + echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ + for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ + if test -n "$$lc"; then \ + if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ + link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ + mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ + for file in *; do \ + if test -f $$file; then \ + ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ + fi; \ + done); \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + else \ + if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ + :; \ + else \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + fi; \ + fi; \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ + ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ + cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ + fi; \ + done; \ + done + +install-strip: install + +installdirs: installdirs-exec installdirs-data +installdirs-exec: +installdirs-data: installdirs-data-@USE_NLS@ + if test "$(PACKAGE)" = "gettext-tools"; then \ + $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ + else \ + : ; \ + fi +installdirs-data-no: +installdirs-data-yes: + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + dir=$(localedir)/$$lang/LC_MESSAGES; \ + $(mkdir_p) $(DESTDIR)$$dir; \ + for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ + if test -n "$$lc"; then \ + if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ + link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ + mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ + for file in *; do \ + if test -f $$file; then \ + ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ + fi; \ + done); \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + else \ + if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ + :; \ + else \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + fi; \ + fi; \ + fi; \ + done; \ + done + +# Define this as empty until I found a useful application. +installcheck: + +uninstall: uninstall-exec uninstall-data +uninstall-exec: +uninstall-data: uninstall-data-@USE_NLS@ + if test "$(PACKAGE)" = "gettext-tools"; then \ + for file in $(DISTFILES.common) Makevars.template; do \ + rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + else \ + : ; \ + fi +uninstall-data-no: +uninstall-data-yes: + catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + done; \ + done + +check: all + +info dvi ps pdf html tags TAGS ctags CTAGS ID: + +mostlyclean: + rm -f remove-potcdate.sed + rm -f stamp-poT + rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po + rm -fr *.o + +clean: mostlyclean + +distclean: clean + rm -f Makefile Makefile.in POTFILES *.mo + +maintainer-clean: distclean + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + rm -f stamp-po $(GMOFILES) + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) +dist distdir: + $(MAKE) update-po + @$(MAKE) dist2 +# This is a separate target because 'update-po' must be executed before. +dist2: stamp-po $(DISTFILES) + dists="$(DISTFILES)"; \ + if test "$(PACKAGE)" = "gettext-tools"; then \ + dists="$$dists Makevars.template"; \ + fi; \ + if test -f $(srcdir)/$(DOMAIN).pot; then \ + dists="$$dists $(DOMAIN).pot stamp-po"; \ + fi; \ + if test -f $(srcdir)/ChangeLog; then \ + dists="$$dists ChangeLog"; \ + fi; \ + for i in 0 1 2 3 4 5 6 7 8 9; do \ + if test -f $(srcdir)/ChangeLog.$$i; then \ + dists="$$dists ChangeLog.$$i"; \ + fi; \ + done; \ + if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ + for file in $$dists; do \ + if test -f $$file; then \ + cp -p $$file $(distdir) || exit 1; \ + else \ + cp -p $(srcdir)/$$file $(distdir) || exit 1; \ + fi; \ + done + +update-po: Makefile + $(MAKE) $(DOMAIN).pot-update + test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES) + $(MAKE) update-gmo + +# General rule for creating PO files. + +.nop.po-create: + @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \ + echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \ + exit 1 + +# General rule for updating PO files. + +.nop.po-update: + @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ + if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \ + tmpdir=`pwd`; \ + echo "$$lang:"; \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}$(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ + cd $(srcdir); \ + if { case `$(MSGMERGE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \ + $(MSGMERGE) $(MSGMERGE_OPTIONS) -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \ + *) \ + $(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \ + esac; \ + }; then \ + if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ + rm -f $$tmpdir/$$lang.new.po; \ + else \ + if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ + :; \ + else \ + echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ + exit 1; \ + fi; \ + fi; \ + else \ + echo "msgmerge for $$lang.po failed!" 1>&2; \ + rm -f $$tmpdir/$$lang.new.po; \ + fi + +$(DUMMYPOFILES): + +update-gmo: Makefile $(GMOFILES) + @: + +# Recreate Makefile by invoking config.status. Explicitly invoke the shell, +# because execution permission bits may not work on the current file system. +# Use @SHELL@, which is the shell determined by autoconf for the use by its +# scripts, not $(SHELL) which is hardwired to /bin/sh and may be deficient. +Makefile: Makefile.in.in Makevars $(top_builddir)/config.status @POMAKEFILEDEPS@ + cd $(top_builddir) \ + && @SHELL@ ./config.status $(subdir)/$@.in po-directories + +force: + +# Tell versions [3.59,3.63) of GNU make not to export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/goaccess++/po/Makevars b/goaccess++/po/Makevars new file mode 100644 index 0000000..facec21 --- /dev/null +++ b/goaccess++/po/Makevars @@ -0,0 +1,79 @@ +# Makefile variables for PO directory in any package using GNU gettext. + +# Usually the message domain is the same as the package name. +DOMAIN = $(PACKAGE) + +# These two variables depend on the location of this directory. +subdir = po +top_builddir = .. +AM_CPPFLAGS = -I. -I$(srcdir) + +# These options get passed to xgettext. +XGETTEXT_OPTIONS = --from-code=UTF-8 --keyword=_ --keyword=N_ + +# This is the copyright holder that gets inserted into the header of the +# $(DOMAIN).pot file. Set this to the copyright holder of the surrounding +# package. (Note that the msgstr strings, extracted from the package's +# sources, belong to the copyright holder of the package.) Translators are +# expected to transfer the copyright for their translations to this person +# or entity, or to disclaim their copyright. The empty string stands for +# the public domain; in this case the translators are expected to disclaim +# their copyright. +COPYRIGHT_HOLDER = Free Software Foundation, Inc. + +# This tells whether or not to prepend "GNU " prefix to the package +# name that gets inserted into the header of the $(DOMAIN).pot file. +# Possible values are "yes", "no", or empty. If it is empty, try to +# detect it automatically by scanning the files in $(top_srcdir) for +# "GNU packagename" string. +PACKAGE_GNU = + +# This is the email address or URL to which the translators shall report +# bugs in the untranslated strings: +# - Strings which are not entire sentences, see the maintainer guidelines +# in the GNU gettext documentation, section 'Preparing Strings'. +# - Strings which use unclear terms or require additional context to be +# understood. +# - Strings which make invalid assumptions about notation of date, time or +# money. +# - Pluralisation problems. +# - Incorrect English spelling. +# - Incorrect formatting. +# It can be your email address, or a mailing list address where translators +# can write to without being subscribed, or the URL of a web page through +# which the translators can contact you. +MSGID_BUGS_ADDRESS = hello@goaccess.io + +# This is the list of locale categories, beyond LC_MESSAGES, for which the +# message catalogs shall be used. It is usually empty. +EXTRA_LOCALE_CATEGORIES = + +# This tells whether the $(DOMAIN).pot file contains messages with an 'msgctxt' +# context. Possible values are "yes" and "no". Set this to yes if the +# package uses functions taking also a message context, like pgettext(), or +# if in $(XGETTEXT_OPTIONS) you define keywords with a context argument. +USE_MSGCTXT = no + +# These options get passed to msgmerge. +# Useful options are in particular: +# --previous to keep previous msgids of translated messages, +# --quiet to reduce the verbosity. +MSGMERGE_OPTIONS = + +# These options get passed to msginit. +# If you want to disable line wrapping when writing PO files, add +# --no-wrap to MSGMERGE_OPTIONS, XGETTEXT_OPTIONS, and +# MSGINIT_OPTIONS. +MSGINIT_OPTIONS = + +# This tells whether or not to regenerate a PO file when $(DOMAIN).pot +# has changed. Possible values are "yes" and "no". Set this to no if +# the POT file is checked in the repository and the version control +# program ignores timestamps. +PO_DEPENDS_ON_POT = yes + +# This tells whether or not to forcibly update $(DOMAIN).pot and +# regenerate PO files on "make dist". Possible values are "yes" and +# "no". Set this to no if the POT file and PO files are maintained +# externally. +DIST_DEPENDS_ON_UPDATE_PO = yes diff --git a/goaccess++/po/POTFILES b/goaccess++/po/POTFILES new file mode 100644 index 0000000..3a8dac9 --- /dev/null +++ b/goaccess++/po/POTFILES @@ -0,0 +1 @@ + ../src/labels.h diff --git a/goaccess++/po/POTFILES.in b/goaccess++/po/POTFILES.in new file mode 100644 index 0000000..99bde5c --- /dev/null +++ b/goaccess++/po/POTFILES.in @@ -0,0 +1,2 @@ +# List of source files which contain translatable strings. +src/labels.h diff --git a/goaccess++/po/Rules-quot b/goaccess++/po/Rules-quot new file mode 100644 index 0000000..af52487 --- /dev/null +++ b/goaccess++/po/Rules-quot @@ -0,0 +1,47 @@ +# Special Makefile rules for English message catalogs with quotation marks. + +DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot + +.SUFFIXES: .insert-header .po-update-en + +en@quot.po-create: + $(MAKE) en@quot.po-update +en@boldquot.po-create: + $(MAKE) en@boldquot.po-update + +en@quot.po-update: en@quot.po-update-en +en@boldquot.po-update: en@boldquot.po-update-en + +.insert-header.po-update-en: + @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \ + if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \ + tmpdir=`pwd`; \ + echo "$$lang:"; \ + ll=`echo $$lang | sed -e 's/@.*//'`; \ + LC_ALL=C; export LC_ALL; \ + cd $(srcdir); \ + if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$lang -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \ + if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ + rm -f $$tmpdir/$$lang.new.po; \ + else \ + if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ + :; \ + else \ + echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ + exit 1; \ + fi; \ + fi; \ + else \ + echo "creation of $$lang.po failed!" 1>&2; \ + rm -f $$tmpdir/$$lang.new.po; \ + fi + +en@quot.insert-header: insert-header.sin + sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header + +en@boldquot.insert-header: insert-header.sin + sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header + +mostlyclean: mostlyclean-quot +mostlyclean-quot: + rm -f *.insert-header diff --git a/goaccess++/po/boldquot.sed b/goaccess++/po/boldquot.sed new file mode 100644 index 0000000..4b937aa --- /dev/null +++ b/goaccess++/po/boldquot.sed @@ -0,0 +1,10 @@ +s/"\([^"]*\)"/“\1”/g +s/`\([^`']*\)'/‘\1’/g +s/ '\([^`']*\)' / ‘\1’ /g +s/ '\([^`']*\)'$/ ‘\1’/g +s/^'\([^`']*\)' /‘\1’ /g +s/“”/""/g +s/“/“/g +s/”/”/g +s/‘/‘/g +s/’/’/g diff --git a/goaccess++/po/en@boldquot.header b/goaccess++/po/en@boldquot.header new file mode 100644 index 0000000..fedb6a0 --- /dev/null +++ b/goaccess++/po/en@boldquot.header @@ -0,0 +1,25 @@ +# All this catalog "translates" are quotation characters. +# The msgids must be ASCII and therefore cannot contain real quotation +# characters, only substitutes like grave accent (0x60), apostrophe (0x27) +# and double quote (0x22). These substitutes look strange; see +# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html +# +# This catalog translates grave accent (0x60) and apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019). +# It also translates pairs of apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019) +# and pairs of quotation mark (0x22) to +# left double quotation mark (U+201C) and right double quotation mark (U+201D). +# +# When output to an UTF-8 terminal, the quotation characters appear perfectly. +# When output to an ISO-8859-1 terminal, the single quotation marks are +# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to +# grave/acute accent (by libiconv), and the double quotation marks are +# transliterated to 0x22. +# When output to an ASCII terminal, the single quotation marks are +# transliterated to apostrophes, and the double quotation marks are +# transliterated to 0x22. +# +# This catalog furthermore displays the text between the quotation marks in +# bold face, assuming the VT100/XTerm escape sequences. +# diff --git a/goaccess++/po/en@quot.header b/goaccess++/po/en@quot.header new file mode 100644 index 0000000..a9647fc --- /dev/null +++ b/goaccess++/po/en@quot.header @@ -0,0 +1,22 @@ +# All this catalog "translates" are quotation characters. +# The msgids must be ASCII and therefore cannot contain real quotation +# characters, only substitutes like grave accent (0x60), apostrophe (0x27) +# and double quote (0x22). These substitutes look strange; see +# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html +# +# This catalog translates grave accent (0x60) and apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019). +# It also translates pairs of apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019) +# and pairs of quotation mark (0x22) to +# left double quotation mark (U+201C) and right double quotation mark (U+201D). +# +# When output to an UTF-8 terminal, the quotation characters appear perfectly. +# When output to an ISO-8859-1 terminal, the single quotation marks are +# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to +# grave/acute accent (by libiconv), and the double quotation marks are +# transliterated to 0x22. +# When output to an ASCII terminal, the single quotation marks are +# transliterated to apostrophes, and the double quotation marks are +# transliterated to 0x22. +# diff --git a/goaccess++/po/es.gmo b/goaccess++/po/es.gmo new file mode 100644 index 0000000000000000000000000000000000000000..7b16262b6be8ebceb3f736b5a6823b364ea4fbe1 GIT binary patch literal 17442 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 O=~_kXD1cHV@BSa2PAKsJ literal 0 HcmV?d00001 diff --git a/goaccess++/po/es.po b/goaccess++/po/es.po new file mode 100644 index 0000000..2b5261a --- /dev/null +++ b/goaccess++/po/es.po @@ -0,0 +1,902 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: Goaccess\n" +"Report-Msgid-Bugs-To: hello@goaccess.io\n" +"POT-Creation-Date: 2018-11-22 23:38-0600\n" +"PO-Revision-Date: 2017-08-04 13:00-0300\n" +"Last-Translator: Enrique Becerra <kabeza@gmail.com>\n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.5.4\n" + +#: src/labels.h:40 +msgid "en" +msgstr "es" + +#: src/labels.h:43 +msgid "Exp. Panel" +msgstr "Exp. Panel" + +#: src/labels.h:44 +msgid "Help" +msgstr "Ayuda" + +#: src/labels.h:45 +msgid "Quit" +msgstr "Salir" + +#: src/labels.h:46 +msgid "Total" +msgstr "Total" + +#: src/labels.h:49 +msgid "[x] ASC [ ] DESC" +msgstr "[x] ASC [ ] DESC" + +#: src/labels.h:50 +msgid "[ ] ASC [x] DESC" +msgstr "[ ] ASC [x] DESC" + +#: src/labels.h:53 +#, c-format +msgid "[Active Panel: %1$s]" +msgstr "[Panel Activo: %1$s]" + +#: src/labels.h:54 +msgid "[q]uit GoAccess" +msgstr "[q]Salir GoAccess" + +#: src/labels.h:55 +msgid "[?] Help [Enter] Exp. Panel" +msgstr "[?] Ayuda [Enter] Exp. Panel" + +#: src/labels.h:56 +msgid "Dashboard" +msgstr "Panel de Control" + +#: src/labels.h:57 +msgid "Dashboard - Overall Analyzed Requests" +msgstr "Panel de Control - Peticiones Analizadas En General" + +#: src/labels.h:58 +msgid "Overall Analyzed Requests" +msgstr "Peticiones Analizadas en General" + +#: src/labels.h:60 src/labels.h:81 +msgid "Tx. Amount" +msgstr "" + +#: src/labels.h:61 +msgid "Date/Time" +msgstr "Fecha/Hora" + +#: src/labels.h:62 +msgid "Excl. IP Hits" +msgstr "Accesos IP Excl." + +#: src/labels.h:63 +msgid "Failed Requests" +msgstr "Peticiones Fallidas" + +#: src/labels.h:64 +msgid "Init. Proc. Time" +msgstr "Hora Inicio Proc." + +#: src/labels.h:65 +msgid "Log Size" +msgstr "Tamaño Log" + +#: src/labels.h:66 +msgid "Log Source" +msgstr "Origen de Log" + +#: src/labels.h:67 src/labels.h:174 +msgid "Referrers" +msgstr "Referidos" + +#: src/labels.h:68 +msgid "Total Requests" +msgstr "Peticiones Totales" + +#: src/labels.h:69 +msgid "Static Files" +msgstr "Archivos Estaticos" + +#: src/labels.h:70 src/labels.h:146 +msgid "Not Found" +msgstr "No Encontrado" + +#: src/labels.h:71 +#, fuzzy +msgid "Requested Files" +msgstr "Archivos Requeridos (URLs)" + +#: src/labels.h:72 +msgid "Unique Visitors" +msgstr "Visitantes Unicos" + +#: src/labels.h:73 +msgid "Valid Requests" +msgstr "Peticiones Validas" + +#: src/labels.h:76 +msgid "Hits" +msgstr "Hits" + +#: src/labels.h:77 +msgid "h%" +msgstr "h%" + +#: src/labels.h:78 src/labels.h:104 +msgid "Visitors" +msgstr "Visitantes" + +#: src/labels.h:79 +msgid "Vis." +msgstr "Vis." + +#: src/labels.h:80 +msgid "v%" +msgstr "v%" + +#: src/labels.h:82 +msgid "Avg. T.S." +msgstr "Prom. T.S." + +#: src/labels.h:83 +msgid "Cum. T.S." +msgstr "Cum. T.S." + +#: src/labels.h:84 +msgid "Max. T.S." +msgstr "Max. T.S." + +#: src/labels.h:85 +msgid "Method" +msgstr "Metodo" + +#: src/labels.h:86 +msgid "Mtd" +msgstr "Mtd" + +#: src/labels.h:87 +msgid "Protocol" +msgstr "Protocolo" + +#: src/labels.h:88 +msgid "Proto" +msgstr "Proto" + +#: src/labels.h:89 +msgid "City" +msgstr "Ciudad" + +#: src/labels.h:90 +msgid "Country" +msgstr "Pais" + +#: src/labels.h:91 +msgid "Hostname" +msgstr "Hostname" + +#: src/labels.h:92 +msgid "Data" +msgstr "Datos" + +#: src/labels.h:94 +msgid "Hits/Visitors" +msgstr "Hits/Visitas" + +#: src/labels.h:98 +msgid "Unique visitors per day" +msgstr "Visitantes unicos por dia" + +#: src/labels.h:100 +msgid "Unique visitors per day - Including spiders" +msgstr "Visitantes unicos por dia - Incluyendo M.Busqueda" + +#: src/labels.h:102 +msgid "Hits having the same IP, date and agent are a unique visit." +msgstr "Hits con el mismo IP, fecha y agente son unica visita" + +#: src/labels.h:107 +msgid "Requested Files (URLs)" +msgstr "Archivos Requeridos (URLs)" + +#: src/labels.h:109 +msgid "Top requests sorted by hits [, avgts, cumts, maxts, mthd, proto]" +msgstr "Peticiones Top ordenadas por hits [, avgts, cumts, maxts, mthd, proto]" + +#: src/labels.h:111 +msgid "Requests" +msgstr "Peticiones" + +#: src/labels.h:114 src/labels.h:118 +msgid "Static Requests" +msgstr "Peticiones Estaticas" + +#: src/labels.h:116 +msgid "Top static requests sorted by hits [, avgts, cumts, maxts, mthd, proto]" +msgstr "" +"Peticiones estaticas top ordenadas por hits [, avgts, cumts, maxts, mthd, " +"proto]" + +#: src/labels.h:121 +msgid "Time Distribution" +msgstr "Distribucion Horaria" + +#: src/labels.h:123 +msgid "Data sorted by hour [, avgts, cumts, maxts]" +msgstr "Datos ordenados por hora [, avgts, cumts, maxts]" + +#: src/labels.h:125 +msgid "Time" +msgstr "Hora" + +#: src/labels.h:128 src/labels.h:132 +msgid "Virtual Hosts" +msgstr "Hosts Virtuales" + +#: src/labels.h:130 src/labels.h:137 +msgid "Data sorted by hits [, avgts, cumts, maxts]" +msgstr "Datos ordenados por hits [, avgts, cumts, maxts]" + +#: src/labels.h:135 +msgid "Remote User (HTTP authentication)" +msgstr "Usuario Remoto (Autenticacion HTTP)" + +#: src/labels.h:139 +msgid "Remote User" +msgstr "Usuario Remoto" + +#: src/labels.h:142 +msgid "Not Found URLs (404s)" +msgstr "URLs no encontradas (404)" + +#: src/labels.h:144 +msgid "Top not found URLs sorted by hits [, avgts, cumts, maxts, mthd, proto]" +msgstr "" +"URLs no encontradas top ordenadas por hits [, avgts, cumts, maxts, mthd, " +"proto]" + +#: src/labels.h:149 +msgid "Visitor Hostnames and IPs" +msgstr "Hosts e IPs de los Visitantes" + +#: src/labels.h:151 +msgid "Top visitor hosts sorted by hits [, avgts, cumts, maxts]" +msgstr "Hosts de visitante top ordenado por hits [, avgts, cumts, maxts]" + +#: src/labels.h:153 +msgid "Hosts" +msgstr "Hosts" + +#: src/labels.h:156 +msgid "Operating Systems" +msgstr "Sistemas Operativos" + +#: src/labels.h:158 +msgid "Top Operating Systems sorted by hits [, avgts, cumts, maxts]" +msgstr "Sistemas Operativos top ordenados por hits [, avgts, cumts, maxts]" + +#: src/labels.h:160 +msgid "OS" +msgstr "SO" + +#: src/labels.h:163 src/labels.h:167 +msgid "Browsers" +msgstr "Navegadores" + +#: src/labels.h:165 +msgid "Top Browsers sorted by hits [, avgts, cumts, maxts]" +msgstr "Navegadores top ordenados por hits [, avgts, cumts, maxts]" + +#: src/labels.h:170 +msgid "Referrers URLs" +msgstr "URLs Referidos" + +#: src/labels.h:172 +msgid "Top Requested Referrers sorted by hits [, avgts, cumts, maxts]" +msgstr "Peticiones top de referidos ordenadas por hits [, avgts, cumts, maxts]" + +#: src/labels.h:177 src/labels.h:181 +msgid "Referring Sites" +msgstr "Sitios Referidos" + +#: src/labels.h:179 +msgid "Top Referring Sites sorted by hits [, avgts, cumts, maxts]" +msgstr "Sitios Referidos top ordenados por hits [, avgts, cumts, maxts]" + +#: src/labels.h:184 +msgid "Keyphrases from Google's search engine" +msgstr "Frases de busqueda de motor de busqueda Google" + +#: src/labels.h:186 +msgid "Top Keyphrases sorted by hits [, avgts, cumts, maxts]" +msgstr "Frases de busqueda top ordenadas por hits [, avgts, cumts, maxts]" + +#: src/labels.h:188 +msgid "Keyphrases" +msgstr "Frases Clave" + +#: src/labels.h:191 src/labels.h:195 +msgid "Geo Location" +msgstr "Geo Localizacion" + +#: src/labels.h:193 +msgid "Continent > Country sorted by unique hits [, avgts, cumts, maxts]" +msgstr "Continente > Pais ordenado por hits unicos [, avgts, cumts, maxts]" + +#: src/labels.h:198 +msgid "HTTP Status Codes" +msgstr "Codigos de Estado HTTP" + +#: src/labels.h:200 +msgid "Top HTTP Status Codes sorted by hits [, avgts, cumts, maxts]" +msgstr "Codigos de Estado HTTP top ordenados por hits [, avgts, cumts, maxts]" + +#: src/labels.h:202 +msgid "Status Codes" +msgstr "Codigos de Estado" + +#: src/labels.h:206 +msgid "[ ] case sensitive" +msgstr "[ ] distinguir mayusculas" + +#: src/labels.h:208 +msgid "[x] case sensitive" +msgstr "[x] distinguir mayusculas" + +#: src/labels.h:210 +msgid "Regex allowed - ^g to cancel - TAB switch case" +msgstr "Permitido Regex - ^g para cancelar - TAB cambiar case" + +#: src/labels.h:212 +msgid "Find pattern in all views" +msgstr "Encontrar patron en todas las vistas" + +#: src/labels.h:216 +msgid "Log Format Configuration" +msgstr "Configuracion de Formato de Log" + +#: src/labels.h:218 +msgid "[SPACE] to toggle - [ENTER] to proceed - [q] to quit" +msgstr "[ESPACIO] para alternar - [ENTER] para proceder - [q] para salir" + +#: src/labels.h:220 +msgid "Log Format - [c] to add/edit format" +msgstr "Formato de Log - [c] para agregar/editar formato" + +#: src/labels.h:222 +msgid "Date Format - [d] to add/edit format" +msgstr "Formato de Fecha - [d] para agregar/editar formato" + +#: src/labels.h:224 +msgid "Time Format - [t] to add/edit format" +msgstr "Formato de Hora - [t] para agregar/editar formato" + +#: src/labels.h:226 src/labels.h:230 +msgid "[UP/DOWN] to scroll - [q] to close window" +msgstr "[ARRIBA/ABAJO] para scrollear - [q] para cerrar ventana" + +#: src/labels.h:232 +#, c-format +msgid "User Agents for %1$s" +msgstr "Agentes de Usuario para %1$s" + +#: src/labels.h:236 +msgid "Scheme Configuration" +msgstr "Configuracion de Esquema" + +#: src/labels.h:238 +msgid "[ENTER] to use scheme - [q]uit" +msgstr "[ENTER] para usar esquema - [q]Salir" + +#: src/labels.h:242 +msgid "Sort active module by" +msgstr "Ordenar modulo activo por" + +#: src/labels.h:244 +msgid "[ENTER] select - [TAB] sort - [q]uit" +msgstr "[ENTER] seleccionar - [TAB] ordenar - [q]Salir" + +#: src/labels.h:248 +msgid "GoAccess Quick Help" +msgstr "Ayuda Rapida de GoAccess" + +#: src/labels.h:250 +msgid "[UP/DOWN] to scroll - [q] to quit" +msgstr "[ARRIBA/ABAJO] para scrollear - [q] para salir" + +#: src/labels.h:254 +msgid "Built using Tokyo Cabinet on-disk B+ Tree." +msgstr "Construido usando Tokyo Cabinet on-disk B+ Tree." + +#: src/labels.h:256 +msgid "Built using Tokyo Cabinet in-memory hash database." +msgstr "Construido usando Tokyo Cabinet in-memory hash database." + +#: src/labels.h:258 +msgid "Built using the default in-memory hash database." +msgstr "Construido usando base de datos hash por defecto en-memoria" + +#: src/labels.h:262 +msgid "Format Errors - Verify your log/date/time format" +msgstr "Errores de Formato - Verifique su formato de log/fecha/hora" + +#: src/labels.h:264 +msgid "No date format was found on your conf file." +msgstr "No se encontro formato de fecha en su archivo de configuracion" + +#: src/labels.h:266 +msgid "No log format was found on your conf file." +msgstr "No se encontro formato de log en su archivo de configuracion" + +#: src/labels.h:268 +msgid "No time format was found on your conf file." +msgstr "No se encontro formato de hora en su archivo de configuracion" + +#: src/labels.h:270 +msgid "No default config file found." +msgstr "No se encontro archivo de configuracion por defecto." + +#: src/labels.h:272 +msgid "You may specify one with" +msgstr "Ud. puede especificar un ancho" + +#: src/labels.h:274 +msgid "producing the following errors" +msgstr "produciendo los siguientes errores" + +#: src/labels.h:276 +#, c-format +msgid "Parsed %1$d lines" +msgstr "Analizadas %1$d lineas" + +#: src/labels.h:278 +msgid "Please report it by opening an issue on GitHub" +msgstr "Por favor avise abriendo un issue en GitHub" + +#: src/labels.h:280 +msgid "Select a time format." +msgstr "Elija un formato de hora." + +#: src/labels.h:282 +msgid "Select a date format." +msgstr "Elija un formato de fecha." + +#: src/labels.h:284 +msgid "Select a log format." +msgstr "Elija un formato de log." + +#: src/labels.h:286 +#, c-format +msgid "'%1$s' panel is disabled" +msgstr "'%1$s' panel esta desactivado" + +#: src/labels.h:290 +msgid "For more details visit" +msgstr "Para mas detalles visite" + +#: src/labels.h:292 +msgid "Last Updated" +msgstr "Ultima actualizacion" + +#: src/labels.h:294 +msgid "WebSocket server ready to accept new client connections" +msgstr "Servidor WebSocket listo para aceptar nuevas conexiones de clientes" + +#: src/labels.h:297 +msgid "The following options can also be supplied to the command" +msgstr "Las siguientes opciones pueden ser ademas suplirse en el comando" + +#: src/labels.h:299 +msgid "Examples can be found by running" +msgstr "Ejemplos pueden encontrarse ejecutando" + +#: src/labels.h:302 +msgid "Server Statistics" +msgstr "Estadisticas de Servidor" + +#: src/labels.h:304 +msgid "Theme" +msgstr "Skin" + +#: src/labels.h:306 +msgid "Dark Gray" +msgstr "Gris Oscuro" + +#: src/labels.h:308 +msgid "Bright" +msgstr "Clara" + +#: src/labels.h:310 +msgid "Dark Blue" +msgstr "Azul Oscuro" + +#: src/labels.h:312 +#, fuzzy +msgid "Dark Purple" +msgstr "Azul Oscuro" + +#: src/labels.h:314 +msgid "Panels" +msgstr "Paneles" + +#: src/labels.h:316 +msgid "Items per Page" +msgstr "Items por pagina" + +#: src/labels.h:318 +msgid "Tables" +msgstr "Tablas" + +#: src/labels.h:320 +msgid "Display Tables" +msgstr "Mostrar Tablas" + +#: src/labels.h:322 +msgid "Auto-Hide on Small Devices" +msgstr "Auto-ocultar en Pequeños Dispositivos" + +#: src/labels.h:324 +msgid "Automatically hide tables on small screen devices" +msgstr "Automaticamente ocultar tablas en pequeños dispositivos" + +#: src/labels.h:326 +msgid "Layout" +msgstr "Diseño" + +#: src/labels.h:328 +msgid "Horizontal" +msgstr "Horizontal" + +#: src/labels.h:330 +msgid "Vertical" +msgstr "Vertical" + +#: src/labels.h:332 +msgid "File Options" +msgstr "Opciones de Archivo" + +#: src/labels.h:334 +msgid "Export as JSON" +msgstr "Exportar como JSON" + +#: src/labels.h:336 +msgid "Panel Options" +msgstr "Opciones de Panel" + +#: src/labels.h:338 +msgid "Previous" +msgstr "Anterior" + +#: src/labels.h:340 +msgid "Next" +msgstr "Siguiente" + +#: src/labels.h:342 +msgid "First" +msgstr "" + +#: src/labels.h:344 +msgid "Last" +msgstr "" + +#: src/labels.h:346 +msgid "Chart Options" +msgstr "Opciones de Grafico" + +#: src/labels.h:348 +msgid "Chart" +msgstr "Grafico" + +#: src/labels.h:350 +msgid "Type" +msgstr "Tipo" + +#: src/labels.h:352 +msgid "Area Spline" +msgstr "Area Ranura" + +#: src/labels.h:354 +msgid "Bar" +msgstr "Bar" + +#: src/labels.h:356 +msgid "Plot Metric" +msgstr "Trazado" + +#: src/labels.h:358 +msgid "Table Columns" +msgstr "Columnas de Tabla" + +#: src/labels.h:362 +msgid "1xx Informational" +msgstr "1xx Informativo" + +#: src/labels.h:364 +msgid "2xx Success" +msgstr "2xx Exito" + +#: src/labels.h:366 +msgid "3xx Redirection" +msgstr "3xx Redireccion" + +#: src/labels.h:368 +msgid "4xx Client Errors" +msgstr "4xx Errores de Cliente" + +#: src/labels.h:370 +msgid "5xx Server Errors" +msgstr "5xx Errores de Servidor" + +#: src/labels.h:373 +msgid "100 - Continue: Server received the initial part of the request" +msgstr "100 - Continuar: Servidor recibio la parte inicial de la peticion" + +#: src/labels.h:375 +msgid "101 - Switching Protocols: Client asked to switch protocols" +msgstr "101 - Cambiando Protocolos: Cliente pidio cambiar protocolos" + +#: src/labels.h:377 +msgid "200 - OK: The request sent by the client was successful" +msgstr "200 - OK: La peticion enviada por el cliente fue exitosa" + +#: src/labels.h:379 +msgid "201 - Created: The request has been fulfilled and created" +msgstr "201 - Creada: La peticion ha sido completada y creada" + +#: src/labels.h:381 +msgid "202 - Accepted: The request has been accepted for processing" +msgstr "202 - Aceptada: La peticion fue aceptada para procesar" + +#: src/labels.h:383 +msgid "203 - Non-authoritative Information: Response from a third party" +msgstr "203 - No-autoritario Informativo: Respuesta de una 3er. parte" + +#: src/labels.h:385 +msgid "204 - No Content: Request did not return any content" +msgstr "204 - Sin Contenido: Peticion no retorno ningun contenido" + +#: src/labels.h:387 +msgid "205 - Reset Content: Server asked the client to reset the document" +msgstr "" +"205 - Resetear Contenido: Servidor pidio al cliente resetear el documento" + +#: src/labels.h:389 +msgid "206 - Partial Content: The partial GET has been successful" +msgstr "206 - Contenido Parcial: el GET parcial fue exitoso" + +#: src/labels.h:391 +msgid "207 - Multi-Status: WebDAV; RFC 4918" +msgstr "207 - Multi-Estado: WebDAV; RFC 4918" + +#: src/labels.h:393 +msgid "208 - Already Reported: WebDAV; RFC 5842" +msgstr "208 - Ya Reportado: WebDAV; RFC 5842" + +#: src/labels.h:395 +msgid "300 - Multiple Choices: Multiple options for the resource" +msgstr "300 - Multiples Opciones: Multiples opciones para el recurso" + +#: src/labels.h:397 +msgid "301 - Moved Permanently: Resource has permanently moved" +msgstr "301 - Movido Permanente: Recurso ha sido permanentemente movido" + +#: src/labels.h:399 +msgid "302 - Moved Temporarily (redirect)" +msgstr "302 - Movido Temporalmente (redireccion)" + +#: src/labels.h:401 +msgid "303 - See Other Document: The response is at a different URI" +msgstr "303 - Ver Otro Documento: La respuesta es en una URI diferente" + +#: src/labels.h:403 +msgid "304 - Not Modified: Resource has not been modified" +msgstr "304 - No Modificado: Recurso no ha sido modificado" + +#: src/labels.h:405 +msgid "305 - Use Proxy: Can only be accessed through the proxy" +msgstr "305 - Usar Proxy: Puede ser accedido solo a traves de proxy" + +#: src/labels.h:407 +msgid "307 - Temporary Redirect: Resource temporarily moved" +msgstr "307 - Redireccion Temporal: Recurso movido temporalmente" + +#: src/labels.h:409 +msgid "400 - Bad Request: The syntax of the request is invalid" +msgstr "400 - Peticion Mala: La sintaxis de la peticion es invalida" + +#: src/labels.h:411 +msgid "401 - Unauthorized: Request needs user authentication" +msgstr "401 - Sin Autorizacion: Peticion necesita autenticacion de usuario" + +#: src/labels.h:413 +msgid "402 - Payment Required" +msgstr "402 - Pago Requerido" + +#: src/labels.h:415 +msgid "403 - Forbidden: Server is refusing to respond to it" +msgstr "403 - Prohibido: Servidor esta rechazando respuesta" + +#: src/labels.h:417 +msgid "404 - Not Found: Requested resource could not be found" +msgstr "404 - No Encontrado: Peticion de recurso no pudo encontrarse" + +#: src/labels.h:419 +msgid "405 - Method Not Allowed: Request method not supported" +msgstr "405 - Metodo No Permitido: Metodo de Peticion no soportado" + +#: src/labels.h:421 +msgid "406 - Not Acceptable" +msgstr "406 - No Aceptable" + +#: src/labels.h:423 +msgid "407 - Proxy Authentication Required" +msgstr "407 - Autenticacion de Proxy Requerida" + +#: src/labels.h:425 +msgid "408 - Request Timeout: Server timed out waiting for the request" +msgstr "408 - Timeout de Peticion: Tiempo agotado de espera para la solicitud" + +#: src/labels.h:427 +msgid "409 - Conflict: Conflict in the request" +msgstr "409 - Conflicto: Conflicto en la peticion" + +#: src/labels.h:429 +msgid "410 - Gone: Resource requested is no longer available" +msgstr "410 - Fue: Recurso requerido no esta mas disponible" + +#: src/labels.h:431 +msgid "411 - Length Required: Invalid Content-Length" +msgstr "411 - Longitud Requerida: Content-Length Invalido" + +#: src/labels.h:433 +msgid "412 - Precondition Failed: Server does not meet preconditions" +msgstr "412 - Precondicion Fallida: Servidor no cumple precondiciones" + +#: src/labels.h:435 +msgid "413 - Payload Too Large" +msgstr "413 - Carga Util Demasiado larga" + +#: src/labels.h:437 +msgid "414 - Request-URI Too Long" +msgstr "414 - Request-URI demasiado larga" + +#: src/labels.h:439 +msgid "415 - Unsupported Media Type: Media type is not supported" +msgstr "415 - Tipo de medios no soportado: El tipo de medios no es soportado" + +#: src/labels.h:441 +msgid "416 - Requested Range Not Satisfiable: Cannot supply that portion" +msgstr "416 - Rango requerido no satisfacible: No puede proveer esa porcion" + +#: src/labels.h:443 +msgid "417 - Expectation Failed" +msgstr "417 - Expectativa Fallida" + +#: src/labels.h:445 +msgid "421 - Misdirected Request" +msgstr "" + +#: src/labels.h:447 +msgid "422 - Unprocessable Entity due to semantic errors: WebDAV" +msgstr "" + +#: src/labels.h:449 +msgid "423 - The resource that is being accessed is locked" +msgstr "" + +#: src/labels.h:451 +msgid "424 - Failed Dependency: WebDAV" +msgstr "" + +#: src/labels.h:453 +msgid "426 - Upgrade Required: Client should switch to a different protocol" +msgstr "" + +#: src/labels.h:455 +#, fuzzy +msgid "428 - Precondition Required" +msgstr "402 - Pago Requerido" + +#: src/labels.h:457 +msgid "429 - Too Many Requests: The user has sent too many requests" +msgstr "" + +#: src/labels.h:459 +#, fuzzy +msgid "431 - Request Header Fields Too Large" +msgstr "494 - (Nginx) Cabecera de Peticion demasiada larga" + +#: src/labels.h:461 +msgid "451 - Unavailable For Legal Reasons" +msgstr "" + +#: src/labels.h:463 +msgid "444 - (Nginx) Connection closed without sending any headers" +msgstr "444 - (Nginx) Conexion cerrada sin enviar cabeceras" + +#: src/labels.h:465 +msgid "494 - (Nginx) Request Header Too Large" +msgstr "494 - (Nginx) Cabecera de Peticion demasiada larga" + +#: src/labels.h:467 +msgid "495 - (Nginx) SSL client certificate error" +msgstr "495 - (Nginx) Cliente SSL certificado erroneo" + +#: src/labels.h:469 +msgid "496 - (Nginx) Client didn't provide certificate" +msgstr "496 - (Nginx) Client no proveyo certificado" + +#: src/labels.h:471 +msgid "497 - (Nginx) HTTP request sent to HTTPS port" +msgstr "497 - (Nginx) Peticion HTTP enviada a puerto HTTPS" + +#: src/labels.h:473 +msgid "499 - (Nginx) Connection closed by client while processing request" +msgstr "499 - (Nginx) Conexion cerrada por cliente mientras procesaba peticion" + +#: src/labels.h:475 +msgid "500 - Internal Server Error" +msgstr "500 - Error Interno de Servidor" + +#: src/labels.h:477 +msgid "501 - Not Implemented" +msgstr "501 - No Implementado" + +#: src/labels.h:479 +msgid "502 - Bad Gateway: Received an invalid response from the upstream" +msgstr "502 - Entrada Erronea: Recibio respuesta invalida" + +#: src/labels.h:481 +msgid "503 - Service Unavailable: The server is currently unavailable" +msgstr "" +"503 - Servicio no disponible: El servidor actualmente no esta disponible" + +#: src/labels.h:483 +msgid "504 - Gateway Timeout: The upstream server failed to send request" +msgstr "" +"504 - Timeout de Gateway: El servidor upstream fallo al enviar peticion" + +#: src/labels.h:485 +msgid "505 - HTTP Version Not Supported" +msgstr "505 - Version HTTP no soportada" + +#: src/labels.h:487 +msgid "520 - CloudFlare - Web server is returning an unknown error" +msgstr "520 - CloudFlare - El servidor esta retornando un error desconocido" + +#: src/labels.h:489 +msgid "521 - CloudFlare - Web server is down" +msgstr "521 - CloudFlare - Servidor Web caido" + +#: src/labels.h:491 +msgid "522 - CloudFlare - Connection timed out" +msgstr "522 - CloudFlare - Tiempo de espera de conexion agotado " + +#: src/labels.h:493 +msgid "523 - CloudFlare - Origin is unreachable" +msgstr "523 - CloudFlare - Origen es inaccesible" + +#: src/labels.h:495 +msgid "524 - CloudFlare - A timeout occurred" +msgstr "524 - CloudFlare - Ocurrio cese de tiempo" + +#~ msgid "Bandwidth" +#~ msgstr "Ancho de Banda" + +#~ msgid "Unique Files" +#~ msgstr "Archivos Unicos" + +#~ msgid "Unique 404" +#~ msgstr "404 Unico" diff --git a/goaccess++/po/fr.gmo b/goaccess++/po/fr.gmo new file mode 100644 index 0000000000000000000000000000000000000000..c90f9b98deded02836f1d309e52fd2773922065b GIT binary patch literal 9094 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 KPs$(oAM?L4rrag~ literal 0 HcmV?d00001 diff --git a/goaccess++/po/fr.po b/goaccess++/po/fr.po new file mode 100644 index 0000000..e89e090 --- /dev/null +++ b/goaccess++/po/fr.po @@ -0,0 +1,904 @@ +# This file is distributed under the same license as the goaccess package. +# Nicolas P <np>, 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: goaccess 1.2\n" +"Report-Msgid-Bugs-To: hello@goaccess.io\n" +"POT-Creation-Date: 2018-11-22 23:38-0600\n" +"PO-Revision-Date: 2017-04-03 09:43+0200\n" +"Last-Translator: Nicolas P <np.pascal@gmail.com>\n" +"Language-Team: français\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Gtranslator 2.91.7\n" + +#: src/labels.h:40 +msgid "en" +msgstr "fr" + +#: src/labels.h:43 +msgid "Exp. Panel" +msgstr "Dev. Panneau" + +#: src/labels.h:44 +msgid "Help" +msgstr "Aide" + +#: src/labels.h:45 +msgid "Quit" +msgstr "Quitter" + +#: src/labels.h:46 +msgid "Total" +msgstr "Total" + +#: src/labels.h:49 +msgid "[x] ASC [ ] DESC" +msgstr "[x] ASC [ ] DESC" + +#: src/labels.h:50 +msgid "[ ] ASC [x] DESC" +msgstr "[ ] ASC [x] DESC" + +#: src/labels.h:53 +#, c-format +msgid "[Active Panel: %1$s]" +msgstr "" + +#: src/labels.h:54 +msgid "[q]uit GoAccess" +msgstr "" + +#: src/labels.h:55 +msgid "[?] Help [Enter] Exp. Panel" +msgstr "" + +#: src/labels.h:56 +msgid "Dashboard" +msgstr "Tableau de bord" + +#: src/labels.h:57 +msgid "Dashboard - Overall Analyzed Requests" +msgstr "Tableau de bord - Requêtes analysées, vue d'ensemble" + +#: src/labels.h:58 +msgid "Overall Analyzed Requests" +msgstr "Requêtes analysées, vue d'ensemble" + +#: src/labels.h:60 src/labels.h:81 +msgid "Tx. Amount" +msgstr "" + +#: src/labels.h:61 +msgid "Date/Time" +msgstr "Date/Heure" + +#: src/labels.h:62 +msgid "Excl. IP Hits" +msgstr "Excl. IP Hits" + +#: src/labels.h:63 +msgid "Failed Requests" +msgstr "Requêtes échouées" + +#: src/labels.h:64 +msgid "Init. Proc. Time" +msgstr "Init. Proc. Time" + +#: src/labels.h:65 +msgid "Log Size" +msgstr "Taille du log" + +#: src/labels.h:66 +msgid "Log Source" +msgstr "Fichier de log" + +#: src/labels.h:67 src/labels.h:174 +msgid "Referrers" +msgstr "Origine" + +#: src/labels.h:68 +msgid "Total Requests" +msgstr "Requêtes totales" + +#: src/labels.h:69 +msgid "Static Files" +msgstr "Fichiers statiques" + +#: src/labels.h:70 src/labels.h:146 +msgid "Not Found" +msgstr "Non Trouvé" + +#: src/labels.h:71 +#, fuzzy +msgid "Requested Files" +msgstr "Fichiers demandés (URLs)" + +#: src/labels.h:72 +msgid "Unique Visitors" +msgstr "Visiteurs uniques" + +#: src/labels.h:73 +msgid "Valid Requests" +msgstr "Requêtes valides" + +#: src/labels.h:76 +msgid "Hits" +msgstr "Hits" + +#: src/labels.h:77 +msgid "h%" +msgstr "" + +#: src/labels.h:78 src/labels.h:104 +msgid "Visitors" +msgstr "Visiteurs" + +#: src/labels.h:79 +msgid "Vis." +msgstr "Vis." + +#: src/labels.h:80 +msgid "v%" +msgstr "" + +#: src/labels.h:82 +msgid "Avg. T.S." +msgstr "Avg. T.S." + +#: src/labels.h:83 +msgid "Cum. T.S." +msgstr "Cum. T.S." + +#: src/labels.h:84 +msgid "Max. T.S." +msgstr "Max. T.S." + +#: src/labels.h:85 +msgid "Method" +msgstr "Méthode" + +#: src/labels.h:86 +msgid "Mtd" +msgstr "Mtd" + +#: src/labels.h:87 +msgid "Protocol" +msgstr "Protocole" + +#: src/labels.h:88 +msgid "Proto" +msgstr "Proto" + +#: src/labels.h:89 +msgid "City" +msgstr "Ville" + +#: src/labels.h:90 +msgid "Country" +msgstr "Pays" + +#: src/labels.h:91 +msgid "Hostname" +msgstr "Nom d'hôte" + +#: src/labels.h:92 +msgid "Data" +msgstr "Données" + +#: src/labels.h:94 +#, fuzzy +msgid "Hits/Visitors" +msgstr "Visiteurs" + +#: src/labels.h:98 +msgid "Unique visitors per day" +msgstr "Visiteurs uniques par jour" + +#: src/labels.h:100 +msgid "Unique visitors per day - Including spiders" +msgstr "Visiteurs uniques/jour - Y compris bots" + +#: src/labels.h:102 +msgid "Hits having the same IP, date and agent are a unique visit." +msgstr "" +"Les hits depuis la même IP, date et user-agent comptent comme visite unique" + +#: src/labels.h:107 +msgid "Requested Files (URLs)" +msgstr "Fichiers demandés (URLs)" + +#: src/labels.h:109 +msgid "Top requests sorted by hits [, avgts, cumts, maxts, mthd, proto]" +msgstr "Top des requêtes trié par hits [, avgts, cumts, maxts, mthd, proto]" + +#: src/labels.h:111 +msgid "Requests" +msgstr "Requêtes" + +#: src/labels.h:114 src/labels.h:118 +msgid "Static Requests" +msgstr "Requêtes statiques" + +#: src/labels.h:116 +msgid "Top static requests sorted by hits [, avgts, cumts, maxts, mthd, proto]" +msgstr "" +"Top des requêtes statiques trié par hits [, avgts, cumts, maxts, mthd, proto]" + +#: src/labels.h:121 +msgid "Time Distribution" +msgstr "Distribution temporelle" + +#: src/labels.h:123 +msgid "Data sorted by hour [, avgts, cumts, maxts]" +msgstr "Données triées par heure [, avgts, cumts, maxts]" + +#: src/labels.h:125 +msgid "Time" +msgstr "Temps" + +#: src/labels.h:128 src/labels.h:132 +msgid "Virtual Hosts" +msgstr "Hôtes virtuels" + +#: src/labels.h:130 src/labels.h:137 +msgid "Data sorted by hits [, avgts, cumts, maxts]" +msgstr "Données triées par hits [, avgts, cumts, maxts]" + +#: src/labels.h:135 +msgid "Remote User (HTTP authentication)" +msgstr "Utilisateur distant (authentification HTTP)" + +#: src/labels.h:139 +msgid "Remote User" +msgstr "Remote Utilisateur" + +#: src/labels.h:142 +msgid "Not Found URLs (404s)" +msgstr "URLs Non trouvées (404s)" + +#: src/labels.h:144 +msgid "Top not found URLs sorted by hits [, avgts, cumts, maxts, mthd, proto]" +msgstr "" +"Top des URLs non trouvées trié par hits [, avgts, cumts, maxts, mthd, proto]" + +#: src/labels.h:149 +msgid "Visitor Hostnames and IPs" +msgstr "Nom de machine et IPs des visiteurs" + +#: src/labels.h:151 +msgid "Top visitor hosts sorted by hits [, avgts, cumts, maxts]" +msgstr "Top des visiteurs trié par hits [, avgts, cumts, maxts]" + +#: src/labels.h:153 +msgid "Hosts" +msgstr "Hôtes" + +#: src/labels.h:156 +msgid "Operating Systems" +msgstr "Systèmes d'exploitation" + +#: src/labels.h:158 +msgid "Top Operating Systems sorted by hits [, avgts, cumts, maxts]" +msgstr "Top des SE trié par hits [, avgts, cumts, maxts]" + +#: src/labels.h:160 +msgid "OS" +msgstr "SE" + +#: src/labels.h:163 src/labels.h:167 +msgid "Browsers" +msgstr "Navigateurs" + +#: src/labels.h:165 +msgid "Top Browsers sorted by hits [, avgts, cumts, maxts]" +msgstr "Top des Navigateurs trié par hits [, avgts, cumts, maxts]" + +#: src/labels.h:170 +msgid "Referrers URLs" +msgstr "URLs d'origine" + +#: src/labels.h:172 +msgid "Top Requested Referrers sorted by hits [, avgts, cumts, maxts]" +msgstr "Top des URLs d'origine trié par hits [, avgts, cumts, maxts]" + +#: src/labels.h:177 src/labels.h:181 +msgid "Referring Sites" +msgstr "Sites d'origine" + +#: src/labels.h:179 +msgid "Top Referring Sites sorted by hits [, avgts, cumts, maxts]" +msgstr "Top des sites d'origine trié par hits [, avgts, cumts, maxts]" + +#: src/labels.h:184 +msgid "Keyphrases from Google's search engine" +msgstr "Mot-clés Google" + +#: src/labels.h:186 +msgid "Top Keyphrases sorted by hits [, avgts, cumts, maxts]" +msgstr "Top des Mot-clés trié par hits [, avgts, cumts, maxts]" + +#: src/labels.h:188 +msgid "Keyphrases" +msgstr "Mot-clés" + +#: src/labels.h:191 src/labels.h:195 +msgid "Geo Location" +msgstr "Géo Localisation" + +#: src/labels.h:193 +msgid "Continent > Country sorted by unique hits [, avgts, cumts, maxts]" +msgstr "Continent > Pays trié par hits unique [, avgts, cumts, maxts]" + +#: src/labels.h:198 +msgid "HTTP Status Codes" +msgstr "Status HTTP" + +#: src/labels.h:200 +msgid "Top HTTP Status Codes sorted by hits [, avgts, cumts, maxts]" +msgstr "Top des status HTTP trié par hits [, avgts, cumts, maxts]" + +#: src/labels.h:202 +msgid "Status Codes" +msgstr "Status HTTP" + +#: src/labels.h:206 +msgid "[ ] case sensitive" +msgstr "[ ] sensible à la casse" + +#: src/labels.h:208 +msgid "[x] case sensitive" +msgstr "[x] sensible à la casse" + +#: src/labels.h:210 +msgid "Regex allowed - ^g to cancel - TAB switch case" +msgstr "Regex OK - ^g pour annuler - TAB pour changer la casse" + +#: src/labels.h:212 +msgid "Find pattern in all views" +msgstr "Trouver tous les motifs dans toutes les vues" + +#: src/labels.h:216 +msgid "Log Format Configuration" +msgstr "" + +#: src/labels.h:218 +msgid "[SPACE] to toggle - [ENTER] to proceed - [q] to quit" +msgstr "" + +#: src/labels.h:220 +msgid "Log Format - [c] to add/edit format" +msgstr "" + +#: src/labels.h:222 +msgid "Date Format - [d] to add/edit format" +msgstr "" + +#: src/labels.h:224 +msgid "Time Format - [t] to add/edit format" +msgstr "" + +#: src/labels.h:226 src/labels.h:230 +msgid "[UP/DOWN] to scroll - [q] to close window" +msgstr "" + +#: src/labels.h:232 +#, c-format +msgid "User Agents for %1$s" +msgstr "" + +#: src/labels.h:236 +msgid "Scheme Configuration" +msgstr "" + +#: src/labels.h:238 +msgid "[ENTER] to use scheme - [q]uit" +msgstr "" + +#: src/labels.h:242 +msgid "Sort active module by" +msgstr "" + +#: src/labels.h:244 +msgid "[ENTER] select - [TAB] sort - [q]uit" +msgstr "" + +#: src/labels.h:248 +msgid "GoAccess Quick Help" +msgstr "" + +#: src/labels.h:250 +msgid "[UP/DOWN] to scroll - [q] to quit" +msgstr "" + +#: src/labels.h:254 +msgid "Built using Tokyo Cabinet on-disk B+ Tree." +msgstr "Construit sur le disque en arbre B+ en utilisant Tokyo Cabinet." + +#: src/labels.h:256 +msgid "Built using Tokyo Cabinet in-memory hash database." +msgstr "" +"Construit en mémoire avec une base de données de la table de hachage en " +"utilisant Tokyo Cabinet" + +#: src/labels.h:258 +msgid "Built using the default in-memory hash database." +msgstr "" +"Construit par défaut en mémoire avec une base de données de la table de " +"hachage" + +#: src/labels.h:262 +msgid "Format Errors - Verify your log/date/time format" +msgstr "Erreurs de format - Vérifiez votre format de journal / date / heure" + +#: src/labels.h:264 +msgid "No date format was found on your conf file." +msgstr "Aucun format de date n'a été trouvé sur votre fichier conf." + +#: src/labels.h:266 +msgid "No log format was found on your conf file." +msgstr "Aucun format de journal n'a été trouvé sur votre fichier conf." + +#: src/labels.h:268 +msgid "No time format was found on your conf file." +msgstr "Aucun format de journal n'a été trouvé sur votre fichier conf." + +#: src/labels.h:270 +msgid "No default config file found." +msgstr "Aucun fichier de configuration par défaut trouvé." + +#: src/labels.h:272 +msgid "You may specify one with" +msgstr "Vous pouvez en préciser un avec" + +#: src/labels.h:274 +msgid "producing the following errors" +msgstr "produisant les erreurs suivantes" + +#: src/labels.h:276 +#, c-format +msgid "Parsed %1$d lines" +msgstr "Analysé %1$d lignes" + +#: src/labels.h:278 +msgid "Please report it by opening an issue on GitHub" +msgstr "Si vous plaît, rapporter cela en ouvrant un probleme sur GitHub" + +#: src/labels.h:280 +msgid "Select a time format." +msgstr "" + +#: src/labels.h:282 +msgid "Select a date format." +msgstr "" + +#: src/labels.h:284 +msgid "Select a log format." +msgstr "" + +#: src/labels.h:286 +#, c-format +msgid "'%1$s' panel is disabled" +msgstr "" + +#: src/labels.h:290 +msgid "For more details visit" +msgstr "Pour plus de détails, visitez" + +#: src/labels.h:292 +msgid "Last Updated" +msgstr "Dernière mise à jour" + +#: src/labels.h:294 +msgid "WebSocket server ready to accept new client connections" +msgstr "WebSocket serveur prêt à accepter les nouvelles connexions client" + +#: src/labels.h:297 +msgid "The following options can also be supplied to the command" +msgstr "Les options suivantes peuvent également être fournies à la commande" + +#: src/labels.h:299 +msgid "Examples can be found by running" +msgstr "Des exemples peuvent être trouvés en cours d'exécution" + +#: src/labels.h:302 +msgid "Server Statistics" +msgstr "Statistiques du serveur" + +#: src/labels.h:304 +msgid "Theme" +msgstr "Thème" + +#: src/labels.h:306 +msgid "Dark Gray" +msgstr "Gris foncé" + +#: src/labels.h:308 +msgid "Bright" +msgstr "Brillant" + +#: src/labels.h:310 +msgid "Dark Blue" +msgstr "Bleu foncé" + +#: src/labels.h:312 +#, fuzzy +msgid "Dark Purple" +msgstr "Bleu foncé" + +#: src/labels.h:314 +msgid "Panels" +msgstr "Panneaux" + +#: src/labels.h:316 +msgid "Items per Page" +msgstr "Objets par page" + +#: src/labels.h:318 +msgid "Tables" +msgstr "Tableaux" + +#: src/labels.h:320 +msgid "Display Tables" +msgstr "Afficher les tableaux" + +#: src/labels.h:322 +msgid "Auto-Hide on Small Devices" +msgstr "Masquage-auto/Petits appareils" + +#: src/labels.h:324 +msgid "Automatically hide tables on small screen devices" +msgstr "" +"Masquer automatiquement les tableaux sur les appareils avec un petit écran" + +#: src/labels.h:326 +msgid "Layout" +msgstr "Disposition" + +#: src/labels.h:328 +msgid "Horizontal" +msgstr "Horizontal" + +#: src/labels.h:330 +msgid "Vertical" +msgstr "Verticale" + +#: src/labels.h:332 +msgid "File Options" +msgstr "Options de fichier" + +#: src/labels.h:334 +msgid "Export as JSON" +msgstr "Exporter en tant que JSON" + +#: src/labels.h:336 +msgid "Panel Options" +msgstr "Options du panneau" + +#: src/labels.h:338 +msgid "Previous" +msgstr "Précédent" + +#: src/labels.h:340 +msgid "Next" +msgstr "Suivant" + +#: src/labels.h:342 +msgid "First" +msgstr "" + +#: src/labels.h:344 +msgid "Last" +msgstr "" + +#: src/labels.h:346 +msgid "Chart Options" +msgstr "Options du graphique" + +#: src/labels.h:348 +msgid "Chart" +msgstr "Graphique" + +#: src/labels.h:350 +msgid "Type" +msgstr "Type" + +#: src/labels.h:352 +msgid "Area Spline" +msgstr "Courbe vectorielle" + +#: src/labels.h:354 +msgid "Bar" +msgstr "Barre" + +#: src/labels.h:356 +msgid "Plot Metric" +msgstr "Tracé métrique" + +#: src/labels.h:358 +msgid "Table Columns" +msgstr "Colonnes de tableau" + +#: src/labels.h:362 +msgid "1xx Informational" +msgstr "" + +#: src/labels.h:364 +msgid "2xx Success" +msgstr "" + +#: src/labels.h:366 +msgid "3xx Redirection" +msgstr "" + +#: src/labels.h:368 +msgid "4xx Client Errors" +msgstr "" + +#: src/labels.h:370 +msgid "5xx Server Errors" +msgstr "" + +#: src/labels.h:373 +msgid "100 - Continue: Server received the initial part of the request" +msgstr "" + +#: src/labels.h:375 +msgid "101 - Switching Protocols: Client asked to switch protocols" +msgstr "" + +#: src/labels.h:377 +msgid "200 - OK: The request sent by the client was successful" +msgstr "" + +#: src/labels.h:379 +msgid "201 - Created: The request has been fulfilled and created" +msgstr "" + +#: src/labels.h:381 +msgid "202 - Accepted: The request has been accepted for processing" +msgstr "" + +#: src/labels.h:383 +msgid "203 - Non-authoritative Information: Response from a third party" +msgstr "" + +#: src/labels.h:385 +msgid "204 - No Content: Request did not return any content" +msgstr "" + +#: src/labels.h:387 +msgid "205 - Reset Content: Server asked the client to reset the document" +msgstr "" + +#: src/labels.h:389 +msgid "206 - Partial Content: The partial GET has been successful" +msgstr "" + +#: src/labels.h:391 +msgid "207 - Multi-Status: WebDAV; RFC 4918" +msgstr "" + +#: src/labels.h:393 +msgid "208 - Already Reported: WebDAV; RFC 5842" +msgstr "" + +#: src/labels.h:395 +msgid "300 - Multiple Choices: Multiple options for the resource" +msgstr "" + +#: src/labels.h:397 +msgid "301 - Moved Permanently: Resource has permanently moved" +msgstr "" + +#: src/labels.h:399 +msgid "302 - Moved Temporarily (redirect)" +msgstr "" + +#: src/labels.h:401 +msgid "303 - See Other Document: The response is at a different URI" +msgstr "" + +#: src/labels.h:403 +msgid "304 - Not Modified: Resource has not been modified" +msgstr "" + +#: src/labels.h:405 +msgid "305 - Use Proxy: Can only be accessed through the proxy" +msgstr "" + +#: src/labels.h:407 +msgid "307 - Temporary Redirect: Resource temporarily moved" +msgstr "" + +#: src/labels.h:409 +msgid "400 - Bad Request: The syntax of the request is invalid" +msgstr "" + +#: src/labels.h:411 +msgid "401 - Unauthorized: Request needs user authentication" +msgstr "" + +#: src/labels.h:413 +msgid "402 - Payment Required" +msgstr "" + +#: src/labels.h:415 +msgid "403 - Forbidden: Server is refusing to respond to it" +msgstr "" + +#: src/labels.h:417 +msgid "404 - Not Found: Requested resource could not be found" +msgstr "" + +#: src/labels.h:419 +msgid "405 - Method Not Allowed: Request method not supported" +msgstr "" + +#: src/labels.h:421 +msgid "406 - Not Acceptable" +msgstr "" + +#: src/labels.h:423 +msgid "407 - Proxy Authentication Required" +msgstr "" + +#: src/labels.h:425 +msgid "408 - Request Timeout: Server timed out waiting for the request" +msgstr "" + +#: src/labels.h:427 +msgid "409 - Conflict: Conflict in the request" +msgstr "" + +#: src/labels.h:429 +msgid "410 - Gone: Resource requested is no longer available" +msgstr "" + +#: src/labels.h:431 +msgid "411 - Length Required: Invalid Content-Length" +msgstr "" + +#: src/labels.h:433 +msgid "412 - Precondition Failed: Server does not meet preconditions" +msgstr "" + +#: src/labels.h:435 +msgid "413 - Payload Too Large" +msgstr "" + +#: src/labels.h:437 +msgid "414 - Request-URI Too Long" +msgstr "" + +#: src/labels.h:439 +msgid "415 - Unsupported Media Type: Media type is not supported" +msgstr "" + +#: src/labels.h:441 +msgid "416 - Requested Range Not Satisfiable: Cannot supply that portion" +msgstr "" + +#: src/labels.h:443 +msgid "417 - Expectation Failed" +msgstr "" + +#: src/labels.h:445 +msgid "421 - Misdirected Request" +msgstr "" + +#: src/labels.h:447 +msgid "422 - Unprocessable Entity due to semantic errors: WebDAV" +msgstr "" + +#: src/labels.h:449 +msgid "423 - The resource that is being accessed is locked" +msgstr "" + +#: src/labels.h:451 +msgid "424 - Failed Dependency: WebDAV" +msgstr "" + +#: src/labels.h:453 +msgid "426 - Upgrade Required: Client should switch to a different protocol" +msgstr "" + +#: src/labels.h:455 +msgid "428 - Precondition Required" +msgstr "" + +#: src/labels.h:457 +msgid "429 - Too Many Requests: The user has sent too many requests" +msgstr "" + +#: src/labels.h:459 +msgid "431 - Request Header Fields Too Large" +msgstr "" + +#: src/labels.h:461 +msgid "451 - Unavailable For Legal Reasons" +msgstr "" + +#: src/labels.h:463 +msgid "444 - (Nginx) Connection closed without sending any headers" +msgstr "" + +#: src/labels.h:465 +msgid "494 - (Nginx) Request Header Too Large" +msgstr "" + +#: src/labels.h:467 +msgid "495 - (Nginx) SSL client certificate error" +msgstr "" + +#: src/labels.h:469 +msgid "496 - (Nginx) Client didn't provide certificate" +msgstr "" + +#: src/labels.h:471 +msgid "497 - (Nginx) HTTP request sent to HTTPS port" +msgstr "" + +#: src/labels.h:473 +msgid "499 - (Nginx) Connection closed by client while processing request" +msgstr "" + +#: src/labels.h:475 +msgid "500 - Internal Server Error" +msgstr "" + +#: src/labels.h:477 +msgid "501 - Not Implemented" +msgstr "" + +#: src/labels.h:479 +msgid "502 - Bad Gateway: Received an invalid response from the upstream" +msgstr "" + +#: src/labels.h:481 +msgid "503 - Service Unavailable: The server is currently unavailable" +msgstr "" + +#: src/labels.h:483 +msgid "504 - Gateway Timeout: The upstream server failed to send request" +msgstr "" + +#: src/labels.h:485 +msgid "505 - HTTP Version Not Supported" +msgstr "" + +#: src/labels.h:487 +msgid "520 - CloudFlare - Web server is returning an unknown error" +msgstr "" + +#: src/labels.h:489 +msgid "521 - CloudFlare - Web server is down" +msgstr "" + +#: src/labels.h:491 +msgid "522 - CloudFlare - Connection timed out" +msgstr "" + +#: src/labels.h:493 +msgid "523 - CloudFlare - Origin is unreachable" +msgstr "" + +#: src/labels.h:495 +msgid "524 - CloudFlare - A timeout occurred" +msgstr "" + +#~ msgid "Bandwidth" +#~ msgstr "Bande passante" + +#~ msgid "Unique Files" +#~ msgstr "Fichiers uniques" + +#~ msgid "Unique 404" +#~ msgstr "Unique 404" + +#~ msgid " - Including spiders" +#~ msgstr "- Inclus robots d'indexation" diff --git a/goaccess++/po/goaccess.pot b/goaccess++/po/goaccess.pot new file mode 100644 index 0000000..f107298 --- /dev/null +++ b/goaccess++/po/goaccess.pot @@ -0,0 +1,882 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Free Software Foundation, Inc. +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: goaccess 1.3\n" +"Report-Msgid-Bugs-To: hello@goaccess.io\n" +"POT-Creation-Date: 2018-11-22 23:38-0600\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/labels.h:40 +msgid "en" +msgstr "" + +#: src/labels.h:43 +msgid "Exp. Panel" +msgstr "" + +#: src/labels.h:44 +msgid "Help" +msgstr "" + +#: src/labels.h:45 +msgid "Quit" +msgstr "" + +#: src/labels.h:46 +msgid "Total" +msgstr "" + +#: src/labels.h:49 +msgid "[x] ASC [ ] DESC" +msgstr "" + +#: src/labels.h:50 +msgid "[ ] ASC [x] DESC" +msgstr "" + +#: src/labels.h:53 +#, c-format +msgid "[Active Panel: %1$s]" +msgstr "" + +#: src/labels.h:54 +msgid "[q]uit GoAccess" +msgstr "" + +#: src/labels.h:55 +msgid "[?] Help [Enter] Exp. Panel" +msgstr "" + +#: src/labels.h:56 +msgid "Dashboard" +msgstr "" + +#: src/labels.h:57 +msgid "Dashboard - Overall Analyzed Requests" +msgstr "" + +#: src/labels.h:58 +msgid "Overall Analyzed Requests" +msgstr "" + +#: src/labels.h:60 src/labels.h:81 +msgid "Tx. Amount" +msgstr "" + +#: src/labels.h:61 +msgid "Date/Time" +msgstr "" + +#: src/labels.h:62 +msgid "Excl. IP Hits" +msgstr "" + +#: src/labels.h:63 +msgid "Failed Requests" +msgstr "" + +#: src/labels.h:64 +msgid "Init. Proc. Time" +msgstr "" + +#: src/labels.h:65 +msgid "Log Size" +msgstr "" + +#: src/labels.h:66 +msgid "Log Source" +msgstr "" + +#: src/labels.h:67 src/labels.h:174 +msgid "Referrers" +msgstr "" + +#: src/labels.h:68 +msgid "Total Requests" +msgstr "" + +#: src/labels.h:69 +msgid "Static Files" +msgstr "" + +#: src/labels.h:70 src/labels.h:146 +msgid "Not Found" +msgstr "" + +#: src/labels.h:71 +msgid "Requested Files" +msgstr "" + +#: src/labels.h:72 +msgid "Unique Visitors" +msgstr "" + +#: src/labels.h:73 +msgid "Valid Requests" +msgstr "" + +#: src/labels.h:76 +msgid "Hits" +msgstr "" + +#: src/labels.h:77 +msgid "h%" +msgstr "" + +#: src/labels.h:78 src/labels.h:104 +msgid "Visitors" +msgstr "" + +#: src/labels.h:79 +msgid "Vis." +msgstr "" + +#: src/labels.h:80 +msgid "v%" +msgstr "" + +#: src/labels.h:82 +msgid "Avg. T.S." +msgstr "" + +#: src/labels.h:83 +msgid "Cum. T.S." +msgstr "" + +#: src/labels.h:84 +msgid "Max. T.S." +msgstr "" + +#: src/labels.h:85 +msgid "Method" +msgstr "" + +#: src/labels.h:86 +msgid "Mtd" +msgstr "" + +#: src/labels.h:87 +msgid "Protocol" +msgstr "" + +#: src/labels.h:88 +msgid "Proto" +msgstr "" + +#: src/labels.h:89 +msgid "City" +msgstr "" + +#: src/labels.h:90 +msgid "Country" +msgstr "" + +#: src/labels.h:91 +msgid "Hostname" +msgstr "" + +#: src/labels.h:92 +msgid "Data" +msgstr "" + +#: src/labels.h:94 +msgid "Hits/Visitors" +msgstr "" + +#: src/labels.h:98 +msgid "Unique visitors per day" +msgstr "" + +#: src/labels.h:100 +msgid "Unique visitors per day - Including spiders" +msgstr "" + +#: src/labels.h:102 +msgid "Hits having the same IP, date and agent are a unique visit." +msgstr "" + +#: src/labels.h:107 +msgid "Requested Files (URLs)" +msgstr "" + +#: src/labels.h:109 +msgid "Top requests sorted by hits [, avgts, cumts, maxts, mthd, proto]" +msgstr "" + +#: src/labels.h:111 +msgid "Requests" +msgstr "" + +#: src/labels.h:114 src/labels.h:118 +msgid "Static Requests" +msgstr "" + +#: src/labels.h:116 +msgid "Top static requests sorted by hits [, avgts, cumts, maxts, mthd, proto]" +msgstr "" + +#: src/labels.h:121 +msgid "Time Distribution" +msgstr "" + +#: src/labels.h:123 +msgid "Data sorted by hour [, avgts, cumts, maxts]" +msgstr "" + +#: src/labels.h:125 +msgid "Time" +msgstr "" + +#: src/labels.h:128 src/labels.h:132 +msgid "Virtual Hosts" +msgstr "" + +#: src/labels.h:130 src/labels.h:137 +msgid "Data sorted by hits [, avgts, cumts, maxts]" +msgstr "" + +#: src/labels.h:135 +msgid "Remote User (HTTP authentication)" +msgstr "" + +#: src/labels.h:139 +msgid "Remote User" +msgstr "" + +#: src/labels.h:142 +msgid "Not Found URLs (404s)" +msgstr "" + +#: src/labels.h:144 +msgid "Top not found URLs sorted by hits [, avgts, cumts, maxts, mthd, proto]" +msgstr "" + +#: src/labels.h:149 +msgid "Visitor Hostnames and IPs" +msgstr "" + +#: src/labels.h:151 +msgid "Top visitor hosts sorted by hits [, avgts, cumts, maxts]" +msgstr "" + +#: src/labels.h:153 +msgid "Hosts" +msgstr "" + +#: src/labels.h:156 +msgid "Operating Systems" +msgstr "" + +#: src/labels.h:158 +msgid "Top Operating Systems sorted by hits [, avgts, cumts, maxts]" +msgstr "" + +#: src/labels.h:160 +msgid "OS" +msgstr "" + +#: src/labels.h:163 src/labels.h:167 +msgid "Browsers" +msgstr "" + +#: src/labels.h:165 +msgid "Top Browsers sorted by hits [, avgts, cumts, maxts]" +msgstr "" + +#: src/labels.h:170 +msgid "Referrers URLs" +msgstr "" + +#: src/labels.h:172 +msgid "Top Requested Referrers sorted by hits [, avgts, cumts, maxts]" +msgstr "" + +#: src/labels.h:177 src/labels.h:181 +msgid "Referring Sites" +msgstr "" + +#: src/labels.h:179 +msgid "Top Referring Sites sorted by hits [, avgts, cumts, maxts]" +msgstr "" + +#: src/labels.h:184 +msgid "Keyphrases from Google's search engine" +msgstr "" + +#: src/labels.h:186 +msgid "Top Keyphrases sorted by hits [, avgts, cumts, maxts]" +msgstr "" + +#: src/labels.h:188 +msgid "Keyphrases" +msgstr "" + +#: src/labels.h:191 src/labels.h:195 +msgid "Geo Location" +msgstr "" + +#: src/labels.h:193 +msgid "Continent > Country sorted by unique hits [, avgts, cumts, maxts]" +msgstr "" + +#: src/labels.h:198 +msgid "HTTP Status Codes" +msgstr "" + +#: src/labels.h:200 +msgid "Top HTTP Status Codes sorted by hits [, avgts, cumts, maxts]" +msgstr "" + +#: src/labels.h:202 +msgid "Status Codes" +msgstr "" + +#: src/labels.h:206 +msgid "[ ] case sensitive" +msgstr "" + +#: src/labels.h:208 +msgid "[x] case sensitive" +msgstr "" + +#: src/labels.h:210 +msgid "Regex allowed - ^g to cancel - TAB switch case" +msgstr "" + +#: src/labels.h:212 +msgid "Find pattern in all views" +msgstr "" + +#: src/labels.h:216 +msgid "Log Format Configuration" +msgstr "" + +#: src/labels.h:218 +msgid "[SPACE] to toggle - [ENTER] to proceed - [q] to quit" +msgstr "" + +#: src/labels.h:220 +msgid "Log Format - [c] to add/edit format" +msgstr "" + +#: src/labels.h:222 +msgid "Date Format - [d] to add/edit format" +msgstr "" + +#: src/labels.h:224 +msgid "Time Format - [t] to add/edit format" +msgstr "" + +#: src/labels.h:226 src/labels.h:230 +msgid "[UP/DOWN] to scroll - [q] to close window" +msgstr "" + +#: src/labels.h:232 +#, c-format +msgid "User Agents for %1$s" +msgstr "" + +#: src/labels.h:236 +msgid "Scheme Configuration" +msgstr "" + +#: src/labels.h:238 +msgid "[ENTER] to use scheme - [q]uit" +msgstr "" + +#: src/labels.h:242 +msgid "Sort active module by" +msgstr "" + +#: src/labels.h:244 +msgid "[ENTER] select - [TAB] sort - [q]uit" +msgstr "" + +#: src/labels.h:248 +msgid "GoAccess Quick Help" +msgstr "" + +#: src/labels.h:250 +msgid "[UP/DOWN] to scroll - [q] to quit" +msgstr "" + +#: src/labels.h:254 +msgid "Built using Tokyo Cabinet on-disk B+ Tree." +msgstr "" + +#: src/labels.h:256 +msgid "Built using Tokyo Cabinet in-memory hash database." +msgstr "" + +#: src/labels.h:258 +msgid "Built using the default in-memory hash database." +msgstr "" + +#: src/labels.h:262 +msgid "Format Errors - Verify your log/date/time format" +msgstr "" + +#: src/labels.h:264 +msgid "No date format was found on your conf file." +msgstr "" + +#: src/labels.h:266 +msgid "No log format was found on your conf file." +msgstr "" + +#: src/labels.h:268 +msgid "No time format was found on your conf file." +msgstr "" + +#: src/labels.h:270 +msgid "No default config file found." +msgstr "" + +#: src/labels.h:272 +msgid "You may specify one with" +msgstr "" + +#: src/labels.h:274 +msgid "producing the following errors" +msgstr "" + +#: src/labels.h:276 +#, c-format +msgid "Parsed %1$d lines" +msgstr "" + +#: src/labels.h:278 +msgid "Please report it by opening an issue on GitHub" +msgstr "" + +#: src/labels.h:280 +msgid "Select a time format." +msgstr "" + +#: src/labels.h:282 +msgid "Select a date format." +msgstr "" + +#: src/labels.h:284 +msgid "Select a log format." +msgstr "" + +#: src/labels.h:286 +#, c-format +msgid "'%1$s' panel is disabled" +msgstr "" + +#: src/labels.h:290 +msgid "For more details visit" +msgstr "" + +#: src/labels.h:292 +msgid "Last Updated" +msgstr "" + +#: src/labels.h:294 +msgid "WebSocket server ready to accept new client connections" +msgstr "" + +#: src/labels.h:297 +msgid "The following options can also be supplied to the command" +msgstr "" + +#: src/labels.h:299 +msgid "Examples can be found by running" +msgstr "" + +#: src/labels.h:302 +msgid "Server Statistics" +msgstr "" + +#: src/labels.h:304 +msgid "Theme" +msgstr "" + +#: src/labels.h:306 +msgid "Dark Gray" +msgstr "" + +#: src/labels.h:308 +msgid "Bright" +msgstr "" + +#: src/labels.h:310 +msgid "Dark Blue" +msgstr "" + +#: src/labels.h:312 +msgid "Dark Purple" +msgstr "" + +#: src/labels.h:314 +msgid "Panels" +msgstr "" + +#: src/labels.h:316 +msgid "Items per Page" +msgstr "" + +#: src/labels.h:318 +msgid "Tables" +msgstr "" + +#: src/labels.h:320 +msgid "Display Tables" +msgstr "" + +#: src/labels.h:322 +msgid "Auto-Hide on Small Devices" +msgstr "" + +#: src/labels.h:324 +msgid "Automatically hide tables on small screen devices" +msgstr "" + +#: src/labels.h:326 +msgid "Layout" +msgstr "" + +#: src/labels.h:328 +msgid "Horizontal" +msgstr "" + +#: src/labels.h:330 +msgid "Vertical" +msgstr "" + +#: src/labels.h:332 +msgid "File Options" +msgstr "" + +#: src/labels.h:334 +msgid "Export as JSON" +msgstr "" + +#: src/labels.h:336 +msgid "Panel Options" +msgstr "" + +#: src/labels.h:338 +msgid "Previous" +msgstr "" + +#: src/labels.h:340 +msgid "Next" +msgstr "" + +#: src/labels.h:342 +msgid "First" +msgstr "" + +#: src/labels.h:344 +msgid "Last" +msgstr "" + +#: src/labels.h:346 +msgid "Chart Options" +msgstr "" + +#: src/labels.h:348 +msgid "Chart" +msgstr "" + +#: src/labels.h:350 +msgid "Type" +msgstr "" + +#: src/labels.h:352 +msgid "Area Spline" +msgstr "" + +#: src/labels.h:354 +msgid "Bar" +msgstr "" + +#: src/labels.h:356 +msgid "Plot Metric" +msgstr "" + +#: src/labels.h:358 +msgid "Table Columns" +msgstr "" + +#: src/labels.h:362 +msgid "1xx Informational" +msgstr "" + +#: src/labels.h:364 +msgid "2xx Success" +msgstr "" + +#: src/labels.h:366 +msgid "3xx Redirection" +msgstr "" + +#: src/labels.h:368 +msgid "4xx Client Errors" +msgstr "" + +#: src/labels.h:370 +msgid "5xx Server Errors" +msgstr "" + +#: src/labels.h:373 +msgid "100 - Continue: Server received the initial part of the request" +msgstr "" + +#: src/labels.h:375 +msgid "101 - Switching Protocols: Client asked to switch protocols" +msgstr "" + +#: src/labels.h:377 +msgid "200 - OK: The request sent by the client was successful" +msgstr "" + +#: src/labels.h:379 +msgid "201 - Created: The request has been fulfilled and created" +msgstr "" + +#: src/labels.h:381 +msgid "202 - Accepted: The request has been accepted for processing" +msgstr "" + +#: src/labels.h:383 +msgid "203 - Non-authoritative Information: Response from a third party" +msgstr "" + +#: src/labels.h:385 +msgid "204 - No Content: Request did not return any content" +msgstr "" + +#: src/labels.h:387 +msgid "205 - Reset Content: Server asked the client to reset the document" +msgstr "" + +#: src/labels.h:389 +msgid "206 - Partial Content: The partial GET has been successful" +msgstr "" + +#: src/labels.h:391 +msgid "207 - Multi-Status: WebDAV; RFC 4918" +msgstr "" + +#: src/labels.h:393 +msgid "208 - Already Reported: WebDAV; RFC 5842" +msgstr "" + +#: src/labels.h:395 +msgid "300 - Multiple Choices: Multiple options for the resource" +msgstr "" + +#: src/labels.h:397 +msgid "301 - Moved Permanently: Resource has permanently moved" +msgstr "" + +#: src/labels.h:399 +msgid "302 - Moved Temporarily (redirect)" +msgstr "" + +#: src/labels.h:401 +msgid "303 - See Other Document: The response is at a different URI" +msgstr "" + +#: src/labels.h:403 +msgid "304 - Not Modified: Resource has not been modified" +msgstr "" + +#: src/labels.h:405 +msgid "305 - Use Proxy: Can only be accessed through the proxy" +msgstr "" + +#: src/labels.h:407 +msgid "307 - Temporary Redirect: Resource temporarily moved" +msgstr "" + +#: src/labels.h:409 +msgid "400 - Bad Request: The syntax of the request is invalid" +msgstr "" + +#: src/labels.h:411 +msgid "401 - Unauthorized: Request needs user authentication" +msgstr "" + +#: src/labels.h:413 +msgid "402 - Payment Required" +msgstr "" + +#: src/labels.h:415 +msgid "403 - Forbidden: Server is refusing to respond to it" +msgstr "" + +#: src/labels.h:417 +msgid "404 - Not Found: Requested resource could not be found" +msgstr "" + +#: src/labels.h:419 +msgid "405 - Method Not Allowed: Request method not supported" +msgstr "" + +#: src/labels.h:421 +msgid "406 - Not Acceptable" +msgstr "" + +#: src/labels.h:423 +msgid "407 - Proxy Authentication Required" +msgstr "" + +#: src/labels.h:425 +msgid "408 - Request Timeout: Server timed out waiting for the request" +msgstr "" + +#: src/labels.h:427 +msgid "409 - Conflict: Conflict in the request" +msgstr "" + +#: src/labels.h:429 +msgid "410 - Gone: Resource requested is no longer available" +msgstr "" + +#: src/labels.h:431 +msgid "411 - Length Required: Invalid Content-Length" +msgstr "" + +#: src/labels.h:433 +msgid "412 - Precondition Failed: Server does not meet preconditions" +msgstr "" + +#: src/labels.h:435 +msgid "413 - Payload Too Large" +msgstr "" + +#: src/labels.h:437 +msgid "414 - Request-URI Too Long" +msgstr "" + +#: src/labels.h:439 +msgid "415 - Unsupported Media Type: Media type is not supported" +msgstr "" + +#: src/labels.h:441 +msgid "416 - Requested Range Not Satisfiable: Cannot supply that portion" +msgstr "" + +#: src/labels.h:443 +msgid "417 - Expectation Failed" +msgstr "" + +#: src/labels.h:445 +msgid "421 - Misdirected Request" +msgstr "" + +#: src/labels.h:447 +msgid "422 - Unprocessable Entity due to semantic errors: WebDAV" +msgstr "" + +#: src/labels.h:449 +msgid "423 - The resource that is being accessed is locked" +msgstr "" + +#: src/labels.h:451 +msgid "424 - Failed Dependency: WebDAV" +msgstr "" + +#: src/labels.h:453 +msgid "426 - Upgrade Required: Client should switch to a different protocol" +msgstr "" + +#: src/labels.h:455 +msgid "428 - Precondition Required" +msgstr "" + +#: src/labels.h:457 +msgid "429 - Too Many Requests: The user has sent too many requests" +msgstr "" + +#: src/labels.h:459 +msgid "431 - Request Header Fields Too Large" +msgstr "" + +#: src/labels.h:461 +msgid "451 - Unavailable For Legal Reasons" +msgstr "" + +#: src/labels.h:463 +msgid "444 - (Nginx) Connection closed without sending any headers" +msgstr "" + +#: src/labels.h:465 +msgid "494 - (Nginx) Request Header Too Large" +msgstr "" + +#: src/labels.h:467 +msgid "495 - (Nginx) SSL client certificate error" +msgstr "" + +#: src/labels.h:469 +msgid "496 - (Nginx) Client didn't provide certificate" +msgstr "" + +#: src/labels.h:471 +msgid "497 - (Nginx) HTTP request sent to HTTPS port" +msgstr "" + +#: src/labels.h:473 +msgid "499 - (Nginx) Connection closed by client while processing request" +msgstr "" + +#: src/labels.h:475 +msgid "500 - Internal Server Error" +msgstr "" + +#: src/labels.h:477 +msgid "501 - Not Implemented" +msgstr "" + +#: src/labels.h:479 +msgid "502 - Bad Gateway: Received an invalid response from the upstream" +msgstr "" + +#: src/labels.h:481 +msgid "503 - Service Unavailable: The server is currently unavailable" +msgstr "" + +#: src/labels.h:483 +msgid "504 - Gateway Timeout: The upstream server failed to send request" +msgstr "" + +#: src/labels.h:485 +msgid "505 - HTTP Version Not Supported" +msgstr "" + +#: src/labels.h:487 +msgid "520 - CloudFlare - Web server is returning an unknown error" +msgstr "" + +#: src/labels.h:489 +msgid "521 - CloudFlare - Web server is down" +msgstr "" + +#: src/labels.h:491 +msgid "522 - CloudFlare - Connection timed out" +msgstr "" + +#: src/labels.h:493 +msgid "523 - CloudFlare - Origin is unreachable" +msgstr "" + +#: src/labels.h:495 +msgid "524 - CloudFlare - A timeout occurred" +msgstr "" diff --git a/goaccess++/po/insert-header.sin b/goaccess++/po/insert-header.sin new file mode 100644 index 0000000..b26de01 --- /dev/null +++ b/goaccess++/po/insert-header.sin @@ -0,0 +1,23 @@ +# Sed script that inserts the file called HEADER before the header entry. +# +# At each occurrence of a line starting with "msgid ", we execute the following +# commands. At the first occurrence, insert the file. At the following +# occurrences, do nothing. The distinction between the first and the following +# occurrences is achieved by looking at the hold space. +/^msgid /{ +x +# Test if the hold space is empty. +s/m/m/ +ta +# Yes it was empty. First occurrence. Read the file. +r HEADER +# Output the file's contents by reading the next line. But don't lose the +# current line while doing this. +g +N +bb +:a +# The hold space was nonempty. Following occurrences. Do nothing. +x +:b +} diff --git a/goaccess++/po/ja.gmo b/goaccess++/po/ja.gmo new file mode 100644 index 0000000000000000000000000000000000000000..1c4576c0db6385743f965f5bf970281fde57d604 GIT binary patch literal 21828 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®Y&;pwh%ROpbIwYI`zexLaLu{Dg61 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 literal 0 HcmV?d00001 diff --git a/goaccess++/po/ja.po b/goaccess++/po/ja.po new file mode 100644 index 0000000..9f7dc5a --- /dev/null +++ b/goaccess++/po/ja.po @@ -0,0 +1,914 @@ +# This file is distributed under the same license as the goaccess package. +# Kamino Hiroki, 2019. +# +msgid "" +msgstr "" +"Project-Id-Version: goaccess 1.2\n" +"Report-Msgid-Bugs-To: hello@goaccess.io\n" +"POT-Creation-Date: 2018-11-22 23:38-0600\n" +"PO-Revision-Date: 2018-10-26 22:00+0900\n" +"Last-Translator: Kamino Hiroki <37243867+4f8p@users.noreply.github.com>\n" +"Language-Team: Japanese\n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: src/labels.h:40 +msgid "en" +msgstr "ja" + +#: src/labels.h:43 +msgid "Exp. Panel" +msgstr "詳細表示" + +#: src/labels.h:44 +msgid "Help" +msgstr "ヘルプ" + +#: src/labels.h:45 +msgid "Quit" +msgstr "終了" + +#: src/labels.h:46 +msgid "Total" +msgstr "合計" + +#: src/labels.h:49 +msgid "[x] ASC [ ] DESC" +msgstr "[x] 昇順 [ ] 降順" + +#: src/labels.h:50 +msgid "[ ] ASC [x] DESC" +msgstr "[ ] 昇順 [x] 降順" + +#: src/labels.h:53 +#, c-format +msgid "[Active Panel: %1$s]" +msgstr "[表示中のパネル: %1$s]" + +#: src/labels.h:54 +msgid "[q]uit GoAccess" +msgstr "[q] GoAccessを閉じる" + +#: src/labels.h:55 +msgid "[?] Help [Enter] Exp. Panel" +msgstr "[?] ヘルプ [Enter] 詳細表示" + +#: src/labels.h:56 +msgid "Dashboard" +msgstr "ダッシュボード" + +#: src/labels.h:57 +msgid "Dashboard - Overall Analyzed Requests" +msgstr "ダッシュボード - 解析済みリクエスト全体" + +#: src/labels.h:58 +msgid "Overall Analyzed Requests" +msgstr "解析済みリクエスト全体" + +#: src/labels.h:60 src/labels.h:81 +msgid "Tx. Amount" +msgstr "データ転送量" + +#: src/labels.h:61 +msgid "Date/Time" +msgstr "日付/時刻" + +#: src/labels.h:62 +msgid "Excl. IP Hits" +msgstr "除外対象数" + +#: src/labels.h:63 +msgid "Failed Requests" +msgstr "無効リクエスト数" + +#: src/labels.h:64 +msgid "Init. Proc. Time" +msgstr "解析にかかった時間" + +#: src/labels.h:65 +msgid "Log Size" +msgstr "ログファイルサイズ" + +#: src/labels.h:66 +msgid "Log Source" +msgstr "ログ取得元" + +#: src/labels.h:67 src/labels.h:174 +msgid "Referrers" +msgstr "リファラー数" + +#: src/labels.h:68 +msgid "Total Requests" +msgstr "合計リクエスト数" + +#: src/labels.h:69 +msgid "Static Files" +msgstr "静的ファイル数" + +#: src/labels.h:70 src/labels.h:146 +msgid "Not Found" +msgstr "404エラー数" + +#: src/labels.h:71 +msgid "Requested Files" +msgstr "要求されたファイル数" + +#: src/labels.h:72 +msgid "Unique Visitors" +msgstr "ユニークユーザー数" + +#: src/labels.h:73 +msgid "Valid Requests" +msgstr "有効リクエスト数" + +#: src/labels.h:76 +msgid "Hits" +msgstr "ヒット数" + +#: src/labels.h:77 +msgid "h%" +msgstr "h%" + +#: src/labels.h:78 src/labels.h:104 +msgid "Visitors" +msgstr "ユーザー数" + +#: src/labels.h:79 +msgid "Vis." +msgstr "ユーザー数" + +#: src/labels.h:80 +msgid "v%" +msgstr "v%" + +#: src/labels.h:82 +msgid "Avg. T.S." +msgstr "平均処理時間" + +#: src/labels.h:83 +msgid "Cum. T.S." +msgstr "合計処理時間" + +#: src/labels.h:84 +msgid "Max. T.S." +msgstr "最大処理時間" + +#: src/labels.h:85 +msgid "Method" +msgstr "要求" + +#: src/labels.h:86 +msgid "Mtd" +msgstr "要求" + +#: src/labels.h:87 +msgid "Protocol" +msgstr "プロトコル" + +#: src/labels.h:88 +msgid "Proto" +msgstr "プロトコル" + +#: src/labels.h:89 +msgid "City" +msgstr "地域" + +#: src/labels.h:90 +msgid "Country" +msgstr "国名" + +#: src/labels.h:91 +msgid "Hostname" +msgstr "ホスト名" + +#: src/labels.h:92 +msgid "Data" +msgstr "データ" + +#: src/labels.h:94 +msgid "Hits/Visitors" +msgstr "ヒット数/ユーザー数" + +#: src/labels.h:98 +msgid "Unique visitors per day" +msgstr "一日あたりのユニークユーザー数" + +#: src/labels.h:100 +msgid "Unique visitors per day - Including spiders" +msgstr "一日あたりのユニークユーザー数(クローラも含める)" + +#: src/labels.h:102 +msgid "Hits having the same IP, date and agent are a unique visit." +msgstr "" +"IPアドレス、日付、ユーザーエージェントが全て同一だった場合、ユニークユーザー" +"として扱われます。" + +#: src/labels.h:107 +msgid "Requested Files (URLs)" +msgstr "リクエストされたファイル(URL)" + +#: src/labels.h:109 +msgid "Top requests sorted by hits [, avgts, cumts, maxts, mthd, proto]" +msgstr "リクエスト順にソート [平均処理時間、合計処理時間、最大処理時間]" + +#: src/labels.h:111 +msgid "Requests" +msgstr "リクエスト数" + +#: src/labels.h:114 src/labels.h:118 +msgid "Static Requests" +msgstr "静的ファイルリクエスト数" + +#: src/labels.h:116 +msgid "Top static requests sorted by hits [, avgts, cumts, maxts, mthd, proto]" +msgstr "" +"静的ファイルリクエスト順にソート [平均処理時間、合計処理時間、最大処理時間]" + +#: src/labels.h:121 +msgid "Time Distribution" +msgstr "時間分布" + +#: src/labels.h:123 +msgid "Data sorted by hour [, avgts, cumts, maxts]" +msgstr "" +"リクエストされた時刻順にソート [平均処理時間、合計処理時間、最大処理時間]" + +#: src/labels.h:125 +msgid "Time" +msgstr "時刻" + +#: src/labels.h:128 src/labels.h:132 +msgid "Virtual Hosts" +msgstr "バーチャルホスト" + +#: src/labels.h:130 src/labels.h:137 +msgid "Data sorted by hits [, avgts, cumts, maxts]" +msgstr "リクエスト順にソート [平均処理時間、合計処理時間、最大処理時間]" + +#: src/labels.h:135 +msgid "Remote User (HTTP authentication)" +msgstr "認証されたユーザー(HTTP認証)" + +#: src/labels.h:139 +msgid "Remote User" +msgstr "認証されたユーザー" + +#: src/labels.h:142 +msgid "Not Found URLs (404s)" +msgstr "404エラーが返されたURL" + +#: src/labels.h:144 +msgid "Top not found URLs sorted by hits [, avgts, cumts, maxts, mthd, proto]" +msgstr "エラーとなったURL順にソート [平均処理時間、合計処理時間、最大処理時間]" + +#: src/labels.h:149 +msgid "Visitor Hostnames and IPs" +msgstr "ユーザーのホスト名とIPアドレス" + +#: src/labels.h:151 +msgid "Top visitor hosts sorted by hits [, avgts, cumts, maxts]" +msgstr "ホスト名順にソート [平均処理時間、合計処理時間、最大処理時間]" + +#: src/labels.h:153 +msgid "Hosts" +msgstr "ホスト名" + +#: src/labels.h:156 +msgid "Operating Systems" +msgstr "オペレーティングシステム" + +#: src/labels.h:158 +msgid "Top Operating Systems sorted by hits [, avgts, cumts, maxts]" +msgstr "OS順にソート [平均処理時間、合計処理時間、最大処理時間]" + +#: src/labels.h:160 +msgid "OS" +msgstr "OS" + +#: src/labels.h:163 src/labels.h:167 +msgid "Browsers" +msgstr "ブラウザ" + +#: src/labels.h:165 +msgid "Top Browsers sorted by hits [, avgts, cumts, maxts]" +msgstr "ブラウザ順にソート [平均処理時間、合計処理時間、最大処理時間]" + +#: src/labels.h:170 +msgid "Referrers URLs" +msgstr "参照元(URL)" + +#: src/labels.h:172 +msgid "Top Requested Referrers sorted by hits [, avgts, cumts, maxts]" +msgstr "送信元アドレス順にソート [平均処理時間、合計処理時間、最大処理時間]" + +#: src/labels.h:177 src/labels.h:181 +msgid "Referring Sites" +msgstr "参照元サイト" + +#: src/labels.h:179 +msgid "Top Referring Sites sorted by hits [, avgts, cumts, maxts]" +msgstr "参照元サイト順にソート [平均処理時間、合計処理時間、最大処理時間]" + +#: src/labels.h:184 +msgid "Keyphrases from Google's search engine" +msgstr "キーフレーズ(Google検索から)" + +#: src/labels.h:186 +msgid "Top Keyphrases sorted by hits [, avgts, cumts, maxts]" +msgstr "キーフレーズ順にソート [平均処理時間、合計処理時間、最大処理時間]" + +#: src/labels.h:188 +msgid "Keyphrases" +msgstr "キーフレーズ" + +#: src/labels.h:191 src/labels.h:195 +msgid "Geo Location" +msgstr "位置情報" + +#: src/labels.h:193 +msgid "Continent > Country sorted by unique hits [, avgts, cumts, maxts]" +msgstr "地理区分 > 国別にソート [平均処理時間、合計処理時間、最大処理時間]" + +#: src/labels.h:198 +msgid "HTTP Status Codes" +msgstr "HTTPステータスコード" + +#: src/labels.h:200 +msgid "Top HTTP Status Codes sorted by hits [, avgts, cumts, maxts]" +msgstr "" +"HTTPステータスコード順にソート [平均処理時間、合計処理時間、最大処理時間]" + +#: src/labels.h:202 +msgid "Status Codes" +msgstr "ステータスコード" + +#: src/labels.h:206 +msgid "[ ] case sensitive" +msgstr "[ ] 大文字と小文字を区別する" + +#: src/labels.h:208 +msgid "[x] case sensitive" +msgstr "[x] 大文字と小文字を区別する" + +#: src/labels.h:210 +msgid "Regex allowed - ^g to cancel - TAB switch case" +msgstr "正規表現を許可する - [^g] キャンセル - [TAB] 切り替え" + +#: src/labels.h:212 +msgid "Find pattern in all views" +msgstr "すべてのビューでパターン検索を行う" + +#: src/labels.h:216 +msgid "Log Format Configuration" +msgstr "ログ形式設定" + +#: src/labels.h:218 +msgid "[SPACE] to toggle - [ENTER] to proceed - [q] to quit" +msgstr "[SPACE] 切り替え - [ENTER] 決定 - [q] 終了" + +#: src/labels.h:220 +msgid "Log Format - [c] to add/edit format" +msgstr "ログ形式 - [c] 追加/編集" + +#: src/labels.h:222 +msgid "Date Format - [d] to add/edit format" +msgstr "日付形式 - [d] 追加/編集" + +#: src/labels.h:224 +msgid "Time Format - [t] to add/edit format" +msgstr "時刻形式 - [t] 追加/編集" + +#: src/labels.h:226 src/labels.h:230 +msgid "[UP/DOWN] to scroll - [q] to close window" +msgstr "[↑/↓] スクロール - [q] ウィンドウを閉じる" + +#: src/labels.h:232 +#, c-format +msgid "User Agents for %1$s" +msgstr "%1$s のユーザーエージェント" + +#: src/labels.h:236 +msgid "Scheme Configuration" +msgstr "スキーム設定" + +#: src/labels.h:238 +msgid "[ENTER] to use scheme - [q]uit" +msgstr "[ENTER] スキーム選択 - [q] 終了" + +#: src/labels.h:242 +msgid "Sort active module by" +msgstr "選択したカラムで並び替え" + +#: src/labels.h:244 +msgid "[ENTER] select - [TAB] sort - [q]uit" +msgstr "[ENTER] 選択 - [TAB] ソート - [q] 終了" + +#: src/labels.h:248 +msgid "GoAccess Quick Help" +msgstr "GoAccessクイックヘルプ" + +#: src/labels.h:250 +msgid "[UP/DOWN] to scroll - [q] to quit" +msgstr "[↑/↓] スクロール - [q] 終了" + +#: src/labels.h:254 +msgid "Built using Tokyo Cabinet on-disk B+ Tree." +msgstr "Tokyo CabinetのB+木データベースを使用する。" + +#: src/labels.h:256 +msgid "Built using Tokyo Cabinet in-memory hash database." +msgstr "Tokyo Cabinetのインメモリハッシュデータベースを使用する。" + +#: src/labels.h:258 +msgid "Built using the default in-memory hash database." +msgstr "デフォルトのインメモリハッシュデータベースを使用する。" + +#: src/labels.h:262 +msgid "Format Errors - Verify your log/date/time format" +msgstr "" +"解析に失敗しました - ログ/日付/時刻のフォーマット設定を確認してください" + +#: src/labels.h:264 +msgid "No date format was found on your conf file." +msgstr "設定ファイル内で日付形式がセットされていません。" + +#: src/labels.h:266 +msgid "No log format was found on your conf file." +msgstr "設定ファイル内でログ形式がセットされていません。" + +#: src/labels.h:268 +msgid "No time format was found on your conf file." +msgstr "設定ファイル内で時刻形式がセットされていません。" + +#: src/labels.h:270 +msgid "No default config file found." +msgstr "デフォルトの設定ファイルが見つかりません。" + +#: src/labels.h:272 +msgid "You may specify one with" +msgstr "いずれか指定してください" + +#: src/labels.h:274 +msgid "producing the following errors" +msgstr "エラーが発生しました" + +#: src/labels.h:276 +#, c-format +msgid "Parsed %1$d lines" +msgstr "解析済み: %1$d 行" + +#: src/labels.h:278 +msgid "Please report it by opening an issue on GitHub" +msgstr "GitHub上のIssueから問題を報告してください" + +#: src/labels.h:280 +msgid "Select a time format." +msgstr "時刻形式を選択します。" + +#: src/labels.h:282 +msgid "Select a date format." +msgstr "日付形式を選択します。" + +#: src/labels.h:284 +msgid "Select a log format." +msgstr "ログ形式を選択します。" + +#: src/labels.h:286 +#, c-format +msgid "'%1$s' panel is disabled" +msgstr "'%1$s' パネルは無効化されています" + +#: src/labels.h:290 +msgid "For more details visit" +msgstr "詳細はこちら" + +#: src/labels.h:292 +msgid "Last Updated" +msgstr "最終更新日時" + +#: src/labels.h:294 +msgid "WebSocket server ready to accept new client connections" +msgstr "WebSocket接続の準備ができました" + +#: src/labels.h:297 +msgid "The following options can also be supplied to the command" +msgstr "次のオプションはコマンドで指定することもできます" + +#: src/labels.h:299 +msgid "Examples can be found by running" +msgstr "実行例" + +#: src/labels.h:302 +msgid "Server Statistics" +msgstr "サーバーの統計情報" + +#: src/labels.h:304 +msgid "Theme" +msgstr "テーマ" + +#: src/labels.h:306 +msgid "Dark Gray" +msgstr "ダークグレー" + +#: src/labels.h:308 +msgid "Bright" +msgstr "ライト" + +#: src/labels.h:310 +msgid "Dark Blue" +msgstr "ダークブルー" + +#: src/labels.h:312 +#, fuzzy +msgid "Dark Purple" +msgstr "ダークブルー" + +#: src/labels.h:314 +msgid "Panels" +msgstr "パネル" + +#: src/labels.h:316 +msgid "Items per Page" +msgstr "ページあたりの表示数" + +#: src/labels.h:318 +msgid "Tables" +msgstr "テーブル" + +#: src/labels.h:320 +msgid "Display Tables" +msgstr "テーブル表示" + +#: src/labels.h:322 +msgid "Auto-Hide on Small Devices" +msgstr "自動非表示設定(小型端末用)" + +#: src/labels.h:324 +msgid "Automatically hide tables on small screen devices" +msgstr "画面が小さい場合に自動でテーブルを非表示にする" + +#: src/labels.h:326 +msgid "Layout" +msgstr "レイアウト" + +#: src/labels.h:328 +msgid "Horizontal" +msgstr "水平" + +#: src/labels.h:330 +msgid "Vertical" +msgstr "垂直" + +#: src/labels.h:332 +msgid "File Options" +msgstr "ファイルオプション" + +#: src/labels.h:334 +msgid "Export as JSON" +msgstr "JSON形式でエクスポート" + +#: src/labels.h:336 +msgid "Panel Options" +msgstr "パネルオプション" + +#: src/labels.h:338 +msgid "Previous" +msgstr "前へ" + +#: src/labels.h:340 +msgid "Next" +msgstr "次へ" + +#: src/labels.h:342 +msgid "First" +msgstr "" + +#: src/labels.h:344 +msgid "Last" +msgstr "" + +#: src/labels.h:346 +msgid "Chart Options" +msgstr "グラフ設定" + +#: src/labels.h:348 +msgid "Chart" +msgstr "グラフ" + +#: src/labels.h:350 +msgid "Type" +msgstr "タイプ" + +#: src/labels.h:352 +msgid "Area Spline" +msgstr "平滑面グラフ" + +#: src/labels.h:354 +msgid "Bar" +msgstr "棒グラフ" + +#: src/labels.h:356 +msgid "Plot Metric" +msgstr "表示するデータ" + +#: src/labels.h:358 +msgid "Table Columns" +msgstr "テーブルカラム" + +#: src/labels.h:362 +msgid "1xx Informational" +msgstr "1xx 情報" + +#: src/labels.h:364 +msgid "2xx Success" +msgstr "2xx 成功" + +#: src/labels.h:366 +msgid "3xx Redirection" +msgstr "3xx リダイレクション" + +#: src/labels.h:368 +msgid "4xx Client Errors" +msgstr "4xx クライアントエラー" + +#: src/labels.h:370 +msgid "5xx Server Errors" +msgstr "5xx サーバーエラー" + +#: src/labels.h:373 +msgid "100 - Continue: Server received the initial part of the request" +msgstr "100 - 継続: リクエストヘッダーを受理しました" + +#: src/labels.h:375 +msgid "101 - Switching Protocols: Client asked to switch protocols" +msgstr "" +"101 - プロトコル変更: HTTPヘッダーでリクエストされたプロトコルに切り替えます" + +#: src/labels.h:377 +msgid "200 - OK: The request sent by the client was successful" +msgstr "200 - 成功: リクエストに成功しました" + +#: src/labels.h:379 +msgid "201 - Created: The request has been fulfilled and created" +msgstr "201 - 作成: リクエストが成功して新たなリソースの作成が完了しました" + +#: src/labels.h:381 +msgid "202 - Accepted: The request has been accepted for processing" +msgstr "202 - 受理: リクエストを受け取ったが処理されていません" + +#: src/labels.h:383 +msgid "203 - Non-authoritative Information: Response from a third party" +msgstr "" +"203 - 認証されていない情報: リクエストを正常に処理しましたが、返される情報は" +"別の送信元から来る可能性があります" + +#: src/labels.h:385 +msgid "204 - No Content: Request did not return any content" +msgstr "" +"204 - コンテンツ無し: リクエストを正常に処理しましたが、返すべき情報がありま" +"せん" + +#: src/labels.h:387 +msgid "205 - Reset Content: Server asked the client to reset the document" +msgstr "" +"205 - リセット要求: リクエストを行ったクライアントに対してドキュメントビュー" +"のリセットを行うよう指示します" + +#: src/labels.h:389 +msgid "206 - Partial Content: The partial GET has been successful" +msgstr "" +"206 - 部分的なリクエスト: GETリクエストを正常に処理しました(リソースが分割さ" +"れている可能性があります)" + +#: src/labels.h:391 +msgid "207 - Multi-Status: WebDAV; RFC 4918" +msgstr "207 - 複数ステータス: (WebDAV拡張) RFC 4918" + +#: src/labels.h:393 +msgid "208 - Already Reported: WebDAV; RFC 5842" +msgstr "208 - 報告済み: (WebDAV拡張) RFC 5842" + +#: src/labels.h:395 +msgid "300 - Multiple Choices: Multiple options for the resource" +msgstr "" +"300 - 選択が必要: 複数のリダイレクト先があり、クライアント側が選択する必要が" +"あります" + +#: src/labels.h:397 +msgid "301 - Moved Permanently: Resource has permanently moved" +msgstr "301 - 恒久的な移動: リクエストされたリソースは完全に移動されました" + +#: src/labels.h:399 +msgid "302 - Moved Temporarily (redirect)" +msgstr "302 - 一時的な移動: リクエストされたリソースは一時的に移動されました" + +#: src/labels.h:401 +msgid "303 - See Other Document: The response is at a different URI" +msgstr "" +"303 - 別コンテンツ: リクエストされたリソースは別のURLで提供されています" + +#: src/labels.h:403 +msgid "304 - Not Modified: Resource has not been modified" +msgstr "304 - 更新無し: リクエストされたリソースは更新されていません" + +#: src/labels.h:405 +msgid "305 - Use Proxy: Can only be accessed through the proxy" +msgstr "" +"305 - プロキシ使用: リクエストされたリソースはプロキシを使用して取得できます" + +#: src/labels.h:407 +msgid "307 - Temporary Redirect: Resource temporarily moved" +msgstr "307 - 一時的な移動: リクエストされたリソースは一時的に移動されました" + +#: src/labels.h:409 +msgid "400 - Bad Request: The syntax of the request is invalid" +msgstr "400 - 不正なリクエスト: リクエストを処理できません" + +#: src/labels.h:411 +msgid "401 - Unauthorized: Request needs user authentication" +msgstr "401 - 認証が必要: このリクエストを処理するには認証が必要です" + +#: src/labels.h:413 +msgid "402 - Payment Required" +msgstr "402 - このリクエストを処理するには料金を支払う必要があります" + +#: src/labels.h:415 +msgid "403 - Forbidden: Server is refusing to respond to it" +msgstr "403 - アクセス禁止: このリクエストへのアクセスは禁止されています" + +#: src/labels.h:417 +msgid "404 - Not Found: Requested resource could not be found" +msgstr "404 - リソース不明: リクエストされたリソースは存在しません" + +#: src/labels.h:419 +msgid "405 - Method Not Allowed: Request method not supported" +msgstr "" +"405 - 許可されていない: リクエストされたメソッドでのアクセスは禁止されていま" +"す" + +#: src/labels.h:421 +msgid "406 - Not Acceptable" +msgstr "406 - リクエストを受理できません" + +#: src/labels.h:423 +msgid "407 - Proxy Authentication Required" +msgstr "407 - プロキシ認証が必要です" + +#: src/labels.h:425 +msgid "408 - Request Timeout: Server timed out waiting for the request" +msgstr "408 - タイムアウト: リクエストがタイムアウトしました" + +#: src/labels.h:427 +msgid "409 - Conflict: Conflict in the request" +msgstr "409 - 衝突: リクエストが衝突しました" + +#: src/labels.h:429 +msgid "410 - Gone: Resource requested is no longer available" +msgstr "410 - 消滅: リクエストされたリソースは完全に削除されました" + +#: src/labels.h:431 +msgid "411 - Length Required: Invalid Content-Length" +msgstr "411 - Content-Lengthヘッダーが必要です" + +#: src/labels.h:433 +msgid "412 - Precondition Failed: Server does not meet preconditions" +msgstr "" +"412 - 前提条件が満たされていない: このリクエストはサーバー側の前提条件を満た" +"していません" + +#: src/labels.h:435 +msgid "413 - Payload Too Large" +msgstr "413 - ペイロードが長すぎます" + +#: src/labels.h:437 +msgid "414 - Request-URI Too Long" +msgstr "414 - URLが長すぎます" + +#: src/labels.h:439 +msgid "415 - Unsupported Media Type: Media type is not supported" +msgstr "415 - サポートされていないメディアタイプ" + +#: src/labels.h:441 +msgid "416 - Requested Range Not Satisfiable: Cannot supply that portion" +msgstr "" +"416 - リクエストされたContent-Lengthヘッダーの範囲がリソースより超過していま" +"す" + +#: src/labels.h:443 +msgid "417 - Expectation Failed" +msgstr "417 - 拡張ステータスコードが使えません" + +#: src/labels.h:445 +msgid "421 - Misdirected Request" +msgstr "421 - 不明なリクエスト" + +#: src/labels.h:447 +msgid "422 - Unprocessable Entity due to semantic errors: WebDAV" +msgstr "422 - リクエストを受理したが、処理を継続できません" + +#: src/labels.h:449 +msgid "423 - The resource that is being accessed is locked" +msgstr "423 - このリソースはロックされています" + +#: src/labels.h:451 +msgid "424 - Failed Dependency: WebDAV" +msgstr "424 - 依存する他の処理が失敗したため処理できません" + +#: src/labels.h:453 +msgid "426 - Upgrade Required: Client should switch to a different protocol" +msgstr "" +"426 - アップグレードが必要: プロトコルが古すぎてリクエストを処理できません" + +#: src/labels.h:455 +msgid "428 - Precondition Required" +msgstr "428 - リクエストを条件付きにする必要があります" + +#: src/labels.h:457 +msgid "429 - Too Many Requests: The user has sent too many requests" +msgstr "429 - 過重リクエスト: 制限されたリクエスト数を超えたので処理できません" + +#: src/labels.h:459 +msgid "431 - Request Header Fields Too Large" +msgstr "431 - HTTPヘッダーが長すぎます" + +#: src/labels.h:461 +msgid "451 - Unavailable For Legal Reasons" +msgstr "451 - 法律上の理由でリクエストを処理できません" + +#: src/labels.h:463 +msgid "444 - (Nginx) Connection closed without sending any headers" +msgstr "444 - (nginx) ヘッダーを返さずコネクションを切断しました" + +#: src/labels.h:465 +msgid "494 - (Nginx) Request Header Too Large" +msgstr "494 - (nginx) HTTPヘッダーが長すぎます" + +#: src/labels.h:467 +msgid "495 - (Nginx) SSL client certificate error" +msgstr "495 - (nginx) SSLクライアント証明書エラー" + +#: src/labels.h:469 +msgid "496 - (Nginx) Client didn't provide certificate" +msgstr "496 - (nginx) クライアントが証明書を提供しませんでした" + +#: src/labels.h:471 +msgid "497 - (Nginx) HTTP request sent to HTTPS port" +msgstr "497 - (nginx) HTTPリクエストをHTTPSポートに送信しました" + +#: src/labels.h:473 +msgid "499 - (Nginx) Connection closed by client while processing request" +msgstr "" +"499 - (nginx) リクエストを処理中にクライアントによって接続を閉じられました" + +#: src/labels.h:475 +msgid "500 - Internal Server Error" +msgstr "500 - 内部サーバーエラー" + +#: src/labels.h:477 +msgid "501 - Not Implemented" +msgstr "501 - サーバーでメソッドが実装されていません" + +#: src/labels.h:479 +msgid "502 - Bad Gateway: Received an invalid response from the upstream" +msgstr "" +"502 - 不正なゲートウェイ: 上流にあるゲートウェイまたはプロキシサーバーから不" +"正なリクエストを受け取りました" + +#: src/labels.h:481 +msgid "503 - Service Unavailable: The server is currently unavailable" +msgstr "503 - サービス利用不可: サーバーがダウンしました" + +#: src/labels.h:483 +msgid "504 - Gateway Timeout: The upstream server failed to send request" +msgstr "" +"504 - ゲートウェイタイムアウト: 上流にあるゲートウェイまたはプロキシサーバー" +"がタイムアウトを起こしました" + +#: src/labels.h:485 +msgid "505 - HTTP Version Not Supported" +msgstr "" +"505 - リクエストで使用されているHTTPバージョンがサーバーでサポートされていま" +"せん" + +#: src/labels.h:487 +msgid "520 - CloudFlare - Web server is returning an unknown error" +msgstr "520 - CloudFlare - Originサーバーからエラーが返されました" + +#: src/labels.h:489 +msgid "521 - CloudFlare - Web server is down" +msgstr "521 - CloudFlare - Originサーバーがダウンしています" + +#: src/labels.h:491 +msgid "522 - CloudFlare - Connection timed out" +msgstr "522 - CloudFlare - Originサーバーへの接続がタイムアウトしました" + +#: src/labels.h:493 +msgid "523 - CloudFlare - Origin is unreachable" +msgstr "523 - CloudFlare - Originサーバーにアクセスできません(到達不能)" + +#: src/labels.h:495 +msgid "524 - CloudFlare - A timeout occurred" +msgstr "524 - CloudFlare - Originサーバーにアクセスできません(タイムアウト)" diff --git a/goaccess++/po/quot.sed b/goaccess++/po/quot.sed new file mode 100644 index 0000000..0122c46 --- /dev/null +++ b/goaccess++/po/quot.sed @@ -0,0 +1,6 @@ +s/"\([^"]*\)"/“\1”/g +s/`\([^`']*\)'/‘\1’/g +s/ '\([^`']*\)' / ‘\1’ /g +s/ '\([^`']*\)'$/ ‘\1’/g +s/^'\([^`']*\)' /‘\1’ /g +s/“”/""/g diff --git a/goaccess++/po/remove-potcdate.sin b/goaccess++/po/remove-potcdate.sin new file mode 100644 index 0000000..2436c49 --- /dev/null +++ b/goaccess++/po/remove-potcdate.sin @@ -0,0 +1,19 @@ +# Sed script that remove the POT-Creation-Date line in the header entry +# from a POT file. +# +# The distinction between the first and the following occurrences of the +# pattern is achieved by looking at the hold space. +/^"POT-Creation-Date: .*"$/{ +x +# Test if the hold space is empty. +s/P/P/ +ta +# Yes it was empty. First occurrence. Remove the line. +g +d +bb +:a +# The hold space was nonempty. Following occurrences. Do nothing. +x +:b +} diff --git a/goaccess++/po/stamp-po b/goaccess++/po/stamp-po new file mode 100644 index 0000000..9788f70 --- /dev/null +++ b/goaccess++/po/stamp-po @@ -0,0 +1 @@ +timestamp diff --git a/goaccess++/po/zh_CN.gmo b/goaccess++/po/zh_CN.gmo new file mode 100644 index 0000000000000000000000000000000000000000..bb4db2efc900249a7221e3952d20341686f0b24e GIT binary patch literal 17925 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 literal 0 HcmV?d00001 diff --git a/goaccess++/po/zh_CN.po b/goaccess++/po/zh_CN.po new file mode 100644 index 0000000..5f73e35 --- /dev/null +++ b/goaccess++/po/zh_CN.po @@ -0,0 +1,899 @@ +# This file is distributed under the same license as the goaccess package. +# Ai, 2018. +# +msgid "" +msgstr "" +"Project-Id-Version: goaccess 1.2\n" +"Report-Msgid-Bugs-To: hello@goaccess.io\n" +"POT-Creation-Date: 2018-11-22 23:38-0600\n" +"PO-Revision-Date: 2017-04-03 09:43+0200\n" +"Last-Translator: Ai<hello@goaccess.io>\n" +"Language-Team: Ai\n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Gtranslator 2.91.7\n" + +#: src/labels.h:40 +msgid "en" +msgstr "zh-CN" + +#: src/labels.h:43 +msgid "Exp. Panel" +msgstr "展开面板" + +#: src/labels.h:44 +msgid "Help" +msgstr "帮助" + +#: src/labels.h:45 +msgid "Quit" +msgstr "退出" + +#: src/labels.h:46 +msgid "Total" +msgstr "总共" + +#: src/labels.h:49 +msgid "[x] ASC [ ] DESC" +msgstr "[x] 递增 [ ] 递减" + +#: src/labels.h:50 +msgid "[ ] ASC [x] DESC" +msgstr "[ ] 递增 [x] 递减" + +#: src/labels.h:53 +#, c-format +msgid "[Active Panel: %1$s]" +msgstr "[当前面板: %1$s]" + +#: src/labels.h:54 +msgid "[q]uit GoAccess" +msgstr "[q]退出GoAccess" + +#: src/labels.h:55 +msgid "[?] Help [Enter] Exp. Panel" +msgstr "[?]帮助 [回车]展开面板" + +#: src/labels.h:56 +msgid "Dashboard" +msgstr "概览" + +#: src/labels.h:57 +msgid "Dashboard - Overall Analyzed Requests" +msgstr "概览-所有已分析的请求" + +#: src/labels.h:58 +msgid "Overall Analyzed Requests" +msgstr "所有已分析的请求" + +#: src/labels.h:60 src/labels.h:81 +msgid "Tx. Amount" +msgstr "" + +#: src/labels.h:61 +msgid "Date/Time" +msgstr "时期/时间" + +#: src/labels.h:62 +msgid "Excl. IP Hits" +msgstr "过滤来自此IP的请求" + +#: src/labels.h:63 +msgid "Failed Requests" +msgstr "失败的请求" + +#: src/labels.h:64 +msgid "Init. Proc. Time" +msgstr "第一次处理耗时" + +#: src/labels.h:65 +msgid "Log Size" +msgstr "日志大小" + +#: src/labels.h:66 +msgid "Log Source" +msgstr "日志文件夹地址" + +#: src/labels.h:67 src/labels.h:174 +msgid "Referrers" +msgstr "来源地址" + +#: src/labels.h:68 +msgid "Total Requests" +msgstr "所有请求" + +#: src/labels.h:69 +msgid "Static Files" +msgstr "静态文件" + +#: src/labels.h:70 src/labels.h:146 +msgid "Not Found" +msgstr "未找到(404)" + +#: src/labels.h:71 +msgid "Requested Files" +msgstr "请求的文件" + +#: src/labels.h:72 +msgid "Unique Visitors" +msgstr "独立访客" + +#: src/labels.h:73 +msgid "Valid Requests" +msgstr "有效的请求" + +#: src/labels.h:76 +msgid "Hits" +msgstr "点击量" + +#: src/labels.h:77 +msgid "h%" +msgstr "" + +#: src/labels.h:78 src/labels.h:104 +msgid "Visitors" +msgstr "访客" + +#: src/labels.h:79 +msgid "Vis." +msgstr "访客" + +#: src/labels.h:80 +msgid "v%" +msgstr "" + +#: src/labels.h:82 +msgid "Avg. T.S." +msgstr "平均响应时" + +#: src/labels.h:83 +msgid "Cum. T.S." +msgstr "总共响应时" + +#: src/labels.h:84 +msgid "Max. T.S." +msgstr "最高响应时" + +#: src/labels.h:85 +msgid "Method" +msgstr "请求方法" + +#: src/labels.h:86 +msgid "Mtd" +msgstr "请求方法" + +#: src/labels.h:87 +msgid "Protocol" +msgstr "协议" + +#: src/labels.h:88 +msgid "Proto" +msgstr "协议" + +#: src/labels.h:89 +msgid "City" +msgstr "城市" + +#: src/labels.h:90 +msgid "Country" +msgstr "国家" + +#: src/labels.h:91 +msgid "Hostname" +msgstr "主机名" + +#: src/labels.h:92 +msgid "Data" +msgstr "数据" + +#: src/labels.h:94 +msgid "Hits/Visitors" +msgstr "点击量/访客" + +#: src/labels.h:98 +msgid "Unique visitors per day" +msgstr "每日独立访客" + +#: src/labels.h:100 +msgid "Unique visitors per day - Including spiders" +msgstr "每日独立访客 - 包括网络机器人" + +#: src/labels.h:102 +msgid "Hits having the same IP, date and agent are a unique visit." +msgstr "来自同一IP、时间和Http用户代理的多次点击被视作一次访问" + +#: src/labels.h:107 +msgid "Requested Files (URLs)" +msgstr "请求的文件" + +#: src/labels.h:109 +msgid "Top requests sorted by hits [, avgts, cumts, maxts, mthd, proto]" +msgstr "" +"请求排序按 [点击量, 平均响应时, 总共响应时, 最高响应时, 请求方法, 协议]" + +#: src/labels.h:111 +msgid "Requests" +msgstr "请求" + +#: src/labels.h:114 src/labels.h:118 +msgid "Static Requests" +msgstr "静态请求" + +#: src/labels.h:116 +msgid "Top static requests sorted by hits [, avgts, cumts, maxts, mthd, proto]" +msgstr "" +"静态请求排序按 [点击量, 平均响应时, 总共响应时, 最高响应时, 请求方法, 协议]" + +#: src/labels.h:121 +msgid "Time Distribution" +msgstr "时间分配" + +#: src/labels.h:123 +msgid "Data sorted by hour [, avgts, cumts, maxts]" +msgstr "数据列排序按 [小时, 平均响应时, 总共响应时, 最高响应时]" + +#: src/labels.h:125 +msgid "Time" +msgstr "时间" + +#: src/labels.h:128 src/labels.h:132 +msgid "Virtual Hosts" +msgstr "虚拟主机" + +#: src/labels.h:130 src/labels.h:137 +msgid "Data sorted by hits [, avgts, cumts, maxts]" +msgstr "数据列排序按 [点击量, 平均响应时, 总共响应时, 最高响应时]" + +#: src/labels.h:135 +msgid "Remote User (HTTP authentication)" +msgstr "已认证用户(HTTP authentication)" + +#: src/labels.h:139 +msgid "Remote User" +msgstr "已认证用户" + +#: src/labels.h:142 +msgid "Not Found URLs (404s)" +msgstr "未找到的URLs" + +#: src/labels.h:144 +msgid "Top not found URLs sorted by hits [, avgts, cumts, maxts, mthd, proto]" +msgstr "" +"未找到的URLs排序按 [点击量, 平均响应时, 总共响应时, 最高响应时, 请求方法, 协" +"议]" + +#: src/labels.h:149 +msgid "Visitor Hostnames and IPs" +msgstr "访客主机名和IP地址" + +#: src/labels.h:151 +msgid "Top visitor hosts sorted by hits [, avgts, cumts, maxts]" +msgstr "访客主机排序按 [点击量, 平均响应时, 总共响应时, 最高响应时]" + +#: src/labels.h:153 +msgid "Hosts" +msgstr "主机" + +#: src/labels.h:156 +msgid "Operating Systems" +msgstr "操作系统" + +#: src/labels.h:158 +msgid "Top Operating Systems sorted by hits [, avgts, cumts, maxts]" +msgstr "操作系统排序按 [点击量, 平均响应时, 总共响应时, 最高响应时]" + +#: src/labels.h:160 +msgid "OS" +msgstr "操作系统" + +#: src/labels.h:163 src/labels.h:167 +msgid "Browsers" +msgstr "浏览器" + +#: src/labels.h:165 +msgid "Top Browsers sorted by hits [, avgts, cumts, maxts]" +msgstr "浏览器排序按 [点击量, 平均响应时, 总共响应时, 最高响应时]" + +#: src/labels.h:170 +msgid "Referrers URLs" +msgstr "来源地址URLs" + +#: src/labels.h:172 +msgid "Top Requested Referrers sorted by hits [, avgts, cumts, maxts]" +msgstr "来源地址排序按 [点击量, 平均响应时, 总共响应时, 最高响应时]" + +#: src/labels.h:177 src/labels.h:181 +msgid "Referring Sites" +msgstr "推荐网站" + +#: src/labels.h:179 +msgid "Top Referring Sites sorted by hits [, avgts, cumts, maxts]" +msgstr "推荐网站排序按 [点击量, 平均响应时, 总共响应时, 最高响应时]" + +#: src/labels.h:184 +msgid "Keyphrases from Google's search engine" +msgstr "谷歌搜索关键字" + +#: src/labels.h:186 +msgid "Top Keyphrases sorted by hits [, avgts, cumts, maxts]" +msgstr "关键字排序按 [点击量, 平均响应时, 总共响应时, 最高响应时]" + +#: src/labels.h:188 +msgid "Keyphrases" +msgstr "关键字" + +#: src/labels.h:191 src/labels.h:195 +msgid "Geo Location" +msgstr "地理位置" + +#: src/labels.h:193 +msgid "Continent > Country sorted by unique hits [, avgts, cumts, maxts]" +msgstr "大陆 > 国家排序按 [点击量, 平均响应时, 总共响应时, 最高响应时]" + +#: src/labels.h:198 +msgid "HTTP Status Codes" +msgstr "HTTP状态码" + +#: src/labels.h:200 +msgid "Top HTTP Status Codes sorted by hits [, avgts, cumts, maxts]" +msgstr "HTTP状态码排序按 [点击量, 平均响应时, 总共响应时, 最高响应时]" + +#: src/labels.h:202 +msgid "Status Codes" +msgstr "状态码" + +#: src/labels.h:206 +msgid "[ ] case sensitive" +msgstr "[ ] 区分大小写" + +#: src/labels.h:208 +msgid "[x] case sensitive" +msgstr "[x] 区分大小写" + +#: src/labels.h:210 +msgid "Regex allowed - ^g to cancel - TAB switch case" +msgstr "允许正则表达式 - ^g退出 - TAB改变大小写" + +#: src/labels.h:212 +msgid "Find pattern in all views" +msgstr "在所有界面中查找匹配模式" + +#: src/labels.h:216 +msgid "Log Format Configuration" +msgstr "日志格式设置" + +#: src/labels.h:218 +msgid "[SPACE] to toggle - [ENTER] to proceed - [q] to quit" +msgstr "[空格]切换 - [回车]继续 - [q]退出" + +#: src/labels.h:220 +msgid "Log Format - [c] to add/edit format" +msgstr "日志格式 - [c]新建/修改格式" + +#: src/labels.h:222 +msgid "Date Format - [d] to add/edit format" +msgstr "日期格式 - [d]新建/修改格式" + +#: src/labels.h:224 +msgid "Time Format - [t] to add/edit format" +msgstr "时间格式 - [t]新建/修改格式" + +#: src/labels.h:226 src/labels.h:230 +msgid "[UP/DOWN] to scroll - [q] to close window" +msgstr "[UP/DOWN]上下滚动 - [q]退出" + +#: src/labels.h:232 +#, c-format +msgid "User Agents for %1$s" +msgstr "用户代理 %1$s" + +#: src/labels.h:236 +msgid "Scheme Configuration" +msgstr "颜色方案设置" + +#: src/labels.h:238 +msgid "[ENTER] to use scheme - [q]uit" +msgstr "[回车]选取方案 - [q]退出" + +#: src/labels.h:242 +msgid "Sort active module by" +msgstr "当前选择栏目排序" + +#: src/labels.h:244 +msgid "[ENTER] select - [TAB] sort - [q]uit" +msgstr "[回车]选择 - [TAB]排序 - [q]退出" + +#: src/labels.h:248 +msgid "GoAccess Quick Help" +msgstr "GoAccess快速帮助" + +#: src/labels.h:250 +msgid "[UP/DOWN] to scroll - [q] to quit" +msgstr "[UP/DOWN]上下滚动 - [q]退出" + +#: src/labels.h:254 +msgid "Built using Tokyo Cabinet on-disk B+ Tree." +msgstr "使用Tokyo Cabinet在磁盘中的B+树来构建" + +#: src/labels.h:256 +msgid "Built using Tokyo Cabinet in-memory hash database." +msgstr "使用Tokyo Cabinet的内存中的哈希表来构建" + +#: src/labels.h:258 +msgid "Built using the default in-memory hash database." +msgstr "使用默认的在内存中的哈希表来构建" + +#: src/labels.h:262 +msgid "Format Errors - Verify your log/date/time format" +msgstr "格式错误 - 请检查你的日志/日期/时间格式" + +#: src/labels.h:264 +msgid "No date format was found on your conf file." +msgstr "未在配置文件中设置日期格式" + +#: src/labels.h:266 +msgid "No log format was found on your conf file." +msgstr "未在配置文件中设置日志格式" + +#: src/labels.h:268 +msgid "No time format was found on your conf file." +msgstr "未在配置文件中设置时间格式" + +#: src/labels.h:270 +msgid "No default config file found." +msgstr "未找到默认的配置文件" + +#: src/labels.h:272 +msgid "You may specify one with" +msgstr "你可以指定配置文件" + +#: src/labels.h:274 +msgid "producing the following errors" +msgstr "出现以下错误" + +#: src/labels.h:276 +#, c-format +msgid "Parsed %1$d lines" +msgstr "已解析 %1$d 行" + +#: src/labels.h:278 +msgid "Please report it by opening an issue on GitHub" +msgstr "请在GitHub中添加一个issue来给我们反馈信息" + +#: src/labels.h:280 +msgid "Select a time format." +msgstr "选择时间格式" + +#: src/labels.h:282 +msgid "Select a date format." +msgstr "选择日期格式" + +#: src/labels.h:284 +msgid "Select a log format." +msgstr "选择日志格式" + +#: src/labels.h:286 +#, c-format +msgid "'%1$s' panel is disabled" +msgstr "'%1$s' 面板已禁用" + +#: src/labels.h:290 +msgid "For more details visit" +msgstr "更多信息请访问" + +#: src/labels.h:292 +msgid "Last Updated" +msgstr "最近更新" + +#: src/labels.h:294 +msgid "WebSocket server ready to accept new client connections" +msgstr "WebSocket服务器已准备接收来自客户的连接" + +#: src/labels.h:297 +msgid "The following options can also be supplied to the command" +msgstr "你也可以在command中选择以下选项" + +#: src/labels.h:299 +msgid "Examples can be found by running" +msgstr "运行一下指令查看更多示例" + +#: src/labels.h:302 +msgid "Server Statistics" +msgstr "服务器统计信息" + +#: src/labels.h:304 +msgid "Theme" +msgstr "主题" + +#: src/labels.h:306 +msgid "Dark Gray" +msgstr "深黑" + +#: src/labels.h:308 +msgid "Bright" +msgstr "明亮" + +#: src/labels.h:310 +msgid "Dark Blue" +msgstr "深蓝" + +#: src/labels.h:312 +#, fuzzy +msgid "Dark Purple" +msgstr "深蓝" + +#: src/labels.h:314 +msgid "Panels" +msgstr "面板" + +#: src/labels.h:316 +msgid "Items per Page" +msgstr "每页项目" + +#: src/labels.h:318 +msgid "Tables" +msgstr "表格" + +#: src/labels.h:320 +msgid "Display Tables" +msgstr "显示表格" + +#: src/labels.h:322 +msgid "Auto-Hide on Small Devices" +msgstr "屏幕过小时自动隐藏" + +#: src/labels.h:324 +msgid "Automatically hide tables on small screen devices" +msgstr "屏幕过小时自动隐藏表格" + +#: src/labels.h:326 +msgid "Layout" +msgstr "布局" + +#: src/labels.h:328 +msgid "Horizontal" +msgstr "横向" + +#: src/labels.h:330 +msgid "Vertical" +msgstr "纵向" + +#: src/labels.h:332 +msgid "File Options" +msgstr "文件选项" + +#: src/labels.h:334 +msgid "Export as JSON" +msgstr "导出为JSON文件" + +#: src/labels.h:336 +msgid "Panel Options" +msgstr "面板选项" + +#: src/labels.h:338 +msgid "Previous" +msgstr "后退" + +#: src/labels.h:340 +msgid "Next" +msgstr "前进" + +#: src/labels.h:342 +msgid "First" +msgstr "" + +#: src/labels.h:344 +msgid "Last" +msgstr "" + +#: src/labels.h:346 +msgid "Chart Options" +msgstr "图表选项" + +#: src/labels.h:348 +msgid "Chart" +msgstr "图表" + +#: src/labels.h:350 +msgid "Type" +msgstr "类型" + +#: src/labels.h:352 +msgid "Area Spline" +msgstr "AreaSpline图表" + +#: src/labels.h:354 +msgid "Bar" +msgstr "条形图" + +#: src/labels.h:356 +msgid "Plot Metric" +msgstr "绘制度量" + +# change +#: src/labels.h:358 +msgid "Table Columns" +msgstr "表格列" + +#: src/labels.h:362 +msgid "1xx Informational" +msgstr "1xx 消息" + +#: src/labels.h:364 +msgid "2xx Success" +msgstr "2xx 成功" + +#: src/labels.h:366 +msgid "3xx Redirection" +msgstr "3xx Url重定向" + +#: src/labels.h:368 +msgid "4xx Client Errors" +msgstr "4xx 客户端错" + +#: src/labels.h:370 +msgid "5xx Server Errors" +msgstr "5xx 服务器错" + +#: src/labels.h:373 +msgid "100 - Continue: Server received the initial part of the request" +msgstr "100 - 继续: 服务器已经接收到请求头" + +#: src/labels.h:375 +msgid "101 - Switching Protocols: Client asked to switch protocols" +msgstr "101 - 更改协议: 客户端被通知变更协议来完成请求" + +#: src/labels.h:377 +msgid "200 - OK: The request sent by the client was successful" +msgstr "200 - 成功: 请求成功" + +#: src/labels.h:379 +msgid "201 - Created: The request has been fulfilled and created" +msgstr "201 - 已创建: 请求成功并且服务器创建了新的资源" + +#: src/labels.h:381 +msgid "202 - Accepted: The request has been accepted for processing" +msgstr "202 - 已接收: 服务器已接受请求,但尚未处理" + +#: src/labels.h:383 +msgid "203 - Non-authoritative Information: Response from a third party" +msgstr "203 - 非授权信息: 服务器已成功处理请求 但返回的信息可能来自另一来源" + +#: src/labels.h:385 +msgid "204 - No Content: Request did not return any content" +msgstr "204 - 无内容: 没有返回任何内容" + +#: src/labels.h:387 +msgid "205 - Reset Content: Server asked the client to reset the document" +msgstr "205 - 重置内容: 服务器已成功处理请求 但没有返回任何内容" + +#: src/labels.h:389 +msgid "206 - Partial Content: The partial GET has been successful" +msgstr "206 - 部分内容: 服务器成功处理了部分GET请求" + +#: src/labels.h:391 +msgid "207 - Multi-Status: WebDAV; RFC 4918" +msgstr "207 - 多状态: WebDAV; RFC 4918" + +#: src/labels.h:393 +msgid "208 - Already Reported: WebDAV; RFC 5842" +msgstr "208 - 已报告: WebDAV; RFC 5842" + +#: src/labels.h:395 +msgid "300 - Multiple Choices: Multiple options for the resource" +msgstr "300 - 多重选择: 资源提供多种选项让客户端选择" + +#: src/labels.h:397 +msgid "301 - Moved Permanently: Resource has permanently moved" +msgstr "301 - 永久移除: 资源已被永久移动到新位置" + +#: src/labels.h:399 +msgid "302 - Moved Temporarily (redirect)" +msgstr "302 - 临时移动" + +#: src/labels.h:401 +msgid "303 - See Other Document: The response is at a different URI" +msgstr "303 - 查看其他位置: 当前请求的响应在另一个URI上被找到" + +#: src/labels.h:403 +msgid "304 - Not Modified: Resource has not been modified" +msgstr "304 - 未修改: 资源未被修改" + +#: src/labels.h:405 +msgid "305 - Use Proxy: Can only be accessed through the proxy" +msgstr "305 - 使用代理: 只能通过代理访问资源" + +#: src/labels.h:407 +msgid "307 - Temporary Redirect: Resource temporarily moved" +msgstr "307 - 临时重定向: 临时从另外的URI响应" + +#: src/labels.h:409 +msgid "400 - Bad Request: The syntax of the request is invalid" +msgstr "400 - 错误请求: 客户端语法错误" + +#: src/labels.h:411 +msgid "401 - Unauthorized: Request needs user authentication" +msgstr "401 - 未授权: 当前请求需要用户授权" + +#: src/labels.h:413 +msgid "402 - Payment Required" +msgstr "402 - 需要支付" + +#: src/labels.h:415 +msgid "403 - Forbidden: Server is refusing to respond to it" +msgstr "403 - 禁止: 服务器拒绝响应请求" + +#: src/labels.h:417 +msgid "404 - Not Found: Requested resource could not be found" +msgstr "404 - 未找到: 找不到请求的资源" + +#: src/labels.h:419 +msgid "405 - Method Not Allowed: Request method not supported" +msgstr "405 - 方法禁用: 不支持请求中指定的方法" + +#: src/labels.h:421 +msgid "406 - Not Acceptable" +msgstr "406 - 无法接收" + +#: src/labels.h:423 +msgid "407 - Proxy Authentication Required" +msgstr "407 - 需要代理授权" + +#: src/labels.h:425 +msgid "408 - Request Timeout: Server timed out waiting for the request" +msgstr "408 - 请求超时: 服务器在等候请求时超时" + +#: src/labels.h:427 +msgid "409 - Conflict: Conflict in the request" +msgstr "409 - 冲突: 服务器在完成请求时发生冲突" + +#: src/labels.h:429 +msgid "410 - Gone: Resource requested is no longer available" +msgstr "410 - 已删除: 请求的资源已永久删除" + +#: src/labels.h:431 +msgid "411 - Length Required: Invalid Content-Length" +msgstr "411 - 需要有效长度: Content-Length无效" + +#: src/labels.h:433 +msgid "412 - Precondition Failed: Server does not meet preconditions" +msgstr "412 - 未满足前提条件: 服务器未满足请求中的前提条件" + +#: src/labels.h:435 +msgid "413 - Payload Too Large" +msgstr "413 - 请求实体过大" + +#: src/labels.h:437 +msgid "414 - Request-URI Too Long" +msgstr "414 - 请求的URI过长" + +#: src/labels.h:439 +msgid "415 - Unsupported Media Type: Media type is not supported" +msgstr "415 - 不支持的媒体类型" + +#: src/labels.h:441 +msgid "416 - Requested Range Not Satisfiable: Cannot supply that portion" +msgstr "416 - 请求范围不符合要求" + +#: src/labels.h:443 +msgid "417 - Expectation Failed" +msgstr "417 - 未满足期望值" + +#: src/labels.h:445 +msgid "421 - Misdirected Request" +msgstr "421 - 被误导的请求" + +#: src/labels.h:447 +msgid "422 - Unprocessable Entity due to semantic errors: WebDAV" +msgstr "422 - 请求格式正确但因存在语法错而无法响应" + +#: src/labels.h:449 +msgid "423 - The resource that is being accessed is locked" +msgstr "423 - 当前资源被锁定" + +#: src/labels.h:451 +msgid "424 - Failed Dependency: WebDAV" +msgstr "424 - 失败的依赖" + +#: src/labels.h:453 +msgid "426 - Upgrade Required: Client should switch to a different protocol" +msgstr "426 - 需要升级: 客户端应该切换到其他的协议" + +#: src/labels.h:455 +msgid "428 - Precondition Required" +msgstr "428 - 需要前提条件" + +#: src/labels.h:457 +msgid "429 - Too Many Requests: The user has sent too many requests" +msgstr "429 - 请求过多: 客户端发送了太多请求" + +#: src/labels.h:459 +msgid "431 - Request Header Fields Too Large" +msgstr "431 - 请求头字段太长" + +#: src/labels.h:461 +msgid "451 - Unavailable For Legal Reasons" +msgstr "451 - 因法律原因不可用" + +#: src/labels.h:463 +msgid "444 - (Nginx) Connection closed without sending any headers" +msgstr "444 - (Nginx) 未发送响应头且连接已关闭" + +#: src/labels.h:465 +msgid "494 - (Nginx) Request Header Too Large" +msgstr "494 - (Nginx) 请求头太大" + +#: src/labels.h:467 +msgid "495 - (Nginx) SSL client certificate error" +msgstr "495 - (Nginx) SSL客户端证书错" + +#: src/labels.h:469 +msgid "496 - (Nginx) Client didn't provide certificate" +msgstr "496 - (Nginx) 客户端未提供证书" + +#: src/labels.h:471 +msgid "497 - (Nginx) HTTP request sent to HTTPS port" +msgstr "497 - (Nginx) HTTP请求被发送到了HTTPS端口" + +#: src/labels.h:473 +msgid "499 - (Nginx) Connection closed by client while processing request" +msgstr "499 - (Nginx) 处理请求时连接被客户端关闭" + +#: src/labels.h:475 +msgid "500 - Internal Server Error" +msgstr "500 - 服务器内部错" + +#: src/labels.h:477 +msgid "501 - Not Implemented" +msgstr "501 - 尚未实施" + +#: src/labels.h:479 +msgid "502 - Bad Gateway: Received an invalid response from the upstream" +msgstr "502 - 错误网关: 服务器作为网关或代理, 从上游服务器收到无效响应" + +#: src/labels.h:481 +msgid "503 - Service Unavailable: The server is currently unavailable" +msgstr "503 - 服务不可用: 服务器无法使用" + +#: src/labels.h:483 +msgid "504 - Gateway Timeout: The upstream server failed to send request" +msgstr "504 - 网关超时: 服务器作为网关或代理, 未从上游服务器收到请求" + +#: src/labels.h:485 +msgid "505 - HTTP Version Not Supported" +msgstr "505 - HTTP版本不受支持" + +#: src/labels.h:487 +msgid "520 - CloudFlare - Web server is returning an unknown error" +msgstr "520 - CloudFlare - 服务器返回一个未知错误" + +#: src/labels.h:489 +msgid "521 - CloudFlare - Web server is down" +msgstr "521 - CloudFlare - 服务器挂了" + +#: src/labels.h:491 +msgid "522 - CloudFlare - Connection timed out" +msgstr "522 - CloudFlare - 连接超时" + +#: src/labels.h:493 +msgid "523 - CloudFlare - Origin is unreachable" +msgstr "523 - CloudFlare - 服务器无法访问" + +#: src/labels.h:495 +msgid "524 - CloudFlare - A timeout occurred" +msgstr "524 - CloudFlare - 服务器响应超时" + +#~ msgid "Bandwidth" +#~ msgstr "带宽" + +#~ msgid "Unique Files" +#~ msgstr "唯一的文件" + +#~ msgid "Unique 404" +#~ msgstr "唯一的404" + +#~ msgid " - Including spiders" +#~ msgstr "- 包括网络机器人" diff --git a/goaccess++/resources/css/app.css b/goaccess++/resources/css/app.css new file mode 100644 index 0000000..a54201c --- /dev/null +++ b/goaccess++/resources/css/app.css @@ -0,0 +1,987 @@ +/* GLOBAL */ +html, +body { + background: #f0f0f0; + overflow-x: hidden; +} +h1 { + font-weight: bold; + letter-spacing: -3px; +} +h3 { + font-size: 21px; + letter-spacing: -1px; +} +.page-header { + border-bottom: 1px solid rgba(0, 0, 0, 0.15); + margin: 25px 0 20px; + position: relative; +} +.page-header h1 { + margin: 0; +} +.pagination { + margin: 5px 0; +} +.clickable, +.expandable>td { + cursor: pointer; +} +.spinner { + color: #999; + left: 50%; + position: absolute; + top: 50%; +} +.powered { + bottom: 190px; + color: #9E9E9E; + font-size: smaller; + position: absolute; + right: 20px; + transform-origin: 100% 0; + transform: rotate(-90deg); +} +.powered a { + color: #636363; +} +.powered span { + color: #007bc3; +} +.dropdown-header { + color: #007bc3; + padding: 3px 25px; + text-transform: uppercase; +} +.gheader { + letter-spacing: -1px; + text-transform: uppercase; +} +h5.gheader { + letter-spacing: 0; +} +.panel-header h4.gheader { + margin-top: 20px; +} +.panel-header .gheader small { + font-size: 69%; +} + +/* NAVIGATION */ +nav { + -webkit-transition: left .2s; + background: #1C1C1C; + border-right: 3px solid #5bc0de; + height: 100%; + left: -236px; + overflow: hidden; + position: fixed; + top: 0; + transition: left .2s; + width: 300px; + z-index: 2; +} +nav .nav-list { + height: 100%; + overflow-y: auto; + width: 350px; +} +nav header { + margin: 40px 20px 30px; +} +nav header a { + color: rgba(240,240,240,.7); + font-size: 2.7em; + font-weight: 300; + text-transform: uppercase; +} +nav header a:hover { + color: #eee; +} +nav.active { + display: block !important; + left: 0; + opacity: .97; +} +nav:hover ~ #content { + opacity: .3; +} +nav.active .nav-bars, +nav.active .nav-gears, +nav.active .nav-ws-status { + opacity: 0; +} +nav .nav-bars, +nav .nav-gears, +nav .nav-ws-status { + -webkit-transition: opacity .2s; + color: #9E9E9E; + cursor: pointer; + float: right; + font-size: 36px; + height: 32px; + left: 13px; + line-height: 32px; + position: fixed; + text-align: center; + top: 30px; + transition: opacity .2s; + width: 32px; +} +nav .nav-gears { + top: 100px; + opacity: 0.6; +} +nav .nav-ws-status, +.nav-ws-status.mini { + color: #6A6A6A; + cursor: help; + display: none; + font-size: 12px; +} +nav .nav-ws-status { + left: 25px; + top: 125px; +} +.nav-ws-status.mini { + top: 14px; + left: 50px; + position: absolute; +} +.nav-ws-status.connected { + color: #5DB56A; +} +nav li a { + border-left: 3px solid transparent; + color: rgba(200,200,200,.5); + display: block; + font-size: smaller; + max-width: 235px; + opacity: 0; + overflow: hidden; + padding: 9px 20px; + text-overflow: ellipsis; + text-transform: uppercase; + transition: opacity .2s; + white-space: nowrap; +} +nav.active li a { + max-width: 100%; + opacity: 1; +} +nav li a:hover, +nav li.active a { + background: rgba(0,0,0,.1); + border-color: #5BC0DE; + color: #eee; +} +nav ul { + padding-left: 0; + list-style: none; +} +/* Navigation -- Icon */ +nav a, +nav a:hover { + text-decoration: none; +} +nav h3 { + color: #FFF !important; + font-size: medium; + font-weight: bold; + margin: 20px 25px 10px; + text-transform: uppercase; +} + +/* CONTAINER */ +@media screen and (max-width: 767px) { + .row-offcanvas { + -webkit-transition: all .25s ease-out; + -o-transition: all .25s ease-out; + position: relative; + transition: all .25s ease-out; + } + + .row-offcanvas-right { + right: 0; + } + + .row-offcanvas-left { + left: 0; + } + + .row-offcanvas-right + .sidebar-offcanvas { + right: -50%; + } + + .row-offcanvas-left + .sidebar-offcanvas { + left: -50%; + } + + .row-offcanvas-right.active { + right: 50%; + } + + .row-offcanvas-left.active { + left: 50%; + } + + .sidebar-offcanvas { + position: absolute; + top: 0; + width: 50%; + }; +} +@media (min-width: 768px) { + .container { + width: 750px; + }; +} +@media (max-width: 480px) { + .wrap-general h5, + .wrap-panel h5 { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + .wrap-general h5 { + width: 100% + } + .wrap-panel h5 { + width: 70% + } +} +.container-fluid { + margin-left: 75px; +} +@media (min-width: 1120px) { + .container { + width: 970px; + }; +} +@media (min-width: 1320px) { + .container { + width: 1170px; + }; +} +@media (max-width: 992px) { + .container-fluid { + margin-left: auto; + }; +} +@media (max-width: 768px) { + .container-fluid { + padding-left: 5px; + padding-right: 5px; + } + .page-header { + padding: 0 10px; + } +} + +/* PANEL STYLES */ +.wrap-panel .panel-header { + position: relative; +} +div.wrap-panel > div { + background: #FFF; + margin-top: 10px; + padding: 0 10px; + border-top: 1px solid rgba(0, 0, 0, 0.15); +} + +/* PANEL TABLES */ +.wrap-panel table.table-borderless tbody tr td, +.wrap-panel table.table-borderless tbody tr th, +.wrap-panel table.table-borderless thead tr th { + border: none; +} +.wrap-panel table thead tr th { + text-align: right; + border-bottom-width: 1px; +} +.wrap-panel table .string, +.wrap-panel table .date { + text-align: left; +} +.wrap-panel table .percent { + color: #898989; +} +.wrap-panel table td, +.wrap-panel table th { + white-space: nowrap; + overflow: hidden; +} +.wrap-panel table th.sortable { + cursor: pointer; +} +/* thead meta */ +.wrap-panel table tbody.tbody-meta { + border-top: 1px solid #C7C7C7; + border-bottom: 1px solid #C7C7C7; +} +.wrap-panel table tbody.tbody-meta tr { + background-color: #F1F1F1; + color: #222; +} +.wrap-panel table tbody.tbody-meta small { + font-size: 65%; +} +/* thead data */ +.wrap-panel table tbody.tbody-data tr td { + border-right: 1px solid #F1F1F1; + font-size: smaller; +} +.wrap-panel table tbody.tbody-data td:last-child { + border-right: none; +} +.wrap-panel table tbody.tbody-data td.row-idx { + color: #898989; +} +.wrap-panel table>tbody+tbody { + border-top-width: 1px; +} +.wrap-panel table tbody.tbody-data tr.shaded { + background-color: #F7F7F7; +} +.wrap-panel table tbody.tbody-data tr. { + background-color: #F7F7F7; +} +.wrap-panel table tbody.tbody-data tr.child td:nth-child(1), +.wrap-panel table tbody.tbody-data tr.child td:nth-child(2) { + border-right: none; +} +.wrap-panel table.table-hover>tbody>tr:hover { + background-color: #EEE; +} + +/* GENERAL */ +.wrap-general { + position: relative; +} +.report-title { + background: #FFF; + border-radius: 4px; + bottom: -10px; + color: #9E9E9E; + font-size: small; + padding: 0 10px; + position: absolute; + right: 0; + z-index: 1; +} +.panel-plot-wrap { + position: absolute; + right: 0; + top: 18px; +} +.col-title { + font-size: 85%; + overflow: hidden; + text-overflow: ellipsis; + text-shadow: 1px 1px 0 #FFF; + white-space: nowrap; + width: 100%; +} +.grid-module { + background: #FFF; + color: rgb(36, 36, 36); + font-weight: normal; + margin-top: 5px; + padding: 7px; +} +.grid-module h3 { + font-size: 25px; + margin: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 100%; +} +.grid-module.black { + border-top: 4px solid #0F1214; +} +.grid-module.gray { + border-top: 4px solid #9E9E9E; +} +.grid-module.red { + border-top: 4px solid #FF303E; +} +.grid-module.blue{ + border-top: 4px solid #00D4E1; +} +.grid-module.green { + border-top: 4px solid #5DB56A; +} +@media (max-width: 767px) { + .panel-plot-wrap { + top: 10px; + } + .powered { + bottom: 10px; + left: 25px; + transform: initial; + } +} + +/* CHARTS */ +.chart-wrap { + margin-bottom: 15px; + position: relative; +} +svg { + background-color: #fff; + display: block; +} +.axis path { + fill: transparent; + stroke: black; + shape-rendering: crispEdges; + stroke-width: 1; +} +.grid.y .tick line, +.grid.x .tick line { + shape-rendering: crispEdges; + stroke: #999; + stroke-dasharray: 3 3; + stroke-width: 1; +} +.axis.x .tick line, +.axis.y0 .tick line, +.axis.y1 .tick line, +.grid.y .tick:first-child line { + stroke: black; + stroke-width: 1; + shape-rendering: crispEdges; +} +.bars rect.bar { + shape-rendering: crispEdges; +} +.rects rect { + fill: transparent; +} +.area { + opacity: 0.2; +} +.points { + stroke: transparent; +} +line.indicator { + fill: transparent; + pointer-events: none; + shape-rendering: crispEdges; + stroke: #999; + stroke-width: 1; +} +.area0, +.bars.y0 .bar, +.points.y0, +rect.legend.y0 { + fill: #447FB3; +} +.area1, +.bars.y1 .bar, +.points.y1, +rect.legend.y1 { + fill: #FF6854; +} +.line0, +.line1 { + fill: transparent; + stroke-width: 1; +} +.line0 { + stroke: #007BC3; +} +.line1 { + stroke: #FF303E; +} +.axis text, +.axis-label, +text.legend { + font: 10px sans-serif; +} +.axis-label.y0, +.axis-label.y1 { + text-anchor: end; +} +rect.legend { + height: 10px; + width: 10px; +} +.legend { + cursor: pointer; +} +.wrap-text text { + text-anchor: start!important; +} + +/* CHART TOOLTIP */ +.chart-tooltip-wrap { + left: 0; + pointer-events: none; + position: absolute; + top: 10px; + z-index: 10; +} +.chart-tooltip { + -moz-box-shadow: 7px 7px 12px -9px #777777; + -webkit-box-shadow: 7px 7px 12px -9px #777777; + background-color: #fff; + border-collapse: collapse; + border-spacing: 0; + box-shadow: 7px 7px 12px -9px #777777; + empty-cells: show; + opacity: 0.9; +} +.chart-tooltip tr { + border: 1px solid #CCC; +} +.chart-tooltip th { + background-color: #aaa; + color: #FFF; + font-size: 14px; + max-width: 380px; + overflow: hidden; + padding: 2px 5px; + text-align: left; + text-overflow: ellipsis; + white-space: nowrap; +} +.chart-tooltip td { + border-left: 1px dotted #999; + font-size: 13px; + padding: 3px 6px; +} +.chart-tooltip td > span { + display: inline-block; + height: 10px; + margin-right: 6px; + width: 10px; +} +.chart-tooltip td.value { + text-align: right; +} +.chart-tooltip .blue { + background-color: #007BC3; +} +.chart-tooltip .red { + background-color: #FF303E; +} + +/* DARK THEME */ +.dark h1 { + color: rgba(255, 255, 255, 0.6); +} +.dark h3, +.dark h4, +.dark h5 { + color: rgba(255,255,255,0.4); +} +.dark .table-responsive { + border: none; +} +.dark .wrap-panel > div > table { + color: #D2D2D2; +} +.dark .wrap-panel table tbody.tbody-meta tr { + background-color: transparent; + color: #F7F7F7; +} +.dark .wrap-panel table tbody.tbody-data tr td { + border-right: none; +} +.dark .wrap-panel table.table-hover>tbody.tbody-data>tr:hover { + background-color: rgba(255, 255, 255, 0.08) !important; +} +.dark .col-title { + color: #9e9e9e; + text-shadow:none; +} +.dark .grid-module h3 { + color: #FFF; +} +.dark .dropdown-menu>li>a { + color: #FFF; +} +.dark div.wrap-panel > div { + color: #EEE; + margin-top: 10px; + padding: 0 10px; + border-top: 1px solid rgba(255, 255, 255, 0.15); +} + +/* DARK BLUE THEME */ +html.dark.blue, +.dark.blue body { + background: #252B30; +} +.dark.blue .container { + background: #252B30; +} +.dark.blue .page-header { + border-bottom: 1px solid #3B444C; +} +.dark.blue .label-info { + background-color: #252B30; +} +.dark.blue nav { + border-right: 1px solid #181B1F; + background: #1F2328; +} +.dark.blue div.wrap-panel > div { + background: #1F2328; +} +.dark.blue .wrap-panel table tbody.tbody-meta { + border-top: 1px solid #3B444C; + border-bottom: 1px solid #3B444C; +} +.dark.blue .wrap-panel table tbody.tbody-data tr.shaded { + background-color: #181B1F; +} +.dark.blue .gray { + border-top: 4px solid #3B444C; +} +.dark.blue .grid-module { + background: #1F2328; +} +.dark.blue .btn-default { + color: #9E9E9E; + background-color: #1F2328; + border-color: #3B444C; +} +.dark.blue .btn-default:active, +.dark.blue .btn-default:hover, +.dark.blue .btn-default.active, +.dark.blue .open>.dropdown-toggle.btn-default { + color: #3B444C; + background-color: #1F2328; + border-color: #0F1214; +} +.dark.blue .pagination>.disabled>a, +.dark.blue .pagination>.disabled>a:hover, +.dark.blue .pagination>.disabled>a:focus { + color: #777; +} +.dark.blue .pagination>li>a { + background-color: #1F2328; + border: 1px solid #3B444C; +} +.dark.blue .pagination>li>a:hover, +.dark.blue .pagination>li>a:active, +.dark.blue .pagination>li>a:focus { + color: #0370B0; + background-color: #1F2328; + border-color: #3B444C; +} +.dark.blue .dropdown-menu>li>a:hover, +.dark.blue .dropdown-menu>li>a:focus { + color: #FFF; + background-color: #3B444C; +} +.dark.blue .dropdown-menu { + background-color: #252B30; +} +.dark.blue::-webkit-scrollbar-track, +.dark.blue .table-responsive::-webkit-scrollbar-track { + -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3); + background-color: #9E9E9E; +} +.dark.blue::-webkit-scrollbar, +.dark.blue .table-responsive::-webkit-scrollbar { + width: 10px; + height: 10px; + background-color: #9E9E9E; +} +.dark.blue::-webkit-scrollbar-thumb, +.dark.blue .table-responsive::-webkit-scrollbar-thumb { + background-color: #3B444C; +} +.dark.blue .chart-tooltip { + background-color: #252B30; +} +.dark.blue .report-title { + background: #1F2328; +} + +/* DARK GREY THEME */ +html.dark.gray, +.dark.gray body { + background: #212121; +} +.dark.gray .container { + background: #212121; +} +.dark.gray .page-header { + border-bottom: 1px solid #303030; +} +.dark.gray .label-info { + background-color: #303030; +} +.dark.gray nav { + border-right: 1px solid #363737; + background: #1C1C1C; +} +.dark.gray div.wrap-panel > div { + background: #1C1C1C; +} +.dark.gray .wrap-panel table tbody.tbody-meta { + border-top: 1px solid #363737; + border-bottom: 1px solid #363737; +} +.dark.gray .wrap-panel table tbody.tbody-data tr.shaded { + background-color: rgba(48, 48, 48, 0.48); +} +.dark.gray .gray { + border-top: 4px solid #303030; +} +.dark.gray .grid-module { + background: #1C1C1C; +} +.dark.gray .btn-default { + color: #9E9E9E; + background-color: #212121; + border-color: #303030; +} +.dark.gray .btn-default:active, +.dark.gray .btn-default:hover, +.dark.gray .btn-default.active, +.dark.gray .open>.dropdown-toggle.btn-default { + color: #363737; + background-color: #1C1C1C; + border-color: #0F1214; +} +.dark.gray .pagination>.disabled>a, +.dark.gray .pagination>.disabled>a:hover, +.dark.gray .pagination>.disabled>a:focus { + color: #777; +} +.dark.gray .pagination>li>a { + background-color: #212121; + border: 1px solid #303030; +} +.dark.gray .pagination>li>a:hover, +.dark.gray .pagination>li>a:active, +.dark.gray .pagination>li>a:focus { + color: #0370B0; + background-color: #212121; + border-color: #303030; +} +.dark.gray .dropdown-menu>li>a { + color: #FFF; +} +.dark.gray .dropdown-menu>li>a:hover, +.dark.gray .dropdown-menu>li>a:focus { + color: #FFF; + background-color: #303030; +} +.dark.gray .dropdown-menu { + background-color: #212121; +} +.dark.gray::-webkit-scrollbar-track, +.dark.gray .table-responsive::-webkit-scrollbar-track { + -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3); + background-color: #9E9E9E; +} +.dark.gray::-webkit-scrollbar, +.dark.gray .table-responsive::-webkit-scrollbar { + width: 10px; + height: 10px; + background-color: #9E9E9E; +} +.dark.gray::-webkit-scrollbar-thumb, +.dark.gray .table-responsive::-webkit-scrollbar-thumb { + background-color: #303030; +} +.dark.gray .chart-tooltip { + background-color: #303030; +} +.dark.gray .report-title { + background: #303030; +} + +/* DARK CHARTS */ +.dark svg { + background-color: transparent; +} +.dark .area { + opacity: 0.1; +} +.dark .line0, +.dark .line1 { + stroke-width: 2; +} +.dark .area0, +.dark .bars.y0 .bar, +.dark rect.legend.y0 { + fill: #007BC3; +} +.dark .area1, +.dark .bars.y1 .bar, +.dark .points.y1, +.dark rect.legend.y1 { + fill: #FF303E; +} +.dark .points.y0 { + fill: #00D4E1; +} +.dark .line0 { + stroke: #007BC3; +} +.dark .line1 { + stroke: #FF303E; +} +.dark .grid.y .tick line, +.dark .grid.x .tick line { + stroke: #44474B; + stroke-dasharray: 1 1; +} +.dark .axis text, +.dark .axis-label, +.dark text.legend { + fill: #9E9E9E; +} +.dark .axis path { + stroke: #999999; +} +.dark .axis.x .tick line, +.dark .axis.y0 .tick line, +.dark .axis.y1 .tick line, +.dark .grid.y .tick:first-child line { + stroke: #3B444C; +} +.dark .chart-tooltip th { + background-color: #1c1c1c; +} +.dark .chart-tooltip tr { + border: 1px solid #363737; +} + +/* DARK PURPLE THEME */ +html.dark.purple, +.dark.purple body { + background: #1e1e2f; +} +.dark.purple .container { + background: #1e1e2f; +} +.dark.purple .page-header { + border-bottom: 1px solid #2b3553; +} +.dark.purple .label-info { + background-color: #181823; +} +.dark.purple nav { + border-right: 1px solid #e14eca; + background: #181823; +} +.dark.purple div.wrap-panel > div { + background: #27293d; + border-top: 1px solid #2b3553; +} +.dark.purple .wrap-panel table tbody.tbody-meta { + border-top: 1px solid #2b3553; + border-bottom: 1px solid #2b3553; +} +.dark.purple .wrap-panel table tbody.tbody-data tr.shaded { + background-color: #1e1e2f; +} +.dark.purple .gray { + border-top: 4px solid #2b3553; +} +.dark.purple .red { + border-top: 4px solid #fd5d93; +} +.dark.purple .green { + border-top: 4px solid #00f2c3; +} +.dark.purple .blue { + border-top: 4px solid #1f8ef1; +} +.dark.purple h3, .dark.purple h4, .dark.purple h5 { + color: #9a9a9a; +} +.dark.purple .grid-module { + background: #27293d; +} +.dark.purple .grid-module h3 { + color: #FFF; +} +.dark.purple .btn-default { + color: #9E9E9E; + background-color: #1e1e2f; + border-color: #2b3553; +} +.dark.purple .btn-default:active, +.dark.purple .btn-default:hover, +.dark.purple .btn-default.active, +.dark.purple .open>.dropdown-toggle.btn-default { + color: #59595f; + background-color: #1e1e2f; + border-color: #2b3553; +} +.dark.purple .pagination>.disabled>a, +.dark.purple .pagination>.disabled>a:hover, +.dark.purple .pagination>.disabled>a:focus { + color: #777; +} +.dark.purple .pagination>li>a { + background-color: #1e1e2f; + border: 1px solid #3B444C; +} +.dark.purple .pagination>li>a:hover, +.dark.purple .pagination>li>a:active, +.dark.purple .pagination>li>a:focus { + color: #0370B0; + background-color: #181823; +} +.dark.purple .dropdown-menu>li>a:hover, +.dark.purple .dropdown-menu>li>a:focus { + color: #FFF; + background-color: #181823; +} +.dark.purple .dropdown-menu { + background-color: #1e1e2f; +} +.dark.purple::-webkit-scrollbar-track, +.dark.purple .table-responsive::-webkit-scrollbar-track { + -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3); + background-color: #9E9E9E; +} +.dark.purple::-webkit-scrollbar, +.dark.purple .table-responsive::-webkit-scrollbar { + width: 10px; + height: 10px; + background-color: #9E9E9E; +} +.dark.purple::-webkit-scrollbar-thumb, +.dark.purple .table-responsive::-webkit-scrollbar-thumb { + background-color: #1e1e2f; +} +.dark.purple .chart-tooltip { + background-color: #181823; +} +.dark.purple .report-title { + background: #181823; +} +.dark.purple .area0, +.dark.purple .bars.y0 .bar, +.dark.purple rect.legend.y0 { + fill: #007BC3; +} +.dark.purple .area1, +.dark.purple .bars.y1 .bar, +.dark.purple .points.y1, +.dark.purple rect.legend.y1 { + fill: #d048b6; +} +.dark.purple .points.y0 { + fill: #00D4E1; +} +.dark.purple .line0 { + stroke: #007BC3; +} +.dark.purple .line1 { + stroke: #d048b6; +} diff --git a/goaccess++/resources/css/app.css.tmp b/goaccess++/resources/css/app.css.tmp new file mode 100644 index 0000000..e01e62b --- /dev/null +++ b/goaccess++/resources/css/app.css.tmp @@ -0,0 +1 @@ +/* GLOBAL */html,body {background: #f0f0f0;overflow-x: hidden;}h1 {font-weight: bold;letter-spacing: -3px;}h3 {font-size: 21px;letter-spacing: -1px;}.page-header {border-bottom: 1px solid rgba(0, 0, 0, 0.15);margin: 25px 0 20px;position: relative;}.page-header h1 {margin: 0;}.pagination {margin: 5px 0;}.clickable,.expandable>td {cursor: pointer;}.spinner {color: #999;left: 50%;position: absolute;top: 50%;}.powered {bottom: 190px;color: #9E9E9E;font-size: smaller;position: absolute;right: 20px;transform-origin: 100% 0;transform: rotate(-90deg);}.powered a {color: #636363;}.powered span {color: #007bc3;}.dropdown-header {color: #007bc3;padding: 3px 25px;text-transform: uppercase;}.gheader {letter-spacing: -1px;text-transform: uppercase;}h5.gheader {letter-spacing: 0;}.panel-header h4.gheader {margin-top: 20px;}.panel-header .gheader small {font-size: 69%;}/* NAVIGATION */nav {-webkit-transition: left .2s;background: #1C1C1C;border-right: 3px solid #5bc0de;height: 100%;left: -236px;overflow: hidden;position: fixed;top: 0;transition: left .2s;width: 300px;z-index: 2;}nav .nav-list {height: 100%;overflow-y: auto;width: 350px;}nav header {margin: 40px 20px 30px;}nav header a {color: rgba(240,240,240,.7);font-size: 2.7em;font-weight: 300;text-transform: uppercase;}nav header a:hover {color: #eee;}nav.active {display: block !important;left: 0;opacity: .97;}nav:hover ~ #content {opacity: .3;}nav.active .nav-bars,nav.active .nav-gears,nav.active .nav-ws-status {opacity: 0;}nav .nav-bars,nav .nav-gears,nav .nav-ws-status {-webkit-transition: opacity .2s;color: #9E9E9E;cursor: pointer;float: right;font-size: 36px;height: 32px;left: 13px;line-height: 32px;position: fixed;text-align: center;top: 30px;transition: opacity .2s;width: 32px;}nav .nav-gears {top: 100px;opacity: 0.6;}nav .nav-ws-status,.nav-ws-status.mini {color: #6A6A6A;cursor: help;display: none;font-size: 12px;}nav .nav-ws-status {left: 25px;top: 125px;}.nav-ws-status.mini {top: 14px;left: 50px;position: absolute;}.nav-ws-status.connected {color: #5DB56A;}nav li a {border-left: 3px solid transparent;color: rgba(200,200,200,.5);display: block;font-size: smaller;max-width: 235px;opacity: 0;overflow: hidden;padding: 9px 20px;text-overflow: ellipsis;text-transform: uppercase;transition: opacity .2s;white-space: nowrap;}nav.active li a {max-width: 100%;opacity: 1;}nav li a:hover,nav li.active a {background: rgba(0,0,0,.1);border-color: #5BC0DE;color: #eee;}nav ul {padding-left: 0;list-style: none;}/* Navigation -- Icon */nav a,nav a:hover {text-decoration: none;}nav h3 {color: #FFF !important;font-size: medium;font-weight: bold;margin: 20px 25px 10px;text-transform: uppercase;}/* CONTAINER */@media screen and (max-width: 767px) {.row-offcanvas {-webkit-transition: all .25s ease-out;-o-transition: all .25s ease-out;position: relative;transition: all .25s ease-out;}.row-offcanvas-right {right: 0;}.row-offcanvas-left {left: 0;}.row-offcanvas-right.sidebar-offcanvas {right: -50%;}.row-offcanvas-left.sidebar-offcanvas {left: -50%;}.row-offcanvas-right.active {right: 50%;}.row-offcanvas-left.active {left: 50%;}.sidebar-offcanvas {position: absolute;top: 0;width: 50%;};}@media (min-width: 768px) {.container {width: 750px;};}@media (max-width: 480px) {.wrap-general h5,.wrap-panel h5 {white-space: nowrap;overflow: hidden;text-overflow: ellipsis;}.wrap-general h5 {width: 100%}.wrap-panel h5 {width: 70%}}.container-fluid {margin-left: 75px;}@media (min-width: 1120px) {.container {width: 970px;};}@media (min-width: 1320px) {.container {width: 1170px;};}@media (max-width: 992px) {.container-fluid {margin-left: auto;};}@media (max-width: 768px) {.container-fluid {padding-left: 5px;padding-right: 5px;}.page-header {padding: 0 10px;}}/* PANEL STYLES */.wrap-panel .panel-header {position: relative;}div.wrap-panel > div {background: #FFF;margin-top: 10px;padding: 0 10px;border-top: 1px solid rgba(0, 0, 0, 0.15);}/* PANEL TABLES */.wrap-panel table.table-borderless tbody tr td,.wrap-panel table.table-borderless tbody tr th,.wrap-panel table.table-borderless thead tr th {border: none;}.wrap-panel table thead tr th {text-align: right;border-bottom-width: 1px;}.wrap-panel table .string,.wrap-panel table .date {text-align: left;}.wrap-panel table .percent {color: #898989;}.wrap-panel table td,.wrap-panel table th {white-space: nowrap;overflow: hidden;}.wrap-panel table th.sortable {cursor: pointer;}/* thead meta */.wrap-panel table tbody.tbody-meta {border-top: 1px solid #C7C7C7;border-bottom: 1px solid #C7C7C7;}.wrap-panel table tbody.tbody-meta tr {background-color: #F1F1F1;color: #222;}.wrap-panel table tbody.tbody-meta small {font-size: 65%;}/* thead data */.wrap-panel table tbody.tbody-data tr td {border-right: 1px solid #F1F1F1;font-size: smaller;}.wrap-panel table tbody.tbody-data td:last-child {border-right: none;}.wrap-panel table tbody.tbody-data td.row-idx {color: #898989;}.wrap-panel table>tbody+tbody {border-top-width: 1px;}.wrap-panel table tbody.tbody-data tr.shaded {background-color: #F7F7F7;}.wrap-panel table tbody.tbody-data tr. {background-color: #F7F7F7;}.wrap-panel table tbody.tbody-data tr.child td:nth-child(1),.wrap-panel table tbody.tbody-data tr.child td:nth-child(2) {border-right: none;}.wrap-panel table.table-hover>tbody>tr:hover {background-color: #EEE;}/* GENERAL */.wrap-general {position: relative;}.report-title {background: #FFF;border-radius: 4px;bottom: -10px;color: #9E9E9E;font-size: small;padding: 0 10px;position: absolute;right: 0;z-index: 1;}.panel-plot-wrap {position: absolute;right: 0;top: 18px;}.col-title {font-size: 85%;overflow: hidden;text-overflow: ellipsis;text-shadow: 1px 1px 0 #FFF;white-space: nowrap;width: 100%;}.grid-module {background: #FFF;color: rgb(36, 36, 36);font-weight: normal;margin-top: 5px;padding: 7px;}.grid-module h3 {font-size: 25px;margin: 0;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;width: 100%;}.grid-module.black {border-top: 4px solid #0F1214;}.grid-module.gray {border-top: 4px solid #9E9E9E;}.grid-module.red {border-top: 4px solid #FF303E;}.grid-module.blue{border-top: 4px solid #00D4E1;}.grid-module.green {border-top: 4px solid #5DB56A;}@media (max-width: 767px) {.panel-plot-wrap {top: 10px;}.powered {bottom: 10px;left: 25px;transform: initial;}}/* CHARTS */.chart-wrap {margin-bottom: 15px;position: relative;}svg {background-color: #fff;display: block;}.axis path {fill: transparent;stroke: black;shape-rendering: crispEdges;stroke-width: 1;}.grid.y .tick line,.grid.x .tick line {shape-rendering: crispEdges;stroke: #999;stroke-dasharray: 3 3;stroke-width: 1;}.axis.x .tick line,.axis.y0 .tick line,.axis.y1 .tick line,.grid.y .tick:first-child line {stroke: black;stroke-width: 1;shape-rendering: crispEdges;}.bars rect.bar {shape-rendering: crispEdges;}.rects rect {fill: transparent;}.area {opacity: 0.2;}.points {stroke: transparent;}line.indicator {fill: transparent;pointer-events: none;shape-rendering: crispEdges;stroke: #999;stroke-width: 1;}.area0,.bars.y0 .bar,.points.y0,rect.legend.y0 {fill: #447FB3;}.area1,.bars.y1 .bar,.points.y1,rect.legend.y1 {fill: #FF6854;}.line0,.line1 {fill: transparent;stroke-width: 1;}.line0 {stroke: #007BC3;}.line1 {stroke: #FF303E;}.axis text,.axis-label,text.legend {font: 10px sans-serif;}.axis-label.y0,.axis-label.y1 {text-anchor: end;}rect.legend {height: 10px;width: 10px;}.legend {cursor: pointer;}.wrap-text text {text-anchor: start!important;}/* CHART TOOLTIP */.chart-tooltip-wrap {left: 0;pointer-events: none;position: absolute;top: 10px;z-index: 10;}.chart-tooltip {-moz-box-shadow: 7px 7px 12px -9px #777777;-webkit-box-shadow: 7px 7px 12px -9px #777777;background-color: #fff;border-collapse: collapse;border-spacing: 0;box-shadow: 7px 7px 12px -9px #777777;empty-cells: show;opacity: 0.9;}.chart-tooltip tr {border: 1px solid #CCC;}.chart-tooltip th {background-color: #aaa;color: #FFF;font-size: 14px;max-width: 380px;overflow: hidden;padding: 2px 5px;text-align: left;text-overflow: ellipsis;white-space: nowrap;}.chart-tooltip td {border-left: 1px dotted #999;font-size: 13px;padding: 3px 6px;}.chart-tooltip td > span {display: inline-block;height: 10px;margin-right: 6px;width: 10px;}.chart-tooltip td.value {text-align: right;}.chart-tooltip .blue {background-color: #007BC3;}.chart-tooltip .red {background-color: #FF303E;}/* DARK THEME */.dark h1 {color: rgba(255, 255, 255, 0.6);}.dark h3,.dark h4,.dark h5 {color: rgba(255,255,255,0.4);}.dark .table-responsive {border: none;}.dark .wrap-panel > div > table {color: #D2D2D2;}.dark .wrap-panel table tbody.tbody-meta tr {background-color: transparent;color: #F7F7F7;}.dark .wrap-panel table tbody.tbody-data tr td {border-right: none;}.dark .wrap-panel table.table-hover>tbody.tbody-data>tr:hover {background-color: rgba(255, 255, 255, 0.08) !important;}.dark .col-title {color: #9e9e9e;text-shadow:none;}.dark .grid-module h3 {color: #FFF;}.dark .dropdown-menu>li>a {color: #FFF;}.dark div.wrap-panel > div {color: #EEE;margin-top: 10px;padding: 0 10px;border-top: 1px solid rgba(255, 255, 255, 0.15);}/* DARK BLUE THEME */html.dark.blue,.dark.blue body {background: #252B30;}.dark.blue .container {background: #252B30;}.dark.blue .page-header {border-bottom: 1px solid #3B444C;}.dark.blue .label-info {background-color: #252B30;}.dark.blue nav {border-right: 1px solid #181B1F;background: #1F2328;}.dark.blue div.wrap-panel > div {background: #1F2328;}.dark.blue .wrap-panel table tbody.tbody-meta {border-top: 1px solid #3B444C;border-bottom: 1px solid #3B444C;}.dark.blue .wrap-panel table tbody.tbody-data tr.shaded {background-color: #181B1F;}.dark.blue .gray {border-top: 4px solid #3B444C;}.dark.blue .grid-module {background: #1F2328;}.dark.blue .btn-default {color: #9E9E9E;background-color: #1F2328;border-color: #3B444C;}.dark.blue .btn-default:active,.dark.blue .btn-default:hover,.dark.blue .btn-default.active,.dark.blue .open>.dropdown-toggle.btn-default {color: #3B444C;background-color: #1F2328;border-color: #0F1214;}.dark.blue .pagination>.disabled>a,.dark.blue .pagination>.disabled>a:hover,.dark.blue .pagination>.disabled>a:focus {color: #777;}.dark.blue .pagination>li>a {background-color: #1F2328;border: 1px solid #3B444C;}.dark.blue .pagination>li>a:hover,.dark.blue .pagination>li>a:active,.dark.blue .pagination>li>a:focus {color: #0370B0;background-color: #1F2328;border-color: #3B444C;}.dark.blue .dropdown-menu>li>a:hover,.dark.blue .dropdown-menu>li>a:focus {color: #FFF;background-color: #3B444C;}.dark.blue .dropdown-menu {background-color: #252B30;}.dark.blue::-webkit-scrollbar-track,.dark.blue .table-responsive::-webkit-scrollbar-track {-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);background-color: #9E9E9E;}.dark.blue::-webkit-scrollbar,.dark.blue .table-responsive::-webkit-scrollbar {width: 10px;height: 10px;background-color: #9E9E9E;}.dark.blue::-webkit-scrollbar-thumb,.dark.blue .table-responsive::-webkit-scrollbar-thumb {background-color: #3B444C;}.dark.blue .chart-tooltip {background-color: #252B30;}.dark.blue .report-title {background: #1F2328;}/* DARK GREY THEME */html.dark.gray,.dark.gray body {background: #212121;}.dark.gray .container {background: #212121;}.dark.gray .page-header {border-bottom: 1px solid #303030;}.dark.gray .label-info {background-color: #303030;}.dark.gray nav {border-right: 1px solid #363737;background: #1C1C1C;}.dark.gray div.wrap-panel > div {background: #1C1C1C;}.dark.gray .wrap-panel table tbody.tbody-meta {border-top: 1px solid #363737;border-bottom: 1px solid #363737;}.dark.gray .wrap-panel table tbody.tbody-data tr.shaded {background-color: rgba(48, 48, 48, 0.48);}.dark.gray .gray {border-top: 4px solid #303030;}.dark.gray .grid-module {background: #1C1C1C;}.dark.gray .btn-default {color: #9E9E9E;background-color: #212121;border-color: #303030;}.dark.gray .btn-default:active,.dark.gray .btn-default:hover,.dark.gray .btn-default.active,.dark.gray .open>.dropdown-toggle.btn-default {color: #363737;background-color: #1C1C1C;border-color: #0F1214;}.dark.gray .pagination>.disabled>a,.dark.gray .pagination>.disabled>a:hover,.dark.gray .pagination>.disabled>a:focus {color: #777;}.dark.gray .pagination>li>a {background-color: #212121;border: 1px solid #303030;}.dark.gray .pagination>li>a:hover,.dark.gray .pagination>li>a:active,.dark.gray .pagination>li>a:focus {color: #0370B0;background-color: #212121;border-color: #303030;}.dark.gray .dropdown-menu>li>a {color: #FFF;}.dark.gray .dropdown-menu>li>a:hover,.dark.gray .dropdown-menu>li>a:focus {color: #FFF;background-color: #303030;}.dark.gray .dropdown-menu {background-color: #212121;}.dark.gray::-webkit-scrollbar-track,.dark.gray .table-responsive::-webkit-scrollbar-track {-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);background-color: #9E9E9E;}.dark.gray::-webkit-scrollbar,.dark.gray .table-responsive::-webkit-scrollbar {width: 10px;height: 10px;background-color: #9E9E9E;}.dark.gray::-webkit-scrollbar-thumb,.dark.gray .table-responsive::-webkit-scrollbar-thumb {background-color: #303030;}.dark.gray .chart-tooltip {background-color: #303030;}.dark.gray .report-title {background: #303030;}/* DARK CHARTS */.dark svg {background-color: transparent;}.dark .area {opacity: 0.1;}.dark .line0,.dark .line1 {stroke-width: 2;}.dark .area0,.dark .bars.y0 .bar,.dark rect.legend.y0 {fill: #007BC3;}.dark .area1,.dark .bars.y1 .bar,.dark .points.y1,.dark rect.legend.y1 {fill: #FF303E;}.dark .points.y0 {fill: #00D4E1;}.dark .line0 {stroke: #007BC3;}.dark .line1 {stroke: #FF303E;}.dark .grid.y .tick line,.dark .grid.x .tick line {stroke: #44474B;stroke-dasharray: 1 1;}.dark .axis text,.dark .axis-label,.dark text.legend {fill: #9E9E9E;}.dark .axis path {stroke: #999999;}.dark .axis.x .tick line,.dark .axis.y0 .tick line,.dark .axis.y1 .tick line,.dark .grid.y .tick:first-child line {stroke: #3B444C;}.dark .chart-tooltip th {background-color: #1c1c1c;}.dark .chart-tooltip tr {border: 1px solid #363737;}/* DARK PURPLE THEME */html.dark.purple,.dark.purple body {background: #1e1e2f;}.dark.purple .container {background: #1e1e2f;}.dark.purple .page-header {border-bottom: 1px solid #2b3553;}.dark.purple .label-info {background-color: #181823;}.dark.purple nav {border-right: 1px solid #e14eca;background: #181823;}.dark.purple div.wrap-panel > div {background: #27293d;border-top: 1px solid #2b3553;}.dark.purple .wrap-panel table tbody.tbody-meta {border-top: 1px solid #2b3553;border-bottom: 1px solid #2b3553;}.dark.purple .wrap-panel table tbody.tbody-data tr.shaded {background-color: #1e1e2f;}.dark.purple .gray {border-top: 4px solid #2b3553;}.dark.purple .red {border-top: 4px solid #fd5d93;}.dark.purple .green {border-top: 4px solid #00f2c3;}.dark.purple .blue {border-top: 4px solid #1f8ef1;}.dark.purple h3, .dark.purple h4, .dark.purple h5 {color: #9a9a9a;}.dark.purple .grid-module {background: #27293d;}.dark.purple .grid-module h3 {color: #FFF;}.dark.purple .btn-default {color: #9E9E9E;background-color: #1e1e2f;border-color: #2b3553;}.dark.purple .btn-default:active,.dark.purple .btn-default:hover,.dark.purple .btn-default.active,.dark.purple .open>.dropdown-toggle.btn-default {color: #59595f;background-color: #1e1e2f;border-color: #2b3553;}.dark.purple .pagination>.disabled>a,.dark.purple .pagination>.disabled>a:hover,.dark.purple .pagination>.disabled>a:focus {color: #777;}.dark.purple .pagination>li>a {background-color: #1e1e2f;border: 1px solid #3B444C;}.dark.purple .pagination>li>a:hover,.dark.purple .pagination>li>a:active,.dark.purple .pagination>li>a:focus {color: #0370B0;background-color: #181823;}.dark.purple .dropdown-menu>li>a:hover,.dark.purple .dropdown-menu>li>a:focus {color: #FFF;background-color: #181823;}.dark.purple .dropdown-menu {background-color: #1e1e2f;}.dark.purple::-webkit-scrollbar-track,.dark.purple .table-responsive::-webkit-scrollbar-track {-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);background-color: #9E9E9E;}.dark.purple::-webkit-scrollbar,.dark.purple .table-responsive::-webkit-scrollbar {width: 10px;height: 10px;background-color: #9E9E9E;}.dark.purple::-webkit-scrollbar-thumb,.dark.purple .table-responsive::-webkit-scrollbar-thumb {background-color: #1e1e2f;}.dark.purple .chart-tooltip {background-color: #181823;}.dark.purple .report-title {background: #181823;}.dark.purple .area0,.dark.purple .bars.y0 .bar,.dark.purple rect.legend.y0 {fill: #007BC3;}.dark.purple .area1,.dark.purple .bars.y1 .bar,.dark.purple .points.y1,.dark.purple rect.legend.y1 {fill: #d048b6;}.dark.purple .points.y0 {fill: #00D4E1;}.dark.purple .line0 {stroke: #007BC3;}.dark.purple .line1 {stroke: #d048b6;} \ No newline at end of file diff --git a/goaccess++/resources/css/bootstrap.min.css b/goaccess++/resources/css/bootstrap.min.css new file mode 100644 index 0000000..c9677e9 --- /dev/null +++ b/goaccess++/resources/css/bootstrap.min.css @@ -0,0 +1 @@ +/*! http://getbootstrap.com/customize/?id=f8abc08c888af89b2ed8cd64f48a1fe3 */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:hover,a:focus{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover,a.text-primary:focus{color:#286090}.text-success{color:#3c763d}a.text-success:hover,a.text-success:focus{color:#2b542c}.text-info{color:#31708f}a.text-info:hover,a.text-info:focus{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover,a.text-warning:focus{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover,a.text-danger:focus{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover,a.bg-primary:focus{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover,a.bg-success:focus{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover,a.bg-info:focus{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover,a.bg-warning:focus{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover,a.bg-danger:focus{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{border:0;background-color:transparent}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:34px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:46px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0;min-height:34px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:focus,.btn-default.focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#fff;background-color:#398439;border-color:#255625}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:focus,.btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#337ab7;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#337ab7}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#337ab7;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:3;color:#fff;background-color:#337ab7;border-color:#337ab7;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}} diff --git a/goaccess++/resources/css/bootstrap.min.css.tmp b/goaccess++/resources/css/bootstrap.min.css.tmp new file mode 100644 index 0000000..0312f0c --- /dev/null +++ b/goaccess++/resources/css/bootstrap.min.css.tmp @@ -0,0 +1 @@ +/*! http://getbootstrap.com/customize/?id=f8abc08c888af89b2ed8cd64f48a1fe3 */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:hover,a:focus{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover,a.text-primary:focus{color:#286090}.text-success{color:#3c763d}a.text-success:hover,a.text-success:focus{color:#2b542c}.text-info{color:#31708f}a.text-info:hover,a.text-info:focus{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover,a.text-warning:focus{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover,a.text-danger:focus{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover,a.bg-primary:focus{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover,a.bg-success:focus{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover,a.bg-info:focus{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover,a.bg-warning:focus{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover,a.bg-danger:focus{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{border:0;background-color:transparent}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:34px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:46px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0;min-height:34px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:focus,.btn-default.focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#fff;background-color:#398439;border-color:#255625}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:focus,.btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#337ab7;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#337ab7}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#337ab7;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:3;color:#fff;background-color:#337ab7;border-color:#337ab7;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}} \ No newline at end of file diff --git a/goaccess++/resources/css/fa.min.css b/goaccess++/resources/css/fa.min.css new file mode 100644 index 0000000..179498e --- /dev/null +++ b/goaccess++/resources/css/fa.min.css @@ -0,0 +1,8 @@ +@font-face { + font-family: 'fa'; + src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff'); + font-weight: normal; + font-style: normal; +} +[class^="fa-"],[class*=" fa-"]{font-family:'fa' !important;speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes "fa-spin"{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg);}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg);}}@keyframes "fa-spin"{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg);}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg);}} +.fa-square-o:before{content:"\f096";}.fa-user:before{content:"\f007"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before{content:"\f00d"}.fa-remove:before{content:"\f00d"}.fa-times:before{content:"\f00d"}.fa-cog:before{content:"\f013"}.fa-gear:before{content:"\f013"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-list:before{content:"\f03a"}.fa-map-marker:before{content:"\f041"}.fa-check-square-o:before{content:"\f046"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-exclamation-triangle:before{content:"\f071"}.fa-warning:before{content:"\f071"}.fa-bar-chart:before{content:"\f080"}.fa-bar-chart-o:before{content:"\f080"}.fa-cogs:before{content:"\f085"}.fa-gears:before{content:"\f085"}.fa-external-link:before{content:"\f08e"}.fa-bell-o:before{content:"\f0a2"}.fa-group:before{content:"\f0c0"}.fa-users:before{content:"\f0c0"}.fa-bars:before{content:"\f0c9"}.fa-navicon:before{content:"\f0c9"}.fa-reorder:before{content:"\f0c9"}.fa-table:before{content:"\f0ce"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-sort:before{content:"\f0dc"}.fa-unsorted:before{content:"\f0dc"}.fa-dashboard:before{content:"\f0e4"}.fa-tachometer:before{content:"\f0e4"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-desktop:before{content:"\f108"}.fa-circle-o:before{content:"\f10c"}.fa-circle:before{content:"\f111"}.fa-code:before{content:"\f121"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-google:before{content:"\f1a0"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-area-chart:before{content:"\f1fe"}.fa-chrome:before{content:"\f268"}.fa-hashtag:before{content:"\f292"}.fa-question-circle-o:before{content:"\f29c"} diff --git a/goaccess++/resources/css/fa.min.css.tmp b/goaccess++/resources/css/fa.min.css.tmp new file mode 100644 index 0000000..ef407be --- /dev/null +++ b/goaccess++/resources/css/fa.min.css.tmp @@ -0,0 +1 @@ +@font-face {font-family: 'fa';src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff');font-weight: normal;font-style: normal;}[class^="fa-"],[class*=" fa-"]{font-family:'fa' !important;speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes "fa-spin"{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg);}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg);}}@keyframes "fa-spin"{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg);}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg);}}.fa-square-o:before{content:"\f096";}.fa-user:before{content:"\f007"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before{content:"\f00d"}.fa-remove:before{content:"\f00d"}.fa-times:before{content:"\f00d"}.fa-cog:before{content:"\f013"}.fa-gear:before{content:"\f013"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-list:before{content:"\f03a"}.fa-map-marker:before{content:"\f041"}.fa-check-square-o:before{content:"\f046"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-exclamation-triangle:before{content:"\f071"}.fa-warning:before{content:"\f071"}.fa-bar-chart:before{content:"\f080"}.fa-bar-chart-o:before{content:"\f080"}.fa-cogs:before{content:"\f085"}.fa-gears:before{content:"\f085"}.fa-external-link:before{content:"\f08e"}.fa-bell-o:before{content:"\f0a2"}.fa-group:before{content:"\f0c0"}.fa-users:before{content:"\f0c0"}.fa-bars:before{content:"\f0c9"}.fa-navicon:before{content:"\f0c9"}.fa-reorder:before{content:"\f0c9"}.fa-table:before{content:"\f0ce"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-sort:before{content:"\f0dc"}.fa-unsorted:before{content:"\f0dc"}.fa-dashboard:before{content:"\f0e4"}.fa-tachometer:before{content:"\f0e4"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-desktop:before{content:"\f108"}.fa-circle-o:before{content:"\f10c"}.fa-circle:before{content:"\f111"}.fa-code:before{content:"\f121"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-google:before{content:"\f1a0"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-area-chart:before{content:"\f1fe"}.fa-chrome:before{content:"\f268"}.fa-hashtag:before{content:"\f292"}.fa-question-circle-o:before{content:"\f29c"} \ No newline at end of file diff --git a/goaccess++/resources/js/app.js b/goaccess++/resources/js/app.js new file mode 100644 index 0000000..4054ae5 --- /dev/null +++ b/goaccess++/resources/js/app.js @@ -0,0 +1,1793 @@ +/*jshint sub:true*/ +(function () { +'use strict'; + +// Syntactic sugar +function $(selector) { + return document.querySelector(selector); +} + +// Syntactic sugar & execute callback +function $$(selector, callback) { + var elems = document.querySelectorAll(selector); + for (var i = 0; i < elems.length; ++i) { + if (callback && typeof callback == 'function') + callback.call(this, elems[i]); + } +} + +var debounce = function (func, wait, now) { + var timeout; + return function debounced () { + var that = this, args = arguments; + function delayed() { + if (!now) + func.apply(that, args); + timeout = null; + } + if (timeout) { + clearTimeout(timeout); + } else if (now) { + func.apply(obj, args); + } + timeout = setTimeout(delayed, wait || 250); + }; +}; + +// global namespace +window.GoAccess = window.GoAccess || { + initialize: function (options) { + this.opts = options; + + this.AppState = {}; // current state app key-value store + this.AppTpls = {}; // precompiled templates + this.AppCharts = {}; // holds all rendered charts + this.AppUIData = (this.opts || {}).uiData || {}; // holds panel definitions + this.AppData = (this.opts || {}).panelData || {}; // hold raw data + this.AppWSConn = (this.opts || {}).wsConnection || {}; // WebSocket connection + this.i18n = (this.opts || {}).i18n || {}; // i18n report labels + this.AppPrefs = { + 'autoHideTables': true, + 'layout': 'horizontal', + 'perPage': 7, + 'theme': 'darkPurple', + }; + this.AppPrefs = GoAccess.Util.merge(this.AppPrefs, this.opts.prefs); + + if (GoAccess.Util.hasLocalStorage()) { + var ls = JSON.parse(localStorage.getItem('AppPrefs')); + this.AppPrefs = GoAccess.Util.merge(this.AppPrefs, ls); + } + if (Object.keys(this.AppWSConn).length) + this.setWebSocket(this.AppWSConn); + + }, + + getPanelUI: function (panel) { + return panel ? this.AppUIData[panel] : this.AppUIData; + }, + + getPrefs: function (panel) { + return panel ? this.AppPrefs[panel] : this.AppPrefs; + }, + + setPrefs: function () { + if (GoAccess.Util.hasLocalStorage()) { + localStorage.setItem('AppPrefs', JSON.stringify(GoAccess.getPrefs())); + } + }, + + getPanelData: function (panel) { + return panel ? this.AppData[panel] : this.AppData; + }, + + setWebSocket: function (wsConn) { + var host = null; + host = wsConn.url ? wsConn.url : window.location.hostname ? window.location.hostname : "localhost"; + var str = /^(wss?:\/\/)?[^\/]+:[0-9]{1,5}\//.test(host + "/") ? host : String(host + ':' + wsConn.port); + str = !/^wss?:\/\//i.test(str) ? (window.location.protocol === "https:" ? 'wss://' : 'ws://') + str : str; + + var socket = new WebSocket(str); + socket.onopen = function (event) { + GoAccess.Nav.WSOpen(); + }.bind(this); + + socket.onmessage = function (event) { + this.AppState['updated'] = true; + this.AppData = JSON.parse(event.data); + this.App.renderData(); + }.bind(this); + + socket.onclose = function (event) { + GoAccess.Nav.WSClose(); + }.bind(this); + }, +}; + +// HELPERS +GoAccess.Util = { + months: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul","Aug", "Sep", "Oct", "Nov", "Dec"], + + // Add all attributes of n to o + merge: function (o, n) { + var obj = {}, i = 0, il = arguments.length, key; + for (; i < il; i++) { + for (key in arguments[i]) { + if (arguments[i].hasOwnProperty(key)) { + obj[key] = arguments[i][key]; + } + } + } + return obj; + }, + + // hash a string + hashCode: function (s) { + return (s.split('').reduce(function (a, b) { + a = ((a << 5) - a) + b.charCodeAt(0); + return a&a; + }, 0) >>> 0).toString(16); + }, + + // Format bytes to human readable + formatBytes: function (bytes, decimals, numOnly) { + if (bytes == 0) + return numOnly ? 0 : '0 Byte'; + var k = 1024; + var dm = decimals + 1 || 2; + var sizes = ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB']; + var i = Math.floor(Math.log(bytes) / Math.log(k)); + return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + (numOnly ? '' : (' ' + sizes[i])); + }, + + // Validate number + isNumeric: function (n) { + return !isNaN(parseFloat(n)) && isFinite(n); + }, + + // Format microseconds to human readable + utime2str: function (usec) { + if (usec >= 864E8) + return ((usec) / 864E8).toFixed(2) + ' d'; + else if (usec >= 36E8) + return ((usec) / 36E8).toFixed(2) + ' h'; + else if (usec >= 6E7) + return ((usec) / 6E7).toFixed(2) + ' m'; + else if (usec >= 1E6) + return ((usec) / 1E6).toFixed(2) + ' s'; + else if (usec >= 1E3) + return ((usec) / 1E3).toFixed(2) + ' ms'; + return (usec).toFixed(2) + ' us'; + }, + + // Format date from 20120124 to 24/Jan/2012 + formatDate: function (str) { + var y = str.substr(0,4), m = str.substr(4,2) - 1, d = str.substr(6,2), + h = str.substr(8,2) || 0, i = str.substr(10, 2) || 0, s = str.substr(12, 2) || 0; + var date = new Date(y,m,d,h,i,s); + + var out = ('0' + date.getDate()).slice(-2) + '/' + this.months[date.getMonth()] + '/' + date.getFullYear(); + 10 <= str.length && (out += ":" + h); + 12 <= str.length && (out += ":" + i); + 14 <= str.length && (out += ":" + s); + return out; + }, + + // Format field value to human readable + fmtValue: function (value, dataType, decimals) { + var val = 0; + if (!dataType) + val = value; + + switch (dataType) { + case 'utime': + val = this.utime2str(value); + break; + case 'date': + val = this.formatDate(value); + break; + case 'numeric': + if (this.isNumeric(value)) + val = value.toLocaleString(); + break; + case 'bytes': + val = this.formatBytes(value, decimals); + break; + case 'percent': + val = parseFloat(value.replace(',', '.')).toFixed(2) + '%'; + break; + case 'time': + if (this.isNumeric(value)) + val = value.toLocaleString(); + break; + case 'secs': + val = value + ' secs'; + break; + default: + val = value; + } + + return value == 0 ? String(val) : val; + }, + + isPanelValid: function (panel) { + var data = GoAccess.getPanelData(), ui = GoAccess.getPanelUI(); + return (!ui.hasOwnProperty(panel) || !data.hasOwnProperty(panel) || !ui[panel].id); + }, + + // Attempts to extract the count from either an object or a scalar. + // e.g., item = Object {count: 14351, percent: 5.79} OR item = 4824825140 + getCount: function (item) { + if (this.isObject(item) && 'count' in item) + return item.count; + return item; + }, + + getPercent: function (item) { + if (this.isObject(item) && 'percent' in item) + return this.fmtValue(item.percent, 'percent'); + return null; + }, + + isObject: function (o) { + return o === Object(o); + }, + + setProp: function (o, s, v) { + var schema = o; + var a = s.split('.'); + for (var i = 0, n = a.length; i < n-1; ++i) { + var k = a[i]; + if (!schema[k]) + schema[k] = {}; + schema = schema[k]; + } + schema[a[n-1]] = v; + }, + + getProp: function (o, s) { + s = s.replace(/\[(\w+)\]/g, '.$1'); + s = s.replace(/^\./, ''); + var a = s.split('.'); + for (var i = 0, n = a.length; i < n; ++i) { + var k = a[i]; + if (this.isObject(o) && k in o) { + o = o[k]; + } else { + return; + } + } + return o; + }, + + hasLocalStorage: function () { + try { + localStorage.setItem('test', 'test'); + localStorage.removeItem('test'); + return true; + } catch(e) { + return false; + } + }, + + isWithinViewPort: function (el) { + var elemTop = el.getBoundingClientRect().top; + var elemBottom = el.getBoundingClientRect().bottom; + return elemTop < window.innerHeight && elemBottom >= 0; + }, +}; + +// OVERALL STATS +GoAccess.OverallStats = { + // Render each overall stats box + renderBox: function (data, ui, row, x, idx) { + var wrap = $('.wrap-general-items'); + + // create a new bootstrap row every 6 elements + if (idx % 6 == 0) { + row = document.createElement('div'); + row.setAttribute('class', 'row'); + wrap.appendChild(row); + } + + var box = document.createElement('div'); + box.innerHTML = GoAccess.AppTpls.General.items.render({ + 'id': x, + 'className': ui.items[x].className, + 'label': ui.items[x].label, + 'value': GoAccess.Util.fmtValue(data[x], ui.items[x].dataType), + }); + row.appendChild(box); + + return row; + }, + + // Render overall stats + renderData: function (data, ui) { + var idx = 0, row = null; + + $('.wrap-general').innerHTML = GoAccess.AppTpls.General.wrap.render(GoAccess.Util.merge(ui, { + 'lastUpdated': data.date_time, + 'from': data.start_date, + 'to': data.end_date, + })); + + // Iterate over general data object + for (var x in data) { + if (!data.hasOwnProperty(x) || !ui.items.hasOwnProperty(x)) + continue; + row = this.renderBox(data, ui, row, x, idx); + idx++; + } + }, + + // Render general/overall analyzed requests. + initialize: function () { + var ui = GoAccess.getPanelUI('general'); + var data = GoAccess.getPanelData('general'), i = 0; + + this.renderData(data, ui); + } +}; + +// RENDER PANELS +GoAccess.Nav = { + events: function () { + $('.nav-bars').onclick = function (e) { + e.stopPropagation(); + this.renderMenu(e); + }.bind(this); + + $('.nav-gears').onclick = function (e) { + e.stopPropagation(); + this.renderOpts(e); + }.bind(this); + + $('.nav-minibars').onclick = function (e) { + e.stopPropagation(); + this.renderOpts(e); + }.bind(this); + + $('body').onclick = function (e) { + $('nav').classList.remove('active'); + }.bind(this); + + $$('.export-json', function (item) { + item.onclick = function (e) { + this.downloadJSON(e); + }.bind(this); + }.bind(this)); + + $$('.theme-bright', function (item) { + item.onclick = function (e) { + this.setTheme('bright'); + }.bind(this); + }.bind(this)); + + $$('.theme-dark-blue', function (item) { + item.onclick = function (e) { + this.setTheme('darkBlue'); + }.bind(this); + }.bind(this)); + + $$('.theme-dark-gray', function (item) { + item.onclick = function (e) { + this.setTheme('darkGray'); + }.bind(this); + }.bind(this)); + + $$('.theme-dark-purple', function (item) { + item.onclick = function (e) { + this.setTheme('darkPurple'); + }.bind(this); + }.bind(this)); + + $$('.layout-horizontal', function (item) { + item.onclick = function (e) { + this.setLayout('horizontal'); + }.bind(this); + }.bind(this)); + + $$('.layout-vertical', function (item) { + item.onclick = function (e) { + this.setLayout('vertical'); + }.bind(this); + }.bind(this)); + + $$('[data-perpage]', function (item) { + item.onclick = function (e) { + this.setPerPage(e); + }.bind(this); + }.bind(this)); + + $$('[data-show-tables]', function (item) { + item.onclick = function (e) { + this.toggleTables(); + }.bind(this); + }.bind(this)); + + $$('[data-autohide-tables]', function (item) { + item.onclick = function (e) { + this.toggleAutoHideTables(); + }.bind(this); + }.bind(this)); + }, + + downloadJSON: function (e) { + var targ = e.currentTarget; + var data = "text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(GoAccess.getPanelData())); + targ.href = 'data:' + data; + targ.download = 'goaccess-' + (+new Date()) + '.json'; + }, + + setLayout: function (layout) { + if ('horizontal' == layout) { + $('.container').classList.add('container-fluid'); + $('.container').classList.remove('container'); + } else if ('vertical' == layout) { + $('.container-fluid').classList.add('container'); + $('.container').classList.remove('container-fluid'); + } + + GoAccess.AppPrefs['layout'] = layout; + GoAccess.setPrefs(); + + GoAccess.Panels.initialize(); + GoAccess.Charts.initialize(); + GoAccess.Tables.initialize(); + }, + + toggleAutoHideTables: function (e) { + var autoHideTables = GoAccess.Tables.autoHideTables(); + $$('.table-wrapper', function (item) { + if (autoHideTables) { + item.classList.remove('hidden-xs'); + } else { + item.classList.add('hidden-xs'); + } + }.bind(this)); + + GoAccess.AppPrefs['autoHideTables'] = !autoHideTables; + GoAccess.setPrefs(); + }, + + toggleTables: function () { + var ui = GoAccess.getPanelUI(); + var showTables = GoAccess.Tables.showTables(); + Object.keys(ui).forEach(function (panel, idx) { + if (!GoAccess.Util.isPanelValid(panel)) + ui[panel]['table'] = !showTables; + }.bind(this)); + + GoAccess.AppPrefs['showTables'] = !showTables; + GoAccess.setPrefs(); + + GoAccess.Panels.initialize(); + GoAccess.Charts.initialize(); + GoAccess.Tables.initialize(); + }, + + setTheme: function (theme) { + if (!theme) + return; + + $('html').className = ''; + switch(theme) { + case 'darkGray': + $('html').classList.add('dark'); + $('html').classList.add('gray'); + break; + case 'darkBlue': + $('html').classList.add('dark'); + $('html').classList.add('blue'); + break; + case 'darkPurple': + $('html').classList.add('dark'); + $('html').classList.add('purple'); + break; + } + GoAccess.AppPrefs['theme'] = theme; + GoAccess.setPrefs(); + }, + + getIcon: function (key) { + switch(key) { + case 'visitors' : return 'users'; + case 'requests' : return 'file'; + case 'static_requests' : return 'file-text'; + case 'not_found' : return 'file-o'; + case 'hosts' : return 'user'; + case 'os' : return 'desktop'; + case 'browsers' : return 'chrome'; + case 'visit_time' : return 'clock-o'; + case 'vhosts' : return 'th-list'; + case 'referrers' : return 'external-link'; + case 'referring_sites' : return 'external-link'; + case 'keyphrases' : return 'google'; + case 'status_codes' : return 'warning'; + case 'remote_user' : return 'users'; + case 'geolocation' : return 'map-marker'; + default : return 'pie-chart'; + } + }, + + getItems: function () { + var ui = GoAccess.getPanelUI(), menu = []; + for (var panel in ui) { + if (GoAccess.Util.isPanelValid(panel)) + continue; + // Push valid panels to our navigation array + menu.push({ + 'current': window.location.hash.substr(1) == panel, + 'head': ui[panel].head, + 'key': panel, + 'icon': this.getIcon(panel), + }); + } + return menu; + }, + + setPerPage: function (e) { + GoAccess.AppPrefs['perPage'] = +e.currentTarget.getAttribute('data-perpage'); + GoAccess.App.renderData(); + GoAccess.setPrefs(); + }, + + getTheme: function () { + return GoAccess.AppPrefs.theme || 'darkGray'; + }, + + getLayout: function () { + return GoAccess.AppPrefs.layout || 'horizontal'; + }, + + getPerPage: function () { + return GoAccess.AppPrefs.perPage || 7; + }, + + // Render left-hand side navigation options. + renderOpts: function () { + var o = {}; + o[this.getLayout()] = true; + o[this.getTheme()] = true; + o['perPage' + this.getPerPage()] = true; + o['autoHideTables'] = GoAccess.Tables.autoHideTables(); + o['showTables'] = GoAccess.Tables.showTables(); + o['labels'] = GoAccess.i18n; + + $('.nav-list').innerHTML = GoAccess.AppTpls.Nav.opts.render(o); + $('nav').classList.toggle('active'); + this.events(); + }, + + // Render left-hand side navigation given the available panels. + renderMenu: function (e) { + $('.nav-list').innerHTML = GoAccess.AppTpls.Nav.menu.render({ + 'nav': this.getItems(), + 'overall': window.location.hash.substr(1) == '', + 'labels': GoAccess.i18n, + }); + $('nav').classList.toggle('active'); + this.events(); + }, + + WSStatus: function () { + if (Object.keys(GoAccess.AppWSConn).length) + $$('.nav-ws-status', function (item) { item.style.display = 'block'; }); + }, + + WSClose: function () { + $$('.nav-ws-status', function (item) { + item.classList.remove('connected'); + item.setAttribute('title', 'Disconnected'); + }); + }, + + WSOpen: function () { + $$('.nav-ws-status', function (item) { + item.classList.add('connected'); + item.setAttribute('title', 'Connected to ' + GoAccess.AppWSConn.url); + }); + }, + + // Render left-hand side navigation given the available panels. + renderWrap: function (nav) { + $('nav').innerHTML = GoAccess.AppTpls.Nav.wrap.render(GoAccess.i18n); + }, + + // Iterate over all available panels and render each. + initialize: function () { + this.setTheme(GoAccess.AppPrefs.theme); + this.renderWrap(); + this.WSStatus(); + this.events(); + } +}; + +// RENDER PANELS +GoAccess.Panels = { + events: function () { + $$('[data-toggle=dropdown]', function (item) { + item.onclick = function (e) { + this.openOpts(e.currentTarget); + }.bind(this); + item.onblur = function (e) { + this.closeOpts(e); + }.bind(this); + }.bind(this)); + + $$('[data-plot]', function (item) { + item.onclick = function (e) { + GoAccess.Charts.redrawChart(e.currentTarget); + }.bind(this); + }.bind(this)); + + $$('[data-chart]', function (item) { + item.onclick = function (e) { + GoAccess.Charts.toggleChart(e.currentTarget); + }.bind(this); + }.bind(this)); + + $$('[data-chart-type]', function (item) { + item.onclick = function (e) { + GoAccess.Charts.setChartType(e.currentTarget); + }.bind(this); + }.bind(this)); + + $$('[data-metric]', function (item) { + item.onclick = function (e) { + GoAccess.Tables.toggleColumn(e.currentTarget); + }.bind(this); + }.bind(this)); + }, + + openOpts: function (targ) { + var panel = targ.getAttribute('data-panel'); + targ.parentElement.classList.toggle('open'); + this.renderOpts(panel); + }, + + closeOpts: function (e) { + e.currentTarget.parentElement.classList.remove('open'); + // Trigger the click event on the target if not opening another menu + if (e.relatedTarget && e.relatedTarget.getAttribute('data-toggle') !== 'dropdown') + e.relatedTarget.click(); + }, + + setPlotSelection: function (ui, prefs) { + var chartType = ((prefs || {}).plot || {}).chartType || ui.plot[0].chartType; + var metric = ((prefs || {}).plot || {}).metric || ui.plot[0].className; + + ui[chartType] = true; + for (var i = 0, len = ui.plot.length; i < len; ++i) + if (ui.plot[i].className == metric) + ui.plot[i]['selected'] = true; + }, + + setColSelection: function (items, prefs) { + var columns = (prefs || {}).columns || {}; + for (var i = 0, len = items.length; i < len; ++i) + if ((items[i].key in columns) && columns[items[i].key]['hide']) + items[i]['hide'] = true; + }, + + setChartSelection: function (ui, prefs) { + ui['showChart'] = prefs && ('chart' in prefs) ? prefs.chart : true; + }, + + setOpts: function (panel) { + var ui = JSON.parse(JSON.stringify(GoAccess.getPanelUI(panel))), prefs = GoAccess.getPrefs(panel); + // set preferences selection upon opening panel options + this.setChartSelection(ui, prefs); + this.setPlotSelection(ui, prefs); + this.setColSelection(ui.items, prefs); + return GoAccess.Util.merge(ui, {'labels': GoAccess.i18n}); + }, + + renderOpts: function (panel) { + $('.panel-opts-' + panel).innerHTML = GoAccess.AppTpls.Panels.opts.render(this.setOpts(panel)); + this.events(); + }, + + enablePrev: function (panel) { + var $pagination = $('#panel-' + panel + ' .pagination a.panel-prev'); + if ($pagination) + $pagination.parentNode.classList.remove('disabled'); + }, + + disablePrev: function (panel) { + var $pagination = $('#panel-' + panel + ' .pagination a.panel-prev'); + if ($pagination) + $pagination.parentNode.classList.add('disabled'); + }, + + enableNext: function (panel) { + var $pagination = $('#panel-' + panel + ' .pagination a.panel-next'); + if ($pagination) + $pagination.parentNode.classList.remove('disabled'); + }, + + disableNext: function (panel) { + var $pagination = $('#panel-' + panel + ' .pagination a.panel-next'); + if ($pagination) + $pagination.parentNode.classList.add('disabled'); + }, + + enableFirst: function (panel) { + var $pagination = $('#panel-' + panel + ' .pagination a.panel-first'); + if ($pagination) + $pagination.parentNode.classList.remove('disabled'); + }, + + disableFirst: function (panel) { + var $pagination = $('#panel-' + panel + ' .pagination a.panel-first'); + if ($pagination) + $pagination.parentNode.classList.add('disabled'); + }, + + enableLast: function (panel) { + var $pagination = $('#panel-' + panel + ' .pagination a.panel-last'); + if ($pagination) + $pagination.parentNode.classList.remove('disabled'); + }, + + disableLast: function (panel) { + var $pagination = $('#panel-' + panel + ' .pagination a.panel-last'); + if ($pagination) + $pagination.parentNode.classList.add('disabled'); + }, + + enablePagination: function (panel) { + this.enablePrev(panel); + this.enableNext(panel); + this.enableFirst(panel); + this.enableLast(panel); + }, + + disablePagination: function (panel) { + this.disablePrev(panel); + this.disableNext(panel); + this.disableFirst(panel); + this.disableLast(panel); + }, + + hasSubItems: function (ui, data) { + for (var i = 0, len = data.length; i < len; ++i) { + if (!data[i].items) + return (ui['hasSubItems'] = false); + if (data[i].items.length) { + return (ui['hasSubItems'] = true); + } + } + return false; + }, + + setComputedData: function (panel, ui, data) { + this.hasSubItems(ui, data.data); + GoAccess.Charts.hasChart(panel, ui); + GoAccess.Tables.hasTable(ui); + }, + + // Render the given panel given a user interface definition. + renderPanel: function (panel, ui, col) { + // set some computed values before rendering panel structure + var data = GoAccess.getPanelData(panel); + this.setComputedData(panel, ui, data); + + // per panel wrapper + var box = document.createElement('div'); + box.id = 'panel-' + panel; + box.innerHTML = GoAccess.AppTpls.Panels.wrap.render(GoAccess.Util.merge(ui, { + 'labels': GoAccess.i18n + })); + col.appendChild(box); + + // Remove pagination if not enough data for the given panel + if (data.data.length <= GoAccess.getPrefs().perPage) + this.disablePagination(panel); + GoAccess.Tables.renderThead(panel, ui); + + return col; + }, + + createCol: function (row) { + var perRow = GoAccess.AppPrefs['layout'] == 'horizontal' ? 6 : 12; + + // set the number of columns based on current layout + var col = document.createElement('div'); + col.setAttribute('class', 'col-md-' + perRow + ' wrap-panel'); + row.appendChild(col); + + return col; + }, + + createRow: function (row, idx) { + var wrap = $('.wrap-panels'); + var every = GoAccess.AppPrefs['layout'] == 'horizontal' ? 2 : 1; + + // create a new bootstrap row every one or two elements depending on + // the layout + if (idx % every == 0) { + row = document.createElement('div'); + row.setAttribute('class', 'row' + (every == 2 ? ' equal' : '')); + wrap.appendChild(row); + } + + return row; + }, + + resetPanel: function (panel) { + var ui = GoAccess.getPanelUI(), idx = 0, row = null; + var ele = $('#panel-' + panel); + + if (GoAccess.Util.isPanelValid(panel)) + return false; + + var col = ele.parentNode; + col.removeChild(ele); + // Render panel given a user interface definition + this.renderPanel(panel, ui[panel], col); + this.events(); + }, + + // Iterate over all available panels and render each panel + // structure. + renderPanels: function () { + var ui = GoAccess.getPanelUI(), idx = 0, row = null, col = null; + + $('.wrap-panels').innerHTML = ''; + for (var panel in ui) { + if (GoAccess.Util.isPanelValid(panel)) + continue; + row = this.createRow(row, idx++); + col = this.createCol(row); + // Render panel given a user interface definition + col = this.renderPanel(panel, ui[panel], col); + } + }, + + initialize: function () { + this.renderPanels(); + this.events(); + } +}; + +// RENDER CHARTS +GoAccess.Charts = { + iter: function (callback) { + Object.keys(GoAccess.AppCharts).forEach(function (panel) { + // redraw chart only if it's within the viewport + if (!GoAccess.Util.isWithinViewPort($('#panel-' + panel))) + return; + if (callback && typeof callback === 'function') + callback.call(this, GoAccess.AppCharts[panel], panel); + }); + }, + + getMetricKeys: function (panel, key) { + return GoAccess.getPanelUI(panel)['items'].map(function (a) { return a[key]; }); + }, + + getPanelData: function (panel, data) { + // Grab ui plot data for the selected panel + var plot = GoAccess.Util.getProp(GoAccess.AppState, panel + '.plot'); + + // Grab the data for the selected panel + data = data || this.processChartData(GoAccess.getPanelData(panel).data); + return plot.chartReverse ? data.reverse() : data; + }, + + drawPlot: function (panel, plotUI, data) { + var chart = this.getChart(panel, plotUI, data); + if (!chart) + return; + + this.renderChart(panel, chart, data); + GoAccess.AppCharts[panel] = null; + GoAccess.AppCharts[panel] = chart; + }, + + setChartType: function (targ) { + var panel = targ.getAttribute('data-panel'); + var type = targ.getAttribute('data-chart-type'); + + GoAccess.Util.setProp(GoAccess.AppPrefs, panel + '.plot.chartType', type); + GoAccess.setPrefs(); + + var plotUI = GoAccess.Util.getProp(GoAccess.AppState, panel + '.plot'); + // Extract data for the selected panel and process it + this.drawPlot(panel, plotUI, this.getPanelData(panel)); + }, + + toggleChart: function (targ) { + var panel = targ.getAttribute('data-panel'); + var prefs = GoAccess.getPrefs(panel), + chart = prefs && ('chart' in prefs) ? prefs.chart : true; + + GoAccess.Util.setProp(GoAccess.AppPrefs, panel + '.chart', !chart); + GoAccess.setPrefs(); + + GoAccess.Panels.resetPanel(panel); + GoAccess.Charts.resetChart(panel); + GoAccess.Tables.renderFullTable(panel); + }, + + hasChart: function (panel, ui) { + var prefs = GoAccess.getPrefs(panel), + chart = prefs && ('chart' in prefs) ? prefs.chart : true; + ui['chart'] = ui.plot.length && chart && chart; + }, + + // Redraw a chart upon selecting a metric. + redrawChart: function (targ) { + var plot = targ.getAttribute('data-plot'); + var panel = targ.getAttribute('data-panel'); + var ui = GoAccess.getPanelUI(panel); + var plotUI = ui.plot; + + GoAccess.Util.setProp(GoAccess.AppPrefs, panel + '.plot.metric', plot); + GoAccess.setPrefs(); + + // Iterate over plot user interface definition + for (var x in plotUI) { + if (!plotUI.hasOwnProperty(x) || plotUI[x].className != plot) + continue; + + GoAccess.Util.setProp(GoAccess.AppState, panel + '.plot', plotUI[x]); + // Extract data for the selected panel and process it + this.drawPlot(panel, plotUI[x], this.getPanelData(panel)); + break; + } + }, + + // Iterate over the item properties and and extract the count value. + extractCount: function (item) { + var o = {}; + for (var prop in item) + o[prop] = GoAccess.Util.getCount(item[prop]); + return o; + }, + + // Extract an array of objects that D3 can consume to process the chart. + // e.g., o = Object {hits: 37402, visitors: 6949, bytes: + // 505881789, avgts: 118609, cumts: 4436224010…} + processChartData: function (data) { + var out = []; + for (var i = 0; i < data.length; ++i) + out.push(this.extractCount(data[i])); + return out; + }, + + findUIItem: function (panel, key) { + var items = GoAccess.getPanelUI(panel).items, o = {}; + for (var i = 0; i < items.length; ++i) { + if (items[i].key == key) + return items[i]; + } + return null; + }, + + getXKey: function (datum, key) { + var arr = []; + if (typeof key === 'string') + return datum[key]; + for (var prop in key) + arr.push(datum[key[prop]]); + return arr.join(' '); + }, + + getAreaSpline: function (panel, plotUI, data) { + var dualYaxis = plotUI['d3']['y1']; + + var chart = AreaChart(dualYaxis) + .labels({ + y0: plotUI['d3']['y0'].label, + y1: dualYaxis ? plotUI['d3']['y1'].label : '' + }) + .x(function (d) { + if ((((plotUI || {}).d3 || {}).x || {}).key) + return this.getXKey(d, plotUI['d3']['x']['key']); + return d.data; + }.bind(this)) + .y0(function (d) { + return +d[plotUI['d3']['y0']['key']]; + }) + .width($("#chart-" + panel).getBoundingClientRect().width) + .height(175) + .format({ + x: (this.findUIItem(panel, 'data') || {}).dataType || null, + y0: ((plotUI.d3 || {}).y0 || {}).format, + y1: ((plotUI.d3 || {}).y1 || {}).format, + }) + .opts(plotUI); + + dualYaxis && chart.y1(function (d) { + return +d[plotUI['d3']['y1']['key']]; + }); + + return chart; + }, + + getVBar: function (panel, plotUI, data) { + var dualYaxis = plotUI['d3']['y1']; + + var chart = BarChart(dualYaxis) + .labels({ + y0: plotUI['d3']['y0'].label, + y1: dualYaxis ? plotUI['d3']['y1'].label : '' + }) + .x(function (d) { + if ((((plotUI || {}).d3 || {}).x || {}).key) + return this.getXKey(d, plotUI['d3']['x']['key']); + return d.data; + }.bind(this)) + .y0(function (d) { + return +d[plotUI['d3']['y0']['key']]; + }) + .width($("#chart-" + panel).getBoundingClientRect().width) + .height(175) + .format({ + x: (this.findUIItem(panel, 'data') || {}).dataType || null, + y0: ((plotUI.d3 || {}).y0 || {}).format, + y1: ((plotUI.d3 || {}).y1 || {}).format, + }) + .opts(plotUI); + + dualYaxis && chart.y1(function (d) { + return +d[plotUI['d3']['y1']['key']]; + }); + + return chart; + }, + + getChartType: function (panel) { + var ui = GoAccess.getPanelUI(panel); + if (!ui.chart) + return ''; + + return GoAccess.Util.getProp(GoAccess.getPrefs(), panel + '.plot.chartType') || ui.plot[0].chartType; + }, + + getPlotUI: function (panel, ui) { + var metric = GoAccess.Util.getProp(GoAccess.getPrefs(), panel + '.plot.metric'); + if (!metric) + return ui.plot[0]; + return ui.plot.filter(function (v) { + return v.className == metric; + })[0]; + }, + + getChart: function (panel, plotUI, data) { + var chart = null; + + // Render given its type + switch (this.getChartType(panel)) { + case 'area-spline': + chart = this.getAreaSpline(panel, plotUI, data); + break; + case 'bar': + chart = this.getVBar(panel, plotUI, data); + break; + } + + return chart; + }, + + renderChart: function (panel, chart, data) { + // remove popup + d3.select('#chart-' + panel + '>.chart-tooltip-wrap') + .remove(); + // remove svg + d3.select('#chart-' + panel).select('svg') + .remove(); + // add chart to the document + d3.select("#chart-" + panel) + .datum(data) + .call(chart) + .append("div").attr("class", "chart-tooltip-wrap"); + }, + + addChart: function (panel, ui) { + var plotUI = null, chart = null; + + // Ensure it has a plot definition + if (!ui.plot || !ui.plot.length) + return; + + plotUI = this.getPlotUI(panel, ui); + // set ui plot data + GoAccess.Util.setProp(GoAccess.AppState, panel + '.plot', plotUI); + + // Grab the data for the selected panel + var data = this.getPanelData(panel); + if (!(chart = this.getChart(panel, plotUI, data))) + return; + + this.renderChart(panel, chart, data); + GoAccess.AppCharts[panel] = chart; + }, + + // Render all charts for the applicable panels. + renderCharts: function (ui) { + for (var panel in ui) { + if (!ui.hasOwnProperty(panel)) + continue; + this.addChart(panel, ui[panel]); + } + }, + + resetChart: function (panel) { + var ui = {}; + if (GoAccess.Util.isPanelValid(panel)) + return false; + + ui = GoAccess.getPanelUI(panel); + this.addChart(panel, ui); + }, + + // Reload (doesn't redraw) the given chart's data + reloadChart: function (chart, panel) { + var subItems = GoAccess.Tables.getSubItemsData(panel); + var data = (subItems.length ? subItems : GoAccess.getPanelData(panel).data).slice(0); + + d3.select("#chart-" + panel) + .datum(this.processChartData(this.getPanelData(panel, data))) + .call(chart.width($("#chart-" + panel).offsetWidth)); + }, + + // Reload (doesn't redraw) all chart's data + reloadCharts: function () { + this.iter(function (chart, panel) { + this.reloadChart(chart, panel); + }.bind(this)); + GoAccess.AppState.updated = false; + }, + + // Only redraw charts with current data + redrawCharts: function () { + this.iter(function (chart, panel) { + d3.select("#chart-" + panel).call(chart.width($("#chart-" + panel).offsetWidth)); + }); + }, + + initialize: function () { + this.renderCharts(GoAccess.getPanelUI()); + + // reload on scroll & redraw on resize + d3.select(window).on('scroll.charts', debounce(function () { + this.reloadCharts(); + }, 250, false).bind(this)).on('resize.charts', function () { + this.redrawCharts(); + }.bind(this)); + } +}; + +// RENDER TABLES +GoAccess.Tables = { + chartData: {}, // holds all panel sub items data that feeds the chart + + events: function () { + $$('.panel-next', function (item) { + item.onclick = function (e) { + var panel = e.currentTarget.getAttribute('data-panel'); + this.renderTable(panel, this.nextPage(panel)); + }.bind(this); + }.bind(this)); + + $$('.panel-prev', function (item) { + item.onclick = function (e) { + var panel = e.currentTarget.getAttribute('data-panel'); + this.renderTable(panel, this.prevPage(panel)); + }.bind(this); + }.bind(this)); + + $$('.panel-first', function (item) { + item.onclick = function (e) { + var panel = e.currentTarget.getAttribute('data-panel'); + this.renderTable(panel, "FIRST_PAGE"); + }.bind(this); + }.bind(this)); + + $$('.panel-last', function (item) { + item.onclick = function (e) { + var panel = e.currentTarget.getAttribute('data-panel'); + this.renderTable(panel, "LAST_PAGE"); + }.bind(this); + }.bind(this)); + + $$('.expandable>td', function (item) { + item.onclick = function (e) { + if (!window.getSelection().toString()) + this.toggleRow(e.currentTarget); + }.bind(this); + }.bind(this)); + + $$('.row-expandable.clickable', function (item) { + item.onclick = function (e) { + this.toggleRow(e.currentTarget); + }.bind(this); + }.bind(this)); + + $$('.sortable', function (item) { + item.onclick = function (e) { + this.sortColumn(e.currentTarget); + }.bind(this); + }.bind(this)); + }, + + toggleColumn: function (targ) { + var panel = targ.getAttribute('data-panel'); + var metric = targ.getAttribute('data-metric'); + + var columns = (GoAccess.getPrefs(panel) || {}).columns || {}; + if (metric in columns) { + delete columns[metric]; + } else { + GoAccess.Util.setProp(columns, metric + '.hide', true); + } + + GoAccess.Util.setProp(GoAccess.AppPrefs, panel + '.columns', columns); + GoAccess.setPrefs(); + + GoAccess.Tables.renderThead(panel, GoAccess.getPanelUI(panel)); + GoAccess.Tables.renderFullTable(panel); + }, + + sortColumn: function (ele) { + var field = ele.getAttribute('data-key'); + var order = ele.getAttribute('data-order'); + var panel = ele.parentElement.parentElement.parentElement.getAttribute('data-panel'); + + order = order ? 'asc' == order ? 'desc' : 'asc' : 'asc'; + GoAccess.App.sortData(panel, field, order); + GoAccess.Util.setProp(GoAccess.AppState, panel + '.sort', { + 'field': field, + 'order': order, + }); + this.renderThead(panel, GoAccess.getPanelUI(panel)); + this.renderTable(panel, this.getCurPage(panel)); + + GoAccess.Charts.reloadChart(GoAccess.AppCharts[panel], panel); + }, + + getDataByKey: function (panel, key) { + var data = GoAccess.getPanelData(panel).data; + for (var i = 0, n = data.length; i < n; ++i) { + if (GoAccess.Util.hashCode(data[i].data) == key) + return data[i]; + } + return null; + }, + + getSubItemsData: function (panel) { + var out = [], items = this.chartData[panel]; + for (var x in items) { + if (!items.hasOwnProperty(x)) + continue; + out = out.concat(items[x]); + } + return out; + }, + + addChartData: function (panel, key) { + var data = this.getDataByKey(panel, key); + var path = panel + '.' + key; + + if (!data || !data.items) + return []; + GoAccess.Util.setProp(this.chartData, path, data.items); + + return this.getSubItemsData(panel); + }, + + removeChartData: function (panel, key) { + if (GoAccess.Util.getProp(this.chartData, panel + '.' + key)) + delete this.chartData[panel][key]; + + if (!this.chartData[panel] || Object.keys(this.chartData[panel]).length == 0) + return GoAccess.getPanelData(panel).data; + + return this.getSubItemsData(panel); + }, + + isExpanded: function (panel, key) { + var path = panel + '.expanded.' + key; + return GoAccess.Util.getProp(GoAccess.AppState, path); + }, + + toggleExpanded: function (panel, key) { + var path = panel + '.expanded.' + key, ret = true; + + if (this.isExpanded(panel, key)) { + delete GoAccess.AppState[panel]['expanded'][key]; + } else { + GoAccess.Util.setProp(GoAccess.AppState, path, true), ret = false; + } + + return ret; + }, + + // Toggle children rows + toggleRow: function (ele) { + var hide = false, data = []; + var row = ele.parentNode; + var panel = row.getAttribute('data-panel'), key = row.getAttribute('data-key'); + var plotUI = GoAccess.AppCharts[panel].opts(); + + hide = this.toggleExpanded(panel, key); + this.renderTable(panel, this.getCurPage(panel)); + if (!plotUI.redrawOnExpand) + return; + + if (!hide) { + data = GoAccess.Charts.processChartData(this.addChartData(panel, key)); + } else { + data = GoAccess.Charts.processChartData(this.removeChartData(panel, key)); + } + GoAccess.Charts.drawPlot(panel, plotUI, data); + }, + + // Get current panel page + getCurPage: function (panel) { + return GoAccess.Util.getProp(GoAccess.AppState, panel + '.curPage') || 0; + }, + + // Page offset. + // e.g., Return Value: 11, curPage: 2 + pageOffSet: function (panel) { + return ((this.getCurPage(panel) - 1) * GoAccess.getPrefs().perPage); + }, + + // Get total number of pages given the number of items on array + getTotalPages: function (dataItems) { + return Math.ceil(dataItems.length / GoAccess.getPrefs().perPage); + }, + + // Get a shallow copy of a portion of the given data array and the + // current page. + getPage: function (panel, dataItems, page) { + var totalPages = this.getTotalPages(dataItems); + if (page < 1) + page = 1; + if (page > totalPages) + page = totalPages; + + GoAccess.Util.setProp(GoAccess.AppState, panel + '.curPage', page); + var start = this.pageOffSet(panel); + var end = start + GoAccess.getPrefs().perPage; + + return dataItems.slice(start, end); + }, + + // Get previous page + prevPage: function (panel) { + return this.getCurPage(panel) - 1; + }, + + // Get next page + nextPage: function (panel) { + return this.getCurPage(panel) + 1; + }, + + getMetaValue: function (ui, value) { + if ('meta' in ui) + return value[ui.meta]; + return null; + }, + + getMetaCell: function (ui, value) { + var val = this.getMetaValue(ui, value); + var max = (value || {}).max; + var min = (value || {}).min; + + // use metaType if exist else fallback to dataType + var vtype = ui.metaType || ui.dataType; + var className = ui.className || ''; + className += ui.dataType != 'string' ? 'text-right' : ''; + return { + 'className': className, + 'max' : max != undefined ? GoAccess.Util.fmtValue(max, vtype) : null, + 'min' : min != undefined ? GoAccess.Util.fmtValue(min, vtype) : null, + 'value' : val != undefined ? GoAccess.Util.fmtValue(val, vtype) : null, + 'title' : ui.meta, + 'label' : ui.metaLabel || null, + }; + }, + + hideColumn: function (panel, col) { + var columns = (GoAccess.getPrefs(panel) || {}).columns || {}; + return ((col in columns) && columns[col]['hide']); + }, + + showTables: function () { + return ('showTables' in GoAccess.getPrefs()) ? GoAccess.getPrefs().showTables : true; + }, + + autoHideTables: function () { + return ('autoHideTables' in GoAccess.getPrefs()) ? GoAccess.getPrefs().autoHideTables : true; + }, + + hasTable: function (ui) { + ui['table'] = this.showTables(); + ui['autoHideTables'] = this.autoHideTables(); + }, + + renderMetaRow: function (panel, ui) { + // find the table to set + var table = $('.table-' + panel + ' tbody.tbody-meta'); + if (!table) + return; + + var cells = [], uiItems = ui.items; + var data = GoAccess.getPanelData(panel).metadata; + for (var i = 0; i < uiItems.length; ++i) { + var item = uiItems[i]; + if (this.hideColumn(panel, item.key)) + continue; + var value = data[item.key]; + cells.push(this.getMetaCell(item, value)); + } + + table.innerHTML = GoAccess.AppTpls.Tables.meta.render({ + row: [{ + 'hasSubItems': ui.hasSubItems, + 'cells': cells + }] + }); + }, + + // Iterate over user interface definition properties + iterUIItems: function (panel, uiItems, dataItems, callback) { + var out = []; + for (var i = 0; i < uiItems.length; ++i) { + var uiItem = uiItems[i]; + if (this.hideColumn(panel, uiItem.key)) + continue; + // Data for the current user interface property. + // e.g., dataItem = Object {count: 13949, percent: 5.63} + var dataItem = dataItems[uiItem.key]; + // Apply the callback and push return data to output array + if (callback && typeof callback == 'function') { + var ret = callback.call(this, panel, uiItem, dataItem); + if (ret) out.push(ret); + } + } + return out; + }, + + // Return an object that can be consumed by the table template given a user + // interface definition and a cell value object. + // e.g., value = Object {count: 14351, percent: 5.79} + getObjectCell: function (panel, ui, value) { + var className = ui.className || ''; + className += ui.dataType != 'string' ? 'text-right' : ''; + return { + 'className': className, + 'percent': GoAccess.Util.getPercent(value), + 'value': GoAccess.Util.fmtValue(GoAccess.Util.getCount(value), ui.dataType) + }; + }, + + // Given a data item object, set all the row cells and return a + // table row that the template can consume. + renderRow: function (panel, callback, ui, dataItem, idx, subItem, parentId, expanded) { + var shadeParent = ((!subItem && idx % 2 != 0) ? 'shaded' : ''); + var shadeChild = ((parentId % 2 != 0) ? 'shaded' : ''); + return { + 'panel' : panel, + 'idx' : !subItem && (String((idx + 1) + this.pageOffSet(panel))), + 'key' : !subItem ? GoAccess.Util.hashCode(dataItem.data) : '', + 'expanded' : !subItem && expanded, + 'parentId' : subItem ? String(parentId) : '', + 'className' : subItem ? 'child ' + shadeChild : 'parent ' + shadeParent, + 'hasSubItems' : ui.hasSubItems, + 'items' : dataItem.items ? dataItem.items.length : 0, + 'cells' : callback.call(this), + }; + }, + + renderRows: function (rows, panel, ui, dataItems, subItem, parentId) { + subItem = subItem || false; + // no data rows + if (dataItems.length == 0 && ui.items.length) { + rows.push({ + cells: [{ + className: 'text-center', + colspan: ui.items.length + 1, + value: 'No data on this panel.' + }] + }); + } + + // Iterate over all data items for the given panel and + // generate a table row per date item. + var cellcb = null; + for (var i = 0; i < dataItems.length; ++i) { + var dataItem = dataItems[i], data = null, expanded = false; + switch(typeof dataItem) { + case 'string': + data = dataItem; + cellcb = function () { + return { + 'colspan': ui.items.length, + 'value': data + }; + }; + break; + default: + data = dataItem.data; + cellcb = this.iterUIItems.bind(this, panel, ui.items, dataItem, this.getObjectCell.bind(this)); + } + + expanded = this.isExpanded(panel, GoAccess.Util.hashCode(data)); + rows.push(this.renderRow(panel, cellcb, ui, dataItem, i, subItem, parentId, expanded)); + if (dataItem.items && dataItem.items.length && expanded) { + this.renderRows(rows, panel, ui, dataItem.items, true, i, expanded); + } + } + }, + + // Entry point to render all data rows into the table + renderDataRows: function (panel, ui, dataItems, page) { + // find the table to set + var table = $('.table-' + panel + ' tbody.tbody-data'); + if (!table) + return; + + dataItems = this.getPage(panel, dataItems, page); + var rows = []; + this.renderRows(rows, panel, ui, dataItems); + if (rows.length == 0) + return; + + table.innerHTML = GoAccess.AppTpls.Tables.data.render({ + rows: rows + }); + }, + + togglePagination: function (panel, page, dataItems) { + GoAccess.Panels.enablePagination(panel); + // Disable pagination next button if last page is reached + if (page >= this.getTotalPages(dataItems)) { + GoAccess.Panels.disableNext(panel); + GoAccess.Panels.disableLast(panel); + } + if (page <= 1) { + GoAccess.Panels.disablePrev(panel); + GoAccess.Panels.disableFirst(panel); + } + }, + + renderTable: function (panel, page) { + var dataItems = GoAccess.getPanelData(panel).data; + var ui = GoAccess.getPanelUI(panel); + + if (page === "LAST_PAGE") { + page = this.getTotalPages(dataItems); + } else if (page === "FIRST_PAGE") { + page = 1; + } + + this.togglePagination(panel, page, dataItems); + // Render data rows + this.renderDataRows(panel, ui, dataItems, page); + this.events(); + }, + + renderFullTable: function (panel) { + var ui = GoAccess.getPanelUI(panel), page = 0; + // panel's data + var data = GoAccess.getPanelData(panel); + // render meta data + if (data.hasOwnProperty('metadata')) + this.renderMetaRow(panel, ui); + + // render actual data + if (data.hasOwnProperty('data')) { + page = this.getCurPage(panel); + this.togglePagination(panel, page, data.data); + this.renderDataRows(panel, ui, data.data, page); + } + }, + + // Iterate over all panels and determine which ones should contain + // a data table. + renderTables: function (force) { + var ui = GoAccess.getPanelUI(); + for (var panel in ui) { + if (GoAccess.Util.isPanelValid(panel) || !this.showTables()) + continue; + if (force || GoAccess.Util.isWithinViewPort($('#panel-' + panel))) + this.renderFullTable(panel); + } + }, + + // Given a UI panel definition, make a copy of it and assign the sort + // fields to the template object to render + sort2Tpl: function (panel, ui) { + var uiClone = JSON.parse(JSON.stringify(ui)), out = []; + var sort = GoAccess.Util.getProp(GoAccess.AppState, panel + '.sort'); + + for (var i = 0, len = uiClone.items.length; i < len; ++i) { + var item = uiClone.items[i]; + if (this.hideColumn(panel, item.key)) + continue; + + item['sort'] = false; + if (item.key == sort.field && sort.order) { + item['sort'] = true; + item[sort.order.toLowerCase()] = true; + } + out.push(item); + } + uiClone.items = out; + + return uiClone; + }, + + renderThead: function (panel, ui) { + var $thead = $('.table-' + panel + '>thead'), $colgroup = $('.table-' + panel + '>colgroup'); + if ($thead && $colgroup && this.showTables()) { + ui = this.sort2Tpl(panel, ui); + + $thead.innerHTML = GoAccess.AppTpls.Tables.head.render(ui); + $colgroup.innerHTML = GoAccess.AppTpls.Tables.colgroup.render(ui); + } + }, + + reloadTables: function () { + this.renderTables(false); + this.events(); + }, + + initialize: function () { + this.renderTables(true); + this.events(); + + // redraw on scroll + d3.select(window).on('scroll.tables', debounce(function () { + this.reloadTables(); + }, 250, false).bind(this)); + }, +}; + +// Main App +GoAccess.App = { + hasFocus: true, + + tpl: function (tpl) { + return Hogan.compile(tpl); + }, + + setTpls: function () { + GoAccess.AppTpls = { + 'Nav': { + 'wrap': this.tpl($('#tpl-nav-wrap').innerHTML), + 'menu': this.tpl($('#tpl-nav-menu').innerHTML), + 'opts': this.tpl($('#tpl-nav-opts').innerHTML), + }, + 'Panels': { + 'wrap': this.tpl($('#tpl-panel').innerHTML), + 'opts': this.tpl($('#tpl-panel-opts').innerHTML), + }, + 'General': { + 'wrap': this.tpl($('#tpl-general').innerHTML), + 'items': this.tpl($('#tpl-general-items').innerHTML), + }, + 'Tables': { + 'colgroup': this.tpl($('#tpl-table-colgroup').innerHTML), + 'head': this.tpl($('#tpl-table-thead').innerHTML), + 'meta': this.tpl($('#tpl-table-row-meta').innerHTML), + 'data': this.tpl($('#tpl-table-row').innerHTML), + }, + }; + }, + + sortField: function (o, field) { + var f = o[field]; + if (GoAccess.Util.isObject(f) && (f !== null)) + f = o[field].count; + return f; + }, + + sortData: function (panel, field, order) { + // panel's data + var panelData = GoAccess.getPanelData(panel).data; + panelData.sort(function (a, b) { + a = this.sortField(a, field); + b = this.sortField(b, field); + + if (typeof a === 'string' && typeof b === 'string') + return 'asc' == order ? a.localeCompare(b) : b.localeCompare(a); + return 'asc' == order ? a - b : b - a; + }.bind(this)); + }, + + setInitSort: function () { + var ui = GoAccess.getPanelUI(); + for (var panel in ui) { + if (GoAccess.Util.isPanelValid(panel)) + continue; + GoAccess.Util.setProp(GoAccess.AppState, panel + '.sort', ui[panel].sort); + } + }, + + // Verify if we need to sort panels upon data re-entry + verifySort: function () { + var ui = GoAccess.getPanelUI(); + for (var panel in ui) { + if (GoAccess.Util.isPanelValid(panel)) + continue; + var sort = GoAccess.Util.getProp(GoAccess.AppState, panel + '.sort'); + // do not sort panels if they still hold the same sort properties + if (JSON.stringify(sort) === JSON.stringify(ui[panel].sort)) + continue; + this.sortData(panel, sort.field, sort.order); + } + }, + + initDom: function () { + $('nav').classList.remove('hide'); + $('.container').classList.remove('hide'); + $('.spinner').classList.add('hide'); + + if (GoAccess.AppPrefs['layout'] == 'horizontal') { + $('.container').classList.add('container-fluid'); + $('.container-fluid').classList.remove('container'); + } + }, + + renderData: function () { + // update data and charts if tab/document has focus + if (!this.hasFocus) + return; + + this.verifySort(); + GoAccess.OverallStats.initialize(); + + // do not rerender tables/charts if data hasn't changed + if (!GoAccess.AppState.updated) + return; + + GoAccess.Charts.reloadCharts(); + GoAccess.Tables.reloadTables(); + }, + + initialize: function () { + this.setInitSort(); + this.setTpls(); + GoAccess.Nav.initialize(); + this.initDom(); + GoAccess.OverallStats.initialize(); + GoAccess.Panels.initialize(); + GoAccess.Charts.initialize(); + GoAccess.Tables.initialize(); + }, +}; + +// Adds the visibilitychange EventListener +document.addEventListener('visibilitychange', function () { + // fires when user switches tabs, apps, etc. + if (document.visibilityState === 'hidden') + GoAccess.App.hasFocus = false; + + // fires when app transitions from hidden or user returns to the app/tab. + if (document.visibilityState === 'visible') { + var hasFocus = GoAccess.App.hasFocus; + GoAccess.App.hasFocus = true; + hasFocus || GoAccess.App.renderData(); + } +}); + +// Init app +window.onload = function () { + GoAccess.initialize({ + 'i18n': window.json_i18n, + 'uiData': window.user_interface, + 'panelData': window.json_data, + 'wsConnection': window.connection || null, + 'prefs': window.html_prefs || {}, + }); + GoAccess.App.initialize(); +}; +}()); diff --git a/goaccess++/resources/js/app.js.tmp b/goaccess++/resources/js/app.js.tmp new file mode 100644 index 0000000..1e71e4c --- /dev/null +++ b/goaccess++/resources/js/app.js.tmp @@ -0,0 +1 @@ +/*jshint sub:true*/(function () {'use strict';function $(selector) {return document.querySelector(selector);}function $$(selector, callback) {var elems = document.querySelectorAll(selector);for (var i = 0; i < elems.length; ++i) {if (callback && typeof callback == 'function')callback.call(this, elems[i]);}}var debounce = function (func, wait, now) {var timeout;return function debounced () {var that = this, args = arguments;function delayed() {if (!now)func.apply(that, args);timeout = null;}if (timeout) {clearTimeout(timeout);} else if (now) {func.apply(obj, args);}timeout = setTimeout(delayed, wait || 250);};};window.GoAccess = window.GoAccess || {initialize: function (options) {this.opts = options;this.AppState = {};this.AppTpls = {};this.AppCharts = {};this.AppUIData = (this.opts || {}).uiData || {};this.AppData = (this.opts || {}).panelData || {};this.AppWSConn = (this.opts || {}).wsConnection || {};this.i18n = (this.opts || {}).i18n || {};this.AppPrefs = {'autoHideTables': true,'layout': 'horizontal','perPage': 7,'theme': 'darkPurple',};this.AppPrefs = GoAccess.Util.merge(this.AppPrefs, this.opts.prefs);if (GoAccess.Util.hasLocalStorage()) {var ls = JSON.parse(localStorage.getItem('AppPrefs'));this.AppPrefs = GoAccess.Util.merge(this.AppPrefs, ls);}if (Object.keys(this.AppWSConn).length)this.setWebSocket(this.AppWSConn);},getPanelUI: function (panel) {return panel ? this.AppUIData[panel] : this.AppUIData;},getPrefs: function (panel) {return panel ? this.AppPrefs[panel] : this.AppPrefs;},setPrefs: function () {if (GoAccess.Util.hasLocalStorage()) {localStorage.setItem('AppPrefs', JSON.stringify(GoAccess.getPrefs()));}},getPanelData: function (panel) {return panel ? this.AppData[panel] : this.AppData;},setWebSocket: function (wsConn) {var host = null;host = wsConn.url ? wsConn.url : window.location.hostname ? window.location.hostname : "localhost";var str = /^(wss?:\/\/)?[^\/]+:[0-9]{1,5}\//.test(host + "/") ? host : String(host + ':' + wsConn.port);str = !/^wss?:\/\//i.test(str) ? (window.location.protocol === "https:" ? 'wss://' : 'ws://') + str : str;var socket = new WebSocket(str);socket.onopen = function (event) {GoAccess.Nav.WSOpen();}.bind(this);socket.onmessage = function (event) {this.AppState['updated'] = true;this.AppData = JSON.parse(event.data);this.App.renderData();}.bind(this);socket.onclose = function (event) {GoAccess.Nav.WSClose();}.bind(this);},};GoAccess.Util = {months: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul","Aug", "Sep", "Oct", "Nov", "Dec"],merge: function (o, n) {var obj = {}, i = 0, il = arguments.length, key;for (; i < il; i++) {for (key in arguments[i]) {if (arguments[i].hasOwnProperty(key)) {obj[key] = arguments[i][key];}}}return obj;},hashCode: function (s) {return (s.split('').reduce(function (a, b) {a = ((a << 5) - a) + b.charCodeAt(0);return a&a;}, 0) >>> 0).toString(16);},formatBytes: function (bytes, decimals, numOnly) {if (bytes == 0)return numOnly ? 0 : '0 Byte';var k = 1024;var dm = decimals + 1 || 2;var sizes = ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB'];var i = Math.floor(Math.log(bytes) / Math.log(k));return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + (numOnly ? '' : (' ' + sizes[i]));},isNumeric: function (n) {return !isNaN(parseFloat(n)) && isFinite(n);},utime2str: function (usec) {if (usec >= 864E8)return ((usec) / 864E8).toFixed(2) + ' d';else if (usec >= 36E8)return ((usec) / 36E8).toFixed(2) + ' h';else if (usec >= 6E7)return ((usec) / 6E7).toFixed(2) + ' m';else if (usec >= 1E6)return ((usec) / 1E6).toFixed(2) + ' s';else if (usec >= 1E3)return ((usec) / 1E3).toFixed(2) + ' ms';return (usec).toFixed(2) + ' us';},formatDate: function (str) {var y = str.substr(0,4), m = str.substr(4,2) - 1, d = str.substr(6,2),h = str.substr(8,2) || 0, i = str.substr(10, 2) || 0, s = str.substr(12, 2) || 0;var date = new Date(y,m,d,h,i,s);var out = ('0' + date.getDate()).slice(-2) + '/' + this.months[date.getMonth()] + '/' + date.getFullYear();10 <= str.length && (out += ":" + h);12 <= str.length && (out += ":" + i);14 <= str.length && (out += ":" + s);return out;},fmtValue: function (value, dataType, decimals) {var val = 0;if (!dataType)val = value;switch (dataType) {case 'utime':val = this.utime2str(value);break;case 'date':val = this.formatDate(value);break;case 'numeric':if (this.isNumeric(value))val = value.toLocaleString();break;case 'bytes':val = this.formatBytes(value, decimals);break;case 'percent':val = parseFloat(value.replace(',', '.')).toFixed(2) + '%';break;case 'time':if (this.isNumeric(value))val = value.toLocaleString();break;case 'secs':val = value + ' secs';break;default:val = value;}return value == 0 ? String(val) : val;},isPanelValid: function (panel) {var data = GoAccess.getPanelData(), ui = GoAccess.getPanelUI();return (!ui.hasOwnProperty(panel) || !data.hasOwnProperty(panel) || !ui[panel].id);},getCount: function (item) {if (this.isObject(item) && 'count' in item)return item.count;return item;},getPercent: function (item) {if (this.isObject(item) && 'percent' in item)return this.fmtValue(item.percent, 'percent');return null;},isObject: function (o) {return o === Object(o);},setProp: function (o, s, v) {var schema = o;var a = s.split('.');for (var i = 0, n = a.length; i < n-1; ++i) {var k = a[i];if (!schema[k])schema[k] = {};schema = schema[k];}schema[a[n-1]] = v;},getProp: function (o, s) {s = s.replace(/\[(\w+)\]/g, '.$1');s = s.replace(/^\./, '');var a = s.split('.');for (var i = 0, n = a.length; i < n; ++i) {var k = a[i];if (this.isObject(o) && k in o) {o = o[k];} else {return;}}return o;},hasLocalStorage: function () {try {localStorage.setItem('test', 'test');localStorage.removeItem('test');return true;} catch(e) {return false;}},isWithinViewPort: function (el) {var elemTop = el.getBoundingClientRect().top;var elemBottom = el.getBoundingClientRect().bottom;return elemTop < window.innerHeight && elemBottom >= 0;},};GoAccess.OverallStats = {renderBox: function (data, ui, row, x, idx) {var wrap = $('.wrap-general-items');if (idx % 6 == 0) {row = document.createElement('div');row.setAttribute('class', 'row');wrap.appendChild(row);}var box = document.createElement('div');box.innerHTML = GoAccess.AppTpls.General.items.render({'id': x,'className': ui.items[x].className,'label': ui.items[x].label,'value': GoAccess.Util.fmtValue(data[x], ui.items[x].dataType),});row.appendChild(box);return row;},renderData: function (data, ui) {var idx = 0, row = null;$('.wrap-general').innerHTML = GoAccess.AppTpls.General.wrap.render(GoAccess.Util.merge(ui, {'lastUpdated': data.date_time,'from': data.start_date,'to': data.end_date,}));for (var x in data) {if (!data.hasOwnProperty(x) || !ui.items.hasOwnProperty(x))continue;row = this.renderBox(data, ui, row, x, idx);idx++;}},initialize: function () {var ui = GoAccess.getPanelUI('general');var data = GoAccess.getPanelData('general'), i = 0;this.renderData(data, ui);}};GoAccess.Nav = {events: function () {$('.nav-bars').onclick = function (e) {e.stopPropagation();this.renderMenu(e);}.bind(this);$('.nav-gears').onclick = function (e) {e.stopPropagation();this.renderOpts(e);}.bind(this);$('.nav-minibars').onclick = function (e) {e.stopPropagation();this.renderOpts(e);}.bind(this);$('body').onclick = function (e) {$('nav').classList.remove('active');}.bind(this);$$('.export-json', function (item) {item.onclick = function (e) {this.downloadJSON(e);}.bind(this);}.bind(this));$$('.theme-bright', function (item) {item.onclick = function (e) {this.setTheme('bright');}.bind(this);}.bind(this));$$('.theme-dark-blue', function (item) {item.onclick = function (e) {this.setTheme('darkBlue');}.bind(this);}.bind(this));$$('.theme-dark-gray', function (item) {item.onclick = function (e) {this.setTheme('darkGray');}.bind(this);}.bind(this));$$('.theme-dark-purple', function (item) {item.onclick = function (e) {this.setTheme('darkPurple');}.bind(this);}.bind(this));$$('.layout-horizontal', function (item) {item.onclick = function (e) {this.setLayout('horizontal');}.bind(this);}.bind(this));$$('.layout-vertical', function (item) {item.onclick = function (e) {this.setLayout('vertical');}.bind(this);}.bind(this));$$('[data-perpage]', function (item) {item.onclick = function (e) {this.setPerPage(e);}.bind(this);}.bind(this));$$('[data-show-tables]', function (item) {item.onclick = function (e) {this.toggleTables();}.bind(this);}.bind(this));$$('[data-autohide-tables]', function (item) {item.onclick = function (e) {this.toggleAutoHideTables();}.bind(this);}.bind(this));},downloadJSON: function (e) {var targ = e.currentTarget;var data = "text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(GoAccess.getPanelData()));targ.href = 'data:' + data;targ.download = 'goaccess-' + (+new Date()) + '.json';},setLayout: function (layout) {if ('horizontal' == layout) {$('.container').classList.add('container-fluid');$('.container').classList.remove('container');} else if ('vertical' == layout) {$('.container-fluid').classList.add('container');$('.container').classList.remove('container-fluid');}GoAccess.AppPrefs['layout'] = layout;GoAccess.setPrefs();GoAccess.Panels.initialize();GoAccess.Charts.initialize();GoAccess.Tables.initialize();},toggleAutoHideTables: function (e) {var autoHideTables = GoAccess.Tables.autoHideTables();$$('.table-wrapper', function (item) {if (autoHideTables) {item.classList.remove('hidden-xs');} else {item.classList.add('hidden-xs');}}.bind(this));GoAccess.AppPrefs['autoHideTables'] = !autoHideTables;GoAccess.setPrefs();},toggleTables: function () {var ui = GoAccess.getPanelUI();var showTables = GoAccess.Tables.showTables();Object.keys(ui).forEach(function (panel, idx) {if (!GoAccess.Util.isPanelValid(panel))ui[panel]['table'] = !showTables;}.bind(this));GoAccess.AppPrefs['showTables'] = !showTables;GoAccess.setPrefs();GoAccess.Panels.initialize();GoAccess.Charts.initialize();GoAccess.Tables.initialize();},setTheme: function (theme) {if (!theme)return;$('html').className = '';switch(theme) {case 'darkGray':$('html').classList.add('dark');$('html').classList.add('gray');break;case 'darkBlue':$('html').classList.add('dark');$('html').classList.add('blue');break;case 'darkPurple':$('html').classList.add('dark');$('html').classList.add('purple');break;}GoAccess.AppPrefs['theme'] = theme;GoAccess.setPrefs();},getIcon: function (key) {switch(key) {case 'visitors' : return 'users';case 'requests' : return 'file';case 'static_requests' : return 'file-text';case 'not_found' : return 'file-o';case 'hosts' : return 'user';case 'os' : return 'desktop';case 'browsers' : return 'chrome';case 'visit_time' : return 'clock-o';case 'vhosts' : return 'th-list';case 'referrers' : return 'external-link';case 'referring_sites' : return 'external-link';case 'keyphrases' : return 'google';case 'status_codes' : return 'warning';case 'remote_user' : return 'users';case 'geolocation' : return 'map-marker';default : return 'pie-chart';}},getItems: function () {var ui = GoAccess.getPanelUI(), menu = [];for (var panel in ui) {if (GoAccess.Util.isPanelValid(panel))continue;menu.push({'current': window.location.hash.substr(1) == panel,'head': ui[panel].head,'key': panel,'icon': this.getIcon(panel),});}return menu;},setPerPage: function (e) {GoAccess.AppPrefs['perPage'] = +e.currentTarget.getAttribute('data-perpage');GoAccess.App.renderData();GoAccess.setPrefs();},getTheme: function () {return GoAccess.AppPrefs.theme || 'darkGray';},getLayout: function () {return GoAccess.AppPrefs.layout || 'horizontal';},getPerPage: function () {return GoAccess.AppPrefs.perPage || 7;},renderOpts: function () {var o = {};o[this.getLayout()] = true;o[this.getTheme()] = true;o['perPage' + this.getPerPage()] = true;o['autoHideTables'] = GoAccess.Tables.autoHideTables();o['showTables'] = GoAccess.Tables.showTables();o['labels'] = GoAccess.i18n;$('.nav-list').innerHTML = GoAccess.AppTpls.Nav.opts.render(o);$('nav').classList.toggle('active');this.events();},renderMenu: function (e) {$('.nav-list').innerHTML = GoAccess.AppTpls.Nav.menu.render({'nav': this.getItems(),'overall': window.location.hash.substr(1) == '','labels': GoAccess.i18n,});$('nav').classList.toggle('active');this.events();},WSStatus: function () {if (Object.keys(GoAccess.AppWSConn).length)$$('.nav-ws-status', function (item) { item.style.display = 'block'; });},WSClose: function () {$$('.nav-ws-status', function (item) {item.classList.remove('connected');item.setAttribute('title', 'Disconnected');});},WSOpen: function () {$$('.nav-ws-status', function (item) {item.classList.add('connected');item.setAttribute('title', 'Connected to ' + GoAccess.AppWSConn.url);});},renderWrap: function (nav) {$('nav').innerHTML = GoAccess.AppTpls.Nav.wrap.render(GoAccess.i18n);},initialize: function () {this.setTheme(GoAccess.AppPrefs.theme);this.renderWrap();this.WSStatus();this.events();}};GoAccess.Panels = {events: function () {$$('[data-toggle=dropdown]', function (item) {item.onclick = function (e) {this.openOpts(e.currentTarget);}.bind(this);item.onblur = function (e) {this.closeOpts(e);}.bind(this);}.bind(this));$$('[data-plot]', function (item) {item.onclick = function (e) {GoAccess.Charts.redrawChart(e.currentTarget);}.bind(this);}.bind(this));$$('[data-chart]', function (item) {item.onclick = function (e) {GoAccess.Charts.toggleChart(e.currentTarget);}.bind(this);}.bind(this));$$('[data-chart-type]', function (item) {item.onclick = function (e) {GoAccess.Charts.setChartType(e.currentTarget);}.bind(this);}.bind(this));$$('[data-metric]', function (item) {item.onclick = function (e) {GoAccess.Tables.toggleColumn(e.currentTarget);}.bind(this);}.bind(this));},openOpts: function (targ) {var panel = targ.getAttribute('data-panel');targ.parentElement.classList.toggle('open');this.renderOpts(panel);},closeOpts: function (e) {e.currentTarget.parentElement.classList.remove('open');if (e.relatedTarget && e.relatedTarget.getAttribute('data-toggle') !== 'dropdown')e.relatedTarget.click();},setPlotSelection: function (ui, prefs) {var chartType = ((prefs || {}).plot || {}).chartType || ui.plot[0].chartType;var metric = ((prefs || {}).plot || {}).metric || ui.plot[0].className;ui[chartType] = true;for (var i = 0, len = ui.plot.length; i < len; ++i)if (ui.plot[i].className == metric)ui.plot[i]['selected'] = true;},setColSelection: function (items, prefs) {var columns = (prefs || {}).columns || {};for (var i = 0, len = items.length; i < len; ++i)if ((items[i].key in columns) && columns[items[i].key]['hide'])items[i]['hide'] = true;},setChartSelection: function (ui, prefs) {ui['showChart'] = prefs && ('chart' in prefs) ? prefs.chart : true;},setOpts: function (panel) {var ui = JSON.parse(JSON.stringify(GoAccess.getPanelUI(panel))), prefs = GoAccess.getPrefs(panel);this.setChartSelection(ui, prefs);this.setPlotSelection(ui, prefs);this.setColSelection(ui.items, prefs);return GoAccess.Util.merge(ui, {'labels': GoAccess.i18n});},renderOpts: function (panel) {$('.panel-opts-' + panel).innerHTML = GoAccess.AppTpls.Panels.opts.render(this.setOpts(panel));this.events();},enablePrev: function (panel) {var $pagination = $('#panel-' + panel + ' .pagination a.panel-prev');if ($pagination)$pagination.parentNode.classList.remove('disabled');},disablePrev: function (panel) {var $pagination = $('#panel-' + panel + ' .pagination a.panel-prev');if ($pagination)$pagination.parentNode.classList.add('disabled');},enableNext: function (panel) {var $pagination = $('#panel-' + panel + ' .pagination a.panel-next');if ($pagination)$pagination.parentNode.classList.remove('disabled');},disableNext: function (panel) {var $pagination = $('#panel-' + panel + ' .pagination a.panel-next');if ($pagination)$pagination.parentNode.classList.add('disabled');},enableFirst: function (panel) {var $pagination = $('#panel-' + panel + ' .pagination a.panel-first');if ($pagination)$pagination.parentNode.classList.remove('disabled');},disableFirst: function (panel) {var $pagination = $('#panel-' + panel + ' .pagination a.panel-first');if ($pagination)$pagination.parentNode.classList.add('disabled');},enableLast: function (panel) {var $pagination = $('#panel-' + panel + ' .pagination a.panel-last');if ($pagination)$pagination.parentNode.classList.remove('disabled');},disableLast: function (panel) {var $pagination = $('#panel-' + panel + ' .pagination a.panel-last');if ($pagination)$pagination.parentNode.classList.add('disabled');},enablePagination: function (panel) {this.enablePrev(panel);this.enableNext(panel);this.enableFirst(panel);this.enableLast(panel);},disablePagination: function (panel) {this.disablePrev(panel);this.disableNext(panel);this.disableFirst(panel);this.disableLast(panel);},hasSubItems: function (ui, data) {for (var i = 0, len = data.length; i < len; ++i) {if (!data[i].items)return (ui['hasSubItems'] = false);if (data[i].items.length) {return (ui['hasSubItems'] = true);}}return false;},setComputedData: function (panel, ui, data) {this.hasSubItems(ui, data.data);GoAccess.Charts.hasChart(panel, ui);GoAccess.Tables.hasTable(ui);},renderPanel: function (panel, ui, col) {var data = GoAccess.getPanelData(panel);this.setComputedData(panel, ui, data);var box = document.createElement('div');box.id = 'panel-' + panel;box.innerHTML = GoAccess.AppTpls.Panels.wrap.render(GoAccess.Util.merge(ui, {'labels': GoAccess.i18n}));col.appendChild(box);if (data.data.length <= GoAccess.getPrefs().perPage)this.disablePagination(panel);GoAccess.Tables.renderThead(panel, ui);return col;},createCol: function (row) {var perRow = GoAccess.AppPrefs['layout'] == 'horizontal' ? 6 : 12;var col = document.createElement('div');col.setAttribute('class', 'col-md-' + perRow + ' wrap-panel');row.appendChild(col);return col;},createRow: function (row, idx) {var wrap = $('.wrap-panels');var every = GoAccess.AppPrefs['layout'] == 'horizontal' ? 2 : 1;if (idx % every == 0) {row = document.createElement('div');row.setAttribute('class', 'row' + (every == 2 ? ' equal' : ''));wrap.appendChild(row);}return row;},resetPanel: function (panel) {var ui = GoAccess.getPanelUI(), idx = 0, row = null;var ele = $('#panel-' + panel);if (GoAccess.Util.isPanelValid(panel))return false;var col = ele.parentNode;col.removeChild(ele);this.renderPanel(panel, ui[panel], col);this.events();},renderPanels: function () {var ui = GoAccess.getPanelUI(), idx = 0, row = null, col = null;$('.wrap-panels').innerHTML = '';for (var panel in ui) {if (GoAccess.Util.isPanelValid(panel))continue;row = this.createRow(row, idx++);col = this.createCol(row);col = this.renderPanel(panel, ui[panel], col);}},initialize: function () {this.renderPanels();this.events();}};GoAccess.Charts = {iter: function (callback) {Object.keys(GoAccess.AppCharts).forEach(function (panel) {if (!GoAccess.Util.isWithinViewPort($('#panel-' + panel)))return;if (callback && typeof callback === 'function')callback.call(this, GoAccess.AppCharts[panel], panel);});},getMetricKeys: function (panel, key) {return GoAccess.getPanelUI(panel)['items'].map(function (a) { return a[key]; });},getPanelData: function (panel, data) {var plot = GoAccess.Util.getProp(GoAccess.AppState, panel + '.plot');data = data || this.processChartData(GoAccess.getPanelData(panel).data);return plot.chartReverse ? data.reverse() : data;},drawPlot: function (panel, plotUI, data) {var chart = this.getChart(panel, plotUI, data);if (!chart)return;this.renderChart(panel, chart, data);GoAccess.AppCharts[panel] = null;GoAccess.AppCharts[panel] = chart;},setChartType: function (targ) {var panel = targ.getAttribute('data-panel');var type = targ.getAttribute('data-chart-type');GoAccess.Util.setProp(GoAccess.AppPrefs, panel + '.plot.chartType', type);GoAccess.setPrefs();var plotUI = GoAccess.Util.getProp(GoAccess.AppState, panel + '.plot');this.drawPlot(panel, plotUI, this.getPanelData(panel));},toggleChart: function (targ) {var panel = targ.getAttribute('data-panel');var prefs = GoAccess.getPrefs(panel),chart = prefs && ('chart' in prefs) ? prefs.chart : true;GoAccess.Util.setProp(GoAccess.AppPrefs, panel + '.chart', !chart);GoAccess.setPrefs();GoAccess.Panels.resetPanel(panel);GoAccess.Charts.resetChart(panel);GoAccess.Tables.renderFullTable(panel);},hasChart: function (panel, ui) {var prefs = GoAccess.getPrefs(panel),chart = prefs && ('chart' in prefs) ? prefs.chart : true;ui['chart'] = ui.plot.length && chart && chart;},redrawChart: function (targ) {var plot = targ.getAttribute('data-plot');var panel = targ.getAttribute('data-panel');var ui = GoAccess.getPanelUI(panel);var plotUI = ui.plot;GoAccess.Util.setProp(GoAccess.AppPrefs, panel + '.plot.metric', plot);GoAccess.setPrefs();for (var x in plotUI) {if (!plotUI.hasOwnProperty(x) || plotUI[x].className != plot)continue;GoAccess.Util.setProp(GoAccess.AppState, panel + '.plot', plotUI[x]);this.drawPlot(panel, plotUI[x], this.getPanelData(panel));break;}},extractCount: function (item) {var o = {};for (var prop in item)o[prop] = GoAccess.Util.getCount(item[prop]);return o;},processChartData: function (data) {var out = [];for (var i = 0; i < data.length; ++i)out.push(this.extractCount(data[i]));return out;},findUIItem: function (panel, key) {var items = GoAccess.getPanelUI(panel).items, o = {};for (var i = 0; i < items.length; ++i) {if (items[i].key == key)return items[i];}return null;},getXKey: function (datum, key) {var arr = [];if (typeof key === 'string')return datum[key];for (var prop in key)arr.push(datum[key[prop]]);return arr.join(' ');},getAreaSpline: function (panel, plotUI, data) {var dualYaxis = plotUI['d3']['y1'];var chart = AreaChart(dualYaxis).labels({y0: plotUI['d3']['y0'].label,y1: dualYaxis ? plotUI['d3']['y1'].label : ''}).x(function (d) {if ((((plotUI || {}).d3 || {}).x || {}).key)return this.getXKey(d, plotUI['d3']['x']['key']);return d.data;}.bind(this)).y0(function (d) {return +d[plotUI['d3']['y0']['key']];}).width($("#chart-" + panel).getBoundingClientRect().width).height(175).format({x: (this.findUIItem(panel, 'data') || {}).dataType || null,y0: ((plotUI.d3 || {}).y0 || {}).format,y1: ((plotUI.d3 || {}).y1 || {}).format,}).opts(plotUI);dualYaxis && chart.y1(function (d) {return +d[plotUI['d3']['y1']['key']];});return chart;},getVBar: function (panel, plotUI, data) {var dualYaxis = plotUI['d3']['y1'];var chart = BarChart(dualYaxis).labels({y0: plotUI['d3']['y0'].label,y1: dualYaxis ? plotUI['d3']['y1'].label : ''}).x(function (d) {if ((((plotUI || {}).d3 || {}).x || {}).key)return this.getXKey(d, plotUI['d3']['x']['key']);return d.data;}.bind(this)).y0(function (d) {return +d[plotUI['d3']['y0']['key']];}).width($("#chart-" + panel).getBoundingClientRect().width).height(175).format({x: (this.findUIItem(panel, 'data') || {}).dataType || null,y0: ((plotUI.d3 || {}).y0 || {}).format,y1: ((plotUI.d3 || {}).y1 || {}).format,}).opts(plotUI);dualYaxis && chart.y1(function (d) {return +d[plotUI['d3']['y1']['key']];});return chart;},getChartType: function (panel) {var ui = GoAccess.getPanelUI(panel);if (!ui.chart)return '';return GoAccess.Util.getProp(GoAccess.getPrefs(), panel + '.plot.chartType') || ui.plot[0].chartType;},getPlotUI: function (panel, ui) {var metric = GoAccess.Util.getProp(GoAccess.getPrefs(), panel + '.plot.metric');if (!metric)return ui.plot[0];return ui.plot.filter(function (v) {return v.className == metric;})[0];},getChart: function (panel, plotUI, data) {var chart = null;switch (this.getChartType(panel)) {case 'area-spline':chart = this.getAreaSpline(panel, plotUI, data);break;case 'bar':chart = this.getVBar(panel, plotUI, data);break;}return chart;},renderChart: function (panel, chart, data) {d3.select('#chart-' + panel + '>.chart-tooltip-wrap').remove();d3.select('#chart-' + panel).select('svg').remove();d3.select("#chart-" + panel).datum(data).call(chart).append("div").attr("class", "chart-tooltip-wrap");},addChart: function (panel, ui) {var plotUI = null, chart = null;if (!ui.plot || !ui.plot.length)return;plotUI = this.getPlotUI(panel, ui);GoAccess.Util.setProp(GoAccess.AppState, panel + '.plot', plotUI);var data = this.getPanelData(panel);if (!(chart = this.getChart(panel, plotUI, data)))return;this.renderChart(panel, chart, data);GoAccess.AppCharts[panel] = chart;},renderCharts: function (ui) {for (var panel in ui) {if (!ui.hasOwnProperty(panel))continue;this.addChart(panel, ui[panel]);}},resetChart: function (panel) {var ui = {};if (GoAccess.Util.isPanelValid(panel))return false;ui = GoAccess.getPanelUI(panel);this.addChart(panel, ui);},reloadChart: function (chart, panel) {var subItems = GoAccess.Tables.getSubItemsData(panel);var data = (subItems.length ? subItems : GoAccess.getPanelData(panel).data).slice(0);d3.select("#chart-" + panel).datum(this.processChartData(this.getPanelData(panel, data))).call(chart.width($("#chart-" + panel).offsetWidth));},reloadCharts: function () {this.iter(function (chart, panel) {this.reloadChart(chart, panel);}.bind(this));GoAccess.AppState.updated = false;},redrawCharts: function () {this.iter(function (chart, panel) {d3.select("#chart-" + panel).call(chart.width($("#chart-" + panel).offsetWidth));});},initialize: function () {this.renderCharts(GoAccess.getPanelUI());d3.select(window).on('scroll.charts', debounce(function () {this.reloadCharts();}, 250, false).bind(this)).on('resize.charts', function () {this.redrawCharts();}.bind(this));}};GoAccess.Tables = {chartData: {},events: function () {$$('.panel-next', function (item) {item.onclick = function (e) {var panel = e.currentTarget.getAttribute('data-panel');this.renderTable(panel, this.nextPage(panel));}.bind(this);}.bind(this));$$('.panel-prev', function (item) {item.onclick = function (e) {var panel = e.currentTarget.getAttribute('data-panel');this.renderTable(panel, this.prevPage(panel));}.bind(this);}.bind(this));$$('.panel-first', function (item) {item.onclick = function (e) {var panel = e.currentTarget.getAttribute('data-panel');this.renderTable(panel, "FIRST_PAGE");}.bind(this);}.bind(this));$$('.panel-last', function (item) {item.onclick = function (e) {var panel = e.currentTarget.getAttribute('data-panel');this.renderTable(panel, "LAST_PAGE");}.bind(this);}.bind(this));$$('.expandable>td', function (item) {item.onclick = function (e) {if (!window.getSelection().toString())this.toggleRow(e.currentTarget);}.bind(this);}.bind(this));$$('.row-expandable.clickable', function (item) {item.onclick = function (e) {this.toggleRow(e.currentTarget);}.bind(this);}.bind(this));$$('.sortable', function (item) {item.onclick = function (e) {this.sortColumn(e.currentTarget);}.bind(this);}.bind(this));},toggleColumn: function (targ) {var panel = targ.getAttribute('data-panel');var metric = targ.getAttribute('data-metric');var columns = (GoAccess.getPrefs(panel) || {}).columns || {};if (metric in columns) {delete columns[metric];} else {GoAccess.Util.setProp(columns, metric + '.hide', true);}GoAccess.Util.setProp(GoAccess.AppPrefs, panel + '.columns', columns);GoAccess.setPrefs();GoAccess.Tables.renderThead(panel, GoAccess.getPanelUI(panel));GoAccess.Tables.renderFullTable(panel);},sortColumn: function (ele) {var field = ele.getAttribute('data-key');var order = ele.getAttribute('data-order');var panel = ele.parentElement.parentElement.parentElement.getAttribute('data-panel');order = order ? 'asc' == order ? 'desc' : 'asc' : 'asc';GoAccess.App.sortData(panel, field, order);GoAccess.Util.setProp(GoAccess.AppState, panel + '.sort', {'field': field,'order': order,});this.renderThead(panel, GoAccess.getPanelUI(panel));this.renderTable(panel, this.getCurPage(panel));GoAccess.Charts.reloadChart(GoAccess.AppCharts[panel], panel);},getDataByKey: function (panel, key) {var data = GoAccess.getPanelData(panel).data;for (var i = 0, n = data.length; i < n; ++i) {if (GoAccess.Util.hashCode(data[i].data) == key)return data[i];}return null;},getSubItemsData: function (panel) {var out = [], items = this.chartData[panel];for (var x in items) {if (!items.hasOwnProperty(x))continue;out = out.concat(items[x]);}return out;},addChartData: function (panel, key) {var data = this.getDataByKey(panel, key);var path = panel + '.' + key;if (!data || !data.items)return [];GoAccess.Util.setProp(this.chartData, path, data.items);return this.getSubItemsData(panel);},removeChartData: function (panel, key) {if (GoAccess.Util.getProp(this.chartData, panel + '.' + key))delete this.chartData[panel][key];if (!this.chartData[panel] || Object.keys(this.chartData[panel]).length == 0)return GoAccess.getPanelData(panel).data;return this.getSubItemsData(panel);},isExpanded: function (panel, key) {var path = panel + '.expanded.' + key;return GoAccess.Util.getProp(GoAccess.AppState, path);},toggleExpanded: function (panel, key) {var path = panel + '.expanded.' + key, ret = true;if (this.isExpanded(panel, key)) {delete GoAccess.AppState[panel]['expanded'][key];} else {GoAccess.Util.setProp(GoAccess.AppState, path, true), ret = false;}return ret;},toggleRow: function (ele) {var hide = false, data = [];var row = ele.parentNode;var panel = row.getAttribute('data-panel'), key = row.getAttribute('data-key');var plotUI = GoAccess.AppCharts[panel].opts();hide = this.toggleExpanded(panel, key);this.renderTable(panel, this.getCurPage(panel));if (!plotUI.redrawOnExpand)return;if (!hide) {data = GoAccess.Charts.processChartData(this.addChartData(panel, key));} else {data = GoAccess.Charts.processChartData(this.removeChartData(panel, key));}GoAccess.Charts.drawPlot(panel, plotUI, data);},getCurPage: function (panel) {return GoAccess.Util.getProp(GoAccess.AppState, panel + '.curPage') || 0;},pageOffSet: function (panel) {return ((this.getCurPage(panel) - 1) * GoAccess.getPrefs().perPage);},getTotalPages: function (dataItems) {return Math.ceil(dataItems.length / GoAccess.getPrefs().perPage);},getPage: function (panel, dataItems, page) {var totalPages = this.getTotalPages(dataItems);if (page < 1)page = 1;if (page > totalPages)page = totalPages;GoAccess.Util.setProp(GoAccess.AppState, panel + '.curPage', page);var start = this.pageOffSet(panel);var end = start + GoAccess.getPrefs().perPage;return dataItems.slice(start, end);},prevPage: function (panel) {return this.getCurPage(panel) - 1;},nextPage: function (panel) {return this.getCurPage(panel) + 1;},getMetaValue: function (ui, value) {if ('meta' in ui)return value[ui.meta];return null;},getMetaCell: function (ui, value) {var val = this.getMetaValue(ui, value);var max = (value || {}).max;var min = (value || {}).min;var vtype = ui.metaType || ui.dataType;var className = ui.className || '';className += ui.dataType != 'string' ? 'text-right' : '';return {'className': className,'max' : max != undefined ? GoAccess.Util.fmtValue(max, vtype) : null,'min' : min != undefined ? GoAccess.Util.fmtValue(min, vtype) : null,'value' : val != undefined ? GoAccess.Util.fmtValue(val, vtype) : null,'title' : ui.meta,'label' : ui.metaLabel || null,};},hideColumn: function (panel, col) {var columns = (GoAccess.getPrefs(panel) || {}).columns || {};return ((col in columns) && columns[col]['hide']);},showTables: function () {return ('showTables' in GoAccess.getPrefs()) ? GoAccess.getPrefs().showTables : true;},autoHideTables: function () {return ('autoHideTables' in GoAccess.getPrefs()) ? GoAccess.getPrefs().autoHideTables : true;},hasTable: function (ui) {ui['table'] = this.showTables();ui['autoHideTables'] = this.autoHideTables();},renderMetaRow: function (panel, ui) {var table = $('.table-' + panel + ' tbody.tbody-meta');if (!table)return;var cells = [], uiItems = ui.items;var data = GoAccess.getPanelData(panel).metadata;for (var i = 0; i < uiItems.length; ++i) {var item = uiItems[i];if (this.hideColumn(panel, item.key))continue;var value = data[item.key];cells.push(this.getMetaCell(item, value));}table.innerHTML = GoAccess.AppTpls.Tables.meta.render({row: [{'hasSubItems': ui.hasSubItems,'cells': cells}]});},iterUIItems: function (panel, uiItems, dataItems, callback) {var out = [];for (var i = 0; i < uiItems.length; ++i) {var uiItem = uiItems[i];if (this.hideColumn(panel, uiItem.key))continue;var dataItem = dataItems[uiItem.key];if (callback && typeof callback == 'function') {var ret = callback.call(this, panel, uiItem, dataItem);if (ret) out.push(ret);}}return out;},getObjectCell: function (panel, ui, value) {var className = ui.className || '';className += ui.dataType != 'string' ? 'text-right' : '';return {'className': className,'percent': GoAccess.Util.getPercent(value),'value': GoAccess.Util.fmtValue(GoAccess.Util.getCount(value), ui.dataType)};},renderRow: function (panel, callback, ui, dataItem, idx, subItem, parentId, expanded) {var shadeParent = ((!subItem && idx % 2 != 0) ? 'shaded' : '');var shadeChild = ((parentId % 2 != 0) ? 'shaded' : '');return {'panel' : panel,'idx' : !subItem && (String((idx + 1) + this.pageOffSet(panel))),'key' : !subItem ? GoAccess.Util.hashCode(dataItem.data) : '','expanded' : !subItem && expanded,'parentId' : subItem ? String(parentId) : '','className' : subItem ? 'child ' + shadeChild : 'parent ' + shadeParent,'hasSubItems' : ui.hasSubItems,'items' : dataItem.items ? dataItem.items.length : 0,'cells' : callback.call(this),};},renderRows: function (rows, panel, ui, dataItems, subItem, parentId) {subItem = subItem || false;if (dataItems.length == 0 && ui.items.length) {rows.push({cells: [{className: 'text-center',colspan: ui.items.length + 1,value: 'No data on this panel.'}]});}var cellcb = null;for (var i = 0; i < dataItems.length; ++i) {var dataItem = dataItems[i], data = null, expanded = false;switch(typeof dataItem) {case 'string':data = dataItem;cellcb = function () {return {'colspan': ui.items.length,'value': data};};break;default:data = dataItem.data;cellcb = this.iterUIItems.bind(this, panel, ui.items, dataItem, this.getObjectCell.bind(this));}expanded = this.isExpanded(panel, GoAccess.Util.hashCode(data));rows.push(this.renderRow(panel, cellcb, ui, dataItem, i, subItem, parentId, expanded));if (dataItem.items && dataItem.items.length && expanded) {this.renderRows(rows, panel, ui, dataItem.items, true, i, expanded);}}},renderDataRows: function (panel, ui, dataItems, page) {var table = $('.table-' + panel + ' tbody.tbody-data');if (!table)return;dataItems = this.getPage(panel, dataItems, page);var rows = [];this.renderRows(rows, panel, ui, dataItems);if (rows.length == 0)return;table.innerHTML = GoAccess.AppTpls.Tables.data.render({rows: rows});},togglePagination: function (panel, page, dataItems) {GoAccess.Panels.enablePagination(panel);if (page >= this.getTotalPages(dataItems)) {GoAccess.Panels.disableNext(panel);GoAccess.Panels.disableLast(panel);}if (page <= 1) {GoAccess.Panels.disablePrev(panel);GoAccess.Panels.disableFirst(panel);}},renderTable: function (panel, page) {var dataItems = GoAccess.getPanelData(panel).data;var ui = GoAccess.getPanelUI(panel);if (page === "LAST_PAGE") {page = this.getTotalPages(dataItems);} else if (page === "FIRST_PAGE") {page = 1;}this.togglePagination(panel, page, dataItems);this.renderDataRows(panel, ui, dataItems, page);this.events();},renderFullTable: function (panel) {var ui = GoAccess.getPanelUI(panel), page = 0;var data = GoAccess.getPanelData(panel);if (data.hasOwnProperty('metadata'))this.renderMetaRow(panel, ui);if (data.hasOwnProperty('data')) {page = this.getCurPage(panel);this.togglePagination(panel, page, data.data);this.renderDataRows(panel, ui, data.data, page);}},renderTables: function (force) {var ui = GoAccess.getPanelUI();for (var panel in ui) {if (GoAccess.Util.isPanelValid(panel) || !this.showTables())continue;if (force || GoAccess.Util.isWithinViewPort($('#panel-' + panel)))this.renderFullTable(panel);}},sort2Tpl: function (panel, ui) {var uiClone = JSON.parse(JSON.stringify(ui)), out = [];var sort = GoAccess.Util.getProp(GoAccess.AppState, panel + '.sort');for (var i = 0, len = uiClone.items.length; i < len; ++i) {var item = uiClone.items[i];if (this.hideColumn(panel, item.key))continue;item['sort'] = false;if (item.key == sort.field && sort.order) {item['sort'] = true;item[sort.order.toLowerCase()] = true;}out.push(item);}uiClone.items = out;return uiClone;},renderThead: function (panel, ui) {var $thead = $('.table-' + panel + '>thead'), $colgroup = $('.table-' + panel + '>colgroup');if ($thead && $colgroup && this.showTables()) {ui = this.sort2Tpl(panel, ui);$thead.innerHTML = GoAccess.AppTpls.Tables.head.render(ui);$colgroup.innerHTML = GoAccess.AppTpls.Tables.colgroup.render(ui);}},reloadTables: function () {this.renderTables(false);this.events();},initialize: function () {this.renderTables(true);this.events();d3.select(window).on('scroll.tables', debounce(function () {this.reloadTables();}, 250, false).bind(this));},};GoAccess.App = {hasFocus: true,tpl: function (tpl) {return Hogan.compile(tpl);},setTpls: function () {GoAccess.AppTpls = {'Nav': {'wrap': this.tpl($('#tpl-nav-wrap').innerHTML),'menu': this.tpl($('#tpl-nav-menu').innerHTML),'opts': this.tpl($('#tpl-nav-opts').innerHTML),},'Panels': {'wrap': this.tpl($('#tpl-panel').innerHTML),'opts': this.tpl($('#tpl-panel-opts').innerHTML),},'General': {'wrap': this.tpl($('#tpl-general').innerHTML),'items': this.tpl($('#tpl-general-items').innerHTML),},'Tables': {'colgroup': this.tpl($('#tpl-table-colgroup').innerHTML),'head': this.tpl($('#tpl-table-thead').innerHTML),'meta': this.tpl($('#tpl-table-row-meta').innerHTML),'data': this.tpl($('#tpl-table-row').innerHTML),},};},sortField: function (o, field) {var f = o[field];if (GoAccess.Util.isObject(f) && (f !== null))f = o[field].count;return f;},sortData: function (panel, field, order) {var panelData = GoAccess.getPanelData(panel).data;panelData.sort(function (a, b) {a = this.sortField(a, field);b = this.sortField(b, field);if (typeof a === 'string' && typeof b === 'string')return 'asc' == order ? a.localeCompare(b) : b.localeCompare(a);return 'asc' == order ? a - b : b - a;}.bind(this));},setInitSort: function () {var ui = GoAccess.getPanelUI();for (var panel in ui) {if (GoAccess.Util.isPanelValid(panel))continue;GoAccess.Util.setProp(GoAccess.AppState, panel + '.sort', ui[panel].sort);}},verifySort: function () {var ui = GoAccess.getPanelUI();for (var panel in ui) {if (GoAccess.Util.isPanelValid(panel))continue;var sort = GoAccess.Util.getProp(GoAccess.AppState, panel + '.sort');if (JSON.stringify(sort) === JSON.stringify(ui[panel].sort))continue;this.sortData(panel, sort.field, sort.order);}},initDom: function () {$('nav').classList.remove('hide');$('.container').classList.remove('hide');$('.spinner').classList.add('hide');if (GoAccess.AppPrefs['layout'] == 'horizontal') {$('.container').classList.add('container-fluid');$('.container-fluid').classList.remove('container');}},renderData: function () {if (!this.hasFocus)return;this.verifySort();GoAccess.OverallStats.initialize();if (!GoAccess.AppState.updated)return;GoAccess.Charts.reloadCharts();GoAccess.Tables.reloadTables();},initialize: function () {this.setInitSort();this.setTpls();GoAccess.Nav.initialize();this.initDom();GoAccess.OverallStats.initialize();GoAccess.Panels.initialize();GoAccess.Charts.initialize();GoAccess.Tables.initialize();},};document.addEventListener('visibilitychange', function () {if (document.visibilityState === 'hidden')GoAccess.App.hasFocus = false;if (document.visibilityState === 'visible') {var hasFocus = GoAccess.App.hasFocus;GoAccess.App.hasFocus = true;hasFocus || GoAccess.App.renderData();}});window.onload = function () {GoAccess.initialize({'i18n': window.json_i18n,'uiData': window.user_interface,'panelData': window.json_data,'wsConnection': window.connection || null,'prefs': window.html_prefs || {},});GoAccess.App.initialize();};}()); \ No newline at end of file diff --git a/goaccess++/resources/js/charts.js b/goaccess++/resources/js/charts.js new file mode 100644 index 0000000..3111546 --- /dev/null +++ b/goaccess++/resources/js/charts.js @@ -0,0 +1,1067 @@ +/** + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2018 Gerardo Orellana <hello @ goaccess.io> + */ + +'use strict'; + +// This is faster than calculating the exact length of each label. +// e.g., getComputedTextLength(), slice()... +function truncate(text, width) { + text.each(function () { + var parent = this.parentNode, $d3parent = d3.select(parent); + var gw = $d3parent.node().getBBox(); + var x = (Math.min(gw.width, width) / 2) * -1; + // adjust wrapper <svg> width + if ('svg' == parent.nodeName) { + $d3parent.attr('width', width).attr('x', x); + } + // wrap <text> within an svg + else { + $d3parent.insert('svg', function () { + return this; + }.bind(this)) + .attr('class', 'wrap-text') + .attr('width', width) + .attr('x', x) + .append(function () { + return this; + }.bind(this)); + } + }); +} + +function AreaChart(dualYaxis) { + var opts = {}; + var margin = { + top : 20, + right : 50, + bottom : 40, + left : 50, + }, + height = 170, + nTicks = 10, + padding = 10, + width = 760; + var labels = { x: 'Unnamed', y0: 'Unnamed', y1: 'Unnamed' }; + var format = { x: null, y0: null, y1: null}; + + var xValue = function (d) { + return d[0]; + }, + yValue0 = function (d) { + return d[1]; + }, + yValue1 = function (d) { + return d[2]; + }; + + var xScale = d3.scale.ordinal(); + var yScale0 = d3.scale.linear().nice(); + var yScale1 = d3.scale.linear().nice(); + + var xAxis = d3.svg.axis() + .scale(xScale) + .orient('bottom') + .tickFormat(function (d) { + if (format.x) + return GoAccess.Util.fmtValue(d, format.x); + return d; + }); + + var yAxis0 = d3.svg.axis() + .scale(yScale0) + .orient('left') + .tickFormat(function (d) { + return d3.format('.2s')(d); + }); + + var yAxis1 = d3.svg.axis() + .scale(yScale1) + .orient('right') + .tickFormat(function (d) { + if (format.y1) + return GoAccess.Util.fmtValue(d, format.y1); + return d3.format('.2s')(d); + }); + + var xGrid = d3.svg.axis() + .scale(xScale) + .orient('bottom'); + + var yGrid = d3.svg.axis() + .scale(yScale0) + .orient('left'); + + var area0 = d3.svg.area() + .interpolate('cardinal') + .x(X) + .y(Y0); + var area1 = d3.svg.area() + .interpolate('cardinal') + .x(X) + .y(Y1); + + var line0 = d3.svg.line() + .interpolate('cardinal') + .x(X) + .y(Y0); + var line1 = d3.svg.line() + .interpolate('cardinal') + .x(X) + .y(Y1); + + // The x-accessor for the path generator; xScale ∘ xValue. + function X(d) { + return xScale(d[0]); + } + + // The x-accessor for the path generator; yScale0 yValue0. + function Y0(d) { + return yScale0(d[1]); + } + + // The x-accessor for the path generator; yScale0 yValue0. + function Y1(d) { + return yScale1(d[2]); + } + + function innerW() { + return width - margin.left - margin.right; + } + + function innerH() { + return height - margin.top - margin.bottom; + } + + function getXTicks(data) { + if (data.length < nTicks) + return xScale.domain(); + + return d3.range(0, data.length, Math.ceil(data.length / nTicks)).map(function (d) { + return xScale.domain()[d]; + }); + } + + function getYTicks(scale) { + var domain = scale.domain(); + return d3.range(domain[0], domain[1], Math.ceil(domain[1] / nTicks)); + } + + // Convert data to standard representation greedily; + // this is needed for nondeterministic accessors. + function mapData(data) { + var _datum = function (d, i) { + var datum = [xValue.call(data, d, i), yValue0.call(data, d, i)]; + dualYaxis && datum.push(yValue1.call(data, d, i)); + return datum; + }; + return data.map(function (d, i) { + return _datum(d, i); + }); + } + + function updateScales(data) { + // Update the x-scale. + xScale.domain(data.map(function (d) { + return d[0]; + })) + .rangePoints([0, innerW()], 1); + + // Update the y-scale. + yScale0.domain([0, d3.max(data, function (d) { + return d[1]; + })]) + .range([innerH(), 0]); + + // Update the y-scale. + dualYaxis && yScale1.domain([0, d3.max(data, function (d) { + return d[2]; + })]) + .range([innerH(), 0]); + } + + function toggleOpacity(ele, op) { + d3.select(ele.parentNode).selectAll('.' + (ele.getAttribute('data-yaxis') == 'y0' ? 'y1' : 'y0')).attr('style', op); + } + + function setLegendLabels(svg) { + // Legend Color + var rect = svg.selectAll('rect.legend.y0').data([null]); + rect.enter().append('rect') + .attr('class', 'legend y0') + .attr('data-yaxis', 'y0') + .on('mousemove', function (d, i) { toggleOpacity(this, 'opacity:0.1'); }) + .on('mouseleave', function (d, i) { toggleOpacity(this, null); }) + .attr('y', (height - 15)); + rect + .attr('x', (width / 2) - 100); + + // Legend Labels + var text = svg.selectAll('text.legend.y0').data([null]); + text.enter().append('text') + .attr('class', 'legend y0') + .attr('data-yaxis', 'y0') + .on('mousemove', function (d, i) { toggleOpacity(this, 'opacity:0.1'); }) + .on('mouseleave', function (d, i) { toggleOpacity(this, null); }) + .attr('y', (height - 6)); + text + .attr('x', (width / 2) - 85) + .text(labels.y0); + + if (!dualYaxis) + return; + + // Legend Labels + rect = svg.selectAll('rect.legend.y1').data([null]); + rect.enter().append('rect') + .attr('class', 'legend y1') + .attr('data-yaxis', 'y1') + .on('mousemove', function (d, i) { toggleOpacity(this, 'opacity:0.1'); }) + .on('mouseleave', function (d, i) { toggleOpacity(this, null); }) + .attr('y', (height - 15)); + rect + .attr('x', (width / 2)); + + // Legend Labels + text = svg.selectAll('text.legend.y1').data([null]); + text.enter().append('text') + .attr('class', 'legend y1') + .attr('data-yaxis', 'y1') + .on('mousemove', function (d, i) { toggleOpacity(this, 'opacity:0.1'); }) + .on('mouseleave', function (d, i) { toggleOpacity(this, null); }) + .attr('y', (height - 6)); + text + .attr('x', (width / 2) + 15) + .text(labels.y1); + } + + function setAxisLabels(svg) { + // Labels + svg.selectAll('text.axis-label.y0').data([null]) + .enter().append('text') + .attr('class', 'axis-label y0') + .attr('y', 10) + .attr('x', 53) + .text(labels.y0); + + if (!dualYaxis) + return; + + // Labels + var tEnter = svg.selectAll('text.axis-label.y1').data([null]); + tEnter.enter().append('text') + .attr('class', 'axis-label y1') + .attr('y', 10) + .text(labels.y1); + dualYaxis && tEnter + .attr('x', width - 25); + } + + function createSkeleton(svg) { + // Otherwise, create the skeletal chart. + var gEnter = svg.enter().append('svg').append('g'); + + // Lines + gEnter.append('g') + .attr('class', 'line line0 y0'); + dualYaxis && gEnter.append('g') + .attr('class', 'line line1 y1'); + + // Areas + gEnter.append('g') + .attr('class', 'area area0 y0'); + dualYaxis && gEnter.append('g') + .attr('class', 'area area1 y1'); + + // Points + gEnter.append('g') + .attr('class', 'points y0'); + dualYaxis && gEnter.append('g') + .attr('class', 'points y1'); + + // Grid + gEnter.append('g') + .attr('class', 'x grid'); + gEnter.append('g') + .attr('class', 'y grid'); + + // Axis + gEnter.append('g') + .attr('class', 'x axis'); + gEnter.append('g') + .attr('class', 'y0 axis'); + dualYaxis && gEnter.append('g') + .attr('class', 'y1 axis'); + + // Rects + gEnter.append('g') + .attr('class', 'rects'); + + setAxisLabels(svg); + setLegendLabels(svg); + + // Mouseover line + gEnter.append('line') + .attr('y2', innerH()) + .attr('y1', 0) + .attr('class', 'indicator'); + } + + function pathLen(d) { + return d.node().getTotalLength(); + } + + function addLine(g, data, line, cName) { + // Update the line path. + var path = g.select('g.' + cName).selectAll('path.' + cName) + .data([data]); + // enter + path + .enter() + .append('svg:path') + .attr('d', line) + .attr('class', cName) + .attr('stroke-dasharray', function (d) { + var pl = pathLen(d3.select(this)); + return pl + ' ' + pl; + }) + .attr('stroke-dashoffset', function (d) { + return pathLen(d3.select(this)); + }); + // update + path + .attr('d', line) + .transition() + .attr('stroke-dasharray', function (d) { + var pl = pathLen(d3.select(this)); + return pl + ' ' + pl; + }) + .duration(2000) + .attr('stroke-dashoffset', 0); + // remove elements + path.exit().remove(); + } + + function addArea(g, data, cb, cName) { + // Update the area path. + var area = g.select('g.' + cName).selectAll('path.' + cName) + .data([data]); + area + .enter() + .append('svg:path') + .attr('class', cName); + area + .attr('d', cb); + // remove elements + area.exit().remove(); + } + + // Update the area path and lines. + function addAreaLines(g, data) { + // Update the area path. + addArea(g, data, area0.y0(yScale0.range()[0]), 'area0'); + // Update the line path. + addLine(g, data, line0, 'line0'); + // Update the area path. + addArea(g, data, area1.y1(yScale1.range()[0]), 'area1'); + // Update the line path. + addLine(g, data, line1, 'line1'); + } + + // Update chart points + function addPoints(g, data) { + var radius = data.length > 100 ? 1 : 2.5; + + var points = g.select('g.points.y0').selectAll('circle.point') + .data(data); + points + .enter() + .append('svg:circle') + .attr('r', radius) + .attr('class', 'point'); + points + .attr('cx', function (d) { return xScale(d[0]); }) + .attr('cy', function (d) { return yScale0(d[1]); }); + // remove elements + points.exit().remove(); + + if (!dualYaxis) + return; + + points = g.select('g.points.y1').selectAll('circle.point') + .data(data); + points + .enter() + .append('svg:circle') + .attr('r', radius) + .attr('class', 'point'); + points + .attr('cx', function (d) { return xScale(d[0]); }) + .attr('cy', function (d) { return yScale1(d[2]); }); + // remove elements + points.exit().remove(); + } + + function addAxis(g, data) { + var xTicks = getXTicks(data); + var tickDistance = xTicks.length > 1 ? (xScale(xTicks[1]) - xScale(xTicks[0])) : innerW(); + var labelW = tickDistance - padding; + + // Update the x-axis. + g.select('.x.axis') + .attr('transform', 'translate(0,' + yScale0.range()[0] + ')') + .call(xAxis.tickValues(xTicks)) + .selectAll(".tick text") + .call(truncate, labelW > 0 ? labelW : innerW()); + + // Update the y0-axis. + g.select('.y0.axis') + .call(yAxis0.tickValues(getYTicks(yScale0))); + + if (!dualYaxis) + return; + + // Update the y1-axis. + g.select('.y1.axis') + .attr('transform', 'translate(' + innerW() + ', 0)') + .call(yAxis1.tickValues(getYTicks(yScale1))); + } + + // Update the X-Y grid. + function addGrid(g, data) { + g.select('.x.grid') + .attr('transform', 'translate(0,' + yScale0.range()[0] + ')') + .call(xGrid + .tickValues(getXTicks(data)) + .tickSize(-innerH(), 0, 0) + .tickFormat('') + ); + + g.select('.y.grid') + .call(yGrid + .tickValues(getYTicks(yScale0)) + .tickSize(-innerW(), 0, 0) + .tickFormat('') + ); + } + + function formatTooltip(data, i) { + var d = data.slice(0); + + d[0] = (format.x) ? GoAccess.Util.fmtValue(d[0], format.x) : d[0]; + d[1] = (format.y0) ? GoAccess.Util.fmtValue(d[1], format.y0) : d3.format(',')(d[1]); + dualYaxis && (d[2] = (format.y1) ? GoAccess.Util.fmtValue(d[2], format.y1) : d3.format(',')(d[2])); + + var template = d3.select('#tpl-chart-tooltip').html(); + return Hogan.compile(template).render({ + 'data': d + }); + } + + function mouseover(_self, selection, data, idx) { + var tooltip = selection.select('.chart-tooltip-wrap'); + tooltip.html(formatTooltip(data, idx)) + .style('left', (xScale(data[0])) + 'px') + .style('top', (d3.mouse(_self)[1] + 10) + 'px') + .style('display', 'block'); + + selection.select('line.indicator') + .style('display', 'block') + .attr('transform', 'translate(' + xScale(data[0]) + ',' + 0 + ')'); + } + + function mouseout(selection, g) { + var tooltip = selection.select('.chart-tooltip-wrap'); + tooltip.style('display', 'none'); + + g.select('line.indicator').style('display', 'none'); + } + + function addRects(selection, g, data) { + var w = (innerW() / data.length); + + var rects = g.select('g.rects').selectAll('rect') + .data(data); + rects + .enter() + .append('svg:rect') + .attr('height', innerH()) + .attr('class', 'point'); + rects + .attr('width', d3.functor(w)) + .attr('x', function (d, i) { return (w * i); }) + .attr('y', 0) + .on('mousemove', function (d, i) { + mouseover(this, selection, d, i); + }) + .on('mouseleave', function (d, i) { + mouseout(selection, g); + }); + // remove elements + rects.exit().remove(); + } + + function chart(selection) { + selection.each(function (data) { + // normalize data + data = mapData(data); + // updates X-Y scales + updateScales(data); + + // Select the svg element, if it exists. + var svg = d3.select(this).selectAll('svg').data([data]); + createSkeleton(svg); + + // Update the outer dimensions. + svg.attr({ + 'width': width, + 'height': height + }); + + // Update the inner dimensions. + var g = svg.select('g') + .attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); + + // Add grid + addGrid(g, data); + // Add chart lines and areas + addAreaLines(g, data); + // Add chart points + addPoints(g, data); + // Add axis + addAxis(g, data); + // Add rects + addRects(selection, g, data); + }); + } + + chart.opts = function (_) { + if (!arguments.length) return opts; + opts = _; + return chart; + }; + + chart.format = function (_) { + if (!arguments.length) return format; + format = _; + return chart; + }; + + chart.labels = function (_) { + if (!arguments.length) return labels; + labels = _; + return chart; + }; + + chart.margin = function (_) { + if (!arguments.length) return margin; + margin = _; + return chart; + }; + + chart.width = function (_) { + if (!arguments.length) return width; + width = _; + return chart; + }; + + chart.height = function (_) { + if (!arguments.length) return height; + height = _; + return chart; + }; + + chart.x = function (_) { + if (!arguments.length) return xValue; + xValue = _; + return chart; + }; + + chart.y0 = function (_) { + if (!arguments.length) return yValue0; + yValue0 = _; + return chart; + }; + + chart.y1 = function (_) { + if (!arguments.length) return yValue1; + yValue1 = _; + return chart; + }; + + return chart; +} + +function BarChart(dualYaxis) { + var opts = {}; + var margin = { + top : 20, + right : 50, + bottom : 40, + left : 50, + }, + height = 170, + nTicks = 10, + padding = 10, + width = 760; + var labels = { x: 'Unnamed', y0: 'Unnamed', y1: 'Unnamed' }; + var format = { x: null, y0: null, y1: null}; + + var xValue = function (d) { + return d[0]; + }, + yValue0 = function (d) { + return d[1]; + }, + yValue1 = function (d) { + return d[2]; + }; + + var xScale = d3.scale.ordinal(); + var yScale0 = d3.scale.linear().nice(); + var yScale1 = d3.scale.linear().nice(); + + var xAxis = d3.svg.axis() + .scale(xScale) + .orient('bottom') + .tickFormat(function (d) { + if (format.x) + return GoAccess.Util.fmtValue(d, format.x); + return d; + }); + + var yAxis0 = d3.svg.axis() + .scale(yScale0) + .orient('left') + .tickFormat(function (d) { + return d3.format('.2s')(d); + }); + + var yAxis1 = d3.svg.axis() + .scale(yScale1) + .orient('right') + .tickFormat(function (d) { + if (format.y1) + return GoAccess.Util.fmtValue(d, format.y1); + return d3.format('.2s')(d); + }); + + var xGrid = d3.svg.axis() + .scale(xScale) + .orient('bottom'); + + var yGrid = d3.svg.axis() + .scale(yScale0) + .orient('left'); + + function innerW() { + return width - margin.left - margin.right; + } + + function innerH() { + return height - margin.top - margin.bottom; + } + + function getXTicks(data) { + if (data.length < nTicks) + return xScale.domain(); + + return d3.range(0, data.length, Math.ceil(data.length / nTicks)).map(function (d) { + return xScale.domain()[d]; + }); + } + + function getYTicks(scale) { + var domain = scale.domain(); + return d3.range(domain[0], domain[1], Math.ceil(domain[1] / nTicks)); + } + + // Convert data to standard representation greedily; + // this is needed for nondeterministic accessors. + function mapData(data) { + var _datum = function (d, i) { + var datum = [xValue.call(data, d, i), yValue0.call(data, d, i)]; + dualYaxis && datum.push(yValue1.call(data, d, i)); + return datum; + }; + return data.map(function (d, i) { + return _datum(d, i); + }); + } + + function updateScales(data) { + // Update the x-scale. + xScale.domain(data.map(function (d) { + return d[0]; + })) + .rangeBands([0, innerW()], 0.1); + + // Update the y-scale. + yScale0.domain([0, d3.max(data, function (d) { + return d[1]; + })]) + .range([innerH(), 0]); + + // Update the y-scale. + dualYaxis && yScale1.domain([0, d3.max(data, function (d) { + return d[2]; + })]) + .range([innerH(), 0]); + } + + function toggleOpacity(ele, op) { + d3.select(ele.parentNode).selectAll('.' + (ele.getAttribute('data-yaxis') == 'y0' ? 'y1' : 'y0')).attr('style', op); + } + + function setLegendLabels(svg) { + // Legend Color + var rect = svg.selectAll('rect.legend.y0').data([null]); + rect.enter().append('rect') + .attr('class', 'legend y0') + .attr('data-yaxis', 'y0') + .on('mousemove', function (d, i) { toggleOpacity(this, 'opacity:0.1'); }) + .on('mouseleave', function (d, i) { toggleOpacity(this, null); }) + .attr('y', (height - 15)); + rect + .attr('x', (width / 2) - 100); + + // Legend Labels + var text = svg.selectAll('text.legend.y0').data([null]); + text.enter().append('text') + .attr('class', 'legend y0') + .attr('data-yaxis', 'y0') + .on('mousemove', function (d, i) { toggleOpacity(this, 'opacity:0.1'); }) + .on('mouseleave', function (d, i) { toggleOpacity(this, null); }) + .attr('y', (height - 6)); + text + .attr('x', (width / 2) - 85) + .text(labels.y0); + + if (!dualYaxis) + return; + + // Legend Labels + rect = svg.selectAll('rect.legend.y1').data([null]); + rect.enter().append('rect') + .attr('class', 'legend y1') + .attr('data-yaxis', 'y1') + .on('mousemove', function (d, i) { toggleOpacity(this, 'opacity:0.1'); }) + .on('mouseleave', function (d, i) { toggleOpacity(this, null); }) + .attr('y', (height - 15)); + rect + .attr('x', (width / 2)); + + // Legend Labels + text = svg.selectAll('text.legend.y1').data([null]); + text.enter().append('text') + .attr('class', 'legend y1') + .attr('data-yaxis', 'y1') + .on('mousemove', function (d, i) { toggleOpacity(this, 'opacity:0.1'); }) + .on('mouseleave', function (d, i) { toggleOpacity(this, null); }) + .attr('y', (height - 6)); + text + .attr('x', (width / 2) + 15) + .text(labels.y1); + } + + function setAxisLabels(svg) { + // Labels + svg.selectAll('text.axis-label.y0').data([null]) + .enter().append('text') + .attr('class', 'axis-label y0') + .attr('y', 10) + .attr('x', 53) + .text(labels.y0); + + if (!dualYaxis) + return; + + // Labels + var tEnter = svg.selectAll('text.axis-label.y1').data([null]); + tEnter.enter().append('text') + .attr('class', 'axis-label y1') + .attr('y', 10) + .text(labels.y1); + dualYaxis && tEnter + .attr('x', width - 25); + } + + function createSkeleton(svg) { + // Otherwise, create the skeletal chart. + var gEnter = svg.enter().append('svg').append('g'); + + // Grid + gEnter.append('g') + .attr('class', 'x grid'); + gEnter.append('g') + .attr('class', 'y grid'); + + // Axis + gEnter.append('g') + .attr('class', 'x axis'); + gEnter.append('g') + .attr('class', 'y0 axis'); + dualYaxis && gEnter.append('g') + .attr('class', 'y1 axis'); + + // Bars + gEnter.append('g') + .attr('class', 'bars y0'); + dualYaxis && gEnter.append('g') + .attr('class', 'bars y1'); + + // Rects + gEnter.append('g') + .attr('class', 'rects'); + + setAxisLabels(svg); + setLegendLabels(svg); + + // Mouseover line + gEnter.append('line') + .attr('y2', innerH()) + .attr('y1', 0) + .attr('class', 'indicator'); + } + + // Update the area path and lines. + function addBars(g, data) { + var bars = g.select('g.bars.y0').selectAll('rect.bar') + .data(data); + // enter + bars + .enter() + .append('svg:rect') + .attr('class', 'bar') + .attr('height', 0) + .attr('width', function (d, i) { return xScale.rangeBand() / 2; }) + .attr('x', function (d, i) { return xScale(d[0]); }) + .attr('y', function (d, i) { return innerH(); }); + // update + bars + .attr('width', xScale.rangeBand() / 2) + .attr('x', function (d) { return xScale(d[0]); }) + .transition() + .delay(function (d, i) { return i / data.length * 1000; }) + .duration(500) + .attr('height', function (d, i) { return innerH() - yScale0(d[1]); }) + .attr('y', function (d, i) { return yScale0(d[1]); }); + // remove elements + bars.exit().remove(); + + if (!dualYaxis) + return; + + bars = g.select('g.bars.y1').selectAll('rect.bar') + .data(data); + // enter + bars + .enter() + .append('svg:rect') + .attr('class', 'bar') + .attr('height', 0) + .attr('width', function (d, i) { return xScale.rangeBand() / 2; }) + .attr('x', function (d) { return (xScale(d[0]) + xScale.rangeBand() / 2); }) + .attr('y', function (d, i) { return innerH(); }); + // update + bars + .attr('width', xScale.rangeBand() / 2) + .attr('x', function (d) { return (xScale(d[0]) + xScale.rangeBand() / 2); }) + .transition() + .delay(function (d, i) { return i / data.length * 1000; }) + .duration(500) + .attr('height', function (d, i) { return innerH() - yScale1(d[2]); }) + .attr('y', function (d, i) { return yScale1(d[2]); }); + // remove elements + bars.exit().remove(); + } + + function addAxis(g, data) { + var xTicks = getXTicks(data); + var tickDistance = xTicks.length > 1 ? (xScale(xTicks[1]) - xScale(xTicks[0])) : innerW(); + var labelW = tickDistance - padding; + + // Update the x-axis. + g.select('.x.axis') + .attr('transform', 'translate(0,' + yScale0.range()[0] + ')') + .call(xAxis.tickValues(xTicks)) + .selectAll(".tick text") + .call(truncate, labelW > 0 ? labelW : innerW()); + + // Update the y0-axis. + g.select('.y0.axis') + .call(yAxis0.tickValues(getYTicks(yScale0))); + + if (!dualYaxis) + return; + + // Update the y1-axis. + g.select('.y1.axis') + .attr('transform', 'translate(' + innerW() + ', 0)') + .call(yAxis1.tickValues(getYTicks(yScale1))); + } + + // Update the X-Y grid. + function addGrid(g, data) { + g.select('.x.grid') + .attr('transform', 'translate(0,' + yScale0.range()[0] + ')') + .call(xGrid + .tickValues(getXTicks(data)) + .tickSize(-innerH(), 0, 0) + .tickFormat('') + ); + + g.select('.y.grid') + .call(yGrid + .tickValues(getYTicks(yScale0)) + .tickSize(-innerW(), 0, 0) + .tickFormat('') + ); + } + + function formatTooltip(data, i) { + var d = data.slice(0); + + d[0] = (format.x) ? GoAccess.Util.fmtValue(d[0], format.x) : d[0]; + d[1] = (format.y0) ? GoAccess.Util.fmtValue(d[1], format.y0) : d3.format(',')(d[1]); + dualYaxis && (d[2] = (format.y1) ? GoAccess.Util.fmtValue(d[2], format.y1) : d3.format(',')(d[2])); + + var template = d3.select('#tpl-chart-tooltip').html(); + return Hogan.compile(template).render({ + 'data': d + }); + } + + function mouseover(_self, selection, data, idx) { + var left = xScale(data[0]) + (xScale.rangeBand() / 2); + var tooltip = selection.select('.chart-tooltip-wrap'); + tooltip.html(formatTooltip(data, idx)) + .style('left', left + 'px') + .style('top', (d3.mouse(_self)[1] + 10) + 'px') + .style('display', 'block'); + + selection.select('line.indicator') + .style('display', 'block') + .attr('transform', 'translate(' + left + ',' + 0 + ')'); + } + + function mouseout(selection, g) { + var tooltip = selection.select('.chart-tooltip-wrap'); + tooltip.style('display', 'none'); + + g.select('line.indicator').style('display', 'none'); + } + + function addRects(selection, g, data) { + var w = (innerW() / data.length); + + var rects = g.select('g.rects').selectAll('rect') + .data(data); + rects + .enter() + .append('svg:rect') + .attr('height', innerH()) + .attr('class', 'point'); + rects + .attr('width', d3.functor(w)) + .attr('x', function (d, i) { return (w * i); }) + .attr('y', 0) + .on('mousemove', function (d, i) { + mouseover(this, selection, d, i); + }) + .on('mouseleave', function (d, i) { + mouseout(selection, g); + }); + // remove elements + rects.exit().remove(); + } + + function chart(selection) { + selection.each(function (data) { + // normalize data + data = mapData(data); + // updates X-Y scales + updateScales(data); + + // Select the svg element, if it exists. + var svg = d3.select(this).selectAll('svg').data([data]); + createSkeleton(svg); + + // Update the outer dimensions. + svg.attr({ + 'width': width, + 'height': height + }); + + // Update the inner dimensions. + var g = svg.select('g') + .attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); + + // Add grid + addGrid(g, data); + // Add axis + addAxis(g, data); + // Add chart lines and areas + addBars(g, data); + // Add rects + addRects(selection, g, data); + }); + } + + chart.opts = function (_) { + if (!arguments.length) return opts; + opts = _; + return chart; + }; + + chart.format = function (_) { + if (!arguments.length) return format; + format = _; + return chart; + }; + + chart.labels = function (_) { + if (!arguments.length) return labels; + labels = _; + return chart; + }; + + chart.width = function (_) { + if (!arguments.length) return width; + width = _; + return chart; + }; + + chart.height = function (_) { + if (!arguments.length) return height; + height = _; + return chart; + }; + + chart.x = function (_) { + if (!arguments.length) return xValue; + xValue = _; + return chart; + }; + + chart.y0 = function (_) { + if (!arguments.length) return yValue0; + yValue0 = _; + return chart; + }; + + chart.y1 = function (_) { + if (!arguments.length) return yValue1; + yValue1 = _; + return chart; + }; + + return chart; +} diff --git a/goaccess++/resources/js/charts.js.tmp b/goaccess++/resources/js/charts.js.tmp new file mode 100644 index 0000000..c9ee93d --- /dev/null +++ b/goaccess++/resources/js/charts.js.tmp @@ -0,0 +1 @@ +/*** ______ ___* / ____/___ / | _____________ __________* / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/* / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ )* \____/\____/_/ |_\___/\___/\___/____/____/** The MIT License (MIT)* Copyright (c) 2009-2018 Gerardo Orellana <hello @ goaccess.io>*/'use strict';function truncate(text, width) {text.each(function () {var parent = this.parentNode, $d3parent = d3.select(parent);var gw = $d3parent.node().getBBox();var x = (Math.min(gw.width, width) / 2) * -1;if ('svg' == parent.nodeName) {$d3parent.attr('width', width).attr('x', x);}else {$d3parent.insert('svg', function () {return this;}.bind(this)).attr('class', 'wrap-text').attr('width', width).attr('x', x).append(function () {return this;}.bind(this));}});}function AreaChart(dualYaxis) {var opts = {};var margin = {top : 20,right : 50,bottom : 40,left : 50,},height = 170,nTicks = 10,padding = 10,width = 760;var labels = { x: 'Unnamed', y0: 'Unnamed', y1: 'Unnamed' };var format = { x: null, y0: null, y1: null};var xValue = function (d) {return d[0];},yValue0 = function (d) {return d[1];},yValue1 = function (d) {return d[2];};var xScale = d3.scale.ordinal();var yScale0 = d3.scale.linear().nice();var yScale1 = d3.scale.linear().nice();var xAxis = d3.svg.axis().scale(xScale).orient('bottom').tickFormat(function (d) {if (format.x)return GoAccess.Util.fmtValue(d, format.x);return d;});var yAxis0 = d3.svg.axis().scale(yScale0).orient('left').tickFormat(function (d) {return d3.format('.2s')(d);});var yAxis1 = d3.svg.axis().scale(yScale1).orient('right').tickFormat(function (d) {if (format.y1)return GoAccess.Util.fmtValue(d, format.y1);return d3.format('.2s')(d);});var xGrid = d3.svg.axis().scale(xScale).orient('bottom');var yGrid = d3.svg.axis().scale(yScale0).orient('left');var area0 = d3.svg.area().interpolate('cardinal').x(X).y(Y0);var area1 = d3.svg.area().interpolate('cardinal').x(X).y(Y1);var line0 = d3.svg.line().interpolate('cardinal').x(X).y(Y0);var line1 = d3.svg.line().interpolate('cardinal').x(X).y(Y1);function X(d) {return xScale(d[0]);}function Y0(d) {return yScale0(d[1]);}function Y1(d) {return yScale1(d[2]);}function innerW() {return width - margin.left - margin.right;}function innerH() {return height - margin.top - margin.bottom;}function getXTicks(data) {if (data.length < nTicks)return xScale.domain();return d3.range(0, data.length, Math.ceil(data.length / nTicks)).map(function (d) {return xScale.domain()[d];});}function getYTicks(scale) {var domain = scale.domain();return d3.range(domain[0], domain[1], Math.ceil(domain[1] / nTicks));}function mapData(data) {var _datum = function (d, i) {var datum = [xValue.call(data, d, i), yValue0.call(data, d, i)];dualYaxis && datum.push(yValue1.call(data, d, i));return datum;};return data.map(function (d, i) {return _datum(d, i);});}function updateScales(data) {xScale.domain(data.map(function (d) {return d[0];})).rangePoints([0, innerW()], 1);yScale0.domain([0, d3.max(data, function (d) {return d[1];})]).range([innerH(), 0]);dualYaxis && yScale1.domain([0, d3.max(data, function (d) {return d[2];})]).range([innerH(), 0]);}function toggleOpacity(ele, op) {d3.select(ele.parentNode).selectAll('.' + (ele.getAttribute('data-yaxis') == 'y0' ? 'y1' : 'y0')).attr('style', op);}function setLegendLabels(svg) {var rect = svg.selectAll('rect.legend.y0').data([null]);rect.enter().append('rect').attr('class', 'legend y0').attr('data-yaxis', 'y0').on('mousemove', function (d, i) { toggleOpacity(this, 'opacity:0.1'); }).on('mouseleave', function (d, i) { toggleOpacity(this, null); }).attr('y', (height - 15));rect.attr('x', (width / 2) - 100);var text = svg.selectAll('text.legend.y0').data([null]);text.enter().append('text').attr('class', 'legend y0').attr('data-yaxis', 'y0').on('mousemove', function (d, i) { toggleOpacity(this, 'opacity:0.1'); }).on('mouseleave', function (d, i) { toggleOpacity(this, null); }).attr('y', (height - 6));text.attr('x', (width / 2) - 85).text(labels.y0);if (!dualYaxis)return;rect = svg.selectAll('rect.legend.y1').data([null]);rect.enter().append('rect').attr('class', 'legend y1').attr('data-yaxis', 'y1').on('mousemove', function (d, i) { toggleOpacity(this, 'opacity:0.1'); }).on('mouseleave', function (d, i) { toggleOpacity(this, null); }).attr('y', (height - 15));rect.attr('x', (width / 2));text = svg.selectAll('text.legend.y1').data([null]);text.enter().append('text').attr('class', 'legend y1').attr('data-yaxis', 'y1').on('mousemove', function (d, i) { toggleOpacity(this, 'opacity:0.1'); }).on('mouseleave', function (d, i) { toggleOpacity(this, null); }).attr('y', (height - 6));text.attr('x', (width / 2) + 15).text(labels.y1);}function setAxisLabels(svg) {svg.selectAll('text.axis-label.y0').data([null]).enter().append('text').attr('class', 'axis-label y0').attr('y', 10).attr('x', 53).text(labels.y0);if (!dualYaxis)return;var tEnter = svg.selectAll('text.axis-label.y1').data([null]);tEnter.enter().append('text').attr('class', 'axis-label y1').attr('y', 10).text(labels.y1);dualYaxis && tEnter.attr('x', width - 25);}function createSkeleton(svg) {var gEnter = svg.enter().append('svg').append('g');gEnter.append('g').attr('class', 'line line0 y0');dualYaxis && gEnter.append('g').attr('class', 'line line1 y1');gEnter.append('g').attr('class', 'area area0 y0');dualYaxis && gEnter.append('g').attr('class', 'area area1 y1');gEnter.append('g').attr('class', 'points y0');dualYaxis && gEnter.append('g').attr('class', 'points y1');gEnter.append('g').attr('class', 'x grid');gEnter.append('g').attr('class', 'y grid');gEnter.append('g').attr('class', 'x axis');gEnter.append('g').attr('class', 'y0 axis');dualYaxis && gEnter.append('g').attr('class', 'y1 axis');gEnter.append('g').attr('class', 'rects');setAxisLabels(svg);setLegendLabels(svg);gEnter.append('line').attr('y2', innerH()).attr('y1', 0).attr('class', 'indicator');}function pathLen(d) {return d.node().getTotalLength();}function addLine(g, data, line, cName) {var path = g.select('g.' + cName).selectAll('path.' + cName).data([data]);path.enter().append('svg:path').attr('d', line).attr('class', cName).attr('stroke-dasharray', function (d) {var pl = pathLen(d3.select(this));return pl + ' ' + pl;}).attr('stroke-dashoffset', function (d) {return pathLen(d3.select(this));});path.attr('d', line).transition().attr('stroke-dasharray', function (d) {var pl = pathLen(d3.select(this));return pl + ' ' + pl;}).duration(2000).attr('stroke-dashoffset', 0);path.exit().remove();}function addArea(g, data, cb, cName) {var area = g.select('g.' + cName).selectAll('path.' + cName).data([data]);area.enter().append('svg:path').attr('class', cName);area.attr('d', cb);area.exit().remove();}function addAreaLines(g, data) {addArea(g, data, area0.y0(yScale0.range()[0]), 'area0');addLine(g, data, line0, 'line0');addArea(g, data, area1.y1(yScale1.range()[0]), 'area1');addLine(g, data, line1, 'line1');}function addPoints(g, data) {var radius = data.length > 100 ? 1 : 2.5;var points = g.select('g.points.y0').selectAll('circle.point').data(data);points.enter().append('svg:circle').attr('r', radius).attr('class', 'point');points.attr('cx', function (d) { return xScale(d[0]); }).attr('cy', function (d) { return yScale0(d[1]); });points.exit().remove();if (!dualYaxis)return;points = g.select('g.points.y1').selectAll('circle.point').data(data);points.enter().append('svg:circle').attr('r', radius).attr('class', 'point');points.attr('cx', function (d) { return xScale(d[0]); }).attr('cy', function (d) { return yScale1(d[2]); });points.exit().remove();}function addAxis(g, data) {var xTicks = getXTicks(data);var tickDistance = xTicks.length > 1 ? (xScale(xTicks[1]) - xScale(xTicks[0])) : innerW();var labelW = tickDistance - padding;g.select('.x.axis').attr('transform', 'translate(0,' + yScale0.range()[0] + ')').call(xAxis.tickValues(xTicks)).selectAll(".tick text").call(truncate, labelW > 0 ? labelW : innerW());g.select('.y0.axis').call(yAxis0.tickValues(getYTicks(yScale0)));if (!dualYaxis)return;g.select('.y1.axis').attr('transform', 'translate(' + innerW() + ', 0)').call(yAxis1.tickValues(getYTicks(yScale1)));}function addGrid(g, data) {g.select('.x.grid').attr('transform', 'translate(0,' + yScale0.range()[0] + ')').call(xGrid.tickValues(getXTicks(data)).tickSize(-innerH(), 0, 0).tickFormat(''));g.select('.y.grid').call(yGrid.tickValues(getYTicks(yScale0)).tickSize(-innerW(), 0, 0).tickFormat(''));}function formatTooltip(data, i) {var d = data.slice(0);d[0] = (format.x) ? GoAccess.Util.fmtValue(d[0], format.x) : d[0];d[1] = (format.y0) ? GoAccess.Util.fmtValue(d[1], format.y0) : d3.format(',')(d[1]);dualYaxis && (d[2] = (format.y1) ? GoAccess.Util.fmtValue(d[2], format.y1) : d3.format(',')(d[2]));var template = d3.select('#tpl-chart-tooltip').html();return Hogan.compile(template).render({'data': d});}function mouseover(_self, selection, data, idx) {var tooltip = selection.select('.chart-tooltip-wrap');tooltip.html(formatTooltip(data, idx)).style('left', (xScale(data[0])) + 'px').style('top', (d3.mouse(_self)[1] + 10) + 'px').style('display', 'block');selection.select('line.indicator').style('display', 'block').attr('transform', 'translate(' + xScale(data[0]) + ',' + 0 + ')');}function mouseout(selection, g) {var tooltip = selection.select('.chart-tooltip-wrap');tooltip.style('display', 'none');g.select('line.indicator').style('display', 'none');}function addRects(selection, g, data) {var w = (innerW() / data.length);var rects = g.select('g.rects').selectAll('rect').data(data);rects.enter().append('svg:rect').attr('height', innerH()).attr('class', 'point');rects.attr('width', d3.functor(w)).attr('x', function (d, i) { return (w * i); }).attr('y', 0).on('mousemove', function (d, i) {mouseover(this, selection, d, i);}).on('mouseleave', function (d, i) {mouseout(selection, g);});rects.exit().remove();}function chart(selection) {selection.each(function (data) {data = mapData(data);updateScales(data);var svg = d3.select(this).selectAll('svg').data([data]);createSkeleton(svg);svg.attr({'width': width,'height': height});var g = svg.select('g').attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');addGrid(g, data);addAreaLines(g, data);addPoints(g, data);addAxis(g, data);addRects(selection, g, data);});}chart.opts = function (_) {if (!arguments.length) return opts;opts = _;return chart;};chart.format = function (_) {if (!arguments.length) return format;format = _;return chart;};chart.labels = function (_) {if (!arguments.length) return labels;labels = _;return chart;};chart.margin = function (_) {if (!arguments.length) return margin;margin = _;return chart;};chart.width = function (_) {if (!arguments.length) return width;width = _;return chart;};chart.height = function (_) {if (!arguments.length) return height;height = _;return chart;};chart.x = function (_) {if (!arguments.length) return xValue;xValue = _;return chart;};chart.y0 = function (_) {if (!arguments.length) return yValue0;yValue0 = _;return chart;};chart.y1 = function (_) {if (!arguments.length) return yValue1;yValue1 = _;return chart;};return chart;}function BarChart(dualYaxis) {var opts = {};var margin = {top : 20,right : 50,bottom : 40,left : 50,},height = 170,nTicks = 10,padding = 10,width = 760;var labels = { x: 'Unnamed', y0: 'Unnamed', y1: 'Unnamed' };var format = { x: null, y0: null, y1: null};var xValue = function (d) {return d[0];},yValue0 = function (d) {return d[1];},yValue1 = function (d) {return d[2];};var xScale = d3.scale.ordinal();var yScale0 = d3.scale.linear().nice();var yScale1 = d3.scale.linear().nice();var xAxis = d3.svg.axis().scale(xScale).orient('bottom').tickFormat(function (d) {if (format.x)return GoAccess.Util.fmtValue(d, format.x);return d;});var yAxis0 = d3.svg.axis().scale(yScale0).orient('left').tickFormat(function (d) {return d3.format('.2s')(d);});var yAxis1 = d3.svg.axis().scale(yScale1).orient('right').tickFormat(function (d) {if (format.y1)return GoAccess.Util.fmtValue(d, format.y1);return d3.format('.2s')(d);});var xGrid = d3.svg.axis().scale(xScale).orient('bottom');var yGrid = d3.svg.axis().scale(yScale0).orient('left');function innerW() {return width - margin.left - margin.right;}function innerH() {return height - margin.top - margin.bottom;}function getXTicks(data) {if (data.length < nTicks)return xScale.domain();return d3.range(0, data.length, Math.ceil(data.length / nTicks)).map(function (d) {return xScale.domain()[d];});}function getYTicks(scale) {var domain = scale.domain();return d3.range(domain[0], domain[1], Math.ceil(domain[1] / nTicks));}function mapData(data) {var _datum = function (d, i) {var datum = [xValue.call(data, d, i), yValue0.call(data, d, i)];dualYaxis && datum.push(yValue1.call(data, d, i));return datum;};return data.map(function (d, i) {return _datum(d, i);});}function updateScales(data) {xScale.domain(data.map(function (d) {return d[0];})).rangeBands([0, innerW()], 0.1);yScale0.domain([0, d3.max(data, function (d) {return d[1];})]).range([innerH(), 0]);dualYaxis && yScale1.domain([0, d3.max(data, function (d) {return d[2];})]).range([innerH(), 0]);}function toggleOpacity(ele, op) {d3.select(ele.parentNode).selectAll('.' + (ele.getAttribute('data-yaxis') == 'y0' ? 'y1' : 'y0')).attr('style', op);}function setLegendLabels(svg) {var rect = svg.selectAll('rect.legend.y0').data([null]);rect.enter().append('rect').attr('class', 'legend y0').attr('data-yaxis', 'y0').on('mousemove', function (d, i) { toggleOpacity(this, 'opacity:0.1'); }).on('mouseleave', function (d, i) { toggleOpacity(this, null); }).attr('y', (height - 15));rect.attr('x', (width / 2) - 100);var text = svg.selectAll('text.legend.y0').data([null]);text.enter().append('text').attr('class', 'legend y0').attr('data-yaxis', 'y0').on('mousemove', function (d, i) { toggleOpacity(this, 'opacity:0.1'); }).on('mouseleave', function (d, i) { toggleOpacity(this, null); }).attr('y', (height - 6));text.attr('x', (width / 2) - 85).text(labels.y0);if (!dualYaxis)return;rect = svg.selectAll('rect.legend.y1').data([null]);rect.enter().append('rect').attr('class', 'legend y1').attr('data-yaxis', 'y1').on('mousemove', function (d, i) { toggleOpacity(this, 'opacity:0.1'); }).on('mouseleave', function (d, i) { toggleOpacity(this, null); }).attr('y', (height - 15));rect.attr('x', (width / 2));text = svg.selectAll('text.legend.y1').data([null]);text.enter().append('text').attr('class', 'legend y1').attr('data-yaxis', 'y1').on('mousemove', function (d, i) { toggleOpacity(this, 'opacity:0.1'); }).on('mouseleave', function (d, i) { toggleOpacity(this, null); }).attr('y', (height - 6));text.attr('x', (width / 2) + 15).text(labels.y1);}function setAxisLabels(svg) {svg.selectAll('text.axis-label.y0').data([null]).enter().append('text').attr('class', 'axis-label y0').attr('y', 10).attr('x', 53).text(labels.y0);if (!dualYaxis)return;var tEnter = svg.selectAll('text.axis-label.y1').data([null]);tEnter.enter().append('text').attr('class', 'axis-label y1').attr('y', 10).text(labels.y1);dualYaxis && tEnter.attr('x', width - 25);}function createSkeleton(svg) {var gEnter = svg.enter().append('svg').append('g');gEnter.append('g').attr('class', 'x grid');gEnter.append('g').attr('class', 'y grid');gEnter.append('g').attr('class', 'x axis');gEnter.append('g').attr('class', 'y0 axis');dualYaxis && gEnter.append('g').attr('class', 'y1 axis');gEnter.append('g').attr('class', 'bars y0');dualYaxis && gEnter.append('g').attr('class', 'bars y1');gEnter.append('g').attr('class', 'rects');setAxisLabels(svg);setLegendLabels(svg);gEnter.append('line').attr('y2', innerH()).attr('y1', 0).attr('class', 'indicator');}function addBars(g, data) {var bars = g.select('g.bars.y0').selectAll('rect.bar').data(data);bars.enter().append('svg:rect').attr('class', 'bar').attr('height', 0).attr('width', function (d, i) { return xScale.rangeBand() / 2; }).attr('x', function (d, i) { return xScale(d[0]); }).attr('y', function (d, i) { return innerH(); });bars.attr('width', xScale.rangeBand() / 2).attr('x', function (d) { return xScale(d[0]); }).transition().delay(function (d, i) { return i / data.length * 1000; }).duration(500).attr('height', function (d, i) { return innerH() - yScale0(d[1]); }).attr('y', function (d, i) { return yScale0(d[1]); });bars.exit().remove();if (!dualYaxis)return;bars = g.select('g.bars.y1').selectAll('rect.bar').data(data);bars.enter().append('svg:rect').attr('class', 'bar').attr('height', 0).attr('width', function (d, i) { return xScale.rangeBand() / 2; }).attr('x', function (d) { return (xScale(d[0]) + xScale.rangeBand() / 2); }).attr('y', function (d, i) { return innerH(); });bars.attr('width', xScale.rangeBand() / 2).attr('x', function (d) { return (xScale(d[0]) + xScale.rangeBand() / 2); }).transition().delay(function (d, i) { return i / data.length * 1000; }).duration(500).attr('height', function (d, i) { return innerH() - yScale1(d[2]); }).attr('y', function (d, i) { return yScale1(d[2]); });bars.exit().remove();}function addAxis(g, data) {var xTicks = getXTicks(data);var tickDistance = xTicks.length > 1 ? (xScale(xTicks[1]) - xScale(xTicks[0])) : innerW();var labelW = tickDistance - padding;g.select('.x.axis').attr('transform', 'translate(0,' + yScale0.range()[0] + ')').call(xAxis.tickValues(xTicks)).selectAll(".tick text").call(truncate, labelW > 0 ? labelW : innerW());g.select('.y0.axis').call(yAxis0.tickValues(getYTicks(yScale0)));if (!dualYaxis)return;g.select('.y1.axis').attr('transform', 'translate(' + innerW() + ', 0)').call(yAxis1.tickValues(getYTicks(yScale1)));}function addGrid(g, data) {g.select('.x.grid').attr('transform', 'translate(0,' + yScale0.range()[0] + ')').call(xGrid.tickValues(getXTicks(data)).tickSize(-innerH(), 0, 0).tickFormat(''));g.select('.y.grid').call(yGrid.tickValues(getYTicks(yScale0)).tickSize(-innerW(), 0, 0).tickFormat(''));}function formatTooltip(data, i) {var d = data.slice(0);d[0] = (format.x) ? GoAccess.Util.fmtValue(d[0], format.x) : d[0];d[1] = (format.y0) ? GoAccess.Util.fmtValue(d[1], format.y0) : d3.format(',')(d[1]);dualYaxis && (d[2] = (format.y1) ? GoAccess.Util.fmtValue(d[2], format.y1) : d3.format(',')(d[2]));var template = d3.select('#tpl-chart-tooltip').html();return Hogan.compile(template).render({'data': d});}function mouseover(_self, selection, data, idx) {var left = xScale(data[0]) + (xScale.rangeBand() / 2);var tooltip = selection.select('.chart-tooltip-wrap');tooltip.html(formatTooltip(data, idx)).style('left', left + 'px').style('top', (d3.mouse(_self)[1] + 10) + 'px').style('display', 'block');selection.select('line.indicator').style('display', 'block').attr('transform', 'translate(' + left + ',' + 0 + ')');}function mouseout(selection, g) {var tooltip = selection.select('.chart-tooltip-wrap');tooltip.style('display', 'none');g.select('line.indicator').style('display', 'none');}function addRects(selection, g, data) {var w = (innerW() / data.length);var rects = g.select('g.rects').selectAll('rect').data(data);rects.enter().append('svg:rect').attr('height', innerH()).attr('class', 'point');rects.attr('width', d3.functor(w)).attr('x', function (d, i) { return (w * i); }).attr('y', 0).on('mousemove', function (d, i) {mouseover(this, selection, d, i);}).on('mouseleave', function (d, i) {mouseout(selection, g);});rects.exit().remove();}function chart(selection) {selection.each(function (data) {data = mapData(data);updateScales(data);var svg = d3.select(this).selectAll('svg').data([data]);createSkeleton(svg);svg.attr({'width': width,'height': height});var g = svg.select('g').attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');addGrid(g, data);addAxis(g, data);addBars(g, data);addRects(selection, g, data);});}chart.opts = function (_) {if (!arguments.length) return opts;opts = _;return chart;};chart.format = function (_) {if (!arguments.length) return format;format = _;return chart;};chart.labels = function (_) {if (!arguments.length) return labels;labels = _;return chart;};chart.width = function (_) {if (!arguments.length) return width;width = _;return chart;};chart.height = function (_) {if (!arguments.length) return height;height = _;return chart;};chart.x = function (_) {if (!arguments.length) return xValue;xValue = _;return chart;};chart.y0 = function (_) {if (!arguments.length) return yValue0;yValue0 = _;return chart;};chart.y1 = function (_) {if (!arguments.length) return yValue1;yValue1 = _;return chart;};return chart;} \ No newline at end of file diff --git a/goaccess++/resources/js/d3.v3.min.js b/goaccess++/resources/js/d3.v3.min.js new file mode 100644 index 0000000..1984d17 --- /dev/null +++ b/goaccess++/resources/js/d3.v3.min.js @@ -0,0 +1,5 @@ +!function(){function n(n){return n&&(n.ownerDocument||n.document||n).documentElement}function t(n){return n&&(n.ownerDocument&&n.ownerDocument.defaultView||n.document&&n||n.defaultView)}function e(n,t){return t>n?-1:n>t?1:n>=t?0:0/0}function r(n){return null===n?0/0:+n}function u(n){return!isNaN(n)}function i(n){return{left:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)<0?r=i+1:u=i}return r},right:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)>0?u=i:r=i+1}return r}}}function o(n){return n.length}function a(n){for(var t=1;n*t%1;)t*=10;return t}function c(n,t){for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}function l(){this._=Object.create(null)}function s(n){return(n+="")===pa||n[0]===va?va+n:n}function f(n){return(n+="")[0]===va?n.slice(1):n}function h(n){return s(n)in this._}function g(n){return(n=s(n))in this._&&delete this._[n]}function p(){var n=[];for(var t in this._)n.push(f(t));return n}function v(){var n=0;for(var t in this._)++n;return n}function d(){for(var n in this._)return!1;return!0}function m(){this._=Object.create(null)}function y(n){return n}function M(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function x(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(var e=0,r=da.length;r>e;++e){var u=da[e]+t;if(u in n)return u}}function b(){}function _(){}function w(n){function t(){for(var t,r=e,u=-1,i=r.length;++u<i;)(t=r[u].on)&&t.apply(this,arguments);return n}var e=[],r=new l;return t.on=function(t,u){var i,o=r.get(t);return arguments.length<2?o&&o.on:(o&&(o.on=null,e=e.slice(0,i=e.indexOf(o)).concat(e.slice(i+1)),r.remove(t)),u&&e.push(r.set(t,{on:u})),n)},t}function S(){ta.event.preventDefault()}function k(){for(var n,t=ta.event;n=t.sourceEvent;)t=n;return t}function E(n){for(var t=new _,e=0,r=arguments.length;++e<r;)t[arguments[e]]=w(t);return t.of=function(e,r){return function(u){try{var i=u.sourceEvent=ta.event;u.target=n,ta.event=u,t[u.type].apply(e,r)}finally{ta.event=i}}},t}function A(n){return ya(n,_a),n}function N(n){return"function"==typeof n?n:function(){return Ma(n,this)}}function C(n){return"function"==typeof n?n:function(){return xa(n,this)}}function z(n,t){function e(){this.removeAttribute(n)}function r(){this.removeAttributeNS(n.space,n.local)}function u(){this.setAttribute(n,t)}function i(){this.setAttributeNS(n.space,n.local,t)}function o(){var e=t.apply(this,arguments);null==e?this.removeAttribute(n):this.setAttribute(n,e)}function a(){var e=t.apply(this,arguments);null==e?this.removeAttributeNS(n.space,n.local):this.setAttributeNS(n.space,n.local,e)}return n=ta.ns.qualify(n),null==t?n.local?r:e:"function"==typeof t?n.local?a:o:n.local?i:u}function q(n){return n.trim().replace(/\s+/g," ")}function L(n){return new RegExp("(?:^|\\s+)"+ta.requote(n)+"(?:\\s+|$)","g")}function T(n){return(n+"").trim().split(/^|\s+/)}function R(n,t){function e(){for(var e=-1;++e<u;)n[e](this,t)}function r(){for(var e=-1,r=t.apply(this,arguments);++e<u;)n[e](this,r)}n=T(n).map(D);var u=n.length;return"function"==typeof t?r:e}function D(n){var t=L(n);return function(e,r){if(u=e.classList)return r?u.add(n):u.remove(n);var u=e.getAttribute("class")||"";r?(t.lastIndex=0,t.test(u)||e.setAttribute("class",q(u+" "+n))):e.setAttribute("class",q(u.replace(t," ")))}}function P(n,t,e){function r(){this.style.removeProperty(n)}function u(){this.style.setProperty(n,t,e)}function i(){var r=t.apply(this,arguments);null==r?this.style.removeProperty(n):this.style.setProperty(n,r,e)}return null==t?r:"function"==typeof t?i:u}function U(n,t){function e(){delete this[n]}function r(){this[n]=t}function u(){var e=t.apply(this,arguments);null==e?delete this[n]:this[n]=e}return null==t?e:"function"==typeof t?u:r}function j(n){function t(){var t=this.ownerDocument,e=this.namespaceURI;return e?t.createElementNS(e,n):t.createElement(n)}function e(){return this.ownerDocument.createElementNS(n.space,n.local)}return"function"==typeof n?n:(n=ta.ns.qualify(n)).local?e:t}function F(){var n=this.parentNode;n&&n.removeChild(this)}function H(n){return{__data__:n}}function O(n){return function(){return ba(this,n)}}function I(n){return arguments.length||(n=e),function(t,e){return t&&e?n(t.__data__,e.__data__):!t-!e}}function Y(n,t){for(var e=0,r=n.length;r>e;e++)for(var u,i=n[e],o=0,a=i.length;a>o;o++)(u=i[o])&&t(u,o,e);return n}function Z(n){return ya(n,Sa),n}function V(n){var t,e;return function(r,u,i){var o,a=n[i].update,c=a.length;for(i!=e&&(e=i,t=0),u>=t&&(t=u+1);!(o=a[t])&&++t<c;);return o}}function X(n,t,e){function r(){var t=this[o];t&&(this.removeEventListener(n,t,t.$),delete this[o])}function u(){var u=c(t,ra(arguments));r.call(this),this.addEventListener(n,this[o]=u,u.$=e),u._=t}function i(){var t,e=new RegExp("^__on([^.]+)"+ta.requote(n)+"$");for(var r in this)if(t=r.match(e)){var u=this[r];this.removeEventListener(t[1],u,u.$),delete this[r]}}var o="__on"+n,a=n.indexOf("."),c=$;a>0&&(n=n.slice(0,a));var l=ka.get(n);return l&&(n=l,c=B),a?t?u:r:t?b:i}function $(n,t){return function(e){var r=ta.event;ta.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{ta.event=r}}}function B(n,t){var e=$(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function W(e){var r=".dragsuppress-"+ ++Aa,u="click"+r,i=ta.select(t(e)).on("touchmove"+r,S).on("dragstart"+r,S).on("selectstart"+r,S);if(null==Ea&&(Ea="onselectstart"in e?!1:x(e.style,"userSelect")),Ea){var o=n(e).style,a=o[Ea];o[Ea]="none"}return function(n){if(i.on(r,null),Ea&&(o[Ea]=a),n){var t=function(){i.on(u,null)};i.on(u,function(){S(),t()},!0),setTimeout(t,0)}}}function J(n,e){e.changedTouches&&(e=e.changedTouches[0]);var r=n.ownerSVGElement||n;if(r.createSVGPoint){var u=r.createSVGPoint();if(0>Na){var i=t(n);if(i.scrollX||i.scrollY){r=ta.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var o=r[0][0].getScreenCTM();Na=!(o.f||o.e),r.remove()}}return Na?(u.x=e.pageX,u.y=e.pageY):(u.x=e.clientX,u.y=e.clientY),u=u.matrixTransform(n.getScreenCTM().inverse()),[u.x,u.y]}var a=n.getBoundingClientRect();return[e.clientX-a.left-n.clientLeft,e.clientY-a.top-n.clientTop]}function G(){return ta.event.changedTouches[0].identifier}function K(n){return n>0?1:0>n?-1:0}function Q(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function nt(n){return n>1?0:-1>n?qa:Math.acos(n)}function tt(n){return n>1?Ra:-1>n?-Ra:Math.asin(n)}function et(n){return((n=Math.exp(n))-1/n)/2}function rt(n){return((n=Math.exp(n))+1/n)/2}function ut(n){return((n=Math.exp(2*n))-1)/(n+1)}function it(n){return(n=Math.sin(n/2))*n}function ot(){}function at(n,t,e){return this instanceof at?(this.h=+n,this.s=+t,void(this.l=+e)):arguments.length<2?n instanceof at?new at(n.h,n.s,n.l):bt(""+n,_t,at):new at(n,t,e)}function ct(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?i+(o-i)*n/60:180>n?o:240>n?i+(o-i)*(240-n)/60:i}function u(n){return Math.round(255*r(n))}var i,o;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,o=.5>=e?e*(1+t):e+t-e*t,i=2*e-o,new mt(u(n+120),u(n),u(n-120))}function lt(n,t,e){return this instanceof lt?(this.h=+n,this.c=+t,void(this.l=+e)):arguments.length<2?n instanceof lt?new lt(n.h,n.c,n.l):n instanceof ft?gt(n.l,n.a,n.b):gt((n=wt((n=ta.rgb(n)).r,n.g,n.b)).l,n.a,n.b):new lt(n,t,e)}function st(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),new ft(e,Math.cos(n*=Da)*t,Math.sin(n)*t)}function ft(n,t,e){return this instanceof ft?(this.l=+n,this.a=+t,void(this.b=+e)):arguments.length<2?n instanceof ft?new ft(n.l,n.a,n.b):n instanceof lt?st(n.h,n.c,n.l):wt((n=mt(n)).r,n.g,n.b):new ft(n,t,e)}function ht(n,t,e){var r=(n+16)/116,u=r+t/500,i=r-e/200;return u=pt(u)*Xa,r=pt(r)*$a,i=pt(i)*Ba,new mt(dt(3.2404542*u-1.5371385*r-.4985314*i),dt(-.969266*u+1.8760108*r+.041556*i),dt(.0556434*u-.2040259*r+1.0572252*i))}function gt(n,t,e){return n>0?new lt(Math.atan2(e,t)*Pa,Math.sqrt(t*t+e*e),n):new lt(0/0,0/0,n)}function pt(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function vt(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function dt(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function mt(n,t,e){return this instanceof mt?(this.r=~~n,this.g=~~t,void(this.b=~~e)):arguments.length<2?n instanceof mt?new mt(n.r,n.g,n.b):bt(""+n,mt,ct):new mt(n,t,e)}function yt(n){return new mt(n>>16,n>>8&255,255&n)}function Mt(n){return yt(n)+""}function xt(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function bt(n,t,e){var r,u,i,o=0,a=0,c=0;if(r=/([a-z]+)\((.*)\)/.exec(n=n.toLowerCase()))switch(u=r[2].split(","),r[1]){case"hsl":return e(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case"rgb":return t(kt(u[0]),kt(u[1]),kt(u[2]))}return(i=Ga.get(n))?t(i.r,i.g,i.b):(null==n||"#"!==n.charAt(0)||isNaN(i=parseInt(n.slice(1),16))||(4===n.length?(o=(3840&i)>>4,o=o>>4|o,a=240&i,a=a>>4|a,c=15&i,c=c<<4|c):7===n.length&&(o=(16711680&i)>>16,a=(65280&i)>>8,c=255&i)),t(o,a,c))}function _t(n,t,e){var r,u,i=Math.min(n/=255,t/=255,e/=255),o=Math.max(n,t,e),a=o-i,c=(o+i)/2;return a?(u=.5>c?a/(o+i):a/(2-o-i),r=n==o?(t-e)/a+(e>t?6:0):t==o?(e-n)/a+2:(n-t)/a+4,r*=60):(r=0/0,u=c>0&&1>c?0:r),new at(r,u,c)}function wt(n,t,e){n=St(n),t=St(t),e=St(e);var r=vt((.4124564*n+.3575761*t+.1804375*e)/Xa),u=vt((.2126729*n+.7151522*t+.072175*e)/$a),i=vt((.0193339*n+.119192*t+.9503041*e)/Ba);return ft(116*u-16,500*(r-u),200*(u-i))}function St(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function kt(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function Et(n){return"function"==typeof n?n:function(){return n}}function At(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),Nt(t,e,n,r)}}function Nt(n,t,e,r){function u(){var n,t=c.status;if(!t&&zt(c)||t>=200&&300>t||304===t){try{n=e.call(i,c)}catch(r){return void o.error.call(i,r)}o.load.call(i,n)}else o.error.call(i,c)}var i={},o=ta.dispatch("beforesend","progress","load","error"),a={},c=new XMLHttpRequest,l=null;return!this.XDomainRequest||"withCredentials"in c||!/^(http(s)?:)?\/\//.test(n)||(c=new XDomainRequest),"onload"in c?c.onload=c.onerror=u:c.onreadystatechange=function(){c.readyState>3&&u()},c.onprogress=function(n){var t=ta.event;ta.event=n;try{o.progress.call(i,c)}finally{ta.event=t}},i.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?a[n]:(null==t?delete a[n]:a[n]=t+"",i)},i.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",i):t},i.responseType=function(n){return arguments.length?(l=n,i):l},i.response=function(n){return e=n,i},["get","post"].forEach(function(n){i[n]=function(){return i.send.apply(i,[n].concat(ra(arguments)))}}),i.send=function(e,r,u){if(2===arguments.length&&"function"==typeof r&&(u=r,r=null),c.open(e,n,!0),null==t||"accept"in a||(a.accept=t+",*/*"),c.setRequestHeader)for(var s in a)c.setRequestHeader(s,a[s]);return null!=t&&c.overrideMimeType&&c.overrideMimeType(t),null!=l&&(c.responseType=l),null!=u&&i.on("error",u).on("load",function(n){u(null,n)}),o.beforesend.call(i,c),c.send(null==r?null:r),i},i.abort=function(){return c.abort(),i},ta.rebind(i,o,"on"),null==r?i:i.get(Ct(r))}function Ct(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function zt(n){var t=n.responseType;return t&&"text"!==t?n.response:n.responseText}function qt(){var n=Lt(),t=Tt()-n;t>24?(isFinite(t)&&(clearTimeout(tc),tc=setTimeout(qt,t)),nc=0):(nc=1,rc(qt))}function Lt(){var n=Date.now();for(ec=Ka;ec;)n>=ec.t&&(ec.f=ec.c(n-ec.t)),ec=ec.n;return n}function Tt(){for(var n,t=Ka,e=1/0;t;)t.f?t=n?n.n=t.n:Ka=t.n:(t.t<e&&(e=t.t),t=(n=t).n);return Qa=n,e}function Rt(n,t){return t-(n?Math.ceil(Math.log(n)/Math.LN10):1)}function Dt(n,t){var e=Math.pow(10,3*ga(8-t));return{scale:t>8?function(n){return n/e}:function(n){return n*e},symbol:n}}function Pt(n){var t=n.decimal,e=n.thousands,r=n.grouping,u=n.currency,i=r&&e?function(n,t){for(var u=n.length,i=[],o=0,a=r[0],c=0;u>0&&a>0&&(c+a+1>t&&(a=Math.max(1,t-c)),i.push(n.substring(u-=a,u+a)),!((c+=a+1)>t));)a=r[o=(o+1)%r.length];return i.reverse().join(e)}:y;return function(n){var e=ic.exec(n),r=e[1]||" ",o=e[2]||">",a=e[3]||"-",c=e[4]||"",l=e[5],s=+e[6],f=e[7],h=e[8],g=e[9],p=1,v="",d="",m=!1,y=!0;switch(h&&(h=+h.substring(1)),(l||"0"===r&&"="===o)&&(l=r="0",o="="),g){case"n":f=!0,g="g";break;case"%":p=100,d="%",g="f";break;case"p":p=100,d="%",g="r";break;case"b":case"o":case"x":case"X":"#"===c&&(v="0"+g.toLowerCase());case"c":y=!1;case"d":m=!0,h=0;break;case"s":p=-1,g="r"}"$"===c&&(v=u[0],d=u[1]),"r"!=g||h||(g="g"),null!=h&&("g"==g?h=Math.max(1,Math.min(21,h)):("e"==g||"f"==g)&&(h=Math.max(0,Math.min(20,h)))),g=oc.get(g)||Ut;var M=l&&f;return function(n){var e=d;if(m&&n%1)return"";var u=0>n||0===n&&0>1/n?(n=-n,"-"):"-"===a?"":a;if(0>p){var c=ta.formatPrefix(n,h);n=c.scale(n),e=c.symbol+d}else n*=p;n=g(n,h);var x,b,_=n.lastIndexOf(".");if(0>_){var w=y?n.lastIndexOf("e"):-1;0>w?(x=n,b=""):(x=n.substring(0,w),b=n.substring(w))}else x=n.substring(0,_),b=t+n.substring(_+1);!l&&f&&(x=i(x,1/0));var S=v.length+x.length+b.length+(M?0:u.length),k=s>S?new Array(S=s-S+1).join(r):"";return M&&(x=i(k+x,k.length?s-b.length:1/0)),u+=v,n=x+b,("<"===o?u+n+k:">"===o?k+u+n:"^"===o?k.substring(0,S>>=1)+u+n+k.substring(S):u+(M?n:k+n))+e}}}function Ut(n){return n+""}function jt(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function Ft(n,t,e){function r(t){var e=n(t),r=i(e,1);return r-t>t-e?e:r}function u(e){return t(e=n(new cc(e-1)),1),e}function i(n,e){return t(n=new cc(+n),e),n}function o(n,r,i){var o=u(n),a=[];if(i>1)for(;r>o;)e(o)%i||a.push(new Date(+o)),t(o,1);else for(;r>o;)a.push(new Date(+o)),t(o,1);return a}function a(n,t,e){try{cc=jt;var r=new jt;return r._=n,o(r,t,e)}finally{cc=Date}}n.floor=n,n.round=r,n.ceil=u,n.offset=i,n.range=o;var c=n.utc=Ht(n);return c.floor=c,c.round=Ht(r),c.ceil=Ht(u),c.offset=Ht(i),c.range=a,n}function Ht(n){return function(t,e){try{cc=jt;var r=new jt;return r._=t,n(r,e)._}finally{cc=Date}}}function Ot(n){function t(n){function t(t){for(var e,u,i,o=[],a=-1,c=0;++a<r;)37===n.charCodeAt(a)&&(o.push(n.slice(c,a)),null!=(u=sc[e=n.charAt(++a)])&&(e=n.charAt(++a)),(i=N[e])&&(e=i(t,null==u?"e"===e?" ":"0":u)),o.push(e),c=a+1);return o.push(n.slice(c,a)),o.join("")}var r=n.length;return t.parse=function(t){var r={y:1900,m:0,d:1,H:0,M:0,S:0,L:0,Z:null},u=e(r,n,t,0);if(u!=t.length)return null;"p"in r&&(r.H=r.H%12+12*r.p);var i=null!=r.Z&&cc!==jt,o=new(i?jt:cc);return"j"in r?o.setFullYear(r.y,0,r.j):"w"in r&&("W"in r||"U"in r)?(o.setFullYear(r.y,0,1),o.setFullYear(r.y,0,"W"in r?(r.w+6)%7+7*r.W-(o.getDay()+5)%7:r.w+7*r.U-(o.getDay()+6)%7)):o.setFullYear(r.y,r.m,r.d),o.setHours(r.H+(r.Z/100|0),r.M+r.Z%100,r.S,r.L),i?o._:o},t.toString=function(){return n},t}function e(n,t,e,r){for(var u,i,o,a=0,c=t.length,l=e.length;c>a;){if(r>=l)return-1;if(u=t.charCodeAt(a++),37===u){if(o=t.charAt(a++),i=C[o in sc?t.charAt(a++):o],!i||(r=i(n,e,r))<0)return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){_.lastIndex=0;var r=_.exec(t.slice(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){x.lastIndex=0;var r=x.exec(t.slice(e));return r?(n.w=b.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){E.lastIndex=0;var r=E.exec(t.slice(e));return r?(n.m=A.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,e){S.lastIndex=0;var r=S.exec(t.slice(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,r){return e(n,N.c.toString(),t,r)}function c(n,t,r){return e(n,N.x.toString(),t,r)}function l(n,t,r){return e(n,N.X.toString(),t,r)}function s(n,t,e){var r=M.get(t.slice(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var f=n.dateTime,h=n.date,g=n.time,p=n.periods,v=n.days,d=n.shortDays,m=n.months,y=n.shortMonths;t.utc=function(n){function e(n){try{cc=jt;var t=new cc;return t._=n,r(t)}finally{cc=Date}}var r=t(n);return e.parse=function(n){try{cc=jt;var t=r.parse(n);return t&&t._}finally{cc=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ae;var M=ta.map(),x=Yt(v),b=Zt(v),_=Yt(d),w=Zt(d),S=Yt(m),k=Zt(m),E=Yt(y),A=Zt(y);p.forEach(function(n,t){M.set(n.toLowerCase(),t)});var N={a:function(n){return d[n.getDay()]},A:function(n){return v[n.getDay()]},b:function(n){return y[n.getMonth()]},B:function(n){return m[n.getMonth()]},c:t(f),d:function(n,t){return It(n.getDate(),t,2)},e:function(n,t){return It(n.getDate(),t,2)},H:function(n,t){return It(n.getHours(),t,2)},I:function(n,t){return It(n.getHours()%12||12,t,2)},j:function(n,t){return It(1+ac.dayOfYear(n),t,3)},L:function(n,t){return It(n.getMilliseconds(),t,3)},m:function(n,t){return It(n.getMonth()+1,t,2)},M:function(n,t){return It(n.getMinutes(),t,2)},p:function(n){return p[+(n.getHours()>=12)]},S:function(n,t){return It(n.getSeconds(),t,2)},U:function(n,t){return It(ac.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return It(ac.mondayOfYear(n),t,2)},x:t(h),X:t(g),y:function(n,t){return It(n.getFullYear()%100,t,2)},Y:function(n,t){return It(n.getFullYear()%1e4,t,4)},Z:ie,"%":function(){return"%"}},C={a:r,A:u,b:i,B:o,c:a,d:Qt,e:Qt,H:te,I:te,j:ne,L:ue,m:Kt,M:ee,p:s,S:re,U:Xt,w:Vt,W:$t,x:c,X:l,y:Wt,Y:Bt,Z:Jt,"%":oe};return t}function It(n,t,e){var r=0>n?"-":"",u=(r?-n:n)+"",i=u.length;return r+(e>i?new Array(e-i+1).join(t)+u:u)}function Yt(n){return new RegExp("^(?:"+n.map(ta.requote).join("|")+")","i")}function Zt(n){for(var t=new l,e=-1,r=n.length;++e<r;)t.set(n[e].toLowerCase(),e);return t}function Vt(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+1));return r?(n.w=+r[0],e+r[0].length):-1}function Xt(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e));return r?(n.U=+r[0],e+r[0].length):-1}function $t(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e));return r?(n.W=+r[0],e+r[0].length):-1}function Bt(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+4));return r?(n.y=+r[0],e+r[0].length):-1}function Wt(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.y=Gt(+r[0]),e+r[0].length):-1}function Jt(n,t,e){return/^[+-]\d{4}$/.test(t=t.slice(e,e+5))?(n.Z=-t,e+5):-1}function Gt(n){return n+(n>68?1900:2e3)}function Kt(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function Qt(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function ne(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function te(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function ee(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function re(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function ue(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function ie(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=ga(t)/60|0,u=ga(t)%60;return e+It(r,"0",2)+It(u,"0",2)}function oe(n,t,e){hc.lastIndex=0;var r=hc.exec(t.slice(e,e+1));return r?e+r[0].length:-1}function ae(n){for(var t=n.length,e=-1;++e<t;)n[e][0]=this(n[e][0]);return function(t){for(var e=0,r=n[e];!r[1](t);)r=n[++e];return r[0](t)}}function ce(){}function le(n,t,e){var r=e.s=n+t,u=r-n,i=r-u;e.t=n-i+(t-u)}function se(n,t){n&&dc.hasOwnProperty(n.type)&&dc[n.type](n,t)}function fe(n,t,e){var r,u=-1,i=n.length-e;for(t.lineStart();++u<i;)r=n[u],t.point(r[0],r[1],r[2]);t.lineEnd()}function he(n,t){var e=-1,r=n.length;for(t.polygonStart();++e<r;)fe(n[e],t,1);t.polygonEnd()}function ge(){function n(n,t){n*=Da,t=t*Da/2+qa/4;var e=n-r,o=e>=0?1:-1,a=o*e,c=Math.cos(t),l=Math.sin(t),s=i*l,f=u*c+s*Math.cos(a),h=s*o*Math.sin(a);yc.add(Math.atan2(h,f)),r=n,u=c,i=l}var t,e,r,u,i;Mc.point=function(o,a){Mc.point=n,r=(t=o)*Da,u=Math.cos(a=(e=a)*Da/2+qa/4),i=Math.sin(a)},Mc.lineEnd=function(){n(t,e)}}function pe(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function ve(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function de(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function me(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function ye(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function Me(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function xe(n){return[Math.atan2(n[1],n[0]),tt(n[2])]}function be(n,t){return ga(n[0]-t[0])<Ca&&ga(n[1]-t[1])<Ca}function _e(n,t){n*=Da;var e=Math.cos(t*=Da);we(e*Math.cos(n),e*Math.sin(n),Math.sin(t))}function we(n,t,e){++xc,_c+=(n-_c)/xc,wc+=(t-wc)/xc,Sc+=(e-Sc)/xc}function Se(){function n(n,u){n*=Da;var i=Math.cos(u*=Da),o=i*Math.cos(n),a=i*Math.sin(n),c=Math.sin(u),l=Math.atan2(Math.sqrt((l=e*c-r*a)*l+(l=r*o-t*c)*l+(l=t*a-e*o)*l),t*o+e*a+r*c);bc+=l,kc+=l*(t+(t=o)),Ec+=l*(e+(e=a)),Ac+=l*(r+(r=c)),we(t,e,r)}var t,e,r;qc.point=function(u,i){u*=Da;var o=Math.cos(i*=Da);t=o*Math.cos(u),e=o*Math.sin(u),r=Math.sin(i),qc.point=n,we(t,e,r)}}function ke(){qc.point=_e}function Ee(){function n(n,t){n*=Da;var e=Math.cos(t*=Da),o=e*Math.cos(n),a=e*Math.sin(n),c=Math.sin(t),l=u*c-i*a,s=i*o-r*c,f=r*a-u*o,h=Math.sqrt(l*l+s*s+f*f),g=r*o+u*a+i*c,p=h&&-nt(g)/h,v=Math.atan2(h,g);Nc+=p*l,Cc+=p*s,zc+=p*f,bc+=v,kc+=v*(r+(r=o)),Ec+=v*(u+(u=a)),Ac+=v*(i+(i=c)),we(r,u,i)}var t,e,r,u,i;qc.point=function(o,a){t=o,e=a,qc.point=n,o*=Da;var c=Math.cos(a*=Da);r=c*Math.cos(o),u=c*Math.sin(o),i=Math.sin(a),we(r,u,i)},qc.lineEnd=function(){n(t,e),qc.lineEnd=ke,qc.point=_e}}function Ae(n,t){function e(e,r){return e=n(e,r),t(e[0],e[1])}return n.invert&&t.invert&&(e.invert=function(e,r){return e=t.invert(e,r),e&&n.invert(e[0],e[1])}),e}function Ne(){return!0}function Ce(n,t,e,r,u){var i=[],o=[];if(n.forEach(function(n){if(!((t=n.length-1)<=0)){var t,e=n[0],r=n[t];if(be(e,r)){u.lineStart();for(var a=0;t>a;++a)u.point((e=n[a])[0],e[1]);return void u.lineEnd()}var c=new qe(e,n,null,!0),l=new qe(e,null,c,!1);c.o=l,i.push(c),o.push(l),c=new qe(r,n,null,!1),l=new qe(r,null,c,!0),c.o=l,i.push(c),o.push(l)}}),o.sort(t),ze(i),ze(o),i.length){for(var a=0,c=e,l=o.length;l>a;++a)o[a].e=c=!c;for(var s,f,h=i[0];;){for(var g=h,p=!0;g.v;)if((g=g.n)===h)return;s=g.z,u.lineStart();do{if(g.v=g.o.v=!0,g.e){if(p)for(var a=0,l=s.length;l>a;++a)u.point((f=s[a])[0],f[1]);else r(g.x,g.n.x,1,u);g=g.n}else{if(p){s=g.p.z;for(var a=s.length-1;a>=0;--a)u.point((f=s[a])[0],f[1])}else r(g.x,g.p.x,-1,u);g=g.p}g=g.o,s=g.z,p=!p}while(!g.v);u.lineEnd()}}}function ze(n){if(t=n.length){for(var t,e,r=0,u=n[0];++r<t;)u.n=e=n[r],e.p=u,u=e;u.n=e=n[0],e.p=u}}function qe(n,t,e,r){this.x=n,this.z=t,this.o=e,this.e=r,this.v=!1,this.n=this.p=null}function Le(n,t,e,r){return function(u,i){function o(t,e){var r=u(t,e);n(t=r[0],e=r[1])&&i.point(t,e)}function a(n,t){var e=u(n,t);d.point(e[0],e[1])}function c(){y.point=a,d.lineStart()}function l(){y.point=o,d.lineEnd()}function s(n,t){v.push([n,t]);var e=u(n,t);x.point(e[0],e[1])}function f(){x.lineStart(),v=[]}function h(){s(v[0][0],v[0][1]),x.lineEnd();var n,t=x.clean(),e=M.buffer(),r=e.length;if(v.pop(),p.push(v),v=null,r)if(1&t){n=e[0];var u,r=n.length-1,o=-1;if(r>0){for(b||(i.polygonStart(),b=!0),i.lineStart();++o<r;)i.point((u=n[o])[0],u[1]);i.lineEnd()}}else r>1&&2&t&&e.push(e.pop().concat(e.shift())),g.push(e.filter(Te))}var g,p,v,d=t(i),m=u.invert(r[0],r[1]),y={point:o,lineStart:c,lineEnd:l,polygonStart:function(){y.point=s,y.lineStart=f,y.lineEnd=h,g=[],p=[]},polygonEnd:function(){y.point=o,y.lineStart=c,y.lineEnd=l,g=ta.merge(g);var n=Fe(m,p);g.length?(b||(i.polygonStart(),b=!0),Ce(g,De,n,e,i)):n&&(b||(i.polygonStart(),b=!0),i.lineStart(),e(null,null,1,i),i.lineEnd()),b&&(i.polygonEnd(),b=!1),g=p=null},sphere:function(){i.polygonStart(),i.lineStart(),e(null,null,1,i),i.lineEnd(),i.polygonEnd()}},M=Re(),x=t(M),b=!1;return y}}function Te(n){return n.length>1}function Re(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:b,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function De(n,t){return((n=n.x)[0]<0?n[1]-Ra-Ca:Ra-n[1])-((t=t.x)[0]<0?t[1]-Ra-Ca:Ra-t[1])}function Pe(n){var t,e=0/0,r=0/0,u=0/0;return{lineStart:function(){n.lineStart(),t=1},point:function(i,o){var a=i>0?qa:-qa,c=ga(i-e);ga(c-qa)<Ca?(n.point(e,r=(r+o)/2>0?Ra:-Ra),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(i,r),t=0):u!==a&&c>=qa&&(ga(e-u)<Ca&&(e-=u*Ca),ga(i-a)<Ca&&(i-=a*Ca),r=Ue(e,r,i,o),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),t=0),n.point(e=i,r=o),u=a},lineEnd:function(){n.lineEnd(),e=r=0/0},clean:function(){return 2-t}}}function Ue(n,t,e,r){var u,i,o=Math.sin(n-e);return ga(o)>Ca?Math.atan((Math.sin(t)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(t))*Math.sin(n))/(u*i*o)):(t+r)/2}function je(n,t,e,r){var u;if(null==n)u=e*Ra,r.point(-qa,u),r.point(0,u),r.point(qa,u),r.point(qa,0),r.point(qa,-u),r.point(0,-u),r.point(-qa,-u),r.point(-qa,0),r.point(-qa,u);else if(ga(n[0]-t[0])>Ca){var i=n[0]<t[0]?qa:-qa;u=e*i/2,r.point(-i,u),r.point(0,u),r.point(i,u)}else r.point(t[0],t[1])}function Fe(n,t){var e=n[0],r=n[1],u=[Math.sin(e),-Math.cos(e),0],i=0,o=0;yc.reset();for(var a=0,c=t.length;c>a;++a){var l=t[a],s=l.length;if(s)for(var f=l[0],h=f[0],g=f[1]/2+qa/4,p=Math.sin(g),v=Math.cos(g),d=1;;){d===s&&(d=0),n=l[d];var m=n[0],y=n[1]/2+qa/4,M=Math.sin(y),x=Math.cos(y),b=m-h,_=b>=0?1:-1,w=_*b,S=w>qa,k=p*M;if(yc.add(Math.atan2(k*_*Math.sin(w),v*x+k*Math.cos(w))),i+=S?b+_*La:b,S^h>=e^m>=e){var E=de(pe(f),pe(n));Me(E);var A=de(u,E);Me(A);var N=(S^b>=0?-1:1)*tt(A[2]);(r>N||r===N&&(E[0]||E[1]))&&(o+=S^b>=0?1:-1)}if(!d++)break;h=m,p=M,v=x,f=n}}return(-Ca>i||Ca>i&&0>yc)^1&o}function He(n){function t(n,t){return Math.cos(n)*Math.cos(t)>i}function e(n){var e,i,c,l,s;return{lineStart:function(){l=c=!1,s=1},point:function(f,h){var g,p=[f,h],v=t(f,h),d=o?v?0:u(f,h):v?u(f+(0>f?qa:-qa),h):0;if(!e&&(l=c=v)&&n.lineStart(),v!==c&&(g=r(e,p),(be(e,g)||be(p,g))&&(p[0]+=Ca,p[1]+=Ca,v=t(p[0],p[1]))),v!==c)s=0,v?(n.lineStart(),g=r(p,e),n.point(g[0],g[1])):(g=r(e,p),n.point(g[0],g[1]),n.lineEnd()),e=g;else if(a&&e&&o^v){var m;d&i||!(m=r(p,e,!0))||(s=0,o?(n.lineStart(),n.point(m[0][0],m[0][1]),n.point(m[1][0],m[1][1]),n.lineEnd()):(n.point(m[1][0],m[1][1]),n.lineEnd(),n.lineStart(),n.point(m[0][0],m[0][1])))}!v||e&&be(e,p)||n.point(p[0],p[1]),e=p,c=v,i=d},lineEnd:function(){c&&n.lineEnd(),e=null},clean:function(){return s|(l&&c)<<1}}}function r(n,t,e){var r=pe(n),u=pe(t),o=[1,0,0],a=de(r,u),c=ve(a,a),l=a[0],s=c-l*l;if(!s)return!e&&n;var f=i*c/s,h=-i*l/s,g=de(o,a),p=ye(o,f),v=ye(a,h);me(p,v);var d=g,m=ve(p,d),y=ve(d,d),M=m*m-y*(ve(p,p)-1);if(!(0>M)){var x=Math.sqrt(M),b=ye(d,(-m-x)/y);if(me(b,p),b=xe(b),!e)return b;var _,w=n[0],S=t[0],k=n[1],E=t[1];w>S&&(_=w,w=S,S=_);var A=S-w,N=ga(A-qa)<Ca,C=N||Ca>A;if(!N&&k>E&&(_=k,k=E,E=_),C?N?k+E>0^b[1]<(ga(b[0]-w)<Ca?k:E):k<=b[1]&&b[1]<=E:A>qa^(w<=b[0]&&b[0]<=S)){var z=ye(d,(-m+x)/y);return me(z,p),[b,xe(z)]}}}function u(t,e){var r=o?n:qa-n,u=0;return-r>t?u|=1:t>r&&(u|=2),-r>e?u|=4:e>r&&(u|=8),u}var i=Math.cos(n),o=i>0,a=ga(i)>Ca,c=gr(n,6*Da);return Le(t,e,c,o?[0,-n]:[-qa,n-qa])}function Oe(n,t,e,r){return function(u){var i,o=u.a,a=u.b,c=o.x,l=o.y,s=a.x,f=a.y,h=0,g=1,p=s-c,v=f-l;if(i=n-c,p||!(i>0)){if(i/=p,0>p){if(h>i)return;g>i&&(g=i)}else if(p>0){if(i>g)return;i>h&&(h=i)}if(i=e-c,p||!(0>i)){if(i/=p,0>p){if(i>g)return;i>h&&(h=i)}else if(p>0){if(h>i)return;g>i&&(g=i)}if(i=t-l,v||!(i>0)){if(i/=v,0>v){if(h>i)return;g>i&&(g=i)}else if(v>0){if(i>g)return;i>h&&(h=i)}if(i=r-l,v||!(0>i)){if(i/=v,0>v){if(i>g)return;i>h&&(h=i)}else if(v>0){if(h>i)return;g>i&&(g=i)}return h>0&&(u.a={x:c+h*p,y:l+h*v}),1>g&&(u.b={x:c+g*p,y:l+g*v}),u}}}}}}function Ie(n,t,e,r){function u(r,u){return ga(r[0]-n)<Ca?u>0?0:3:ga(r[0]-e)<Ca?u>0?2:1:ga(r[1]-t)<Ca?u>0?1:0:u>0?3:2}function i(n,t){return o(n.x,t.x)}function o(n,t){var e=u(n,1),r=u(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(a){function c(n){for(var t=0,e=d.length,r=n[1],u=0;e>u;++u)for(var i,o=1,a=d[u],c=a.length,l=a[0];c>o;++o)i=a[o],l[1]<=r?i[1]>r&&Q(l,i,n)>0&&++t:i[1]<=r&&Q(l,i,n)<0&&--t,l=i;return 0!==t}function l(i,a,c,l){var s=0,f=0;if(null==i||(s=u(i,c))!==(f=u(a,c))||o(i,a)<0^c>0){do l.point(0===s||3===s?n:e,s>1?r:t);while((s=(s+c+4)%4)!==f)}else l.point(a[0],a[1])}function s(u,i){return u>=n&&e>=u&&i>=t&&r>=i}function f(n,t){s(n,t)&&a.point(n,t)}function h(){C.point=p,d&&d.push(m=[]),S=!0,w=!1,b=_=0/0}function g(){v&&(p(y,M),x&&w&&A.rejoin(),v.push(A.buffer())),C.point=f,w&&a.lineEnd()}function p(n,t){n=Math.max(-Tc,Math.min(Tc,n)),t=Math.max(-Tc,Math.min(Tc,t));var e=s(n,t);if(d&&m.push([n,t]),S)y=n,M=t,x=e,S=!1,e&&(a.lineStart(),a.point(n,t));else if(e&&w)a.point(n,t);else{var r={a:{x:b,y:_},b:{x:n,y:t}};N(r)?(w||(a.lineStart(),a.point(r.a.x,r.a.y)),a.point(r.b.x,r.b.y),e||a.lineEnd(),k=!1):e&&(a.lineStart(),a.point(n,t),k=!1)}b=n,_=t,w=e}var v,d,m,y,M,x,b,_,w,S,k,E=a,A=Re(),N=Oe(n,t,e,r),C={point:f,lineStart:h,lineEnd:g,polygonStart:function(){a=A,v=[],d=[],k=!0},polygonEnd:function(){a=E,v=ta.merge(v);var t=c([n,r]),e=k&&t,u=v.length;(e||u)&&(a.polygonStart(),e&&(a.lineStart(),l(null,null,1,a),a.lineEnd()),u&&Ce(v,i,t,l,a),a.polygonEnd()),v=d=m=null}};return C}}function Ye(n){var t=0,e=qa/3,r=ir(n),u=r(t,e);return u.parallels=function(n){return arguments.length?r(t=n[0]*qa/180,e=n[1]*qa/180):[t/qa*180,e/qa*180]},u}function Ze(n,t){function e(n,t){var e=Math.sqrt(i-2*u*Math.sin(t))/u;return[e*Math.sin(n*=u),o-e*Math.cos(n)]}var r=Math.sin(n),u=(r+Math.sin(t))/2,i=1+r*(2*u-r),o=Math.sqrt(i)/u;return e.invert=function(n,t){var e=o-t;return[Math.atan2(n,e)/u,tt((i-(n*n+e*e)*u*u)/(2*u))]},e}function Ve(){function n(n,t){Dc+=u*n-r*t,r=n,u=t}var t,e,r,u;Hc.point=function(i,o){Hc.point=n,t=r=i,e=u=o},Hc.lineEnd=function(){n(t,e)}}function Xe(n,t){Pc>n&&(Pc=n),n>jc&&(jc=n),Uc>t&&(Uc=t),t>Fc&&(Fc=t)}function $e(){function n(n,t){o.push("M",n,",",t,i)}function t(n,t){o.push("M",n,",",t),a.point=e}function e(n,t){o.push("L",n,",",t)}function r(){a.point=n}function u(){o.push("Z")}var i=Be(4.5),o=[],a={point:n,lineStart:function(){a.point=t},lineEnd:r,polygonStart:function(){a.lineEnd=u},polygonEnd:function(){a.lineEnd=r,a.point=n},pointRadius:function(n){return i=Be(n),a},result:function(){if(o.length){var n=o.join("");return o=[],n}}};return a}function Be(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function We(n,t){_c+=n,wc+=t,++Sc}function Je(){function n(n,r){var u=n-t,i=r-e,o=Math.sqrt(u*u+i*i);kc+=o*(t+n)/2,Ec+=o*(e+r)/2,Ac+=o,We(t=n,e=r)}var t,e;Ic.point=function(r,u){Ic.point=n,We(t=r,e=u)}}function Ge(){Ic.point=We}function Ke(){function n(n,t){var e=n-r,i=t-u,o=Math.sqrt(e*e+i*i);kc+=o*(r+n)/2,Ec+=o*(u+t)/2,Ac+=o,o=u*n-r*t,Nc+=o*(r+n),Cc+=o*(u+t),zc+=3*o,We(r=n,u=t)}var t,e,r,u;Ic.point=function(i,o){Ic.point=n,We(t=r=i,e=u=o)},Ic.lineEnd=function(){n(t,e)}}function Qe(n){function t(t,e){n.moveTo(t+o,e),n.arc(t,e,o,0,La)}function e(t,e){n.moveTo(t,e),a.point=r}function r(t,e){n.lineTo(t,e)}function u(){a.point=t}function i(){n.closePath()}var o=4.5,a={point:t,lineStart:function(){a.point=e},lineEnd:u,polygonStart:function(){a.lineEnd=i},polygonEnd:function(){a.lineEnd=u,a.point=t},pointRadius:function(n){return o=n,a},result:b};return a}function nr(n){function t(n){return(a?r:e)(n)}function e(t){return rr(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){M=0/0,S.point=i,t.lineStart()}function i(e,r){var i=pe([e,r]),o=n(e,r);u(M,x,y,b,_,w,M=o[0],x=o[1],y=e,b=i[0],_=i[1],w=i[2],a,t),t.point(M,x)}function o(){S.point=e,t.lineEnd()}function c(){r(),S.point=l,S.lineEnd=s}function l(n,t){i(f=n,h=t),g=M,p=x,v=b,d=_,m=w,S.point=i}function s(){u(M,x,y,b,_,w,g,p,f,v,d,m,a,t),S.lineEnd=o,o()}var f,h,g,p,v,d,m,y,M,x,b,_,w,S={point:e,lineStart:r,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=c +},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function u(t,e,r,a,c,l,s,f,h,g,p,v,d,m){var y=s-t,M=f-e,x=y*y+M*M;if(x>4*i&&d--){var b=a+g,_=c+p,w=l+v,S=Math.sqrt(b*b+_*_+w*w),k=Math.asin(w/=S),E=ga(ga(w)-1)<Ca||ga(r-h)<Ca?(r+h)/2:Math.atan2(_,b),A=n(E,k),N=A[0],C=A[1],z=N-t,q=C-e,L=M*z-y*q;(L*L/x>i||ga((y*z+M*q)/x-.5)>.3||o>a*g+c*p+l*v)&&(u(t,e,r,a,c,l,N,C,E,b/=S,_/=S,w,d,m),m.point(N,C),u(N,C,E,b,_,w,s,f,h,g,p,v,d,m))}}var i=.5,o=Math.cos(30*Da),a=16;return t.precision=function(n){return arguments.length?(a=(i=n*n)>0&&16,t):Math.sqrt(i)},t}function tr(n){var t=nr(function(t,e){return n([t*Pa,e*Pa])});return function(n){return or(t(n))}}function er(n){this.stream=n}function rr(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function ur(n){return ir(function(){return n})()}function ir(n){function t(n){return n=a(n[0]*Da,n[1]*Da),[n[0]*h+c,l-n[1]*h]}function e(n){return n=a.invert((n[0]-c)/h,(l-n[1])/h),n&&[n[0]*Pa,n[1]*Pa]}function r(){a=Ae(o=lr(m,M,x),i);var n=i(v,d);return c=g-n[0]*h,l=p+n[1]*h,u()}function u(){return s&&(s.valid=!1,s=null),t}var i,o,a,c,l,s,f=nr(function(n,t){return n=i(n,t),[n[0]*h+c,l-n[1]*h]}),h=150,g=480,p=250,v=0,d=0,m=0,M=0,x=0,b=Lc,_=y,w=null,S=null;return t.stream=function(n){return s&&(s.valid=!1),s=or(b(o,f(_(n)))),s.valid=!0,s},t.clipAngle=function(n){return arguments.length?(b=null==n?(w=n,Lc):He((w=+n)*Da),u()):w},t.clipExtent=function(n){return arguments.length?(S=n,_=n?Ie(n[0][0],n[0][1],n[1][0],n[1][1]):y,u()):S},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(g=+n[0],p=+n[1],r()):[g,p]},t.center=function(n){return arguments.length?(v=n[0]%360*Da,d=n[1]%360*Da,r()):[v*Pa,d*Pa]},t.rotate=function(n){return arguments.length?(m=n[0]%360*Da,M=n[1]%360*Da,x=n.length>2?n[2]%360*Da:0,r()):[m*Pa,M*Pa,x*Pa]},ta.rebind(t,f,"precision"),function(){return i=n.apply(this,arguments),t.invert=i.invert&&e,r()}}function or(n){return rr(n,function(t,e){n.point(t*Da,e*Da)})}function ar(n,t){return[n,t]}function cr(n,t){return[n>qa?n-La:-qa>n?n+La:n,t]}function lr(n,t,e){return n?t||e?Ae(fr(n),hr(t,e)):fr(n):t||e?hr(t,e):cr}function sr(n){return function(t,e){return t+=n,[t>qa?t-La:-qa>t?t+La:t,e]}}function fr(n){var t=sr(n);return t.invert=sr(-n),t}function hr(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,l=Math.sin(t),s=l*r+a*u;return[Math.atan2(c*i-s*o,a*r-l*u),tt(s*i+c*o)]}var r=Math.cos(n),u=Math.sin(n),i=Math.cos(t),o=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,l=Math.sin(t),s=l*i-c*o;return[Math.atan2(c*i+l*o,a*r+s*u),tt(s*r-a*u)]},e}function gr(n,t){var e=Math.cos(n),r=Math.sin(n);return function(u,i,o,a){var c=o*t;null!=u?(u=pr(e,u),i=pr(e,i),(o>0?i>u:u>i)&&(u+=o*La)):(u=n+o*La,i=n-.5*c);for(var l,s=u;o>0?s>i:i>s;s-=c)a.point((l=xe([e,-r*Math.cos(s),-r*Math.sin(s)]))[0],l[1])}}function pr(n,t){var e=pe(t);e[0]-=n,Me(e);var r=nt(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Ca)%(2*Math.PI)}function vr(n,t,e){var r=ta.range(n,t-Ca,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function dr(n,t,e){var r=ta.range(n,t-Ca,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function mr(n){return n.source}function yr(n){return n.target}function Mr(n,t,e,r){var u=Math.cos(t),i=Math.sin(t),o=Math.cos(r),a=Math.sin(r),c=u*Math.cos(n),l=u*Math.sin(n),s=o*Math.cos(e),f=o*Math.sin(e),h=2*Math.asin(Math.sqrt(it(r-t)+u*o*it(e-n))),g=1/Math.sin(h),p=h?function(n){var t=Math.sin(n*=h)*g,e=Math.sin(h-n)*g,r=e*c+t*s,u=e*l+t*f,o=e*i+t*a;return[Math.atan2(u,r)*Pa,Math.atan2(o,Math.sqrt(r*r+u*u))*Pa]}:function(){return[n*Pa,t*Pa]};return p.distance=h,p}function xr(){function n(n,u){var i=Math.sin(u*=Da),o=Math.cos(u),a=ga((n*=Da)-t),c=Math.cos(a);Yc+=Math.atan2(Math.sqrt((a=o*Math.sin(a))*a+(a=r*i-e*o*c)*a),e*i+r*o*c),t=n,e=i,r=o}var t,e,r;Zc.point=function(u,i){t=u*Da,e=Math.sin(i*=Da),r=Math.cos(i),Zc.point=n},Zc.lineEnd=function(){Zc.point=Zc.lineEnd=b}}function br(n,t){function e(t,e){var r=Math.cos(t),u=Math.cos(e),i=n(r*u);return[i*u*Math.sin(t),i*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),u=t(r),i=Math.sin(u),o=Math.cos(u);return[Math.atan2(n*i,r*o),Math.asin(r&&e*i/r)]},e}function _r(n,t){function e(n,t){o>0?-Ra+Ca>t&&(t=-Ra+Ca):t>Ra-Ca&&(t=Ra-Ca);var e=o/Math.pow(u(t),i);return[e*Math.sin(i*n),o-e*Math.cos(i*n)]}var r=Math.cos(n),u=function(n){return Math.tan(qa/4+n/2)},i=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(u(t)/u(n)),o=r*Math.pow(u(n),i)/i;return i?(e.invert=function(n,t){var e=o-t,r=K(i)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/i,2*Math.atan(Math.pow(o/r,1/i))-Ra]},e):Sr}function wr(n,t){function e(n,t){var e=i-t;return[e*Math.sin(u*n),i-e*Math.cos(u*n)]}var r=Math.cos(n),u=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),i=r/u+n;return ga(u)<Ca?ar:(e.invert=function(n,t){var e=i-t;return[Math.atan2(n,e)/u,i-K(u)*Math.sqrt(n*n+e*e)]},e)}function Sr(n,t){return[n,Math.log(Math.tan(qa/4+t/2))]}function kr(n){var t,e=ur(n),r=e.scale,u=e.translate,i=e.clipExtent;return e.scale=function(){var n=r.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.translate=function(){var n=u.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.clipExtent=function(n){var o=i.apply(e,arguments);if(o===e){if(t=null==n){var a=qa*r(),c=u();i([[c[0]-a,c[1]-a],[c[0]+a,c[1]+a]])}}else t&&(o=null);return o},e.clipExtent(null)}function Er(n,t){return[Math.log(Math.tan(qa/4+t/2)),-n]}function Ar(n){return n[0]}function Nr(n){return n[1]}function Cr(n){for(var t=n.length,e=[0,1],r=2,u=2;t>u;u++){for(;r>1&&Q(n[e[r-2]],n[e[r-1]],n[u])<=0;)--r;e[r++]=u}return e.slice(0,r)}function zr(n,t){return n[0]-t[0]||n[1]-t[1]}function qr(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Lr(n,t,e,r){var u=n[0],i=e[0],o=t[0]-u,a=r[0]-i,c=n[1],l=e[1],s=t[1]-c,f=r[1]-l,h=(a*(c-l)-f*(u-i))/(f*o-a*s);return[u+h*o,c+h*s]}function Tr(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Rr(){tu(this),this.edge=this.site=this.circle=null}function Dr(n){var t=el.pop()||new Rr;return t.site=n,t}function Pr(n){Xr(n),Qc.remove(n),el.push(n),tu(n)}function Ur(n){var t=n.circle,e=t.x,r=t.cy,u={x:e,y:r},i=n.P,o=n.N,a=[n];Pr(n);for(var c=i;c.circle&&ga(e-c.circle.x)<Ca&&ga(r-c.circle.cy)<Ca;)i=c.P,a.unshift(c),Pr(c),c=i;a.unshift(c),Xr(c);for(var l=o;l.circle&&ga(e-l.circle.x)<Ca&&ga(r-l.circle.cy)<Ca;)o=l.N,a.push(l),Pr(l),l=o;a.push(l),Xr(l);var s,f=a.length;for(s=1;f>s;++s)l=a[s],c=a[s-1],Kr(l.edge,c.site,l.site,u);c=a[0],l=a[f-1],l.edge=Jr(c.site,l.site,null,u),Vr(c),Vr(l)}function jr(n){for(var t,e,r,u,i=n.x,o=n.y,a=Qc._;a;)if(r=Fr(a,o)-i,r>Ca)a=a.L;else{if(u=i-Hr(a,o),!(u>Ca)){r>-Ca?(t=a.P,e=a):u>-Ca?(t=a,e=a.N):t=e=a;break}if(!a.R){t=a;break}a=a.R}var c=Dr(n);if(Qc.insert(t,c),t||e){if(t===e)return Xr(t),e=Dr(t.site),Qc.insert(c,e),c.edge=e.edge=Jr(t.site,c.site),Vr(t),void Vr(e);if(!e)return void(c.edge=Jr(t.site,c.site));Xr(t),Xr(e);var l=t.site,s=l.x,f=l.y,h=n.x-s,g=n.y-f,p=e.site,v=p.x-s,d=p.y-f,m=2*(h*d-g*v),y=h*h+g*g,M=v*v+d*d,x={x:(d*y-g*M)/m+s,y:(h*M-v*y)/m+f};Kr(e.edge,l,p,x),c.edge=Jr(l,n,null,x),e.edge=Jr(n,p,null,x),Vr(t),Vr(e)}}function Fr(n,t){var e=n.site,r=e.x,u=e.y,i=u-t;if(!i)return r;var o=n.P;if(!o)return-1/0;e=o.site;var a=e.x,c=e.y,l=c-t;if(!l)return a;var s=a-r,f=1/i-1/l,h=s/l;return f?(-h+Math.sqrt(h*h-2*f*(s*s/(-2*l)-c+l/2+u-i/2)))/f+r:(r+a)/2}function Hr(n,t){var e=n.N;if(e)return Fr(e,t);var r=n.site;return r.y===t?r.x:1/0}function Or(n){this.site=n,this.edges=[]}function Ir(n){for(var t,e,r,u,i,o,a,c,l,s,f=n[0][0],h=n[1][0],g=n[0][1],p=n[1][1],v=Kc,d=v.length;d--;)if(i=v[d],i&&i.prepare())for(a=i.edges,c=a.length,o=0;c>o;)s=a[o].end(),r=s.x,u=s.y,l=a[++o%c].start(),t=l.x,e=l.y,(ga(r-t)>Ca||ga(u-e)>Ca)&&(a.splice(o,0,new Qr(Gr(i.site,s,ga(r-f)<Ca&&p-u>Ca?{x:f,y:ga(t-f)<Ca?e:p}:ga(u-p)<Ca&&h-r>Ca?{x:ga(e-p)<Ca?t:h,y:p}:ga(r-h)<Ca&&u-g>Ca?{x:h,y:ga(t-h)<Ca?e:g}:ga(u-g)<Ca&&r-f>Ca?{x:ga(e-g)<Ca?t:f,y:g}:null),i.site,null)),++c)}function Yr(n,t){return t.angle-n.angle}function Zr(){tu(this),this.x=this.y=this.arc=this.site=this.cy=null}function Vr(n){var t=n.P,e=n.N;if(t&&e){var r=t.site,u=n.site,i=e.site;if(r!==i){var o=u.x,a=u.y,c=r.x-o,l=r.y-a,s=i.x-o,f=i.y-a,h=2*(c*f-l*s);if(!(h>=-za)){var g=c*c+l*l,p=s*s+f*f,v=(f*g-l*p)/h,d=(c*p-s*g)/h,f=d+a,m=rl.pop()||new Zr;m.arc=n,m.site=u,m.x=v+o,m.y=f+Math.sqrt(v*v+d*d),m.cy=f,n.circle=m;for(var y=null,M=tl._;M;)if(m.y<M.y||m.y===M.y&&m.x<=M.x){if(!M.L){y=M.P;break}M=M.L}else{if(!M.R){y=M;break}M=M.R}tl.insert(y,m),y||(nl=m)}}}}function Xr(n){var t=n.circle;t&&(t.P||(nl=t.N),tl.remove(t),rl.push(t),tu(t),n.circle=null)}function $r(n){for(var t,e=Gc,r=Oe(n[0][0],n[0][1],n[1][0],n[1][1]),u=e.length;u--;)t=e[u],(!Br(t,n)||!r(t)||ga(t.a.x-t.b.x)<Ca&&ga(t.a.y-t.b.y)<Ca)&&(t.a=t.b=null,e.splice(u,1))}function Br(n,t){var e=n.b;if(e)return!0;var r,u,i=n.a,o=t[0][0],a=t[1][0],c=t[0][1],l=t[1][1],s=n.l,f=n.r,h=s.x,g=s.y,p=f.x,v=f.y,d=(h+p)/2,m=(g+v)/2;if(v===g){if(o>d||d>=a)return;if(h>p){if(i){if(i.y>=l)return}else i={x:d,y:c};e={x:d,y:l}}else{if(i){if(i.y<c)return}else i={x:d,y:l};e={x:d,y:c}}}else if(r=(h-p)/(v-g),u=m-r*d,-1>r||r>1)if(h>p){if(i){if(i.y>=l)return}else i={x:(c-u)/r,y:c};e={x:(l-u)/r,y:l}}else{if(i){if(i.y<c)return}else i={x:(l-u)/r,y:l};e={x:(c-u)/r,y:c}}else if(v>g){if(i){if(i.x>=a)return}else i={x:o,y:r*o+u};e={x:a,y:r*a+u}}else{if(i){if(i.x<o)return}else i={x:a,y:r*a+u};e={x:o,y:r*o+u}}return n.a=i,n.b=e,!0}function Wr(n,t){this.l=n,this.r=t,this.a=this.b=null}function Jr(n,t,e,r){var u=new Wr(n,t);return Gc.push(u),e&&Kr(u,n,t,e),r&&Kr(u,t,n,r),Kc[n.i].edges.push(new Qr(u,n,t)),Kc[t.i].edges.push(new Qr(u,t,n)),u}function Gr(n,t,e){var r=new Wr(n,null);return r.a=t,r.b=e,Gc.push(r),r}function Kr(n,t,e,r){n.a||n.b?n.l===e?n.b=r:n.a=r:(n.a=r,n.l=t,n.r=e)}function Qr(n,t,e){var r=n.a,u=n.b;this.edge=n,this.site=t,this.angle=e?Math.atan2(e.y-t.y,e.x-t.x):n.l===t?Math.atan2(u.x-r.x,r.y-u.y):Math.atan2(r.x-u.x,u.y-r.y)}function nu(){this._=null}function tu(n){n.U=n.C=n.L=n.R=n.P=n.N=null}function eu(n,t){var e=t,r=t.R,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.R=r.L,e.R&&(e.R.U=e),r.L=e}function ru(n,t){var e=t,r=t.L,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.L=r.R,e.L&&(e.L.U=e),r.R=e}function uu(n){for(;n.L;)n=n.L;return n}function iu(n,t){var e,r,u,i=n.sort(ou).pop();for(Gc=[],Kc=new Array(n.length),Qc=new nu,tl=new nu;;)if(u=nl,i&&(!u||i.y<u.y||i.y===u.y&&i.x<u.x))(i.x!==e||i.y!==r)&&(Kc[i.i]=new Or(i),jr(i),e=i.x,r=i.y),i=n.pop();else{if(!u)break;Ur(u.arc)}t&&($r(t),Ir(t));var o={cells:Kc,edges:Gc};return Qc=tl=Gc=Kc=null,o}function ou(n,t){return t.y-n.y||t.x-n.x}function au(n,t,e){return(n.x-e.x)*(t.y-n.y)-(n.x-t.x)*(e.y-n.y)}function cu(n){return n.x}function lu(n){return n.y}function su(){return{leaf:!0,nodes:[],point:null,x:null,y:null}}function fu(n,t,e,r,u,i){if(!n(t,e,r,u,i)){var o=.5*(e+u),a=.5*(r+i),c=t.nodes;c[0]&&fu(n,c[0],e,r,o,a),c[1]&&fu(n,c[1],o,r,u,a),c[2]&&fu(n,c[2],e,a,o,i),c[3]&&fu(n,c[3],o,a,u,i)}}function hu(n,t,e,r,u,i,o){var a,c=1/0;return function l(n,s,f,h,g){if(!(s>i||f>o||r>h||u>g)){if(p=n.point){var p,v=t-n.x,d=e-n.y,m=v*v+d*d;if(c>m){var y=Math.sqrt(c=m);r=t-y,u=e-y,i=t+y,o=e+y,a=p}}for(var M=n.nodes,x=.5*(s+h),b=.5*(f+g),_=t>=x,w=e>=b,S=w<<1|_,k=S+4;k>S;++S)if(n=M[3&S])switch(3&S){case 0:l(n,s,f,x,b);break;case 1:l(n,x,f,h,b);break;case 2:l(n,s,b,x,g);break;case 3:l(n,x,b,h,g)}}}(n,r,u,i,o),a}function gu(n,t){n=ta.rgb(n),t=ta.rgb(t);var e=n.r,r=n.g,u=n.b,i=t.r-e,o=t.g-r,a=t.b-u;return function(n){return"#"+xt(Math.round(e+i*n))+xt(Math.round(r+o*n))+xt(Math.round(u+a*n))}}function pu(n,t){var e,r={},u={};for(e in n)e in t?r[e]=mu(n[e],t[e]):u[e]=n[e];for(e in t)e in n||(u[e]=t[e]);return function(n){for(e in r)u[e]=r[e](n);return u}}function vu(n,t){return n=+n,t=+t,function(e){return n*(1-e)+t*e}}function du(n,t){var e,r,u,i=il.lastIndex=ol.lastIndex=0,o=-1,a=[],c=[];for(n+="",t+="";(e=il.exec(n))&&(r=ol.exec(t));)(u=r.index)>i&&(u=t.slice(i,u),a[o]?a[o]+=u:a[++o]=u),(e=e[0])===(r=r[0])?a[o]?a[o]+=r:a[++o]=r:(a[++o]=null,c.push({i:o,x:vu(e,r)})),i=ol.lastIndex;return i<t.length&&(u=t.slice(i),a[o]?a[o]+=u:a[++o]=u),a.length<2?c[0]?(t=c[0].x,function(n){return t(n)+""}):function(){return t}:(t=c.length,function(n){for(var e,r=0;t>r;++r)a[(e=c[r]).i]=e.x(n);return a.join("")})}function mu(n,t){for(var e,r=ta.interpolators.length;--r>=0&&!(e=ta.interpolators[r](n,t)););return e}function yu(n,t){var e,r=[],u=[],i=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;a>e;++e)r.push(mu(n[e],t[e]));for(;i>e;++e)u[e]=n[e];for(;o>e;++e)u[e]=t[e];return function(n){for(e=0;a>e;++e)u[e]=r[e](n);return u}}function Mu(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function xu(n){return function(t){return 1-n(1-t)}}function bu(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function _u(n){return n*n}function wu(n){return n*n*n}function Su(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function ku(n){return function(t){return Math.pow(t,n)}}function Eu(n){return 1-Math.cos(n*Ra)}function Au(n){return Math.pow(2,10*(n-1))}function Nu(n){return 1-Math.sqrt(1-n*n)}function Cu(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/La*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*La/t)}}function zu(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function qu(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Lu(n,t){n=ta.hcl(n),t=ta.hcl(t);var e=n.h,r=n.c,u=n.l,i=t.h-e,o=t.c-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.c:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return st(e+i*n,r+o*n,u+a*n)+""}}function Tu(n,t){n=ta.hsl(n),t=ta.hsl(t);var e=n.h,r=n.s,u=n.l,i=t.h-e,o=t.s-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.s:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return ct(e+i*n,r+o*n,u+a*n)+""}}function Ru(n,t){n=ta.lab(n),t=ta.lab(t);var e=n.l,r=n.a,u=n.b,i=t.l-e,o=t.a-r,a=t.b-u;return function(n){return ht(e+i*n,r+o*n,u+a*n)+""}}function Du(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function Pu(n){var t=[n.a,n.b],e=[n.c,n.d],r=ju(t),u=Uu(t,e),i=ju(Fu(e,t,-u))||0;t[0]*e[1]<e[0]*t[1]&&(t[0]*=-1,t[1]*=-1,r*=-1,u*=-1),this.rotate=(r?Math.atan2(t[1],t[0]):Math.atan2(-e[0],e[1]))*Pa,this.translate=[n.e,n.f],this.scale=[r,i],this.skew=i?Math.atan2(u,i)*Pa:0}function Uu(n,t){return n[0]*t[0]+n[1]*t[1]}function ju(n){var t=Math.sqrt(Uu(n,n));return t&&(n[0]/=t,n[1]/=t),t}function Fu(n,t,e){return n[0]+=e*t[0],n[1]+=e*t[1],n}function Hu(n,t){var e,r=[],u=[],i=ta.transform(n),o=ta.transform(t),a=i.translate,c=o.translate,l=i.rotate,s=o.rotate,f=i.skew,h=o.skew,g=i.scale,p=o.scale;return a[0]!=c[0]||a[1]!=c[1]?(r.push("translate(",null,",",null,")"),u.push({i:1,x:vu(a[0],c[0])},{i:3,x:vu(a[1],c[1])})):r.push(c[0]||c[1]?"translate("+c+")":""),l!=s?(l-s>180?s+=360:s-l>180&&(l+=360),u.push({i:r.push(r.pop()+"rotate(",null,")")-2,x:vu(l,s)})):s&&r.push(r.pop()+"rotate("+s+")"),f!=h?u.push({i:r.push(r.pop()+"skewX(",null,")")-2,x:vu(f,h)}):h&&r.push(r.pop()+"skewX("+h+")"),g[0]!=p[0]||g[1]!=p[1]?(e=r.push(r.pop()+"scale(",null,",",null,")"),u.push({i:e-4,x:vu(g[0],p[0])},{i:e-2,x:vu(g[1],p[1])})):(1!=p[0]||1!=p[1])&&r.push(r.pop()+"scale("+p+")"),e=u.length,function(n){for(var t,i=-1;++i<e;)r[(t=u[i]).i]=t.x(n);return r.join("")}}function Ou(n,t){return t=(t-=n=+n)||1/t,function(e){return(e-n)/t}}function Iu(n,t){return t=(t-=n=+n)||1/t,function(e){return Math.max(0,Math.min(1,(e-n)/t))}}function Yu(n){for(var t=n.source,e=n.target,r=Vu(t,e),u=[t];t!==r;)t=t.parent,u.push(t);for(var i=u.length;e!==r;)u.splice(i,0,e),e=e.parent;return u}function Zu(n){for(var t=[],e=n.parent;null!=e;)t.push(n),n=e,e=e.parent;return t.push(n),t}function Vu(n,t){if(n===t)return n;for(var e=Zu(n),r=Zu(t),u=e.pop(),i=r.pop(),o=null;u===i;)o=u,u=e.pop(),i=r.pop();return o}function Xu(n){n.fixed|=2}function $u(n){n.fixed&=-7}function Bu(n){n.fixed|=4,n.px=n.x,n.py=n.y}function Wu(n){n.fixed&=-5}function Ju(n,t,e){var r=0,u=0;if(n.charge=0,!n.leaf)for(var i,o=n.nodes,a=o.length,c=-1;++c<a;)i=o[c],null!=i&&(Ju(i,t,e),n.charge+=i.charge,r+=i.charge*i.cx,u+=i.charge*i.cy);if(n.point){n.leaf||(n.point.x+=Math.random()-.5,n.point.y+=Math.random()-.5);var l=t*e[n.point.index];n.charge+=n.pointCharge=l,r+=l*n.point.x,u+=l*n.point.y}n.cx=r/n.charge,n.cy=u/n.charge}function Gu(n,t){return ta.rebind(n,t,"sort","children","value"),n.nodes=n,n.links=ri,n}function Ku(n,t){for(var e=[n];null!=(n=e.pop());)if(t(n),(u=n.children)&&(r=u.length))for(var r,u;--r>=0;)e.push(u[r])}function Qu(n,t){for(var e=[n],r=[];null!=(n=e.pop());)if(r.push(n),(i=n.children)&&(u=i.length))for(var u,i,o=-1;++o<u;)e.push(i[o]);for(;null!=(n=r.pop());)t(n)}function ni(n){return n.children}function ti(n){return n.value}function ei(n,t){return t.value-n.value}function ri(n){return ta.merge(n.map(function(n){return(n.children||[]).map(function(t){return{source:n,target:t}})}))}function ui(n){return n.x}function ii(n){return n.y}function oi(n,t,e){n.y0=t,n.y=e}function ai(n){return ta.range(n.length)}function ci(n){for(var t=-1,e=n[0].length,r=[];++t<e;)r[t]=0;return r}function li(n){for(var t,e=1,r=0,u=n[0][1],i=n.length;i>e;++e)(t=n[e][1])>u&&(r=e,u=t);return r}function si(n){return n.reduce(fi,0)}function fi(n,t){return n+t[1]}function hi(n,t){return gi(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function gi(n,t){for(var e=-1,r=+n[0],u=(n[1]-r)/t,i=[];++e<=t;)i[e]=u*e+r;return i}function pi(n){return[ta.min(n),ta.max(n)]}function vi(n,t){return n.value-t.value}function di(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function mi(n,t){n._pack_next=t,t._pack_prev=n}function yi(n,t){var e=t.x-n.x,r=t.y-n.y,u=n.r+t.r;return.999*u*u>e*e+r*r}function Mi(n){function t(n){s=Math.min(n.x-n.r,s),f=Math.max(n.x+n.r,f),h=Math.min(n.y-n.r,h),g=Math.max(n.y+n.r,g)}if((e=n.children)&&(l=e.length)){var e,r,u,i,o,a,c,l,s=1/0,f=-1/0,h=1/0,g=-1/0;if(e.forEach(xi),r=e[0],r.x=-r.r,r.y=0,t(r),l>1&&(u=e[1],u.x=u.r,u.y=0,t(u),l>2))for(i=e[2],wi(r,u,i),t(i),di(r,i),r._pack_prev=i,di(i,u),u=r._pack_next,o=3;l>o;o++){wi(r,u,i=e[o]);var p=0,v=1,d=1;for(a=u._pack_next;a!==u;a=a._pack_next,v++)if(yi(a,i)){p=1;break}if(1==p)for(c=r._pack_prev;c!==a._pack_prev&&!yi(c,i);c=c._pack_prev,d++);p?(d>v||v==d&&u.r<r.r?mi(r,u=a):mi(r=c,u),o--):(di(r,i),u=i,t(i))}var m=(s+f)/2,y=(h+g)/2,M=0;for(o=0;l>o;o++)i=e[o],i.x-=m,i.y-=y,M=Math.max(M,i.r+Math.sqrt(i.x*i.x+i.y*i.y));n.r=M,e.forEach(bi)}}function xi(n){n._pack_next=n._pack_prev=n}function bi(n){delete n._pack_next,delete n._pack_prev}function _i(n,t,e,r){var u=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,u)for(var i=-1,o=u.length;++i<o;)_i(u[i],t,e,r)}function wi(n,t,e){var r=n.r+e.r,u=t.x-n.x,i=t.y-n.y;if(r&&(u||i)){var o=t.r+e.r,a=u*u+i*i;o*=o,r*=r;var c=.5+(r-o)/(2*a),l=Math.sqrt(Math.max(0,2*o*(r+a)-(r-=a)*r-o*o))/(2*a);e.x=n.x+c*u+l*i,e.y=n.y+c*i-l*u}else e.x=n.x+r,e.y=n.y}function Si(n,t){return n.parent==t.parent?1:2}function ki(n){var t=n.children;return t.length?t[0]:n.t}function Ei(n){var t,e=n.children;return(t=e.length)?e[t-1]:n.t}function Ai(n,t,e){var r=e/(t.i-n.i);t.c-=r,t.s+=e,n.c+=r,t.z+=e,t.m+=e}function Ni(n){for(var t,e=0,r=0,u=n.children,i=u.length;--i>=0;)t=u[i],t.z+=e,t.m+=e,e+=t.s+(r+=t.c)}function Ci(n,t,e){return n.a.parent===t.parent?n.a:e}function zi(n){return 1+ta.max(n,function(n){return n.y})}function qi(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Li(n){var t=n.children;return t&&t.length?Li(t[0]):n}function Ti(n){var t,e=n.children;return e&&(t=e.length)?Ti(e[t-1]):n}function Ri(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Di(n,t){var e=n.x+t[3],r=n.y+t[0],u=n.dx-t[1]-t[3],i=n.dy-t[0]-t[2];return 0>u&&(e+=u/2,u=0),0>i&&(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function Pi(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Ui(n){return n.rangeExtent?n.rangeExtent():Pi(n.range())}function ji(n,t,e,r){var u=e(n[0],n[1]),i=r(t[0],t[1]);return function(n){return i(u(n))}}function Fi(n,t){var e,r=0,u=n.length-1,i=n[r],o=n[u];return i>o&&(e=r,r=u,u=e,e=i,i=o,o=e),n[r]=t.floor(i),n[u]=t.ceil(o),n}function Hi(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:ml}function Oi(n,t,e,r){var u=[],i=[],o=0,a=Math.min(n.length,t.length)-1;for(n[a]<n[0]&&(n=n.slice().reverse(),t=t.slice().reverse());++o<=a;)u.push(e(n[o-1],n[o])),i.push(r(t[o-1],t[o]));return function(t){var e=ta.bisect(n,t,1,a)-1;return i[e](u[e](t))}}function Ii(n,t,e,r){function u(){var u=Math.min(n.length,t.length)>2?Oi:ji,c=r?Iu:Ou;return o=u(n,t,c,e),a=u(t,n,c,mu),i}function i(n){return o(n)}var o,a;return i.invert=function(n){return a(n)},i.domain=function(t){return arguments.length?(n=t.map(Number),u()):n},i.range=function(n){return arguments.length?(t=n,u()):t},i.rangeRound=function(n){return i.range(n).interpolate(Du)},i.clamp=function(n){return arguments.length?(r=n,u()):r},i.interpolate=function(n){return arguments.length?(e=n,u()):e},i.ticks=function(t){return Xi(n,t)},i.tickFormat=function(t,e){return $i(n,t,e)},i.nice=function(t){return Zi(n,t),u()},i.copy=function(){return Ii(n,t,e,r)},u()}function Yi(n,t){return ta.rebind(n,t,"range","rangeRound","interpolate","clamp")}function Zi(n,t){return Fi(n,Hi(Vi(n,t)[2]))}function Vi(n,t){null==t&&(t=10);var e=Pi(n),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),i=t/r*u;return.15>=i?u*=10:.35>=i?u*=5:.75>=i&&(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function Xi(n,t){return ta.range.apply(ta,Vi(n,t))}function $i(n,t,e){var r=Vi(n,t);if(e){var u=ic.exec(e);if(u.shift(),"s"===u[8]){var i=ta.formatPrefix(Math.max(ga(r[0]),ga(r[1])));return u[7]||(u[7]="."+Bi(i.scale(r[2]))),u[8]="f",e=ta.format(u.join("")),function(n){return e(i.scale(n))+i.symbol}}u[7]||(u[7]="."+Wi(u[8],r)),e=u.join("")}else e=",."+Bi(r[2])+"f";return ta.format(e)}function Bi(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function Wi(n,t){var e=Bi(t[2]);return n in yl?Math.abs(e-Bi(Math.max(ga(t[0]),ga(t[1]))))+ +("e"!==n):e-2*("%"===n)}function Ji(n,t,e,r){function u(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function i(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function o(t){return n(u(t))}return o.invert=function(t){return i(n.invert(t))},o.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(u)),o):r},o.base=function(e){return arguments.length?(t=+e,n.domain(r.map(u)),o):t},o.nice=function(){var t=Fi(r.map(u),e?Math:xl);return n.domain(t),r=t.map(i),o},o.ticks=function(){var n=Pi(r),o=[],a=n[0],c=n[1],l=Math.floor(u(a)),s=Math.ceil(u(c)),f=t%1?2:t;if(isFinite(s-l)){if(e){for(;s>l;l++)for(var h=1;f>h;h++)o.push(i(l)*h);o.push(i(l))}else for(o.push(i(l));l++<s;)for(var h=f-1;h>0;h--)o.push(i(l)*h);for(l=0;o[l]<a;l++);for(s=o.length;o[s-1]>c;s--);o=o.slice(l,s)}return o},o.tickFormat=function(n,t){if(!arguments.length)return Ml;arguments.length<2?t=Ml:"function"!=typeof t&&(t=ta.format(t));var r,a=Math.max(.1,n/o.ticks().length),c=e?(r=1e-12,Math.ceil):(r=-1e-12,Math.floor);return function(n){return n/i(c(u(n)+r))<=a?t(n):""}},o.copy=function(){return Ji(n.copy(),t,e,r)},Yi(o,n)}function Gi(n,t,e){function r(t){return n(u(t))}var u=Ki(t),i=Ki(1/t);return r.invert=function(t){return i(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(u)),r):e},r.ticks=function(n){return Xi(e,n)},r.tickFormat=function(n,t){return $i(e,n,t)},r.nice=function(n){return r.domain(Zi(e,n))},r.exponent=function(o){return arguments.length?(u=Ki(t=o),i=Ki(1/t),n.domain(e.map(u)),r):t},r.copy=function(){return Gi(n.copy(),t,e)},Yi(r,n)}function Ki(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function Qi(n,t){function e(e){return i[((u.get(e)||("range"===t.t?u.set(e,n.push(e)):0/0))-1)%i.length]}function r(t,e){return ta.range(n.length).map(function(n){return t+e*n})}var u,i,o;return e.domain=function(r){if(!arguments.length)return n;n=[],u=new l;for(var i,o=-1,a=r.length;++o<a;)u.has(i=r[o])||u.set(i,n.push(i));return e[t.t].apply(e,t.a)},e.range=function(n){return arguments.length?(i=n,o=0,t={t:"range",a:arguments},e):i},e.rangePoints=function(u,a){arguments.length<2&&(a=0);var c=u[0],l=u[1],s=n.length<2?(c=(c+l)/2,0):(l-c)/(n.length-1+a);return i=r(c+s*a/2,s),o=0,t={t:"rangePoints",a:arguments},e},e.rangeRoundPoints=function(u,a){arguments.length<2&&(a=0);var c=u[0],l=u[1],s=n.length<2?(c=l=Math.round((c+l)/2),0):(l-c)/(n.length-1+a)|0;return i=r(c+Math.round(s*a/2+(l-c-(n.length-1+a)*s)/2),s),o=0,t={t:"rangeRoundPoints",a:arguments},e},e.rangeBands=function(u,a,c){arguments.length<2&&(a=0),arguments.length<3&&(c=a);var l=u[1]<u[0],s=u[l-0],f=u[1-l],h=(f-s)/(n.length-a+2*c);return i=r(s+h*c,h),l&&i.reverse(),o=h*(1-a),t={t:"rangeBands",a:arguments},e},e.rangeRoundBands=function(u,a,c){arguments.length<2&&(a=0),arguments.length<3&&(c=a);var l=u[1]<u[0],s=u[l-0],f=u[1-l],h=Math.floor((f-s)/(n.length-a+2*c));return i=r(s+Math.round((f-s-(n.length-a)*h)/2),h),l&&i.reverse(),o=Math.round(h*(1-a)),t={t:"rangeRoundBands",a:arguments},e},e.rangeBand=function(){return o},e.rangeExtent=function(){return Pi(t.a[0])},e.copy=function(){return Qi(n,t)},e.domain(n)}function no(n,t){function i(){var e=0,r=t.length;for(a=[];++e<r;)a[e-1]=ta.quantile(n,e/r);return o}function o(n){return isNaN(n=+n)?void 0:t[ta.bisect(a,n)]}var a;return o.domain=function(t){return arguments.length?(n=t.map(r).filter(u).sort(e),i()):n},o.range=function(n){return arguments.length?(t=n,i()):t},o.quantiles=function(){return a},o.invertExtent=function(e){return e=t.indexOf(e),0>e?[0/0,0/0]:[e>0?a[e-1]:n[0],e<a.length?a[e]:n[n.length-1]]},o.copy=function(){return no(n,t)},i()}function to(n,t,e){function r(t){return e[Math.max(0,Math.min(o,Math.floor(i*(t-n))))]}function u(){return i=e.length/(t-n),o=e.length-1,r}var i,o;return r.domain=function(e){return arguments.length?(n=+e[0],t=+e[e.length-1],u()):[n,t]},r.range=function(n){return arguments.length?(e=n,u()):e},r.invertExtent=function(t){return t=e.indexOf(t),t=0>t?0/0:t/i+n,[t,t+1/i]},r.copy=function(){return to(n,t,e)},u()}function eo(n,t){function e(e){return e>=e?t[ta.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return eo(n,t)},e}function ro(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return Xi(n,t)},t.tickFormat=function(t,e){return $i(n,t,e)},t.copy=function(){return ro(n)},t}function uo(){return 0}function io(n){return n.innerRadius}function oo(n){return n.outerRadius}function ao(n){return n.startAngle}function co(n){return n.endAngle}function lo(n){return n&&n.padAngle}function so(n,t,e,r){return(n-e)*t-(t-r)*n>0?0:1}function fo(n,t,e,r,u){var i=n[0]-t[0],o=n[1]-t[1],a=(u?r:-r)/Math.sqrt(i*i+o*o),c=a*o,l=-a*i,s=n[0]+c,f=n[1]+l,h=t[0]+c,g=t[1]+l,p=(s+h)/2,v=(f+g)/2,d=h-s,m=g-f,y=d*d+m*m,M=e-r,x=s*g-h*f,b=(0>m?-1:1)*Math.sqrt(M*M*y-x*x),_=(x*m-d*b)/y,w=(-x*d-m*b)/y,S=(x*m+d*b)/y,k=(-x*d+m*b)/y,E=_-p,A=w-v,N=S-p,C=k-v;return E*E+A*A>N*N+C*C&&(_=S,w=k),[[_-c,w-l],[_*e/M,w*e/M]]}function ho(n){function t(t){function o(){l.push("M",i(n(s),a))}for(var c,l=[],s=[],f=-1,h=t.length,g=Et(e),p=Et(r);++f<h;)u.call(this,c=t[f],f)?s.push([+g.call(this,c,f),+p.call(this,c,f)]):s.length&&(o(),s=[]);return s.length&&o(),l.length?l.join(""):null}var e=Ar,r=Nr,u=Ne,i=go,o=i.key,a=.7;return t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t.defined=function(n){return arguments.length?(u=n,t):u},t.interpolate=function(n){return arguments.length?(o="function"==typeof n?i=n:(i=El.get(n)||go).key,t):o},t.tension=function(n){return arguments.length?(a=n,t):a},t}function go(n){return n.join("L")}function po(n){return go(n)+"Z"}function vo(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("H",(r[0]+(r=n[t])[0])/2,"V",r[1]);return e>1&&u.push("H",r[0]),u.join("")}function mo(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("V",(r=n[t])[1],"H",r[0]);return u.join("")}function yo(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("H",(r=n[t])[0],"V",r[1]);return u.join("")}function Mo(n,t){return n.length<4?go(n):n[1]+_o(n.slice(1,-1),wo(n,t))}function xo(n,t){return n.length<3?go(n):n[0]+_o((n.push(n[0]),n),wo([n[n.length-2]].concat(n,[n[1]]),t))}function bo(n,t){return n.length<3?go(n):n[0]+_o(n,wo(n,t))}function _o(n,t){if(t.length<1||n.length!=t.length&&n.length!=t.length+2)return go(n);var e=n.length!=t.length,r="",u=n[0],i=n[1],o=t[0],a=o,c=1;if(e&&(r+="Q"+(i[0]-2*o[0]/3)+","+(i[1]-2*o[1]/3)+","+i[0]+","+i[1],u=n[1],c=2),t.length>1){a=t[1],i=n[c],c++,r+="C"+(u[0]+o[0])+","+(u[1]+o[1])+","+(i[0]-a[0])+","+(i[1]-a[1])+","+i[0]+","+i[1];for(var l=2;l<t.length;l++,c++)i=n[c],a=t[l],r+="S"+(i[0]-a[0])+","+(i[1]-a[1])+","+i[0]+","+i[1]}if(e){var s=n[c];r+="Q"+(i[0]+2*a[0]/3)+","+(i[1]+2*a[1]/3)+","+s[0]+","+s[1]}return r}function wo(n,t){for(var e,r=[],u=(1-t)/2,i=n[0],o=n[1],a=1,c=n.length;++a<c;)e=i,i=o,o=n[a],r.push([u*(o[0]-e[0]),u*(o[1]-e[1])]);return r}function So(n){if(n.length<3)return go(n);var t=1,e=n.length,r=n[0],u=r[0],i=r[1],o=[u,u,u,(r=n[1])[0]],a=[i,i,i,r[1]],c=[u,",",i,"L",No(Cl,o),",",No(Cl,a)];for(n.push(n[e-1]);++t<=e;)r=n[t],o.shift(),o.push(r[0]),a.shift(),a.push(r[1]),Co(c,o,a);return n.pop(),c.push("L",r),c.join("")}function ko(n){if(n.length<4)return go(n);for(var t,e=[],r=-1,u=n.length,i=[0],o=[0];++r<3;)t=n[r],i.push(t[0]),o.push(t[1]);for(e.push(No(Cl,i)+","+No(Cl,o)),--r;++r<u;)t=n[r],i.shift(),i.push(t[0]),o.shift(),o.push(t[1]),Co(e,i,o);return e.join("")}function Eo(n){for(var t,e,r=-1,u=n.length,i=u+4,o=[],a=[];++r<4;)e=n[r%u],o.push(e[0]),a.push(e[1]);for(t=[No(Cl,o),",",No(Cl,a)],--r;++r<i;)e=n[r%u],o.shift(),o.push(e[0]),a.shift(),a.push(e[1]),Co(t,o,a);return t.join("")}function Ao(n,t){var e=n.length-1;if(e)for(var r,u,i=n[0][0],o=n[0][1],a=n[e][0]-i,c=n[e][1]-o,l=-1;++l<=e;)r=n[l],u=l/e,r[0]=t*r[0]+(1-t)*(i+u*a),r[1]=t*r[1]+(1-t)*(o+u*c);return So(n)}function No(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]+n[3]*t[3]}function Co(n,t,e){n.push("C",No(Al,t),",",No(Al,e),",",No(Nl,t),",",No(Nl,e),",",No(Cl,t),",",No(Cl,e))}function zo(n,t){return(t[1]-n[1])/(t[0]-n[0])}function qo(n){for(var t=0,e=n.length-1,r=[],u=n[0],i=n[1],o=r[0]=zo(u,i);++t<e;)r[t]=(o+(o=zo(u=i,i=n[t+1])))/2;return r[t]=o,r}function Lo(n){for(var t,e,r,u,i=[],o=qo(n),a=-1,c=n.length-1;++a<c;)t=zo(n[a],n[a+1]),ga(t)<Ca?o[a]=o[a+1]=0:(e=o[a]/t,r=o[a+1]/t,u=e*e+r*r,u>9&&(u=3*t/Math.sqrt(u),o[a]=u*e,o[a+1]=u*r));for(a=-1;++a<=c;)u=(n[Math.min(c,a+1)][0]-n[Math.max(0,a-1)][0])/(6*(1+o[a]*o[a])),i.push([u||0,o[a]*u||0]);return i}function To(n){return n.length<3?go(n):n[0]+_o(n,Lo(n))}function Ro(n){for(var t,e,r,u=-1,i=n.length;++u<i;)t=n[u],e=t[0],r=t[1]-Ra,t[0]=e*Math.cos(r),t[1]=e*Math.sin(r);return n}function Do(n){function t(t){function c(){v.push("M",a(n(m),f),s,l(n(d.reverse()),f),"Z")}for(var h,g,p,v=[],d=[],m=[],y=-1,M=t.length,x=Et(e),b=Et(u),_=e===r?function(){return g}:Et(r),w=u===i?function(){return p}:Et(i);++y<M;)o.call(this,h=t[y],y)?(d.push([g=+x.call(this,h,y),p=+b.call(this,h,y)]),m.push([+_.call(this,h,y),+w.call(this,h,y)])):d.length&&(c(),d=[],m=[]);return d.length&&c(),v.length?v.join(""):null}var e=Ar,r=Ar,u=0,i=Nr,o=Ne,a=go,c=a.key,l=a,s="L",f=.7;return t.x=function(n){return arguments.length?(e=r=n,t):r},t.x0=function(n){return arguments.length?(e=n,t):e},t.x1=function(n){return arguments.length?(r=n,t):r +},t.y=function(n){return arguments.length?(u=i=n,t):i},t.y0=function(n){return arguments.length?(u=n,t):u},t.y1=function(n){return arguments.length?(i=n,t):i},t.defined=function(n){return arguments.length?(o=n,t):o},t.interpolate=function(n){return arguments.length?(c="function"==typeof n?a=n:(a=El.get(n)||go).key,l=a.reverse||a,s=a.closed?"M":"L",t):c},t.tension=function(n){return arguments.length?(f=n,t):f},t}function Po(n){return n.radius}function Uo(n){return[n.x,n.y]}function jo(n){return function(){var t=n.apply(this,arguments),e=t[0],r=t[1]-Ra;return[e*Math.cos(r),e*Math.sin(r)]}}function Fo(){return 64}function Ho(){return"circle"}function Oo(n){var t=Math.sqrt(n/qa);return"M0,"+t+"A"+t+","+t+" 0 1,1 0,"+-t+"A"+t+","+t+" 0 1,1 0,"+t+"Z"}function Io(n){return function(){var t,e;(t=this[n])&&(e=t[t.active])&&(--t.count?delete t[t.active]:delete this[n],t.active+=.5,e.event&&e.event.interrupt.call(this,this.__data__,e.index))}}function Yo(n,t,e){return ya(n,Pl),n.namespace=t,n.id=e,n}function Zo(n,t,e,r){var u=n.id,i=n.namespace;return Y(n,"function"==typeof e?function(n,o,a){n[i][u].tween.set(t,r(e.call(n,n.__data__,o,a)))}:(e=r(e),function(n){n[i][u].tween.set(t,e)}))}function Vo(n){return null==n&&(n=""),function(){this.textContent=n}}function Xo(n){return null==n?"__transition__":"__transition_"+n+"__"}function $o(n,t,e,r,u){var i=n[e]||(n[e]={active:0,count:0}),o=i[r];if(!o){var a=u.time;o=i[r]={tween:new l,time:a,delay:u.delay,duration:u.duration,ease:u.ease,index:t},u=null,++i.count,ta.timer(function(u){function c(e){if(i.active>r)return s();var u=i[i.active];u&&(--i.count,delete i[i.active],u.event&&u.event.interrupt.call(n,n.__data__,u.index)),i.active=r,o.event&&o.event.start.call(n,n.__data__,t),o.tween.forEach(function(e,r){(r=r.call(n,n.__data__,t))&&v.push(r)}),h=o.ease,f=o.duration,ta.timer(function(){return p.c=l(e||1)?Ne:l,1},0,a)}function l(e){if(i.active!==r)return 1;for(var u=e/f,a=h(u),c=v.length;c>0;)v[--c].call(n,a);return u>=1?(o.event&&o.event.end.call(n,n.__data__,t),s()):void 0}function s(){return--i.count?delete i[r]:delete n[e],1}var f,h,g=o.delay,p=ec,v=[];return p.t=g+a,u>=g?c(u-g):void(p.c=c)},0,a)}}function Bo(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate("+(isFinite(r)?r:e(n))+",0)"})}function Wo(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate(0,"+(isFinite(r)?r:e(n))+")"})}function Jo(n){return n.toISOString()}function Go(n,t,e){function r(t){return n(t)}function u(n,e){var r=n[1]-n[0],u=r/e,i=ta.bisect(Vl,u);return i==Vl.length?[t.year,Vi(n.map(function(n){return n/31536e6}),e)[2]]:i?t[u/Vl[i-1]<Vl[i]/u?i-1:i]:[Bl,Vi(n,e)[2]]}return r.invert=function(t){return Ko(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain(t),r):n.domain().map(Ko)},r.nice=function(n,t){function e(e){return!isNaN(e)&&!n.range(e,Ko(+e+1),t).length}var i=r.domain(),o=Pi(i),a=null==n?u(o,10):"number"==typeof n&&u(o,n);return a&&(n=a[0],t=a[1]),r.domain(Fi(i,t>1?{floor:function(t){for(;e(t=n.floor(t));)t=Ko(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=Ko(+t+1);return t}}:n))},r.ticks=function(n,t){var e=Pi(r.domain()),i=null==n?u(e,10):"number"==typeof n?u(e,n):!n.range&&[{range:n},t];return i&&(n=i[0],t=i[1]),n.range(e[0],Ko(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return Go(n.copy(),t,e)},Yi(r,n)}function Ko(n){return new Date(n)}function Qo(n){return JSON.parse(n.responseText)}function na(n){var t=ua.createRange();return t.selectNode(ua.body),t.createContextualFragment(n.responseText)}var ta={version:"3.5.6"},ea=[].slice,ra=function(n){return ea.call(n)},ua=this.document;if(ua)try{ra(ua.documentElement.childNodes)[0].nodeType}catch(ia){ra=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}if(Date.now||(Date.now=function(){return+new Date}),ua)try{ua.createElement("DIV").style.setProperty("opacity",0,"")}catch(oa){var aa=this.Element.prototype,ca=aa.setAttribute,la=aa.setAttributeNS,sa=this.CSSStyleDeclaration.prototype,fa=sa.setProperty;aa.setAttribute=function(n,t){ca.call(this,n,t+"")},aa.setAttributeNS=function(n,t,e){la.call(this,n,t,e+"")},sa.setProperty=function(n,t,e){fa.call(this,n,t+"",e)}}ta.ascending=e,ta.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:0/0},ta.min=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i;)if(null!=(r=n[u])&&r>=r){e=r;break}for(;++u<i;)null!=(r=n[u])&&e>r&&(e=r)}else{for(;++u<i;)if(null!=(r=t.call(n,n[u],u))&&r>=r){e=r;break}for(;++u<i;)null!=(r=t.call(n,n[u],u))&&e>r&&(e=r)}return e},ta.max=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i;)if(null!=(r=n[u])&&r>=r){e=r;break}for(;++u<i;)null!=(r=n[u])&&r>e&&(e=r)}else{for(;++u<i;)if(null!=(r=t.call(n,n[u],u))&&r>=r){e=r;break}for(;++u<i;)null!=(r=t.call(n,n[u],u))&&r>e&&(e=r)}return e},ta.extent=function(n,t){var e,r,u,i=-1,o=n.length;if(1===arguments.length){for(;++i<o;)if(null!=(r=n[i])&&r>=r){e=u=r;break}for(;++i<o;)null!=(r=n[i])&&(e>r&&(e=r),r>u&&(u=r))}else{for(;++i<o;)if(null!=(r=t.call(n,n[i],i))&&r>=r){e=u=r;break}for(;++i<o;)null!=(r=t.call(n,n[i],i))&&(e>r&&(e=r),r>u&&(u=r))}return[e,u]},ta.sum=function(n,t){var e,r=0,i=n.length,o=-1;if(1===arguments.length)for(;++o<i;)u(e=+n[o])&&(r+=e);else for(;++o<i;)u(e=+t.call(n,n[o],o))&&(r+=e);return r},ta.mean=function(n,t){var e,i=0,o=n.length,a=-1,c=o;if(1===arguments.length)for(;++a<o;)u(e=r(n[a]))?i+=e:--c;else for(;++a<o;)u(e=r(t.call(n,n[a],a)))?i+=e:--c;return c?i/c:void 0},ta.quantile=function(n,t){var e=(n.length-1)*t+1,r=Math.floor(e),u=+n[r-1],i=e-r;return i?u+i*(n[r]-u):u},ta.median=function(n,t){var i,o=[],a=n.length,c=-1;if(1===arguments.length)for(;++c<a;)u(i=r(n[c]))&&o.push(i);else for(;++c<a;)u(i=r(t.call(n,n[c],c)))&&o.push(i);return o.length?ta.quantile(o.sort(e),.5):void 0},ta.variance=function(n,t){var e,i,o=n.length,a=0,c=0,l=-1,s=0;if(1===arguments.length)for(;++l<o;)u(e=r(n[l]))&&(i=e-a,a+=i/++s,c+=i*(e-a));else for(;++l<o;)u(e=r(t.call(n,n[l],l)))&&(i=e-a,a+=i/++s,c+=i*(e-a));return s>1?c/(s-1):void 0},ta.deviation=function(){var n=ta.variance.apply(this,arguments);return n?Math.sqrt(n):n};var ha=i(e);ta.bisectLeft=ha.left,ta.bisect=ta.bisectRight=ha.right,ta.bisector=function(n){return i(1===n.length?function(t,r){return e(n(t),r)}:n)},ta.shuffle=function(n,t,e){(i=arguments.length)<3&&(e=n.length,2>i&&(t=0));for(var r,u,i=e-t;i;)u=Math.random()*i--|0,r=n[i+t],n[i+t]=n[u+t],n[u+t]=r;return n},ta.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},ta.pairs=function(n){for(var t,e=0,r=n.length-1,u=n[0],i=new Array(0>r?0:r);r>e;)i[e]=[t=u,u=n[++e]];return i},ta.zip=function(){if(!(r=arguments.length))return[];for(var n=-1,t=ta.min(arguments,o),e=new Array(t);++n<t;)for(var r,u=-1,i=e[n]=new Array(r);++u<r;)i[u]=arguments[u][n];return e},ta.transpose=function(n){return ta.zip.apply(ta,n)},ta.keys=function(n){var t=[];for(var e in n)t.push(e);return t},ta.values=function(n){var t=[];for(var e in n)t.push(n[e]);return t},ta.entries=function(n){var t=[];for(var e in n)t.push({key:e,value:n[e]});return t},ta.merge=function(n){for(var t,e,r,u=n.length,i=-1,o=0;++i<u;)o+=n[i].length;for(e=new Array(o);--u>=0;)for(r=n[u],t=r.length;--t>=0;)e[--o]=r[t];return e};var ga=Math.abs;ta.range=function(n,t,e){if(arguments.length<3&&(e=1,arguments.length<2&&(t=n,n=0)),(t-n)/e===1/0)throw new Error("infinite range");var r,u=[],i=a(ga(e)),o=-1;if(n*=i,t*=i,e*=i,0>e)for(;(r=n+e*++o)>t;)u.push(r/i);else for(;(r=n+e*++o)<t;)u.push(r/i);return u},ta.map=function(n,t){var e=new l;if(n instanceof l)n.forEach(function(n,t){e.set(n,t)});else if(Array.isArray(n)){var r,u=-1,i=n.length;if(1===arguments.length)for(;++u<i;)e.set(u,n[u]);else for(;++u<i;)e.set(t.call(n,r=n[u],u),r)}else for(var o in n)e.set(o,n[o]);return e};var pa="__proto__",va="\x00";c(l,{has:h,get:function(n){return this._[s(n)]},set:function(n,t){return this._[s(n)]=t},remove:g,keys:p,values:function(){var n=[];for(var t in this._)n.push(this._[t]);return n},entries:function(){var n=[];for(var t in this._)n.push({key:f(t),value:this._[t]});return n},size:v,empty:d,forEach:function(n){for(var t in this._)n.call(this,f(t),this._[t])}}),ta.nest=function(){function n(t,o,a){if(a>=i.length)return r?r.call(u,o):e?o.sort(e):o;for(var c,s,f,h,g=-1,p=o.length,v=i[a++],d=new l;++g<p;)(h=d.get(c=v(s=o[g])))?h.push(s):d.set(c,[s]);return t?(s=t(),f=function(e,r){s.set(e,n(t,r,a))}):(s={},f=function(e,r){s[e]=n(t,r,a)}),d.forEach(f),s}function t(n,e){if(e>=i.length)return n;var r=[],u=o[e++];return n.forEach(function(n,u){r.push({key:n,values:t(u,e)})}),u?r.sort(function(n,t){return u(n.key,t.key)}):r}var e,r,u={},i=[],o=[];return u.map=function(t,e){return n(e,t,0)},u.entries=function(e){return t(n(ta.map,e,0),0)},u.key=function(n){return i.push(n),u},u.sortKeys=function(n){return o[i.length-1]=n,u},u.sortValues=function(n){return e=n,u},u.rollup=function(n){return r=n,u},u},ta.set=function(n){var t=new m;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},c(m,{has:h,add:function(n){return this._[s(n+="")]=!0,n},remove:g,values:p,size:v,empty:d,forEach:function(n){for(var t in this._)n.call(this,f(t))}}),ta.behavior={},ta.rebind=function(n,t){for(var e,r=1,u=arguments.length;++r<u;)n[e=arguments[r]]=M(n,t,t[e]);return n};var da=["webkit","ms","moz","Moz","o","O"];ta.dispatch=function(){for(var n=new _,t=-1,e=arguments.length;++t<e;)n[arguments[t]]=w(n);return n},_.prototype.on=function(n,t){var e=n.indexOf("."),r="";if(e>=0&&(r=n.slice(e+1),n=n.slice(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},ta.event=null,ta.requote=function(n){return n.replace(ma,"\\$&")};var ma=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,ya={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},Ma=function(n,t){return t.querySelector(n)},xa=function(n,t){return t.querySelectorAll(n)},ba=function(n,t){var e=n.matches||n[x(n,"matchesSelector")];return(ba=function(n,t){return e.call(n,t)})(n,t)};"function"==typeof Sizzle&&(Ma=function(n,t){return Sizzle(n,t)[0]||null},xa=Sizzle,ba=Sizzle.matchesSelector),ta.selection=function(){return ta.select(ua.documentElement)};var _a=ta.selection.prototype=[];_a.select=function(n){var t,e,r,u,i=[];n=N(n);for(var o=-1,a=this.length;++o<a;){i.push(t=[]),t.parentNode=(r=this[o]).parentNode;for(var c=-1,l=r.length;++c<l;)(u=r[c])?(t.push(e=n.call(u,u.__data__,c,o)),e&&"__data__"in u&&(e.__data__=u.__data__)):t.push(null)}return A(i)},_a.selectAll=function(n){var t,e,r=[];n=C(n);for(var u=-1,i=this.length;++u<i;)for(var o=this[u],a=-1,c=o.length;++a<c;)(e=o[a])&&(r.push(t=ra(n.call(e,e.__data__,a,u))),t.parentNode=e);return A(r)};var wa={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};ta.ns={prefix:wa,qualify:function(n){var t=n.indexOf(":"),e=n;return t>=0&&(e=n.slice(0,t),n=n.slice(t+1)),wa.hasOwnProperty(e)?{space:wa[e],local:n}:n}},_a.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=ta.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(z(t,n[t]));return this}return this.each(z(n,t))},_a.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=T(n)).length,u=-1;if(t=e.classList){for(;++u<r;)if(!t.contains(n[u]))return!1}else for(t=e.getAttribute("class");++u<r;)if(!L(n[u]).test(t))return!1;return!0}for(t in n)this.each(R(t,n[t]));return this}return this.each(R(n,t))},_a.style=function(n,e,r){var u=arguments.length;if(3>u){if("string"!=typeof n){2>u&&(e="");for(r in n)this.each(P(r,n[r],e));return this}if(2>u){var i=this.node();return t(i).getComputedStyle(i,null).getPropertyValue(n)}r=""}return this.each(P(n,e,r))},_a.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(U(t,n[t]));return this}return this.each(U(n,t))},_a.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},_a.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},_a.append=function(n){return n=j(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},_a.insert=function(n,t){return n=j(n),t=N(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},_a.remove=function(){return this.each(F)},_a.data=function(n,t){function e(n,e){var r,u,i,o=n.length,f=e.length,h=Math.min(o,f),g=new Array(f),p=new Array(f),v=new Array(o);if(t){var d,m=new l,y=new Array(o);for(r=-1;++r<o;)m.has(d=t.call(u=n[r],u.__data__,r))?v[r]=u:m.set(d,u),y[r]=d;for(r=-1;++r<f;)(u=m.get(d=t.call(e,i=e[r],r)))?u!==!0&&(g[r]=u,u.__data__=i):p[r]=H(i),m.set(d,!0);for(r=-1;++r<o;)m.get(y[r])!==!0&&(v[r]=n[r])}else{for(r=-1;++r<h;)u=n[r],i=e[r],u?(u.__data__=i,g[r]=u):p[r]=H(i);for(;f>r;++r)p[r]=H(e[r]);for(;o>r;++r)v[r]=n[r]}p.update=g,p.parentNode=g.parentNode=v.parentNode=n.parentNode,a.push(p),c.push(g),s.push(v)}var r,u,i=-1,o=this.length;if(!arguments.length){for(n=new Array(o=(r=this[0]).length);++i<o;)(u=r[i])&&(n[i]=u.__data__);return n}var a=Z([]),c=A([]),s=A([]);if("function"==typeof n)for(;++i<o;)e(r=this[i],n.call(r,r.parentNode.__data__,i));else for(;++i<o;)e(r=this[i],n);return c.enter=function(){return a},c.exit=function(){return s},c},_a.datum=function(n){return arguments.length?this.property("__data__",n):this.property("__data__")},_a.filter=function(n){var t,e,r,u=[];"function"!=typeof n&&(n=O(n));for(var i=0,o=this.length;o>i;i++){u.push(t=[]),t.parentNode=(e=this[i]).parentNode;for(var a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a,i)&&t.push(r)}return A(u)},_a.order=function(){for(var n=-1,t=this.length;++n<t;)for(var e,r=this[n],u=r.length-1,i=r[u];--u>=0;)(e=r[u])&&(i&&i!==e.nextSibling&&i.parentNode.insertBefore(e,i),i=e);return this},_a.sort=function(n){n=I.apply(this,arguments);for(var t=-1,e=this.length;++t<e;)this[t].sort(n);return this.order()},_a.each=function(n){return Y(this,function(t,e,r){n.call(t,t.__data__,e,r)})},_a.call=function(n){var t=ra(arguments);return n.apply(t[0]=this,t),this},_a.empty=function(){return!this.node()},_a.node=function(){for(var n=0,t=this.length;t>n;n++)for(var e=this[n],r=0,u=e.length;u>r;r++){var i=e[r];if(i)return i}return null},_a.size=function(){var n=0;return Y(this,function(){++n}),n};var Sa=[];ta.selection.enter=Z,ta.selection.enter.prototype=Sa,Sa.append=_a.append,Sa.empty=_a.empty,Sa.node=_a.node,Sa.call=_a.call,Sa.size=_a.size,Sa.select=function(n){for(var t,e,r,u,i,o=[],a=-1,c=this.length;++a<c;){r=(u=this[a]).update,o.push(t=[]),t.parentNode=u.parentNode;for(var l=-1,s=u.length;++l<s;)(i=u[l])?(t.push(r[l]=e=n.call(u.parentNode,i.__data__,l,a)),e.__data__=i.__data__):t.push(null)}return A(o)},Sa.insert=function(n,t){return arguments.length<2&&(t=V(this)),_a.insert.call(this,n,t)},ta.select=function(t){var e;return"string"==typeof t?(e=[Ma(t,ua)],e.parentNode=ua.documentElement):(e=[t],e.parentNode=n(t)),A([e])},ta.selectAll=function(n){var t;return"string"==typeof n?(t=ra(xa(n,ua)),t.parentNode=ua.documentElement):(t=n,t.parentNode=null),A([t])},_a.on=function(n,t,e){var r=arguments.length;if(3>r){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(X(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(X(n,t,e))};var ka=ta.map({mouseenter:"mouseover",mouseleave:"mouseout"});ua&&ka.forEach(function(n){"on"+n in ua&&ka.remove(n)});var Ea,Aa=0;ta.mouse=function(n){return J(n,k())};var Na=this.navigator&&/WebKit/.test(this.navigator.userAgent)?-1:0;ta.touch=function(n,t,e){if(arguments.length<3&&(e=t,t=k().changedTouches),t)for(var r,u=0,i=t.length;i>u;++u)if((r=t[u]).identifier===e)return J(n,r)},ta.behavior.drag=function(){function n(){this.on("mousedown.drag",i).on("touchstart.drag",o)}function e(n,t,e,i,o){return function(){function a(){var n,e,r=t(h,v);r&&(n=r[0]-M[0],e=r[1]-M[1],p|=n|e,M=r,g({type:"drag",x:r[0]+l[0],y:r[1]+l[1],dx:n,dy:e}))}function c(){t(h,v)&&(m.on(i+d,null).on(o+d,null),y(p&&ta.event.target===f),g({type:"dragend"}))}var l,s=this,f=ta.event.target,h=s.parentNode,g=r.of(s,arguments),p=0,v=n(),d=".drag"+(null==v?"":"-"+v),m=ta.select(e(f)).on(i+d,a).on(o+d,c),y=W(f),M=t(h,v);u?(l=u.apply(s,arguments),l=[l.x-M[0],l.y-M[1]]):l=[0,0],g({type:"dragstart"})}}var r=E(n,"drag","dragstart","dragend"),u=null,i=e(b,ta.mouse,t,"mousemove","mouseup"),o=e(G,ta.touch,y,"touchmove","touchend");return n.origin=function(t){return arguments.length?(u=t,n):u},ta.rebind(n,r,"on")},ta.touches=function(n,t){return arguments.length<2&&(t=k().touches),t?ra(t).map(function(t){var e=J(n,t);return e.identifier=t.identifier,e}):[]};var Ca=1e-6,za=Ca*Ca,qa=Math.PI,La=2*qa,Ta=La-Ca,Ra=qa/2,Da=qa/180,Pa=180/qa,Ua=Math.SQRT2,ja=2,Fa=4;ta.interpolateZoom=function(n,t){function e(n){var t=n*y;if(m){var e=rt(v),o=i/(ja*h)*(e*ut(Ua*t+v)-et(v));return[r+o*l,u+o*s,i*e/rt(Ua*t+v)]}return[r+n*l,u+n*s,i*Math.exp(Ua*t)]}var r=n[0],u=n[1],i=n[2],o=t[0],a=t[1],c=t[2],l=o-r,s=a-u,f=l*l+s*s,h=Math.sqrt(f),g=(c*c-i*i+Fa*f)/(2*i*ja*h),p=(c*c-i*i-Fa*f)/(2*c*ja*h),v=Math.log(Math.sqrt(g*g+1)-g),d=Math.log(Math.sqrt(p*p+1)-p),m=d-v,y=(m||Math.log(c/i))/Ua;return e.duration=1e3*y,e},ta.behavior.zoom=function(){function n(n){n.on(q,f).on(Oa+".zoom",g).on("dblclick.zoom",p).on(R,h)}function e(n){return[(n[0]-k.x)/k.k,(n[1]-k.y)/k.k]}function r(n){return[n[0]*k.k+k.x,n[1]*k.k+k.y]}function u(n){k.k=Math.max(N[0],Math.min(N[1],n))}function i(n,t){t=r(t),k.x+=n[0]-t[0],k.y+=n[1]-t[1]}function o(t,e,r,o){t.__chart__={x:k.x,y:k.y,k:k.k},u(Math.pow(2,o)),i(d=e,r),t=ta.select(t),C>0&&(t=t.transition().duration(C)),t.call(n.event)}function a(){b&&b.domain(x.range().map(function(n){return(n-k.x)/k.k}).map(x.invert)),w&&w.domain(_.range().map(function(n){return(n-k.y)/k.k}).map(_.invert))}function c(n){z++||n({type:"zoomstart"})}function l(n){a(),n({type:"zoom",scale:k.k,translate:[k.x,k.y]})}function s(n){--z||(n({type:"zoomend"}),d=null)}function f(){function n(){f=1,i(ta.mouse(u),g),l(a)}function r(){h.on(L,null).on(T,null),p(f&&ta.event.target===o),s(a)}var u=this,o=ta.event.target,a=D.of(u,arguments),f=0,h=ta.select(t(u)).on(L,n).on(T,r),g=e(ta.mouse(u)),p=W(u);Dl.call(u),c(a)}function h(){function n(){var n=ta.touches(p);return g=k.k,n.forEach(function(n){n.identifier in d&&(d[n.identifier]=e(n))}),n}function t(){var t=ta.event.target;ta.select(t).on(x,r).on(b,a),_.push(t);for(var e=ta.event.changedTouches,u=0,i=e.length;i>u;++u)d[e[u].identifier]=null;var c=n(),l=Date.now();if(1===c.length){if(500>l-M){var s=c[0];o(p,s,d[s.identifier],Math.floor(Math.log(k.k)/Math.LN2)+1),S()}M=l}else if(c.length>1){var s=c[0],f=c[1],h=s[0]-f[0],g=s[1]-f[1];m=h*h+g*g}}function r(){var n,t,e,r,o=ta.touches(p);Dl.call(p);for(var a=0,c=o.length;c>a;++a,r=null)if(e=o[a],r=d[e.identifier]){if(t)break;n=e,t=r}if(r){var s=(s=e[0]-n[0])*s+(s=e[1]-n[1])*s,f=m&&Math.sqrt(s/m);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+r[0])/2,(t[1]+r[1])/2],u(f*g)}M=null,i(n,t),l(v)}function a(){if(ta.event.touches.length){for(var t=ta.event.changedTouches,e=0,r=t.length;r>e;++e)delete d[t[e].identifier];for(var u in d)return void n()}ta.selectAll(_).on(y,null),w.on(q,f).on(R,h),E(),s(v)}var g,p=this,v=D.of(p,arguments),d={},m=0,y=".zoom-"+ta.event.changedTouches[0].identifier,x="touchmove"+y,b="touchend"+y,_=[],w=ta.select(p),E=W(p);t(),c(v),w.on(q,null).on(R,t)}function g(){var n=D.of(this,arguments);y?clearTimeout(y):(Dl.call(this),v=e(d=m||ta.mouse(this)),c(n)),y=setTimeout(function(){y=null,s(n)},50),S(),u(Math.pow(2,.002*Ha())*k.k),i(d,v),l(n)}function p(){var n=ta.mouse(this),t=Math.log(k.k)/Math.LN2;o(this,n,e(n),ta.event.shiftKey?Math.ceil(t)-1:Math.floor(t)+1)}var v,d,m,y,M,x,b,_,w,k={x:0,y:0,k:1},A=[960,500],N=Ia,C=250,z=0,q="mousedown.zoom",L="mousemove.zoom",T="mouseup.zoom",R="touchstart.zoom",D=E(n,"zoomstart","zoom","zoomend");return Oa||(Oa="onwheel"in ua?(Ha=function(){return-ta.event.deltaY*(ta.event.deltaMode?120:1)},"wheel"):"onmousewheel"in ua?(Ha=function(){return ta.event.wheelDelta},"mousewheel"):(Ha=function(){return-ta.event.detail},"MozMousePixelScroll")),n.event=function(n){n.each(function(){var n=D.of(this,arguments),t=k;Tl?ta.select(this).transition().each("start.zoom",function(){k=this.__chart__||{x:0,y:0,k:1},c(n)}).tween("zoom:zoom",function(){var e=A[0],r=A[1],u=d?d[0]:e/2,i=d?d[1]:r/2,o=ta.interpolateZoom([(u-k.x)/k.k,(i-k.y)/k.k,e/k.k],[(u-t.x)/t.k,(i-t.y)/t.k,e/t.k]);return function(t){var r=o(t),a=e/r[2];this.__chart__=k={x:u-r[0]*a,y:i-r[1]*a,k:a},l(n)}}).each("interrupt.zoom",function(){s(n)}).each("end.zoom",function(){s(n)}):(this.__chart__=k,c(n),l(n),s(n))})},n.translate=function(t){return arguments.length?(k={x:+t[0],y:+t[1],k:k.k},a(),n):[k.x,k.y]},n.scale=function(t){return arguments.length?(k={x:k.x,y:k.y,k:+t},a(),n):k.k},n.scaleExtent=function(t){return arguments.length?(N=null==t?Ia:[+t[0],+t[1]],n):N},n.center=function(t){return arguments.length?(m=t&&[+t[0],+t[1]],n):m},n.size=function(t){return arguments.length?(A=t&&[+t[0],+t[1]],n):A},n.duration=function(t){return arguments.length?(C=+t,n):C},n.x=function(t){return arguments.length?(b=t,x=t.copy(),k={x:0,y:0,k:1},n):b},n.y=function(t){return arguments.length?(w=t,_=t.copy(),k={x:0,y:0,k:1},n):w},ta.rebind(n,D,"on")};var Ha,Oa,Ia=[0,1/0];ta.color=ot,ot.prototype.toString=function(){return this.rgb()+""},ta.hsl=at;var Ya=at.prototype=new ot;Ya.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),new at(this.h,this.s,this.l/n)},Ya.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new at(this.h,this.s,n*this.l)},Ya.rgb=function(){return ct(this.h,this.s,this.l)},ta.hcl=lt;var Za=lt.prototype=new ot;Za.brighter=function(n){return new lt(this.h,this.c,Math.min(100,this.l+Va*(arguments.length?n:1)))},Za.darker=function(n){return new lt(this.h,this.c,Math.max(0,this.l-Va*(arguments.length?n:1)))},Za.rgb=function(){return st(this.h,this.c,this.l).rgb()},ta.lab=ft;var Va=18,Xa=.95047,$a=1,Ba=1.08883,Wa=ft.prototype=new ot;Wa.brighter=function(n){return new ft(Math.min(100,this.l+Va*(arguments.length?n:1)),this.a,this.b)},Wa.darker=function(n){return new ft(Math.max(0,this.l-Va*(arguments.length?n:1)),this.a,this.b)},Wa.rgb=function(){return ht(this.l,this.a,this.b)},ta.rgb=mt;var Ja=mt.prototype=new ot;Ja.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,u=30;return t||e||r?(t&&u>t&&(t=u),e&&u>e&&(e=u),r&&u>r&&(r=u),new mt(Math.min(255,t/n),Math.min(255,e/n),Math.min(255,r/n))):new mt(u,u,u)},Ja.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new mt(n*this.r,n*this.g,n*this.b)},Ja.hsl=function(){return _t(this.r,this.g,this.b)},Ja.toString=function(){return"#"+xt(this.r)+xt(this.g)+xt(this.b)};var Ga=ta.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});Ga.forEach(function(n,t){Ga.set(n,yt(t))}),ta.functor=Et,ta.xhr=At(y),ta.dsv=function(n,t){function e(n,e,i){arguments.length<3&&(i=e,e=null);var o=Nt(n,t,null==e?r:u(e),i);return o.row=function(n){return arguments.length?o.response(null==(e=n)?r:u(n)):e},o}function r(n){return e.parse(n.responseText)}function u(n){return function(t){return e.parse(t.responseText,n)}}function i(t){return t.map(o).join(n)}function o(n){return a.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var a=new RegExp('["'+n+"\n]"),c=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var u=new Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(u(n),e)}:u})},e.parseRows=function(n,t){function e(){if(s>=l)return o;if(u)return u=!1,i;var t=s;if(34===n.charCodeAt(t)){for(var e=t;e++<l;)if(34===n.charCodeAt(e)){if(34!==n.charCodeAt(e+1))break;++e}s=e+2;var r=n.charCodeAt(e+1);return 13===r?(u=!0,10===n.charCodeAt(e+2)&&++s):10===r&&(u=!0),n.slice(t+1,e).replace(/""/g,'"')}for(;l>s;){var r=n.charCodeAt(s++),a=1;if(10===r)u=!0;else if(13===r)u=!0,10===n.charCodeAt(s)&&(++s,++a);else if(r!==c)continue;return n.slice(t,s-a)}return n.slice(t)}for(var r,u,i={},o={},a=[],l=n.length,s=0,f=0;(r=e())!==o;){for(var h=[];r!==i&&r!==o;)h.push(r),r=e();t&&null==(h=t(h,f++))||a.push(h)}return a},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new m,u=[];return t.forEach(function(n){for(var t in n)r.has(t)||u.push(r.add(t))}),[u.map(o).join(n)].concat(t.map(function(t){return u.map(function(n){return o(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(i).join("\n")},e},ta.csv=ta.dsv(",","text/csv"),ta.tsv=ta.dsv(" ","text/tab-separated-values");var Ka,Qa,nc,tc,ec,rc=this[x(this,"requestAnimationFrame")]||function(n){setTimeout(n,17)};ta.timer=function(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var u=e+t,i={c:n,t:u,f:!1,n:null};Qa?Qa.n=i:Ka=i,Qa=i,nc||(tc=clearTimeout(tc),nc=1,rc(qt))},ta.timer.flush=function(){Lt(),Tt()},ta.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)};var uc=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"].map(Dt);ta.formatPrefix=function(n,t){var e=0;return n&&(0>n&&(n*=-1),t&&(n=ta.round(n,Rt(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((e-1)/3)))),uc[8+e/3]};var ic=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,oc=ta.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=ta.round(n,Rt(n,t))).toFixed(Math.max(0,Math.min(20,Rt(n*(1+1e-15),t))))}}),ac=ta.time={},cc=Date;jt.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){lc.setUTCDate.apply(this._,arguments)},setDay:function(){lc.setUTCDay.apply(this._,arguments)},setFullYear:function(){lc.setUTCFullYear.apply(this._,arguments)},setHours:function(){lc.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){lc.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){lc.setUTCMinutes.apply(this._,arguments)},setMonth:function(){lc.setUTCMonth.apply(this._,arguments)},setSeconds:function(){lc.setUTCSeconds.apply(this._,arguments)},setTime:function(){lc.setTime.apply(this._,arguments)}};var lc=Date.prototype;ac.year=Ft(function(n){return n=ac.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),ac.years=ac.year.range,ac.years.utc=ac.year.utc.range,ac.day=Ft(function(n){var t=new cc(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),ac.days=ac.day.range,ac.days.utc=ac.day.utc.range,ac.dayOfYear=function(n){var t=ac.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(n,t){t=7-t;var e=ac[n]=Ft(function(n){return(n=ac.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=ac.year(n).getDay();return Math.floor((ac.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});ac[n+"s"]=e.range,ac[n+"s"].utc=e.utc.range,ac[n+"OfYear"]=function(n){var e=ac.year(n).getDay();return Math.floor((ac.dayOfYear(n)+(e+t)%7)/7)}}),ac.week=ac.sunday,ac.weeks=ac.sunday.range,ac.weeks.utc=ac.sunday.utc.range,ac.weekOfYear=ac.sundayOfYear;var sc={"-":"",_:" ",0:"0"},fc=/^\s*\d+/,hc=/^%/;ta.locale=function(n){return{numberFormat:Pt(n),timeFormat:Ot(n)}};var gc=ta.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});ta.format=gc.numberFormat,ta.geo={},ce.prototype={s:0,t:0,add:function(n){le(n,this.t,pc),le(pc.s,this.s,this),this.s?this.t+=pc.t:this.s=pc.t +},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var pc=new ce;ta.geo.stream=function(n,t){n&&vc.hasOwnProperty(n.type)?vc[n.type](n,t):se(n,t)};var vc={Feature:function(n,t){se(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,u=e.length;++r<u;)se(e[r].geometry,t)}},dc={Sphere:function(n,t){t.sphere()},Point:function(n,t){n=n.coordinates,t.point(n[0],n[1],n[2])},MultiPoint:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)n=e[r],t.point(n[0],n[1],n[2])},LineString:function(n,t){fe(n.coordinates,t,0)},MultiLineString:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)fe(e[r],t,0)},Polygon:function(n,t){he(n.coordinates,t)},MultiPolygon:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)he(e[r],t)},GeometryCollection:function(n,t){for(var e=n.geometries,r=-1,u=e.length;++r<u;)se(e[r],t)}};ta.geo.area=function(n){return mc=0,ta.geo.stream(n,Mc),mc};var mc,yc=new ce,Mc={sphere:function(){mc+=4*qa},point:b,lineStart:b,lineEnd:b,polygonStart:function(){yc.reset(),Mc.lineStart=ge},polygonEnd:function(){var n=2*yc;mc+=0>n?4*qa+n:n,Mc.lineStart=Mc.lineEnd=Mc.point=b}};ta.geo.bounds=function(){function n(n,t){M.push(x=[s=n,h=n]),f>t&&(f=t),t>g&&(g=t)}function t(t,e){var r=pe([t*Da,e*Da]);if(m){var u=de(m,r),i=[u[1],-u[0],0],o=de(i,u);Me(o),o=xe(o);var c=t-p,l=c>0?1:-1,v=o[0]*Pa*l,d=ga(c)>180;if(d^(v>l*p&&l*t>v)){var y=o[1]*Pa;y>g&&(g=y)}else if(v=(v+360)%360-180,d^(v>l*p&&l*t>v)){var y=-o[1]*Pa;f>y&&(f=y)}else f>e&&(f=e),e>g&&(g=e);d?p>t?a(s,t)>a(s,h)&&(h=t):a(t,h)>a(s,h)&&(s=t):h>=s?(s>t&&(s=t),t>h&&(h=t)):t>p?a(s,t)>a(s,h)&&(h=t):a(t,h)>a(s,h)&&(s=t)}else n(t,e);m=r,p=t}function e(){b.point=t}function r(){x[0]=s,x[1]=h,b.point=n,m=null}function u(n,e){if(m){var r=n-p;y+=ga(r)>180?r+(r>0?360:-360):r}else v=n,d=e;Mc.point(n,e),t(n,e)}function i(){Mc.lineStart()}function o(){u(v,d),Mc.lineEnd(),ga(y)>Ca&&(s=-(h=180)),x[0]=s,x[1]=h,m=null}function a(n,t){return(t-=n)<0?t+360:t}function c(n,t){return n[0]-t[0]}function l(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:n<t[0]||t[1]<n}var s,f,h,g,p,v,d,m,y,M,x,b={point:n,lineStart:e,lineEnd:r,polygonStart:function(){b.point=u,b.lineStart=i,b.lineEnd=o,y=0,Mc.polygonStart()},polygonEnd:function(){Mc.polygonEnd(),b.point=n,b.lineStart=e,b.lineEnd=r,0>yc?(s=-(h=180),f=-(g=90)):y>Ca?g=90:-Ca>y&&(f=-90),x[0]=s,x[1]=h}};return function(n){g=h=-(s=f=1/0),M=[],ta.geo.stream(n,b);var t=M.length;if(t){M.sort(c);for(var e,r=1,u=M[0],i=[u];t>r;++r)e=M[r],l(e[0],u)||l(e[1],u)?(a(u[0],e[1])>a(u[0],u[1])&&(u[1]=e[1]),a(e[0],u[1])>a(u[0],u[1])&&(u[0]=e[0])):i.push(u=e);for(var o,e,p=-1/0,t=i.length-1,r=0,u=i[t];t>=r;u=e,++r)e=i[r],(o=a(u[1],e[0]))>p&&(p=o,s=e[0],h=u[1])}return M=x=null,1/0===s||1/0===f?[[0/0,0/0],[0/0,0/0]]:[[s,f],[h,g]]}}(),ta.geo.centroid=function(n){xc=bc=_c=wc=Sc=kc=Ec=Ac=Nc=Cc=zc=0,ta.geo.stream(n,qc);var t=Nc,e=Cc,r=zc,u=t*t+e*e+r*r;return za>u&&(t=kc,e=Ec,r=Ac,Ca>bc&&(t=_c,e=wc,r=Sc),u=t*t+e*e+r*r,za>u)?[0/0,0/0]:[Math.atan2(e,t)*Pa,tt(r/Math.sqrt(u))*Pa]};var xc,bc,_c,wc,Sc,kc,Ec,Ac,Nc,Cc,zc,qc={sphere:b,point:_e,lineStart:Se,lineEnd:ke,polygonStart:function(){qc.lineStart=Ee},polygonEnd:function(){qc.lineStart=Se}},Lc=Le(Ne,Pe,je,[-qa,-qa/2]),Tc=1e9;ta.geo.clipExtent=function(){var n,t,e,r,u,i,o={stream:function(n){return u&&(u.valid=!1),u=i(n),u.valid=!0,u},extent:function(a){return arguments.length?(i=Ie(n=+a[0][0],t=+a[0][1],e=+a[1][0],r=+a[1][1]),u&&(u.valid=!1,u=null),o):[[n,t],[e,r]]}};return o.extent([[0,0],[960,500]])},(ta.geo.conicEqualArea=function(){return Ye(Ze)}).raw=Ze,ta.geo.albers=function(){return ta.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},ta.geo.albersUsa=function(){function n(n){var i=n[0],o=n[1];return t=null,e(i,o),t||(r(i,o),t)||u(i,o),t}var t,e,r,u,i=ta.geo.albers(),o=ta.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),a=ta.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),c={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=i.scale(),e=i.translate(),r=(n[0]-e[0])/t,u=(n[1]-e[1])/t;return(u>=.12&&.234>u&&r>=-.425&&-.214>r?o:u>=.166&&.234>u&&r>=-.214&&-.115>r?a:i).invert(n)},n.stream=function(n){var t=i.stream(n),e=o.stream(n),r=a.stream(n);return{point:function(n,u){t.point(n,u),e.point(n,u),r.point(n,u)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(i.precision(t),o.precision(t),a.precision(t),n):i.precision()},n.scale=function(t){return arguments.length?(i.scale(t),o.scale(.35*t),a.scale(t),n.translate(i.translate())):i.scale()},n.translate=function(t){if(!arguments.length)return i.translate();var l=i.scale(),s=+t[0],f=+t[1];return e=i.translate(t).clipExtent([[s-.455*l,f-.238*l],[s+.455*l,f+.238*l]]).stream(c).point,r=o.translate([s-.307*l,f+.201*l]).clipExtent([[s-.425*l+Ca,f+.12*l+Ca],[s-.214*l-Ca,f+.234*l-Ca]]).stream(c).point,u=a.translate([s-.205*l,f+.212*l]).clipExtent([[s-.214*l+Ca,f+.166*l+Ca],[s-.115*l-Ca,f+.234*l-Ca]]).stream(c).point,n},n.scale(1070)};var Rc,Dc,Pc,Uc,jc,Fc,Hc={point:b,lineStart:b,lineEnd:b,polygonStart:function(){Dc=0,Hc.lineStart=Ve},polygonEnd:function(){Hc.lineStart=Hc.lineEnd=Hc.point=b,Rc+=ga(Dc/2)}},Oc={point:Xe,lineStart:b,lineEnd:b,polygonStart:b,polygonEnd:b},Ic={point:We,lineStart:Je,lineEnd:Ge,polygonStart:function(){Ic.lineStart=Ke},polygonEnd:function(){Ic.point=We,Ic.lineStart=Je,Ic.lineEnd=Ge}};ta.geo.path=function(){function n(n){return n&&("function"==typeof a&&i.pointRadius(+a.apply(this,arguments)),o&&o.valid||(o=u(i)),ta.geo.stream(n,o)),i.result()}function t(){return o=null,n}var e,r,u,i,o,a=4.5;return n.area=function(n){return Rc=0,ta.geo.stream(n,u(Hc)),Rc},n.centroid=function(n){return _c=wc=Sc=kc=Ec=Ac=Nc=Cc=zc=0,ta.geo.stream(n,u(Ic)),zc?[Nc/zc,Cc/zc]:Ac?[kc/Ac,Ec/Ac]:Sc?[_c/Sc,wc/Sc]:[0/0,0/0]},n.bounds=function(n){return jc=Fc=-(Pc=Uc=1/0),ta.geo.stream(n,u(Oc)),[[Pc,Uc],[jc,Fc]]},n.projection=function(n){return arguments.length?(u=(e=n)?n.stream||tr(n):y,t()):e},n.context=function(n){return arguments.length?(i=null==(r=n)?new $e:new Qe(n),"function"!=typeof a&&i.pointRadius(a),t()):r},n.pointRadius=function(t){return arguments.length?(a="function"==typeof t?t:(i.pointRadius(+t),+t),n):a},n.projection(ta.geo.albersUsa()).context(null)},ta.geo.transform=function(n){return{stream:function(t){var e=new er(t);for(var r in n)e[r]=n[r];return e}}},er.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},ta.geo.projection=ur,ta.geo.projectionMutator=ir,(ta.geo.equirectangular=function(){return ur(ar)}).raw=ar.invert=ar,ta.geo.rotation=function(n){function t(t){return t=n(t[0]*Da,t[1]*Da),t[0]*=Pa,t[1]*=Pa,t}return n=lr(n[0]%360*Da,n[1]*Da,n.length>2?n[2]*Da:0),t.invert=function(t){return t=n.invert(t[0]*Da,t[1]*Da),t[0]*=Pa,t[1]*=Pa,t},t},cr.invert=ar,ta.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=lr(-n[0]*Da,-n[1]*Da,0).invert,u=[];return e(null,null,1,{point:function(n,e){u.push(n=t(n,e)),n[0]*=Pa,n[1]*=Pa}}),{type:"Polygon",coordinates:[u]}}var t,e,r=[0,0],u=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=gr((t=+r)*Da,u*Da),n):t},n.precision=function(r){return arguments.length?(e=gr(t*Da,(u=+r)*Da),n):u},n.angle(90)},ta.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Da,u=n[1]*Da,i=t[1]*Da,o=Math.sin(r),a=Math.cos(r),c=Math.sin(u),l=Math.cos(u),s=Math.sin(i),f=Math.cos(i);return Math.atan2(Math.sqrt((e=f*o)*e+(e=l*s-c*f*a)*e),c*s+l*f*a)},ta.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return ta.range(Math.ceil(i/d)*d,u,d).map(h).concat(ta.range(Math.ceil(l/m)*m,c,m).map(g)).concat(ta.range(Math.ceil(r/p)*p,e,p).filter(function(n){return ga(n%d)>Ca}).map(s)).concat(ta.range(Math.ceil(a/v)*v,o,v).filter(function(n){return ga(n%m)>Ca}).map(f))}var e,r,u,i,o,a,c,l,s,f,h,g,p=10,v=p,d=90,m=360,y=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(i).concat(g(c).slice(1),h(u).reverse().slice(1),g(l).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(i=+t[0][0],u=+t[1][0],l=+t[0][1],c=+t[1][1],i>u&&(t=i,i=u,u=t),l>c&&(t=l,l=c,c=t),n.precision(y)):[[i,l],[u,c]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],a=+t[0][1],o=+t[1][1],r>e&&(t=r,r=e,e=t),a>o&&(t=a,a=o,o=t),n.precision(y)):[[r,a],[e,o]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],m=+t[1],n):[d,m]},n.minorStep=function(t){return arguments.length?(p=+t[0],v=+t[1],n):[p,v]},n.precision=function(t){return arguments.length?(y=+t,s=vr(a,o,90),f=dr(r,e,y),h=vr(l,c,90),g=dr(i,u,y),n):y},n.majorExtent([[-180,-90+Ca],[180,90-Ca]]).minorExtent([[-180,-80-Ca],[180,80+Ca]])},ta.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||u.apply(this,arguments)]}}var t,e,r=mr,u=yr;return n.distance=function(){return ta.geo.distance(t||r.apply(this,arguments),e||u.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(u=t,e="function"==typeof t?null:t,n):u},n.precision=function(){return arguments.length?n:0},n},ta.geo.interpolate=function(n,t){return Mr(n[0]*Da,n[1]*Da,t[0]*Da,t[1]*Da)},ta.geo.length=function(n){return Yc=0,ta.geo.stream(n,Zc),Yc};var Yc,Zc={sphere:b,point:b,lineStart:xr,lineEnd:b,polygonStart:b,polygonEnd:b},Vc=br(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(ta.geo.azimuthalEqualArea=function(){return ur(Vc)}).raw=Vc;var Xc=br(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},y);(ta.geo.azimuthalEquidistant=function(){return ur(Xc)}).raw=Xc,(ta.geo.conicConformal=function(){return Ye(_r)}).raw=_r,(ta.geo.conicEquidistant=function(){return Ye(wr)}).raw=wr;var $c=br(function(n){return 1/n},Math.atan);(ta.geo.gnomonic=function(){return ur($c)}).raw=$c,Sr.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Ra]},(ta.geo.mercator=function(){return kr(Sr)}).raw=Sr;var Bc=br(function(){return 1},Math.asin);(ta.geo.orthographic=function(){return ur(Bc)}).raw=Bc;var Wc=br(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(ta.geo.stereographic=function(){return ur(Wc)}).raw=Wc,Er.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-Ra]},(ta.geo.transverseMercator=function(){var n=kr(Er),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[n[1],-n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length>2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},e([0,0,90])}).raw=Er,ta.geom={},ta.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,u=Et(e),i=Et(r),o=n.length,a=[],c=[];for(t=0;o>t;t++)a.push([+u.call(this,n[t],t),+i.call(this,n[t],t),t]);for(a.sort(zr),t=0;o>t;t++)c.push([a[t][0],-a[t][1]]);var l=Cr(a),s=Cr(c),f=s[0]===l[0],h=s[s.length-1]===l[l.length-1],g=[];for(t=l.length-1;t>=0;--t)g.push(n[a[l[t]][2]]);for(t=+f;t<s.length-h;++t)g.push(n[a[s[t]][2]]);return g}var e=Ar,r=Nr;return arguments.length?t(n):(t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t)},ta.geom.polygon=function(n){return ya(n,Jc),n};var Jc=ta.geom.polygon.prototype=[];Jc.area=function(){for(var n,t=-1,e=this.length,r=this[e-1],u=0;++t<e;)n=r,r=this[t],u+=n[1]*r[0]-n[0]*r[1];return.5*u},Jc.centroid=function(n){var t,e,r=-1,u=this.length,i=0,o=0,a=this[u-1];for(arguments.length||(n=-1/(6*this.area()));++r<u;)t=a,a=this[r],e=t[0]*a[1]-a[0]*t[1],i+=(t[0]+a[0])*e,o+=(t[1]+a[1])*e;return[i*n,o*n]},Jc.clip=function(n){for(var t,e,r,u,i,o,a=Tr(n),c=-1,l=this.length-Tr(this),s=this[l-1];++c<l;){for(t=n.slice(),n.length=0,u=this[c],i=t[(r=t.length-a)-1],e=-1;++e<r;)o=t[e],qr(o,s,u)?(qr(i,s,u)||n.push(Lr(i,o,s,u)),n.push(o)):qr(i,s,u)&&n.push(Lr(i,o,s,u)),i=o;a&&n.push(n[0]),s=u}return n};var Gc,Kc,Qc,nl,tl,el=[],rl=[];Or.prototype.prepare=function(){for(var n,t=this.edges,e=t.length;e--;)n=t[e].edge,n.b&&n.a||t.splice(e,1);return t.sort(Yr),t.length},Qr.prototype={start:function(){return this.edge.l===this.site?this.edge.a:this.edge.b},end:function(){return this.edge.l===this.site?this.edge.b:this.edge.a}},nu.prototype={insert:function(n,t){var e,r,u;if(n){if(t.P=n,t.N=n.N,n.N&&(n.N.P=t),n.N=t,n.R){for(n=n.R;n.L;)n=n.L;n.L=t}else n.R=t;e=n}else this._?(n=uu(this._),t.P=null,t.N=n,n.P=n.L=t,e=n):(t.P=t.N=null,this._=t,e=null);for(t.L=t.R=null,t.U=e,t.C=!0,n=t;e&&e.C;)r=e.U,e===r.L?(u=r.R,u&&u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.R&&(eu(this,e),n=e,e=n.U),e.C=!1,r.C=!0,ru(this,r))):(u=r.L,u&&u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.L&&(ru(this,e),n=e,e=n.U),e.C=!1,r.C=!0,eu(this,r))),e=n.U;this._.C=!1},remove:function(n){n.N&&(n.N.P=n.P),n.P&&(n.P.N=n.N),n.N=n.P=null;var t,e,r,u=n.U,i=n.L,o=n.R;if(e=i?o?uu(o):i:o,u?u.L===n?u.L=e:u.R=e:this._=e,i&&o?(r=e.C,e.C=n.C,e.L=i,i.U=e,e!==o?(u=e.U,e.U=n.U,n=e.R,u.L=n,e.R=o,o.U=e):(e.U=u,u=e,n=e.R)):(r=n.C,n=e),n&&(n.U=u),!r){if(n&&n.C)return void(n.C=!1);do{if(n===this._)break;if(n===u.L){if(t=u.R,t.C&&(t.C=!1,u.C=!0,eu(this,u),t=u.R),t.L&&t.L.C||t.R&&t.R.C){t.R&&t.R.C||(t.L.C=!1,t.C=!0,ru(this,t),t=u.R),t.C=u.C,u.C=t.R.C=!1,eu(this,u),n=this._;break}}else if(t=u.L,t.C&&(t.C=!1,u.C=!0,ru(this,u),t=u.L),t.L&&t.L.C||t.R&&t.R.C){t.L&&t.L.C||(t.R.C=!1,t.C=!0,eu(this,t),t=u.L),t.C=u.C,u.C=t.L.C=!1,ru(this,u),n=this._;break}t.C=!0,n=u,u=u.U}while(!n.C);n&&(n.C=!1)}}},ta.geom.voronoi=function(n){function t(n){var t=new Array(n.length),r=a[0][0],u=a[0][1],i=a[1][0],o=a[1][1];return iu(e(n),a).cells.forEach(function(e,a){var c=e.edges,l=e.site,s=t[a]=c.length?c.map(function(n){var t=n.start();return[t.x,t.y]}):l.x>=r&&l.x<=i&&l.y>=u&&l.y<=o?[[r,o],[i,o],[i,u],[r,u]]:[];s.point=n[a]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(i(n,t)/Ca)*Ca,y:Math.round(o(n,t)/Ca)*Ca,i:t}})}var r=Ar,u=Nr,i=r,o=u,a=ul;return n?t(n):(t.links=function(n){return iu(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return iu(e(n)).cells.forEach(function(e,r){for(var u,i,o=e.site,a=e.edges.sort(Yr),c=-1,l=a.length,s=a[l-1].edge,f=s.l===o?s.r:s.l;++c<l;)u=s,i=f,s=a[c].edge,f=s.l===o?s.r:s.l,r<i.i&&r<f.i&&au(o,i,f)<0&&t.push([n[r],n[i.i],n[f.i]])}),t},t.x=function(n){return arguments.length?(i=Et(r=n),t):r},t.y=function(n){return arguments.length?(o=Et(u=n),t):u},t.clipExtent=function(n){return arguments.length?(a=null==n?ul:n,t):a===ul?null:a},t.size=function(n){return arguments.length?t.clipExtent(n&&[[0,0],n]):a===ul?null:a&&a[1]},t)};var ul=[[-1e6,-1e6],[1e6,1e6]];ta.geom.delaunay=function(n){return ta.geom.voronoi().triangles(n)},ta.geom.quadtree=function(n,t,e,r,u){function i(n){function i(n,t,e,r,u,i,o,a){if(!isNaN(e)&&!isNaN(r))if(n.leaf){var c=n.x,s=n.y;if(null!=c)if(ga(c-e)+ga(s-r)<.01)l(n,t,e,r,u,i,o,a);else{var f=n.point;n.x=n.y=n.point=null,l(n,f,c,s,u,i,o,a),l(n,t,e,r,u,i,o,a)}else n.x=e,n.y=r,n.point=t}else l(n,t,e,r,u,i,o,a)}function l(n,t,e,r,u,o,a,c){var l=.5*(u+a),s=.5*(o+c),f=e>=l,h=r>=s,g=h<<1|f;n.leaf=!1,n=n.nodes[g]||(n.nodes[g]=su()),f?u=l:a=l,h?o=s:c=s,i(n,t,e,r,u,o,a,c)}var s,f,h,g,p,v,d,m,y,M=Et(a),x=Et(c);if(null!=t)v=t,d=e,m=r,y=u;else if(m=y=-(v=d=1/0),f=[],h=[],p=n.length,o)for(g=0;p>g;++g)s=n[g],s.x<v&&(v=s.x),s.y<d&&(d=s.y),s.x>m&&(m=s.x),s.y>y&&(y=s.y),f.push(s.x),h.push(s.y);else for(g=0;p>g;++g){var b=+M(s=n[g],g),_=+x(s,g);v>b&&(v=b),d>_&&(d=_),b>m&&(m=b),_>y&&(y=_),f.push(b),h.push(_)}var w=m-v,S=y-d;w>S?y=d+w:m=v+S;var k=su();if(k.add=function(n){i(k,n,+M(n,++g),+x(n,g),v,d,m,y)},k.visit=function(n){fu(n,k,v,d,m,y)},k.find=function(n){return hu(k,n[0],n[1],v,d,m,y)},g=-1,null==t){for(;++g<p;)i(k,n[g],f[g],h[g],v,d,m,y);--g}else n.forEach(k.add);return f=h=n=s=null,k}var o,a=Ar,c=Nr;return(o=arguments.length)?(a=cu,c=lu,3===o&&(u=e,r=t,e=t=0),i(n)):(i.x=function(n){return arguments.length?(a=n,i):a},i.y=function(n){return arguments.length?(c=n,i):c},i.extent=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=+n[0][0],e=+n[0][1],r=+n[1][0],u=+n[1][1]),i):null==t?null:[[t,e],[r,u]]},i.size=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=e=0,r=+n[0],u=+n[1]),i):null==t?null:[r-t,u-e]},i)},ta.interpolateRgb=gu,ta.interpolateObject=pu,ta.interpolateNumber=vu,ta.interpolateString=du;var il=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,ol=new RegExp(il.source,"g");ta.interpolate=mu,ta.interpolators=[function(n,t){var e=typeof t;return("string"===e?Ga.has(t.toLowerCase())||/^(#|rgb\(|hsl\()/i.test(t)?gu:du:t instanceof ot?gu:Array.isArray(t)?yu:"object"===e&&isNaN(t)?pu:vu)(n,t)}],ta.interpolateArray=yu;var al=function(){return y},cl=ta.map({linear:al,poly:ku,quad:function(){return _u},cubic:function(){return wu},sin:function(){return Eu},exp:function(){return Au},circle:function(){return Nu},elastic:Cu,back:zu,bounce:function(){return qu}}),ll=ta.map({"in":y,out:xu,"in-out":bu,"out-in":function(n){return bu(xu(n))}});ta.ease=function(n){var t=n.indexOf("-"),e=t>=0?n.slice(0,t):n,r=t>=0?n.slice(t+1):"in";return e=cl.get(e)||al,r=ll.get(r)||y,Mu(r(e.apply(null,ea.call(arguments,1))))},ta.interpolateHcl=Lu,ta.interpolateHsl=Tu,ta.interpolateLab=Ru,ta.interpolateRound=Du,ta.transform=function(n){var t=ua.createElementNS(ta.ns.prefix.svg,"g");return(ta.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new Pu(e?e.matrix:sl)})(n)},Pu.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var sl={a:1,b:0,c:0,d:1,e:0,f:0};ta.interpolateTransform=Hu,ta.layout={},ta.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++e<r;)t.push(Yu(n[e]));return t}},ta.layout.chord=function(){function n(){var n,l,f,h,g,p={},v=[],d=ta.range(i),m=[];for(e=[],r=[],n=0,h=-1;++h<i;){for(l=0,g=-1;++g<i;)l+=u[h][g];v.push(l),m.push(ta.range(i)),n+=l}for(o&&d.sort(function(n,t){return o(v[n],v[t])}),a&&m.forEach(function(n,t){n.sort(function(n,e){return a(u[t][n],u[t][e])})}),n=(La-s*i)/n,l=0,h=-1;++h<i;){for(f=l,g=-1;++g<i;){var y=d[h],M=m[y][g],x=u[y][M],b=l,_=l+=x*n;p[y+"-"+M]={index:y,subindex:M,startAngle:b,endAngle:_,value:x}}r[y]={index:y,startAngle:f,endAngle:l,value:(l-f)/n},l+=s}for(h=-1;++h<i;)for(g=h-1;++g<i;){var w=p[h+"-"+g],S=p[g+"-"+h];(w.value||S.value)&&e.push(w.value<S.value?{source:S,target:w}:{source:w,target:S})}c&&t()}function t(){e.sort(function(n,t){return c((n.source.value+n.target.value)/2,(t.source.value+t.target.value)/2)})}var e,r,u,i,o,a,c,l={},s=0;return l.matrix=function(n){return arguments.length?(i=(u=n)&&u.length,e=r=null,l):u},l.padding=function(n){return arguments.length?(s=n,e=r=null,l):s},l.sortGroups=function(n){return arguments.length?(o=n,e=r=null,l):o},l.sortSubgroups=function(n){return arguments.length?(a=n,e=null,l):a},l.sortChords=function(n){return arguments.length?(c=n,e&&t(),l):c},l.chords=function(){return e||n(),e},l.groups=function(){return r||n(),r},l},ta.layout.force=function(){function n(n){return function(t,e,r,u){if(t.point!==n){var i=t.cx-n.x,o=t.cy-n.y,a=u-e,c=i*i+o*o;if(c>a*a/d){if(p>c){var l=t.charge/c;n.px-=i*l,n.py-=o*l}return!0}if(t.point&&c&&p>c){var l=t.pointCharge/c;n.px-=i*l,n.py-=o*l}}return!t.charge}}function t(n){n.px=ta.event.x,n.py=ta.event.y,a.resume()}var e,r,u,i,o,a={},c=ta.dispatch("start","tick","end"),l=[1,1],s=.9,f=fl,h=hl,g=-30,p=gl,v=.1,d=.64,m=[],M=[];return a.tick=function(){if((r*=.99)<.005)return c.end({type:"end",alpha:r=0}),!0;var t,e,a,f,h,p,d,y,x,b=m.length,_=M.length;for(e=0;_>e;++e)a=M[e],f=a.source,h=a.target,y=h.x-f.x,x=h.y-f.y,(p=y*y+x*x)&&(p=r*i[e]*((p=Math.sqrt(p))-u[e])/p,y*=p,x*=p,h.x-=y*(d=f.weight/(h.weight+f.weight)),h.y-=x*d,f.x+=y*(d=1-d),f.y+=x*d);if((d=r*v)&&(y=l[0]/2,x=l[1]/2,e=-1,d))for(;++e<b;)a=m[e],a.x+=(y-a.x)*d,a.y+=(x-a.y)*d;if(g)for(Ju(t=ta.geom.quadtree(m),r,o),e=-1;++e<b;)(a=m[e]).fixed||t.visit(n(a));for(e=-1;++e<b;)a=m[e],a.fixed?(a.x=a.px,a.y=a.py):(a.x-=(a.px-(a.px=a.x))*s,a.y-=(a.py-(a.py=a.y))*s);c.tick({type:"tick",alpha:r})},a.nodes=function(n){return arguments.length?(m=n,a):m},a.links=function(n){return arguments.length?(M=n,a):M},a.size=function(n){return arguments.length?(l=n,a):l},a.linkDistance=function(n){return arguments.length?(f="function"==typeof n?n:+n,a):f},a.distance=a.linkDistance,a.linkStrength=function(n){return arguments.length?(h="function"==typeof n?n:+n,a):h},a.friction=function(n){return arguments.length?(s=+n,a):s},a.charge=function(n){return arguments.length?(g="function"==typeof n?n:+n,a):g},a.chargeDistance=function(n){return arguments.length?(p=n*n,a):Math.sqrt(p)},a.gravity=function(n){return arguments.length?(v=+n,a):v},a.theta=function(n){return arguments.length?(d=n*n,a):Math.sqrt(d)},a.alpha=function(n){return arguments.length?(n=+n,r?r=n>0?n:0:n>0&&(c.start({type:"start",alpha:r=n}),ta.timer(a.tick)),a):r},a.start=function(){function n(n,r){if(!e){for(e=new Array(c),a=0;c>a;++a)e[a]=[];for(a=0;s>a;++a){var u=M[a];e[u.source.index].push(u.target),e[u.target.index].push(u.source)}}for(var i,o=e[t],a=-1,l=o.length;++a<l;)if(!isNaN(i=o[a][n]))return i;return Math.random()*r}var t,e,r,c=m.length,s=M.length,p=l[0],v=l[1];for(t=0;c>t;++t)(r=m[t]).index=t,r.weight=0;for(t=0;s>t;++t)r=M[t],"number"==typeof r.source&&(r.source=m[r.source]),"number"==typeof r.target&&(r.target=m[r.target]),++r.source.weight,++r.target.weight;for(t=0;c>t;++t)r=m[t],isNaN(r.x)&&(r.x=n("x",p)),isNaN(r.y)&&(r.y=n("y",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(u=[],"function"==typeof f)for(t=0;s>t;++t)u[t]=+f.call(this,M[t],t);else for(t=0;s>t;++t)u[t]=f;if(i=[],"function"==typeof h)for(t=0;s>t;++t)i[t]=+h.call(this,M[t],t);else for(t=0;s>t;++t)i[t]=h;if(o=[],"function"==typeof g)for(t=0;c>t;++t)o[t]=+g.call(this,m[t],t);else for(t=0;c>t;++t)o[t]=g;return a.resume()},a.resume=function(){return a.alpha(.1)},a.stop=function(){return a.alpha(0)},a.drag=function(){return e||(e=ta.behavior.drag().origin(y).on("dragstart.force",Xu).on("drag.force",t).on("dragend.force",$u)),arguments.length?void this.on("mouseover.force",Bu).on("mouseout.force",Wu).call(e):e},ta.rebind(a,c,"on")};var fl=20,hl=1,gl=1/0;ta.layout.hierarchy=function(){function n(u){var i,o=[u],a=[];for(u.depth=0;null!=(i=o.pop());)if(a.push(i),(l=e.call(n,i,i.depth))&&(c=l.length)){for(var c,l,s;--c>=0;)o.push(s=l[c]),s.parent=i,s.depth=i.depth+1;r&&(i.value=0),i.children=l}else r&&(i.value=+r.call(n,i,i.depth)||0),delete i.children;return Qu(u,function(n){var e,u;t&&(e=n.children)&&e.sort(t),r&&(u=n.parent)&&(u.value+=n.value)}),a}var t=ei,e=ni,r=ti;return n.sort=function(e){return arguments.length?(t=e,n):t},n.children=function(t){return arguments.length?(e=t,n):e},n.value=function(t){return arguments.length?(r=t,n):r},n.revalue=function(t){return r&&(Ku(t,function(n){n.children&&(n.value=0)}),Qu(t,function(t){var e;t.children||(t.value=+r.call(n,t,t.depth)||0),(e=t.parent)&&(e.value+=t.value)})),t},n},ta.layout.partition=function(){function n(t,e,r,u){var i=t.children;if(t.x=e,t.y=t.depth*u,t.dx=r,t.dy=u,i&&(o=i.length)){var o,a,c,l=-1;for(r=t.value?r/t.value:0;++l<o;)n(a=i[l],e,c=a.value*r,u),e+=c}}function t(n){var e=n.children,r=0;if(e&&(u=e.length))for(var u,i=-1;++i<u;)r=Math.max(r,t(e[i]));return 1+r}function e(e,i){var o=r.call(this,e,i);return n(o[0],0,u[0],u[1]/t(o[0])),o}var r=ta.layout.hierarchy(),u=[1,1];return e.size=function(n){return arguments.length?(u=n,e):u},Gu(e,r)},ta.layout.pie=function(){function n(o){var a,c=o.length,l=o.map(function(e,r){return+t.call(n,e,r)}),s=+("function"==typeof r?r.apply(this,arguments):r),f=("function"==typeof u?u.apply(this,arguments):u)-s,h=Math.min(Math.abs(f)/c,+("function"==typeof i?i.apply(this,arguments):i)),g=h*(0>f?-1:1),p=(f-c*g)/ta.sum(l),v=ta.range(c),d=[];return null!=e&&v.sort(e===pl?function(n,t){return l[t]-l[n]}:function(n,t){return e(o[n],o[t])}),v.forEach(function(n){d[n]={data:o[n],value:a=l[n],startAngle:s,endAngle:s+=a*p+g,padAngle:h}}),d}var t=Number,e=pl,r=0,u=La,i=0;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(u=t,n):u},n.padAngle=function(t){return arguments.length?(i=t,n):i},n};var pl={};ta.layout.stack=function(){function n(a,c){if(!(h=a.length))return a;var l=a.map(function(e,r){return t.call(n,e,r)}),s=l.map(function(t){return t.map(function(t,e){return[i.call(n,t,e),o.call(n,t,e)]})}),f=e.call(n,s,c);l=ta.permute(l,f),s=ta.permute(s,f);var h,g,p,v,d=r.call(n,s,c),m=l[0].length;for(p=0;m>p;++p)for(u.call(n,l[0][p],v=d[p],s[0][p][1]),g=1;h>g;++g)u.call(n,l[g][p],v+=s[g-1][p][1],s[g][p][1]);return a}var t=y,e=ai,r=ci,u=oi,i=ui,o=ii;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:vl.get(t)||ai,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:dl.get(t)||ci,n):r},n.x=function(t){return arguments.length?(i=t,n):i},n.y=function(t){return arguments.length?(o=t,n):o},n.out=function(t){return arguments.length?(u=t,n):u},n};var vl=ta.map({"inside-out":function(n){var t,e,r=n.length,u=n.map(li),i=n.map(si),o=ta.range(r).sort(function(n,t){return u[n]-u[t]}),a=0,c=0,l=[],s=[];for(t=0;r>t;++t)e=o[t],c>a?(a+=i[e],l.push(e)):(c+=i[e],s.push(e));return s.reverse().concat(l)},reverse:function(n){return ta.range(n.length).reverse()},"default":ai}),dl=ta.map({silhouette:function(n){var t,e,r,u=n.length,i=n[0].length,o=[],a=0,c=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];r>a&&(a=r),o.push(r)}for(e=0;i>e;++e)c[e]=(a-o[e])/2;return c},wiggle:function(n){var t,e,r,u,i,o,a,c,l,s=n.length,f=n[0],h=f.length,g=[];for(g[0]=c=l=0,e=1;h>e;++e){for(t=0,u=0;s>t;++t)u+=n[t][e][1];for(t=0,i=0,a=f[e][0]-f[e-1][0];s>t;++t){for(r=0,o=(n[t][e][1]-n[t][e-1][1])/(2*a);t>r;++r)o+=(n[r][e][1]-n[r][e-1][1])/a;i+=o*n[t][e][1]}g[e]=c-=u?i/u*a:0,l>c&&(l=c)}for(e=0;h>e;++e)g[e]-=l;return g},expand:function(n){var t,e,r,u=n.length,i=n[0].length,o=1/u,a=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];if(r)for(t=0;u>t;t++)n[t][e][1]/=r;else for(t=0;u>t;t++)n[t][e][1]=o}for(e=0;i>e;++e)a[e]=0;return a},zero:ci});ta.layout.histogram=function(){function n(n,i){for(var o,a,c=[],l=n.map(e,this),s=r.call(this,l,i),f=u.call(this,s,l,i),i=-1,h=l.length,g=f.length-1,p=t?1:1/h;++i<g;)o=c[i]=[],o.dx=f[i+1]-(o.x=f[i]),o.y=0;if(g>0)for(i=-1;++i<h;)a=l[i],a>=s[0]&&a<=s[1]&&(o=c[ta.bisect(f,a,1,g)-1],o.y+=p,o.push(n[i]));return c}var t=!0,e=Number,r=pi,u=hi;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=Et(t),n):r},n.bins=function(t){return arguments.length?(u="number"==typeof t?function(n){return gi(n,t)}:Et(t),n):u},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},ta.layout.pack=function(){function n(n,i){var o=e.call(this,n,i),a=o[0],c=u[0],l=u[1],s=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(a.x=a.y=0,Qu(a,function(n){n.r=+s(n.value)}),Qu(a,Mi),r){var f=r*(t?1:Math.max(2*a.r/c,2*a.r/l))/2;Qu(a,function(n){n.r+=f}),Qu(a,Mi),Qu(a,function(n){n.r-=f})}return _i(a,c/2,l/2,t?1:1/Math.max(2*a.r/c,2*a.r/l)),o}var t,e=ta.layout.hierarchy().sort(vi),r=0,u=[1,1];return n.size=function(t){return arguments.length?(u=t,n):u},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},Gu(n,e)},ta.layout.tree=function(){function n(n,u){var s=o.call(this,n,u),f=s[0],h=t(f);if(Qu(h,e),h.parent.m=-h.z,Ku(h,r),l)Ku(f,i);else{var g=f,p=f,v=f;Ku(f,function(n){n.x<g.x&&(g=n),n.x>p.x&&(p=n),n.depth>v.depth&&(v=n)});var d=a(g,p)/2-g.x,m=c[0]/(p.x+a(p,g)/2+d),y=c[1]/(v.depth||1);Ku(f,function(n){n.x=(n.x+d)*m,n.y=n.depth*y})}return s}function t(n){for(var t,e={A:null,children:[n]},r=[e];null!=(t=r.pop());)for(var u,i=t.children,o=0,a=i.length;a>o;++o)r.push((i[o]=u={_:i[o],parent:t,children:(u=i[o].children)&&u.slice()||[],A:null,a:null,z:0,m:0,c:0,s:0,t:null,i:o}).a=u);return e.children[0]}function e(n){var t=n.children,e=n.parent.children,r=n.i?e[n.i-1]:null;if(t.length){Ni(n);var i=(t[0].z+t[t.length-1].z)/2;r?(n.z=r.z+a(n._,r._),n.m=n.z-i):n.z=i}else r&&(n.z=r.z+a(n._,r._));n.parent.A=u(n,r,n.parent.A||e[0])}function r(n){n._.x=n.z+n.parent.m,n.m+=n.parent.m}function u(n,t,e){if(t){for(var r,u=n,i=n,o=t,c=u.parent.children[0],l=u.m,s=i.m,f=o.m,h=c.m;o=Ei(o),u=ki(u),o&&u;)c=ki(c),i=Ei(i),i.a=n,r=o.z+f-u.z-l+a(o._,u._),r>0&&(Ai(Ci(o,n,e),n,r),l+=r,s+=r),f+=o.m,l+=u.m,h+=c.m,s+=i.m;o&&!Ei(i)&&(i.t=o,i.m+=f-s),u&&!ki(c)&&(c.t=u,c.m+=l-h,e=n)}return e}function i(n){n.x*=c[0],n.y=n.depth*c[1]}var o=ta.layout.hierarchy().sort(null).value(null),a=Si,c=[1,1],l=null;return n.separation=function(t){return arguments.length?(a=t,n):a},n.size=function(t){return arguments.length?(l=null==(c=t)?i:null,n):l?null:c},n.nodeSize=function(t){return arguments.length?(l=null==(c=t)?null:i,n):l?c:null},Gu(n,o)},ta.layout.cluster=function(){function n(n,i){var o,a=t.call(this,n,i),c=a[0],l=0;Qu(c,function(n){var t=n.children;t&&t.length?(n.x=qi(t),n.y=zi(t)):(n.x=o?l+=e(n,o):0,n.y=0,o=n)});var s=Li(c),f=Ti(c),h=s.x-e(s,f)/2,g=f.x+e(f,s)/2;return Qu(c,u?function(n){n.x=(n.x-c.x)*r[0],n.y=(c.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(g-h)*r[0],n.y=(1-(c.y?n.y/c.y:1))*r[1]}),a}var t=ta.layout.hierarchy().sort(null).value(null),e=Si,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},Gu(n,t)},ta.layout.treemap=function(){function n(n,t){for(var e,r,u=-1,i=n.length;++u<i;)r=(e=n[u]).value*(0>t?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var i=e.children;if(i&&i.length){var o,a,c,l=f(e),s=[],h=i.slice(),p=1/0,v="slice"===g?l.dx:"dice"===g?l.dy:"slice-dice"===g?1&e.depth?l.dy:l.dx:Math.min(l.dx,l.dy);for(n(h,l.dx*l.dy/e.value),s.area=0;(c=h.length)>0;)s.push(o=h[c-1]),s.area+=o.area,"squarify"!==g||(a=r(s,v))<=p?(h.pop(),p=a):(s.area-=s.pop().area,u(s,v,l,!1),v=Math.min(l.dx,l.dy),s.length=s.area=0,p=1/0);s.length&&(u(s,v,l,!0),s.length=s.area=0),i.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var i,o=f(t),a=r.slice(),c=[];for(n(a,o.dx*o.dy/t.value),c.area=0;i=a.pop();)c.push(i),c.area+=i.area,null!=i.z&&(u(c,i.z?o.dx:o.dy,o,!a.length),c.length=c.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,u=0,i=1/0,o=-1,a=n.length;++o<a;)(e=n[o].area)&&(i>e&&(i=e),e>u&&(u=e));return r*=r,t*=t,r?Math.max(t*u*p/r,r/(t*i*p)):1/0}function u(n,t,e,r){var u,i=-1,o=n.length,a=e.x,l=e.y,s=t?c(n.area/t):0;if(t==e.dx){for((r||s>e.dy)&&(s=e.dy);++i<o;)u=n[i],u.x=a,u.y=l,u.dy=s,a+=u.dx=Math.min(e.x+e.dx-a,s?c(u.area/s):0);u.z=!0,u.dx+=e.x+e.dx-a,e.y+=s,e.dy-=s}else{for((r||s>e.dx)&&(s=e.dx);++i<o;)u=n[i],u.x=a,u.y=l,u.dx=s,l+=u.dy=Math.min(e.y+e.dy-l,s?c(u.area/s):0);u.z=!1,u.dy+=e.y+e.dy-l,e.x+=s,e.dx-=s}}function i(r){var u=o||a(r),i=u[0];return i.x=0,i.y=0,i.dx=l[0],i.dy=l[1],o&&a.revalue(i),n([i],i.dx*i.dy/i.value),(o?e:t)(i),h&&(o=u),u}var o,a=ta.layout.hierarchy(),c=Math.round,l=[1,1],s=null,f=Ri,h=!1,g="squarify",p=.5*(1+Math.sqrt(5)); +return i.size=function(n){return arguments.length?(l=n,i):l},i.padding=function(n){function t(t){var e=n.call(i,t,t.depth);return null==e?Ri(t):Di(t,"number"==typeof e?[e,e,e,e]:e)}function e(t){return Di(t,n)}if(!arguments.length)return s;var r;return f=null==(s=n)?Ri:"function"==(r=typeof n)?t:"number"===r?(n=[n,n,n,n],e):e,i},i.round=function(n){return arguments.length?(c=n?Math.round:Number,i):c!=Number},i.sticky=function(n){return arguments.length?(h=n,o=null,i):h},i.ratio=function(n){return arguments.length?(p=n,i):p},i.mode=function(n){return arguments.length?(g=n+"",i):g},Gu(i,a)},ta.random={normal:function(n,t){var e=arguments.length;return 2>e&&(t=1),1>e&&(n=0),function(){var e,r,u;do e=2*Math.random()-1,r=2*Math.random()-1,u=e*e+r*r;while(!u||u>1);return n+t*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(){var n=ta.random.normal.apply(ta,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=ta.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t}}},ta.scale={};var ml={floor:y,ceil:y};ta.scale.linear=function(){return Ii([0,1],[0,1],mu,!1)};var yl={s:1,g:1,p:1,r:1,e:1};ta.scale.log=function(){return Ji(ta.scale.linear().domain([0,1]),10,!0,[1,10])};var Ml=ta.format(".0e"),xl={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};ta.scale.pow=function(){return Gi(ta.scale.linear(),1,[0,1])},ta.scale.sqrt=function(){return ta.scale.pow().exponent(.5)},ta.scale.ordinal=function(){return Qi([],{t:"range",a:[[]]})},ta.scale.category10=function(){return ta.scale.ordinal().range(bl)},ta.scale.category20=function(){return ta.scale.ordinal().range(_l)},ta.scale.category20b=function(){return ta.scale.ordinal().range(wl)},ta.scale.category20c=function(){return ta.scale.ordinal().range(Sl)};var bl=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(Mt),_l=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(Mt),wl=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(Mt),Sl=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(Mt);ta.scale.quantile=function(){return no([],[])},ta.scale.quantize=function(){return to(0,1,[0,1])},ta.scale.threshold=function(){return eo([.5],[0,1])},ta.scale.identity=function(){return ro([0,1])},ta.svg={},ta.svg.arc=function(){function n(){var n=Math.max(0,+e.apply(this,arguments)),l=Math.max(0,+r.apply(this,arguments)),s=o.apply(this,arguments)-Ra,f=a.apply(this,arguments)-Ra,h=Math.abs(f-s),g=s>f?0:1;if(n>l&&(p=l,l=n,n=p),h>=Ta)return t(l,g)+(n?t(n,1-g):"")+"Z";var p,v,d,m,y,M,x,b,_,w,S,k,E=0,A=0,N=[];if((m=(+c.apply(this,arguments)||0)/2)&&(d=i===kl?Math.sqrt(n*n+l*l):+i.apply(this,arguments),g||(A*=-1),l&&(A=tt(d/l*Math.sin(m))),n&&(E=tt(d/n*Math.sin(m)))),l){y=l*Math.cos(s+A),M=l*Math.sin(s+A),x=l*Math.cos(f-A),b=l*Math.sin(f-A);var C=Math.abs(f-s-2*A)<=qa?0:1;if(A&&so(y,M,x,b)===g^C){var z=(s+f)/2;y=l*Math.cos(z),M=l*Math.sin(z),x=b=null}}else y=M=0;if(n){_=n*Math.cos(f-E),w=n*Math.sin(f-E),S=n*Math.cos(s+E),k=n*Math.sin(s+E);var q=Math.abs(s-f+2*E)<=qa?0:1;if(E&&so(_,w,S,k)===1-g^q){var L=(s+f)/2;_=n*Math.cos(L),w=n*Math.sin(L),S=k=null}}else _=w=0;if((p=Math.min(Math.abs(l-n)/2,+u.apply(this,arguments)))>.001){v=l>n^g?0:1;var T=null==S?[_,w]:null==x?[y,M]:Lr([y,M],[S,k],[x,b],[_,w]),R=y-T[0],D=M-T[1],P=x-T[0],U=b-T[1],j=1/Math.sin(Math.acos((R*P+D*U)/(Math.sqrt(R*R+D*D)*Math.sqrt(P*P+U*U)))/2),F=Math.sqrt(T[0]*T[0]+T[1]*T[1]);if(null!=x){var H=Math.min(p,(l-F)/(j+1)),O=fo(null==S?[_,w]:[S,k],[y,M],l,H,g),I=fo([x,b],[_,w],l,H,g);p===H?N.push("M",O[0],"A",H,",",H," 0 0,",v," ",O[1],"A",l,",",l," 0 ",1-g^so(O[1][0],O[1][1],I[1][0],I[1][1]),",",g," ",I[1],"A",H,",",H," 0 0,",v," ",I[0]):N.push("M",O[0],"A",H,",",H," 0 1,",v," ",I[0])}else N.push("M",y,",",M);if(null!=S){var Y=Math.min(p,(n-F)/(j-1)),Z=fo([y,M],[S,k],n,-Y,g),V=fo([_,w],null==x?[y,M]:[x,b],n,-Y,g);p===Y?N.push("L",V[0],"A",Y,",",Y," 0 0,",v," ",V[1],"A",n,",",n," 0 ",g^so(V[1][0],V[1][1],Z[1][0],Z[1][1]),",",1-g," ",Z[1],"A",Y,",",Y," 0 0,",v," ",Z[0]):N.push("L",V[0],"A",Y,",",Y," 0 0,",v," ",Z[0])}else N.push("L",_,",",w)}else N.push("M",y,",",M),null!=x&&N.push("A",l,",",l," 0 ",C,",",g," ",x,",",b),N.push("L",_,",",w),null!=S&&N.push("A",n,",",n," 0 ",q,",",1-g," ",S,",",k);return N.push("Z"),N.join("")}function t(n,t){return"M0,"+n+"A"+n+","+n+" 0 1,"+t+" 0,"+-n+"A"+n+","+n+" 0 1,"+t+" 0,"+n}var e=io,r=oo,u=uo,i=kl,o=ao,a=co,c=lo;return n.innerRadius=function(t){return arguments.length?(e=Et(t),n):e},n.outerRadius=function(t){return arguments.length?(r=Et(t),n):r},n.cornerRadius=function(t){return arguments.length?(u=Et(t),n):u},n.padRadius=function(t){return arguments.length?(i=t==kl?kl:Et(t),n):i},n.startAngle=function(t){return arguments.length?(o=Et(t),n):o},n.endAngle=function(t){return arguments.length?(a=Et(t),n):a},n.padAngle=function(t){return arguments.length?(c=Et(t),n):c},n.centroid=function(){var n=(+e.apply(this,arguments)+ +r.apply(this,arguments))/2,t=(+o.apply(this,arguments)+ +a.apply(this,arguments))/2-Ra;return[Math.cos(t)*n,Math.sin(t)*n]},n};var kl="auto";ta.svg.line=function(){return ho(y)};var El=ta.map({linear:go,"linear-closed":po,step:vo,"step-before":mo,"step-after":yo,basis:So,"basis-open":ko,"basis-closed":Eo,bundle:Ao,cardinal:bo,"cardinal-open":Mo,"cardinal-closed":xo,monotone:To});El.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var Al=[0,2/3,1/3,0],Nl=[0,1/3,2/3,0],Cl=[0,1/6,2/3,1/6];ta.svg.line.radial=function(){var n=ho(Ro);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},mo.reverse=yo,yo.reverse=mo,ta.svg.area=function(){return Do(y)},ta.svg.area.radial=function(){var n=Do(Ro);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},ta.svg.chord=function(){function n(n,a){var c=t(this,i,n,a),l=t(this,o,n,a);return"M"+c.p0+r(c.r,c.p1,c.a1-c.a0)+(e(c,l)?u(c.r,c.p1,c.r,c.p0):u(c.r,c.p1,l.r,l.p0)+r(l.r,l.p1,l.a1-l.a0)+u(l.r,l.p1,c.r,c.p0))+"Z"}function t(n,t,e,r){var u=t.call(n,e,r),i=a.call(n,u,r),o=c.call(n,u,r)-Ra,s=l.call(n,u,r)-Ra;return{r:i,a0:o,a1:s,p0:[i*Math.cos(o),i*Math.sin(o)],p1:[i*Math.cos(s),i*Math.sin(s)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>qa)+",1 "+t}function u(n,t,e,r){return"Q 0,0 "+r}var i=mr,o=yr,a=Po,c=ao,l=co;return n.radius=function(t){return arguments.length?(a=Et(t),n):a},n.source=function(t){return arguments.length?(i=Et(t),n):i},n.target=function(t){return arguments.length?(o=Et(t),n):o},n.startAngle=function(t){return arguments.length?(c=Et(t),n):c},n.endAngle=function(t){return arguments.length?(l=Et(t),n):l},n},ta.svg.diagonal=function(){function n(n,u){var i=t.call(this,n,u),o=e.call(this,n,u),a=(i.y+o.y)/2,c=[i,{x:i.x,y:a},{x:o.x,y:a},o];return c=c.map(r),"M"+c[0]+"C"+c[1]+" "+c[2]+" "+c[3]}var t=mr,e=yr,r=Uo;return n.source=function(e){return arguments.length?(t=Et(e),n):t},n.target=function(t){return arguments.length?(e=Et(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},ta.svg.diagonal.radial=function(){var n=ta.svg.diagonal(),t=Uo,e=n.projection;return n.projection=function(n){return arguments.length?e(jo(t=n)):t},n},ta.svg.symbol=function(){function n(n,r){return(zl.get(t.call(this,n,r))||Oo)(e.call(this,n,r))}var t=Ho,e=Fo;return n.type=function(e){return arguments.length?(t=Et(e),n):t},n.size=function(t){return arguments.length?(e=Et(t),n):e},n};var zl=ta.map({circle:Oo,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*Ll)),e=t*Ll;return"M0,"+-t+"L"+e+",0 0,"+t+" "+-e+",0Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/ql),e=t*ql/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/ql),e=t*ql/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});ta.svg.symbolTypes=zl.keys();var ql=Math.sqrt(3),Ll=Math.tan(30*Da);_a.transition=function(n){for(var t,e,r=Tl||++Ul,u=Xo(n),i=[],o=Rl||{time:Date.now(),ease:Su,delay:0,duration:250},a=-1,c=this.length;++a<c;){i.push(t=[]);for(var l=this[a],s=-1,f=l.length;++s<f;)(e=l[s])&&$o(e,s,u,r,o),t.push(e)}return Yo(i,u,r)},_a.interrupt=function(n){return this.each(null==n?Dl:Io(Xo(n)))};var Tl,Rl,Dl=Io(Xo()),Pl=[],Ul=0;Pl.call=_a.call,Pl.empty=_a.empty,Pl.node=_a.node,Pl.size=_a.size,ta.transition=function(n,t){return n&&n.transition?Tl?n.transition(t):n:ta.selection().transition(n)},ta.transition.prototype=Pl,Pl.select=function(n){var t,e,r,u=this.id,i=this.namespace,o=[];n=N(n);for(var a=-1,c=this.length;++a<c;){o.push(t=[]);for(var l=this[a],s=-1,f=l.length;++s<f;)(r=l[s])&&(e=n.call(r,r.__data__,s,a))?("__data__"in r&&(e.__data__=r.__data__),$o(e,s,i,u,r[i][u]),t.push(e)):t.push(null)}return Yo(o,i,u)},Pl.selectAll=function(n){var t,e,r,u,i,o=this.id,a=this.namespace,c=[];n=C(n);for(var l=-1,s=this.length;++l<s;)for(var f=this[l],h=-1,g=f.length;++h<g;)if(r=f[h]){i=r[a][o],e=n.call(r,r.__data__,h,l),c.push(t=[]);for(var p=-1,v=e.length;++p<v;)(u=e[p])&&$o(u,p,a,o,i),t.push(u)}return Yo(c,a,o)},Pl.filter=function(n){var t,e,r,u=[];"function"!=typeof n&&(n=O(n));for(var i=0,o=this.length;o>i;i++){u.push(t=[]);for(var e=this[i],a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a,i)&&t.push(r)}return Yo(u,this.namespace,this.id)},Pl.tween=function(n,t){var e=this.id,r=this.namespace;return arguments.length<2?this.node()[r][e].tween.get(n):Y(this,null==t?function(t){t[r][e].tween.remove(n)}:function(u){u[r][e].tween.set(n,t)})},Pl.attr=function(n,t){function e(){this.removeAttribute(a)}function r(){this.removeAttributeNS(a.space,a.local)}function u(n){return null==n?e:(n+="",function(){var t,e=this.getAttribute(a);return e!==n&&(t=o(e,n),function(n){this.setAttribute(a,t(n))})})}function i(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(a.space,a.local);return e!==n&&(t=o(e,n),function(n){this.setAttributeNS(a.space,a.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var o="transform"==n?Hu:mu,a=ta.ns.qualify(n);return Zo(this,"attr."+n,t,a.local?i:u)},Pl.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(u));return r&&function(n){this.setAttribute(u,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(u.space,u.local));return r&&function(n){this.setAttributeNS(u.space,u.local,r(n))}}var u=ta.ns.qualify(n);return this.tween("attr."+n,u.local?r:e)},Pl.style=function(n,e,r){function u(){this.style.removeProperty(n)}function i(e){return null==e?u:(e+="",function(){var u,i=t(this).getComputedStyle(this,null).getPropertyValue(n);return i!==e&&(u=mu(i,e),function(t){this.style.setProperty(n,u(t),r)})})}var o=arguments.length;if(3>o){if("string"!=typeof n){2>o&&(e="");for(r in n)this.style(r,n[r],e);return this}r=""}return Zo(this,"style."+n,e,i)},Pl.styleTween=function(n,e,r){function u(u,i){var o=e.call(this,u,i,t(this).getComputedStyle(this,null).getPropertyValue(n));return o&&function(t){this.style.setProperty(n,o(t),r)}}return arguments.length<3&&(r=""),this.tween("style."+n,u)},Pl.text=function(n){return Zo(this,"text",n,Vo)},Pl.remove=function(){var n=this.namespace;return this.each("end.transition",function(){var t;this[n].count<2&&(t=this.parentNode)&&t.removeChild(this)})},Pl.ease=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].ease:("function"!=typeof n&&(n=ta.ease.apply(ta,arguments)),Y(this,function(r){r[e][t].ease=n}))},Pl.delay=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].delay:Y(this,"function"==typeof n?function(r,u,i){r[e][t].delay=+n.call(r,r.__data__,u,i)}:(n=+n,function(r){r[e][t].delay=n}))},Pl.duration=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].duration:Y(this,"function"==typeof n?function(r,u,i){r[e][t].duration=Math.max(1,n.call(r,r.__data__,u,i))}:(n=Math.max(1,n),function(r){r[e][t].duration=n}))},Pl.each=function(n,t){var e=this.id,r=this.namespace;if(arguments.length<2){var u=Rl,i=Tl;try{Tl=e,Y(this,function(t,u,i){Rl=t[r][e],n.call(t,t.__data__,u,i)})}finally{Rl=u,Tl=i}}else Y(this,function(u){var i=u[r][e];(i.event||(i.event=ta.dispatch("start","end","interrupt"))).on(n,t)});return this},Pl.transition=function(){for(var n,t,e,r,u=this.id,i=++Ul,o=this.namespace,a=[],c=0,l=this.length;l>c;c++){a.push(n=[]);for(var t=this[c],s=0,f=t.length;f>s;s++)(e=t[s])&&(r=e[o][u],$o(e,s,o,i,{time:r.time,ease:r.ease,delay:r.delay+r.duration,duration:r.duration})),n.push(e)}return Yo(a,o,i)},ta.svg.axis=function(){function n(n){n.each(function(){var n,l=ta.select(this),s=this.__chart__||e,f=this.__chart__=e.copy(),h=null==c?f.ticks?f.ticks.apply(f,a):f.domain():c,g=null==t?f.tickFormat?f.tickFormat.apply(f,a):y:t,p=l.selectAll(".tick").data(h,f),v=p.enter().insert("g",".domain").attr("class","tick").style("opacity",Ca),d=ta.transition(p.exit()).style("opacity",Ca).remove(),m=ta.transition(p.order()).style("opacity",1),M=Math.max(u,0)+o,x=Ui(f),b=l.selectAll(".domain").data([0]),_=(b.enter().append("path").attr("class","domain"),ta.transition(b));v.append("line"),v.append("text");var w,S,k,E,A=v.select("line"),N=m.select("line"),C=p.select("text").text(g),z=v.select("text"),q=m.select("text"),L="top"===r||"left"===r?-1:1;if("bottom"===r||"top"===r?(n=Bo,w="x",k="y",S="x2",E="y2",C.attr("dy",0>L?"0em":".71em").style("text-anchor","middle"),_.attr("d","M"+x[0]+","+L*i+"V0H"+x[1]+"V"+L*i)):(n=Wo,w="y",k="x",S="y2",E="x2",C.attr("dy",".32em").style("text-anchor",0>L?"end":"start"),_.attr("d","M"+L*i+","+x[0]+"H0V"+x[1]+"H"+L*i)),A.attr(E,L*u),z.attr(k,L*M),N.attr(S,0).attr(E,L*u),q.attr(w,0).attr(k,L*M),f.rangeBand){var T=f,R=T.rangeBand()/2;s=f=function(n){return T(n)+R}}else s.rangeBand?s=f:d.call(n,f,s);v.call(n,s,f),m.call(n,f,f)})}var t,e=ta.scale.linear(),r=jl,u=6,i=6,o=3,a=[10],c=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in Fl?t+"":jl,n):r},n.ticks=function(){return arguments.length?(a=arguments,n):a},n.tickValues=function(t){return arguments.length?(c=t,n):c},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(u=+t,i=+arguments[e-1],n):u},n.innerTickSize=function(t){return arguments.length?(u=+t,n):u},n.outerTickSize=function(t){return arguments.length?(i=+t,n):i},n.tickPadding=function(t){return arguments.length?(o=+t,n):o},n.tickSubdivide=function(){return arguments.length&&n},n};var jl="bottom",Fl={top:1,right:1,bottom:1,left:1};ta.svg.brush=function(){function n(t){t.each(function(){var t=ta.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",i).on("touchstart.brush",i),o=t.selectAll(".background").data([0]);o.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),t.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var a=t.selectAll(".resize").data(v,y);a.exit().remove(),a.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return Hl[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),a.style("display",n.empty()?"none":null);var c,f=ta.transition(t),h=ta.transition(o);l&&(c=Ui(l),h.attr("x",c[0]).attr("width",c[1]-c[0]),r(f)),s&&(c=Ui(s),h.attr("y",c[0]).attr("height",c[1]-c[0]),u(f)),e(f)})}function e(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+f[+/e$/.test(n)]+","+h[+/^s/.test(n)]+")"})}function r(n){n.select(".extent").attr("x",f[0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",f[1]-f[0])}function u(n){n.select(".extent").attr("y",h[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",h[1]-h[0])}function i(){function i(){32==ta.event.keyCode&&(C||(M=null,q[0]-=f[1],q[1]-=h[1],C=2),S())}function v(){32==ta.event.keyCode&&2==C&&(q[0]+=f[1],q[1]+=h[1],C=0,S())}function d(){var n=ta.mouse(b),t=!1;x&&(n[0]+=x[0],n[1]+=x[1]),C||(ta.event.altKey?(M||(M=[(f[0]+f[1])/2,(h[0]+h[1])/2]),q[0]=f[+(n[0]<M[0])],q[1]=h[+(n[1]<M[1])]):M=null),A&&m(n,l,0)&&(r(k),t=!0),N&&m(n,s,1)&&(u(k),t=!0),t&&(e(k),w({type:"brush",mode:C?"move":"resize"}))}function m(n,t,e){var r,u,i=Ui(t),c=i[0],l=i[1],s=q[e],v=e?h:f,d=v[1]-v[0];return C&&(c-=s,l-=d+s),r=(e?p:g)?Math.max(c,Math.min(l,n[e])):n[e],C?u=(r+=s)+d:(M&&(s=Math.max(c,Math.min(l,2*M[e]-r))),r>s?(u=r,r=s):u=s),v[0]!=r||v[1]!=u?(e?a=null:o=null,v[0]=r,v[1]=u,!0):void 0}function y(){d(),k.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),ta.select("body").style("cursor",null),L.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),z(),w({type:"brushend"})}var M,x,b=this,_=ta.select(ta.event.target),w=c.of(b,arguments),k=ta.select(b),E=_.datum(),A=!/^(n|s)$/.test(E)&&l,N=!/^(e|w)$/.test(E)&&s,C=_.classed("extent"),z=W(b),q=ta.mouse(b),L=ta.select(t(b)).on("keydown.brush",i).on("keyup.brush",v);if(ta.event.changedTouches?L.on("touchmove.brush",d).on("touchend.brush",y):L.on("mousemove.brush",d).on("mouseup.brush",y),k.interrupt().selectAll("*").interrupt(),C)q[0]=f[0]-q[0],q[1]=h[0]-q[1];else if(E){var T=+/w$/.test(E),R=+/^n/.test(E);x=[f[1-T]-q[0],h[1-R]-q[1]],q[0]=f[T],q[1]=h[R]}else ta.event.altKey&&(M=q.slice());k.style("pointer-events","none").selectAll(".resize").style("display",null),ta.select("body").style("cursor",_.style("cursor")),w({type:"brushstart"}),d()}var o,a,c=E(n,"brushstart","brush","brushend"),l=null,s=null,f=[0,0],h=[0,0],g=!0,p=!0,v=Ol[0];return n.event=function(n){n.each(function(){var n=c.of(this,arguments),t={x:f,y:h,i:o,j:a},e=this.__chart__||t;this.__chart__=t,Tl?ta.select(this).transition().each("start.brush",function(){o=e.i,a=e.j,f=e.x,h=e.y,n({type:"brushstart"})}).tween("brush:brush",function(){var e=yu(f,t.x),r=yu(h,t.y);return o=a=null,function(u){f=t.x=e(u),h=t.y=r(u),n({type:"brush",mode:"resize"})}}).each("end.brush",function(){o=t.i,a=t.j,n({type:"brush",mode:"resize"}),n({type:"brushend"})}):(n({type:"brushstart"}),n({type:"brush",mode:"resize"}),n({type:"brushend"}))})},n.x=function(t){return arguments.length?(l=t,v=Ol[!l<<1|!s],n):l},n.y=function(t){return arguments.length?(s=t,v=Ol[!l<<1|!s],n):s},n.clamp=function(t){return arguments.length?(l&&s?(g=!!t[0],p=!!t[1]):l?g=!!t:s&&(p=!!t),n):l&&s?[g,p]:l?g:s?p:null},n.extent=function(t){var e,r,u,i,c;return arguments.length?(l&&(e=t[0],r=t[1],s&&(e=e[0],r=r[0]),o=[e,r],l.invert&&(e=l(e),r=l(r)),e>r&&(c=e,e=r,r=c),(e!=f[0]||r!=f[1])&&(f=[e,r])),s&&(u=t[0],i=t[1],l&&(u=u[1],i=i[1]),a=[u,i],s.invert&&(u=s(u),i=s(i)),u>i&&(c=u,u=i,i=c),(u!=h[0]||i!=h[1])&&(h=[u,i])),n):(l&&(o?(e=o[0],r=o[1]):(e=f[0],r=f[1],l.invert&&(e=l.invert(e),r=l.invert(r)),e>r&&(c=e,e=r,r=c))),s&&(a?(u=a[0],i=a[1]):(u=h[0],i=h[1],s.invert&&(u=s.invert(u),i=s.invert(i)),u>i&&(c=u,u=i,i=c))),l&&s?[[e,u],[r,i]]:l?[e,r]:s&&[u,i])},n.clear=function(){return n.empty()||(f=[0,0],h=[0,0],o=a=null),n},n.empty=function(){return!!l&&f[0]==f[1]||!!s&&h[0]==h[1]},ta.rebind(n,c,"on")};var Hl={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Ol=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Il=ac.format=gc.timeFormat,Yl=Il.utc,Zl=Yl("%Y-%m-%dT%H:%M:%S.%LZ");Il.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?Jo:Zl,Jo.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},Jo.toString=Zl.toString,ac.second=Ft(function(n){return new cc(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),ac.seconds=ac.second.range,ac.seconds.utc=ac.second.utc.range,ac.minute=Ft(function(n){return new cc(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),ac.minutes=ac.minute.range,ac.minutes.utc=ac.minute.utc.range,ac.hour=Ft(function(n){var t=n.getTimezoneOffset()/60;return new cc(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),ac.hours=ac.hour.range,ac.hours.utc=ac.hour.utc.range,ac.month=Ft(function(n){return n=ac.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),ac.months=ac.month.range,ac.months.utc=ac.month.utc.range;var Vl=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Xl=[[ac.second,1],[ac.second,5],[ac.second,15],[ac.second,30],[ac.minute,1],[ac.minute,5],[ac.minute,15],[ac.minute,30],[ac.hour,1],[ac.hour,3],[ac.hour,6],[ac.hour,12],[ac.day,1],[ac.day,2],[ac.week,1],[ac.month,1],[ac.month,3],[ac.year,1]],$l=Il.multi([[".%L",function(n){return n.getMilliseconds()}],[":%S",function(n){return n.getSeconds()}],["%I:%M",function(n){return n.getMinutes()}],["%I %p",function(n){return n.getHours()}],["%a %d",function(n){return n.getDay()&&1!=n.getDate()}],["%b %d",function(n){return 1!=n.getDate()}],["%B",function(n){return n.getMonth()}],["%Y",Ne]]),Bl={range:function(n,t,e){return ta.range(Math.ceil(n/e)*e,+t,e).map(Ko)},floor:y,ceil:y};Xl.year=ac.year,ac.scale=function(){return Go(ta.scale.linear(),Xl,$l)};var Wl=Xl.map(function(n){return[n[0].utc,n[1]]}),Jl=Yl.multi([[".%L",function(n){return n.getUTCMilliseconds()}],[":%S",function(n){return n.getUTCSeconds()}],["%I:%M",function(n){return n.getUTCMinutes()}],["%I %p",function(n){return n.getUTCHours()}],["%a %d",function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],["%b %d",function(n){return 1!=n.getUTCDate()}],["%B",function(n){return n.getUTCMonth()}],["%Y",Ne]]);Wl.year=ac.year.utc,ac.scale.utc=function(){return Go(ta.scale.linear(),Wl,Jl)},ta.text=At(function(n){return n.responseText}),ta.json=function(n,t){return Nt(n,"application/json",Qo,t)},ta.html=function(n,t){return Nt(n,"text/html",na,t)},ta.xml=At(function(n){return n.responseXML}),"function"==typeof define&&define.amd?define(ta):"object"==typeof module&&module.exports&&(module.exports=ta),this.d3=ta}(); \ No newline at end of file diff --git a/goaccess++/resources/js/d3.v3.min.js.tmp b/goaccess++/resources/js/d3.v3.min.js.tmp new file mode 100644 index 0000000..e0383a1 --- /dev/null +++ b/goaccess++/resources/js/d3.v3.min.js.tmp @@ -0,0 +1 @@ +!function(){function n(n){return n&&(n.ownerDocument||n.document||n).documentElement}function t(n){return n&&(n.ownerDocument&&n.ownerDocument.defaultView||n.document&&n||n.defaultView)}function e(n,t){return t>n?-1:n>t?1:n>=t?0:0/0}function r(n){return null===n?0/0:+n}function u(n){return!isNaN(n)}function i(n){return{left:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)<0?r=i+1:u=i}return r},right:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)>0?u=i:r=i+1}return r}}}function o(n){return n.length}function a(n){for(var t=1;n*t%1;)t*=10;return t}function c(n,t){for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}function l(){this._=Object.create(null)}function s(n){return(n+="")===pa||n[0]===va?va+n:n}function f(n){return(n+="")[0]===va?n.slice(1):n}function h(n){return s(n)in this._}function g(n){return(n=s(n))in this._&&delete this._[n]}function p(){var n=[];for(var t in this._)n.push(f(t));return n}function v(){var n=0;for(var t in this._)++n;return n}function d(){for(var n in this._)return!1;return!0}function m(){this._=Object.create(null)}function y(n){return n}function M(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function x(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(var e=0,r=da.length;r>e;++e){var u=da[e]+t;if(u in n)return u}}function b(){}function _(){}function w(n){function t(){for(var t,r=e,u=-1,i=r.length;++u<i;)(t=r[u].on)&&t.apply(this,arguments);return n}var e=[],r=new l;return t.on=function(t,u){var i,o=r.get(t);return arguments.length<2?o&&o.on:(o&&(o.on=null,e=e.slice(0,i=e.indexOf(o)).concat(e.slice(i+1)),r.remove(t)),u&&e.push(r.set(t,{on:u})),n)},t}function S(){ta.event.preventDefault()}function k(){for(var n,t=ta.event;n=t.sourceEvent;)t=n;return t}function E(n){for(var t=new _,e=0,r=arguments.length;++e<r;)t[arguments[e]]=w(t);return t.of=function(e,r){return function(u){try{var i=u.sourceEvent=ta.event;u.target=n,ta.event=u,t[u.type].apply(e,r)}finally{ta.event=i}}},t}function A(n){return ya(n,_a),n}function N(n){return"function"==typeof n?n:function(){return Ma(n,this)}}function C(n){return"function"==typeof n?n:function(){return xa(n,this)}}function z(n,t){function e(){this.removeAttribute(n)}function r(){this.removeAttributeNS(n.space,n.local)}function u(){this.setAttribute(n,t)}function i(){this.setAttributeNS(n.space,n.local,t)}function o(){var e=t.apply(this,arguments);null==e?this.removeAttribute(n):this.setAttribute(n,e)}function a(){var e=t.apply(this,arguments);null==e?this.removeAttributeNS(n.space,n.local):this.setAttributeNS(n.space,n.local,e)}return n=ta.ns.qualify(n),null==t?n.local?r:e:"function"==typeof t?n.local?a:o:n.local?i:u}function q(n){return n.trim().replace(/\s+/g," ")}function L(n){return new RegExp("(?:^|\\s+)"+ta.requote(n)+"(?:\\s+|$)","g")}function T(n){return(n+"").trim().split(/^|\s+/)}function R(n,t){function e(){for(var e=-1;++e<u;)n[e](this,t)}function r(){for(var e=-1,r=t.apply(this,arguments);++e<u;)n[e](this,r)}n=T(n).map(D);var u=n.length;return"function"==typeof t?r:e}function D(n){var t=L(n);return function(e,r){if(u=e.classList)return r?u.add(n):u.remove(n);var u=e.getAttribute("class")||"";r?(t.lastIndex=0,t.test(u)||e.setAttribute("class",q(u+" "+n))):e.setAttribute("class",q(u.replace(t," ")))}}function P(n,t,e){function r(){this.style.removeProperty(n)}function u(){this.style.setProperty(n,t,e)}function i(){var r=t.apply(this,arguments);null==r?this.style.removeProperty(n):this.style.setProperty(n,r,e)}return null==t?r:"function"==typeof t?i:u}function U(n,t){function e(){delete this[n]}function r(){this[n]=t}function u(){var e=t.apply(this,arguments);null==e?delete this[n]:this[n]=e}return null==t?e:"function"==typeof t?u:r}function j(n){function t(){var t=this.ownerDocument,e=this.namespaceURI;return e?t.createElementNS(e,n):t.createElement(n)}function e(){return this.ownerDocument.createElementNS(n.space,n.local)}return"function"==typeof n?n:(n=ta.ns.qualify(n)).local?e:t}function F(){var n=this.parentNode;n&&n.removeChild(this)}function H(n){return{__data__:n}}function O(n){return function(){return ba(this,n)}}function I(n){return arguments.length||(n=e),function(t,e){return t&&e?n(t.__data__,e.__data__):!t-!e}}function Y(n,t){for(var e=0,r=n.length;r>e;e++)for(var u,i=n[e],o=0,a=i.length;a>o;o++)(u=i[o])&&t(u,o,e);return n}function Z(n){return ya(n,Sa),n}function V(n){var t,e;return function(r,u,i){var o,a=n[i].update,c=a.length;for(i!=e&&(e=i,t=0),u>=t&&(t=u+1);!(o=a[t])&&++t<c;);return o}}function X(n,t,e){function r(){var t=this[o];t&&(this.removeEventListener(n,t,t.$),delete this[o])}function u(){var u=c(t,ra(arguments));r.call(this),this.addEventListener(n,this[o]=u,u.$=e),u._=t}function i(){var t,e=new RegExp("^__on([^.]+)"+ta.requote(n)+"$");for(var r in this)if(t=r.match(e)){var u=this[r];this.removeEventListener(t[1],u,u.$),delete this[r]}}var o="__on"+n,a=n.indexOf("."),c=$;a>0&&(n=n.slice(0,a));var l=ka.get(n);return l&&(n=l,c=B),a?t?u:r:t?b:i}function $(n,t){return function(e){var r=ta.event;ta.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{ta.event=r}}}function B(n,t){var e=$(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function W(e){var r=".dragsuppress-"+ ++Aa,u="click"+r,i=ta.select(t(e)).on("touchmove"+r,S).on("dragstart"+r,S).on("selectstart"+r,S);if(null==Ea&&(Ea="onselectstart"in e?!1:x(e.style,"userSelect")),Ea){var o=n(e).style,a=o[Ea];o[Ea]="none"}return function(n){if(i.on(r,null),Ea&&(o[Ea]=a),n){var t=function(){i.on(u,null)};i.on(u,function(){S(),t()},!0),setTimeout(t,0)}}}function J(n,e){e.changedTouches&&(e=e.changedTouches[0]);var r=n.ownerSVGElement||n;if(r.createSVGPoint){var u=r.createSVGPoint();if(0>Na){var i=t(n);if(i.scrollX||i.scrollY){r=ta.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var o=r[0][0].getScreenCTM();Na=!(o.f||o.e),r.remove()}}return Na?(u.x=e.pageX,u.y=e.pageY):(u.x=e.clientX,u.y=e.clientY),u=u.matrixTransform(n.getScreenCTM().inverse()),[u.x,u.y]}var a=n.getBoundingClientRect();return[e.clientX-a.left-n.clientLeft,e.clientY-a.top-n.clientTop]}function G(){return ta.event.changedTouches[0].identifier}function K(n){return n>0?1:0>n?-1:0}function Q(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function nt(n){return n>1?0:-1>n?qa:Math.acos(n)}function tt(n){return n>1?Ra:-1>n?-Ra:Math.asin(n)}function et(n){return((n=Math.exp(n))-1/n)/2}function rt(n){return((n=Math.exp(n))+1/n)/2}function ut(n){return((n=Math.exp(2*n))-1)/(n+1)}function it(n){return(n=Math.sin(n/2))*n}function ot(){}function at(n,t,e){return this instanceof at?(this.h=+n,this.s=+t,void(this.l=+e)):arguments.length<2?n instanceof at?new at(n.h,n.s,n.l):bt(""+n,_t,at):new at(n,t,e)}function ct(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?i+(o-i)*n/60:180>n?o:240>n?i+(o-i)*(240-n)/60:i}function u(n){return Math.round(255*r(n))}var i,o;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,o=.5>=e?e*(1+t):e+t-e*t,i=2*e-o,new mt(u(n+120),u(n),u(n-120))}function lt(n,t,e){return this instanceof lt?(this.h=+n,this.c=+t,void(this.l=+e)):arguments.length<2?n instanceof lt?new lt(n.h,n.c,n.l):n instanceof ft?gt(n.l,n.a,n.b):gt((n=wt((n=ta.rgb(n)).r,n.g,n.b)).l,n.a,n.b):new lt(n,t,e)}function st(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),new ft(e,Math.cos(n*=Da)*t,Math.sin(n)*t)}function ft(n,t,e){return this instanceof ft?(this.l=+n,this.a=+t,void(this.b=+e)):arguments.length<2?n instanceof ft?new ft(n.l,n.a,n.b):n instanceof lt?st(n.h,n.c,n.l):wt((n=mt(n)).r,n.g,n.b):new ft(n,t,e)}function ht(n,t,e){var r=(n+16)/116,u=r+t/500,i=r-e/200;return u=pt(u)*Xa,r=pt(r)*$a,i=pt(i)*Ba,new mt(dt(3.2404542*u-1.5371385*r-.4985314*i),dt(-.969266*u+1.8760108*r+.041556*i),dt(.0556434*u-.2040259*r+1.0572252*i))}function gt(n,t,e){return n>0?new lt(Math.atan2(e,t)*Pa,Math.sqrt(t*t+e*e),n):new lt(0/0,0/0,n)}function pt(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function vt(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function dt(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function mt(n,t,e){return this instanceof mt?(this.r=~~n,this.g=~~t,void(this.b=~~e)):arguments.length<2?n instanceof mt?new mt(n.r,n.g,n.b):bt(""+n,mt,ct):new mt(n,t,e)}function yt(n){return new mt(n>>16,n>>8&255,255&n)}function Mt(n){return yt(n)+""}function xt(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function bt(n,t,e){var r,u,i,o=0,a=0,c=0;if(r=/([a-z]+)\((.*)\)/.exec(n=n.toLowerCase()))switch(u=r[2].split(","),r[1]){case"hsl":return e(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case"rgb":return t(kt(u[0]),kt(u[1]),kt(u[2]))}return(i=Ga.get(n))?t(i.r,i.g,i.b):(null==n||"#"!==n.charAt(0)||isNaN(i=parseInt(n.slice(1),16))||(4===n.length?(o=(3840&i)>>4,o=o>>4|o,a=240&i,a=a>>4|a,c=15&i,c=c<<4|c):7===n.length&&(o=(16711680&i)>>16,a=(65280&i)>>8,c=255&i)),t(o,a,c))}function _t(n,t,e){var r,u,i=Math.min(n/=255,t/=255,e/=255),o=Math.max(n,t,e),a=o-i,c=(o+i)/2;return a?(u=.5>c?a/(o+i):a/(2-o-i),r=n==o?(t-e)/a+(e>t?6:0):t==o?(e-n)/a+2:(n-t)/a+4,r*=60):(r=0/0,u=c>0&&1>c?0:r),new at(r,u,c)}function wt(n,t,e){n=St(n),t=St(t),e=St(e);var r=vt((.4124564*n+.3575761*t+.1804375*e)/Xa),u=vt((.2126729*n+.7151522*t+.072175*e)/$a),i=vt((.0193339*n+.119192*t+.9503041*e)/Ba);return ft(116*u-16,500*(r-u),200*(u-i))}function St(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function kt(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function Et(n){return"function"==typeof n?n:function(){return n}}function At(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),Nt(t,e,n,r)}}function Nt(n,t,e,r){function u(){var n,t=c.status;if(!t&&zt(c)||t>=200&&300>t||304===t){try{n=e.call(i,c)}catch(r){return void o.error.call(i,r)}o.load.call(i,n)}else o.error.call(i,c)}var i={},o=ta.dispatch("beforesend","progress","load","error"),a={},c=new XMLHttpRequest,l=null;return!this.XDomainRequest||"withCredentials"in c||!/^(http(s)?:)?\/\//.test(n)||(c=new XDomainRequest),"onload"in c?c.onload=c.onerror=u:c.onreadystatechange=function(){c.readyState>3&&u()},c.onprogress=function(n){var t=ta.event;ta.event=n;try{o.progress.call(i,c)}finally{ta.event=t}},i.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?a[n]:(null==t?delete a[n]:a[n]=t+"",i)},i.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",i):t},i.responseType=function(n){return arguments.length?(l=n,i):l},i.response=function(n){return e=n,i},["get","post"].forEach(function(n){i[n]=function(){return i.send.apply(i,[n].concat(ra(arguments)))}}),i.send=function(e,r,u){if(2===arguments.length&&"function"==typeof r&&(u=r,r=null),c.open(e,n,!0),null==t||"accept"in a||(a.accept=t+",*/*"),c.setRequestHeader)for(var s in a)c.setRequestHeader(s,a[s]);return null!=t&&c.overrideMimeType&&c.overrideMimeType(t),null!=l&&(c.responseType=l),null!=u&&i.on("error",u).on("load",function(n){u(null,n)}),o.beforesend.call(i,c),c.send(null==r?null:r),i},i.abort=function(){return c.abort(),i},ta.rebind(i,o,"on"),null==r?i:i.get(Ct(r))}function Ct(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function zt(n){var t=n.responseType;return t&&"text"!==t?n.response:n.responseText}function qt(){var n=Lt(),t=Tt()-n;t>24?(isFinite(t)&&(clearTimeout(tc),tc=setTimeout(qt,t)),nc=0):(nc=1,rc(qt))}function Lt(){var n=Date.now();for(ec=Ka;ec;)n>=ec.t&&(ec.f=ec.c(n-ec.t)),ec=ec.n;return n}function Tt(){for(var n,t=Ka,e=1/0;t;)t.f?t=n?n.n=t.n:Ka=t.n:(t.t<e&&(e=t.t),t=(n=t).n);return Qa=n,e}function Rt(n,t){return t-(n?Math.ceil(Math.log(n)/Math.LN10):1)}function Dt(n,t){var e=Math.pow(10,3*ga(8-t));return{scale:t>8?function(n){return n/e}:function(n){return n*e},symbol:n}}function Pt(n){var t=n.decimal,e=n.thousands,r=n.grouping,u=n.currency,i=r&&e?function(n,t){for(var u=n.length,i=[],o=0,a=r[0],c=0;u>0&&a>0&&(c+a+1>t&&(a=Math.max(1,t-c)),i.push(n.substring(u-=a,u+a)),!((c+=a+1)>t));)a=r[o=(o+1)%r.length];return i.reverse().join(e)}:y;return function(n){var e=ic.exec(n),r=e[1]||" ",o=e[2]||">",a=e[3]||"-",c=e[4]||"",l=e[5],s=+e[6],f=e[7],h=e[8],g=e[9],p=1,v="",d="",m=!1,y=!0;switch(h&&(h=+h.substring(1)),(l||"0"===r&&"="===o)&&(l=r="0",o="="),g){case"n":f=!0,g="g";break;case"%":p=100,d="%",g="f";break;case"p":p=100,d="%",g="r";break;case"b":case"o":case"x":case"X":"#"===c&&(v="0"+g.toLowerCase());case"c":y=!1;case"d":m=!0,h=0;break;case"s":p=-1,g="r"}"$"===c&&(v=u[0],d=u[1]),"r"!=g||h||(g="g"),null!=h&&("g"==g?h=Math.max(1,Math.min(21,h)):("e"==g||"f"==g)&&(h=Math.max(0,Math.min(20,h)))),g=oc.get(g)||Ut;var M=l&&f;return function(n){var e=d;if(m&&n%1)return"";var u=0>n||0===n&&0>1/n?(n=-n,"-"):"-"===a?"":a;if(0>p){var c=ta.formatPrefix(n,h);n=c.scale(n),e=c.symbol+d}else n*=p;n=g(n,h);var x,b,_=n.lastIndexOf(".");if(0>_){var w=y?n.lastIndexOf("e"):-1;0>w?(x=n,b=""):(x=n.substring(0,w),b=n.substring(w))}else x=n.substring(0,_),b=t+n.substring(_+1);!l&&f&&(x=i(x,1/0));var S=v.length+x.length+b.length+(M?0:u.length),k=s>S?new Array(S=s-S+1).join(r):"";return M&&(x=i(k+x,k.length?s-b.length:1/0)),u+=v,n=x+b,("<"===o?u+n+k:">"===o?k+u+n:"^"===o?k.substring(0,S>>=1)+u+n+k.substring(S):u+(M?n:k+n))+e}}}function Ut(n){return n+""}function jt(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function Ft(n,t,e){function r(t){var e=n(t),r=i(e,1);return r-t>t-e?e:r}function u(e){return t(e=n(new cc(e-1)),1),e}function i(n,e){return t(n=new cc(+n),e),n}function o(n,r,i){var o=u(n),a=[];if(i>1)for(;r>o;)e(o)%i||a.push(new Date(+o)),t(o,1);else for(;r>o;)a.push(new Date(+o)),t(o,1);return a}function a(n,t,e){try{cc=jt;var r=new jt;return r._=n,o(r,t,e)}finally{cc=Date}}n.floor=n,n.round=r,n.ceil=u,n.offset=i,n.range=o;var c=n.utc=Ht(n);return c.floor=c,c.round=Ht(r),c.ceil=Ht(u),c.offset=Ht(i),c.range=a,n}function Ht(n){return function(t,e){try{cc=jt;var r=new jt;return r._=t,n(r,e)._}finally{cc=Date}}}function Ot(n){function t(n){function t(t){for(var e,u,i,o=[],a=-1,c=0;++a<r;)37===n.charCodeAt(a)&&(o.push(n.slice(c,a)),null!=(u=sc[e=n.charAt(++a)])&&(e=n.charAt(++a)),(i=N[e])&&(e=i(t,null==u?"e"===e?" ":"0":u)),o.push(e),c=a+1);return o.push(n.slice(c,a)),o.join("")}var r=n.length;return t.parse=function(t){var r={y:1900,m:0,d:1,H:0,M:0,S:0,L:0,Z:null},u=e(r,n,t,0);if(u!=t.length)return null;"p"in r&&(r.H=r.H%12+12*r.p);var i=null!=r.Z&&cc!==jt,o=new(i?jt:cc);return"j"in r?o.setFullYear(r.y,0,r.j):"w"in r&&("W"in r||"U"in r)?(o.setFullYear(r.y,0,1),o.setFullYear(r.y,0,"W"in r?(r.w+6)%7+7*r.W-(o.getDay()+5)%7:r.w+7*r.U-(o.getDay()+6)%7)):o.setFullYear(r.y,r.m,r.d),o.setHours(r.H+(r.Z/100|0),r.M+r.Z%100,r.S,r.L),i?o._:o},t.toString=function(){return n},t}function e(n,t,e,r){for(var u,i,o,a=0,c=t.length,l=e.length;c>a;){if(r>=l)return-1;if(u=t.charCodeAt(a++),37===u){if(o=t.charAt(a++),i=C[o in sc?t.charAt(a++):o],!i||(r=i(n,e,r))<0)return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){_.lastIndex=0;var r=_.exec(t.slice(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){x.lastIndex=0;var r=x.exec(t.slice(e));return r?(n.w=b.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){E.lastIndex=0;var r=E.exec(t.slice(e));return r?(n.m=A.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,e){S.lastIndex=0;var r=S.exec(t.slice(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,r){return e(n,N.c.toString(),t,r)}function c(n,t,r){return e(n,N.x.toString(),t,r)}function l(n,t,r){return e(n,N.X.toString(),t,r)}function s(n,t,e){var r=M.get(t.slice(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var f=n.dateTime,h=n.date,g=n.time,p=n.periods,v=n.days,d=n.shortDays,m=n.months,y=n.shortMonths;t.utc=function(n){function e(n){try{cc=jt;var t=new cc;return t._=n,r(t)}finally{cc=Date}}var r=t(n);return e.parse=function(n){try{cc=jt;var t=r.parse(n);return t&&t._}finally{cc=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ae;var M=ta.map(),x=Yt(v),b=Zt(v),_=Yt(d),w=Zt(d),S=Yt(m),k=Zt(m),E=Yt(y),A=Zt(y);p.forEach(function(n,t){M.set(n.toLowerCase(),t)});var N={a:function(n){return d[n.getDay()]},A:function(n){return v[n.getDay()]},b:function(n){return y[n.getMonth()]},B:function(n){return m[n.getMonth()]},c:t(f),d:function(n,t){return It(n.getDate(),t,2)},e:function(n,t){return It(n.getDate(),t,2)},H:function(n,t){return It(n.getHours(),t,2)},I:function(n,t){return It(n.getHours()%12||12,t,2)},j:function(n,t){return It(1+ac.dayOfYear(n),t,3)},L:function(n,t){return It(n.getMilliseconds(),t,3)},m:function(n,t){return It(n.getMonth()+1,t,2)},M:function(n,t){return It(n.getMinutes(),t,2)},p:function(n){return p[+(n.getHours()>=12)]},S:function(n,t){return It(n.getSeconds(),t,2)},U:function(n,t){return It(ac.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return It(ac.mondayOfYear(n),t,2)},x:t(h),X:t(g),y:function(n,t){return It(n.getFullYear()%100,t,2)},Y:function(n,t){return It(n.getFullYear()%1e4,t,4)},Z:ie,"%":function(){return"%"}},C={a:r,A:u,b:i,B:o,c:a,d:Qt,e:Qt,H:te,I:te,j:ne,L:ue,m:Kt,M:ee,p:s,S:re,U:Xt,w:Vt,W:$t,x:c,X:l,y:Wt,Y:Bt,Z:Jt,"%":oe};return t}function It(n,t,e){var r=0>n?"-":"",u=(r?-n:n)+"",i=u.length;return r+(e>i?new Array(e-i+1).join(t)+u:u)}function Yt(n){return new RegExp("^(?:"+n.map(ta.requote).join("|")+")","i")}function Zt(n){for(var t=new l,e=-1,r=n.length;++e<r;)t.set(n[e].toLowerCase(),e);return t}function Vt(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+1));return r?(n.w=+r[0],e+r[0].length):-1}function Xt(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e));return r?(n.U=+r[0],e+r[0].length):-1}function $t(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e));return r?(n.W=+r[0],e+r[0].length):-1}function Bt(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+4));return r?(n.y=+r[0],e+r[0].length):-1}function Wt(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.y=Gt(+r[0]),e+r[0].length):-1}function Jt(n,t,e){return/^[+-]\d{4}$/.test(t=t.slice(e,e+5))?(n.Z=-t,e+5):-1}function Gt(n){return n+(n>68?1900:2e3)}function Kt(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function Qt(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function ne(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function te(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function ee(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function re(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function ue(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function ie(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=ga(t)/60|0,u=ga(t)%60;return e+It(r,"0",2)+It(u,"0",2)}function oe(n,t,e){hc.lastIndex=0;var r=hc.exec(t.slice(e,e+1));return r?e+r[0].length:-1}function ae(n){for(var t=n.length,e=-1;++e<t;)n[e][0]=this(n[e][0]);return function(t){for(var e=0,r=n[e];!r[1](t);)r=n[++e];return r[0](t)}}function ce(){}function le(n,t,e){var r=e.s=n+t,u=r-n,i=r-u;e.t=n-i+(t-u)}function se(n,t){n&&dc.hasOwnProperty(n.type)&&dc[n.type](n,t)}function fe(n,t,e){var r,u=-1,i=n.length-e;for(t.lineStart();++u<i;)r=n[u],t.point(r[0],r[1],r[2]);t.lineEnd()}function he(n,t){var e=-1,r=n.length;for(t.polygonStart();++e<r;)fe(n[e],t,1);t.polygonEnd()}function ge(){function n(n,t){n*=Da,t=t*Da/2+qa/4;var e=n-r,o=e>=0?1:-1,a=o*e,c=Math.cos(t),l=Math.sin(t),s=i*l,f=u*c+s*Math.cos(a),h=s*o*Math.sin(a);yc.add(Math.atan2(h,f)),r=n,u=c,i=l}var t,e,r,u,i;Mc.point=function(o,a){Mc.point=n,r=(t=o)*Da,u=Math.cos(a=(e=a)*Da/2+qa/4),i=Math.sin(a)},Mc.lineEnd=function(){n(t,e)}}function pe(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function ve(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function de(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function me(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function ye(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function Me(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function xe(n){return[Math.atan2(n[1],n[0]),tt(n[2])]}function be(n,t){return ga(n[0]-t[0])<Ca&&ga(n[1]-t[1])<Ca}function _e(n,t){n*=Da;var e=Math.cos(t*=Da);we(e*Math.cos(n),e*Math.sin(n),Math.sin(t))}function we(n,t,e){++xc,_c+=(n-_c)/xc,wc+=(t-wc)/xc,Sc+=(e-Sc)/xc}function Se(){function n(n,u){n*=Da;var i=Math.cos(u*=Da),o=i*Math.cos(n),a=i*Math.sin(n),c=Math.sin(u),l=Math.atan2(Math.sqrt((l=e*c-r*a)*l+(l=r*o-t*c)*l+(l=t*a-e*o)*l),t*o+e*a+r*c);bc+=l,kc+=l*(t+(t=o)),Ec+=l*(e+(e=a)),Ac+=l*(r+(r=c)),we(t,e,r)}var t,e,r;qc.point=function(u,i){u*=Da;var o=Math.cos(i*=Da);t=o*Math.cos(u),e=o*Math.sin(u),r=Math.sin(i),qc.point=n,we(t,e,r)}}function ke(){qc.point=_e}function Ee(){function n(n,t){n*=Da;var e=Math.cos(t*=Da),o=e*Math.cos(n),a=e*Math.sin(n),c=Math.sin(t),l=u*c-i*a,s=i*o-r*c,f=r*a-u*o,h=Math.sqrt(l*l+s*s+f*f),g=r*o+u*a+i*c,p=h&&-nt(g)/h,v=Math.atan2(h,g);Nc+=p*l,Cc+=p*s,zc+=p*f,bc+=v,kc+=v*(r+(r=o)),Ec+=v*(u+(u=a)),Ac+=v*(i+(i=c)),we(r,u,i)}var t,e,r,u,i;qc.point=function(o,a){t=o,e=a,qc.point=n,o*=Da;var c=Math.cos(a*=Da);r=c*Math.cos(o),u=c*Math.sin(o),i=Math.sin(a),we(r,u,i)},qc.lineEnd=function(){n(t,e),qc.lineEnd=ke,qc.point=_e}}function Ae(n,t){function e(e,r){return e=n(e,r),t(e[0],e[1])}return n.invert&&t.invert&&(e.invert=function(e,r){return e=t.invert(e,r),e&&n.invert(e[0],e[1])}),e}function Ne(){return!0}function Ce(n,t,e,r,u){var i=[],o=[];if(n.forEach(function(n){if(!((t=n.length-1)<=0)){var t,e=n[0],r=n[t];if(be(e,r)){u.lineStart();for(var a=0;t>a;++a)u.point((e=n[a])[0],e[1]);return void u.lineEnd()}var c=new qe(e,n,null,!0),l=new qe(e,null,c,!1);c.o=l,i.push(c),o.push(l),c=new qe(r,n,null,!1),l=new qe(r,null,c,!0),c.o=l,i.push(c),o.push(l)}}),o.sort(t),ze(i),ze(o),i.length){for(var a=0,c=e,l=o.length;l>a;++a)o[a].e=c=!c;for(var s,f,h=i[0];;){for(var g=h,p=!0;g.v;)if((g=g.n)===h)return;s=g.z,u.lineStart();do{if(g.v=g.o.v=!0,g.e){if(p)for(var a=0,l=s.length;l>a;++a)u.point((f=s[a])[0],f[1]);else r(g.x,g.n.x,1,u);g=g.n}else{if(p){s=g.p.z;for(var a=s.length-1;a>=0;--a)u.point((f=s[a])[0],f[1])}else r(g.x,g.p.x,-1,u);g=g.p}g=g.o,s=g.z,p=!p}while(!g.v);u.lineEnd()}}}function ze(n){if(t=n.length){for(var t,e,r=0,u=n[0];++r<t;)u.n=e=n[r],e.p=u,u=e;u.n=e=n[0],e.p=u}}function qe(n,t,e,r){this.x=n,this.z=t,this.o=e,this.e=r,this.v=!1,this.n=this.p=null}function Le(n,t,e,r){return function(u,i){function o(t,e){var r=u(t,e);n(t=r[0],e=r[1])&&i.point(t,e)}function a(n,t){var e=u(n,t);d.point(e[0],e[1])}function c(){y.point=a,d.lineStart()}function l(){y.point=o,d.lineEnd()}function s(n,t){v.push([n,t]);var e=u(n,t);x.point(e[0],e[1])}function f(){x.lineStart(),v=[]}function h(){s(v[0][0],v[0][1]),x.lineEnd();var n,t=x.clean(),e=M.buffer(),r=e.length;if(v.pop(),p.push(v),v=null,r)if(1&t){n=e[0];var u,r=n.length-1,o=-1;if(r>0){for(b||(i.polygonStart(),b=!0),i.lineStart();++o<r;)i.point((u=n[o])[0],u[1]);i.lineEnd()}}else r>1&&2&t&&e.push(e.pop().concat(e.shift())),g.push(e.filter(Te))}var g,p,v,d=t(i),m=u.invert(r[0],r[1]),y={point:o,lineStart:c,lineEnd:l,polygonStart:function(){y.point=s,y.lineStart=f,y.lineEnd=h,g=[],p=[]},polygonEnd:function(){y.point=o,y.lineStart=c,y.lineEnd=l,g=ta.merge(g);var n=Fe(m,p);g.length?(b||(i.polygonStart(),b=!0),Ce(g,De,n,e,i)):n&&(b||(i.polygonStart(),b=!0),i.lineStart(),e(null,null,1,i),i.lineEnd()),b&&(i.polygonEnd(),b=!1),g=p=null},sphere:function(){i.polygonStart(),i.lineStart(),e(null,null,1,i),i.lineEnd(),i.polygonEnd()}},M=Re(),x=t(M),b=!1;return y}}function Te(n){return n.length>1}function Re(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:b,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function De(n,t){return((n=n.x)[0]<0?n[1]-Ra-Ca:Ra-n[1])-((t=t.x)[0]<0?t[1]-Ra-Ca:Ra-t[1])}function Pe(n){var t,e=0/0,r=0/0,u=0/0;return{lineStart:function(){n.lineStart(),t=1},point:function(i,o){var a=i>0?qa:-qa,c=ga(i-e);ga(c-qa)<Ca?(n.point(e,r=(r+o)/2>0?Ra:-Ra),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(i,r),t=0):u!==a&&c>=qa&&(ga(e-u)<Ca&&(e-=u*Ca),ga(i-a)<Ca&&(i-=a*Ca),r=Ue(e,r,i,o),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),t=0),n.point(e=i,r=o),u=a},lineEnd:function(){n.lineEnd(),e=r=0/0},clean:function(){return 2-t}}}function Ue(n,t,e,r){var u,i,o=Math.sin(n-e);return ga(o)>Ca?Math.atan((Math.sin(t)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(t))*Math.sin(n))/(u*i*o)):(t+r)/2}function je(n,t,e,r){var u;if(null==n)u=e*Ra,r.point(-qa,u),r.point(0,u),r.point(qa,u),r.point(qa,0),r.point(qa,-u),r.point(0,-u),r.point(-qa,-u),r.point(-qa,0),r.point(-qa,u);else if(ga(n[0]-t[0])>Ca){var i=n[0]<t[0]?qa:-qa;u=e*i/2,r.point(-i,u),r.point(0,u),r.point(i,u)}else r.point(t[0],t[1])}function Fe(n,t){var e=n[0],r=n[1],u=[Math.sin(e),-Math.cos(e),0],i=0,o=0;yc.reset();for(var a=0,c=t.length;c>a;++a){var l=t[a],s=l.length;if(s)for(var f=l[0],h=f[0],g=f[1]/2+qa/4,p=Math.sin(g),v=Math.cos(g),d=1;;){d===s&&(d=0),n=l[d];var m=n[0],y=n[1]/2+qa/4,M=Math.sin(y),x=Math.cos(y),b=m-h,_=b>=0?1:-1,w=_*b,S=w>qa,k=p*M;if(yc.add(Math.atan2(k*_*Math.sin(w),v*x+k*Math.cos(w))),i+=S?b+_*La:b,S^h>=e^m>=e){var E=de(pe(f),pe(n));Me(E);var A=de(u,E);Me(A);var N=(S^b>=0?-1:1)*tt(A[2]);(r>N||r===N&&(E[0]||E[1]))&&(o+=S^b>=0?1:-1)}if(!d++)break;h=m,p=M,v=x,f=n}}return(-Ca>i||Ca>i&&0>yc)^1&o}function He(n){function t(n,t){return Math.cos(n)*Math.cos(t)>i}function e(n){var e,i,c,l,s;return{lineStart:function(){l=c=!1,s=1},point:function(f,h){var g,p=[f,h],v=t(f,h),d=o?v?0:u(f,h):v?u(f+(0>f?qa:-qa),h):0;if(!e&&(l=c=v)&&n.lineStart(),v!==c&&(g=r(e,p),(be(e,g)||be(p,g))&&(p[0]+=Ca,p[1]+=Ca,v=t(p[0],p[1]))),v!==c)s=0,v?(n.lineStart(),g=r(p,e),n.point(g[0],g[1])):(g=r(e,p),n.point(g[0],g[1]),n.lineEnd()),e=g;else if(a&&e&&o^v){var m;d&i||!(m=r(p,e,!0))||(s=0,o?(n.lineStart(),n.point(m[0][0],m[0][1]),n.point(m[1][0],m[1][1]),n.lineEnd()):(n.point(m[1][0],m[1][1]),n.lineEnd(),n.lineStart(),n.point(m[0][0],m[0][1])))}!v||e&&be(e,p)||n.point(p[0],p[1]),e=p,c=v,i=d},lineEnd:function(){c&&n.lineEnd(),e=null},clean:function(){return s|(l&&c)<<1}}}function r(n,t,e){var r=pe(n),u=pe(t),o=[1,0,0],a=de(r,u),c=ve(a,a),l=a[0],s=c-l*l;if(!s)return!e&&n;var f=i*c/s,h=-i*l/s,g=de(o,a),p=ye(o,f),v=ye(a,h);me(p,v);var d=g,m=ve(p,d),y=ve(d,d),M=m*m-y*(ve(p,p)-1);if(!(0>M)){var x=Math.sqrt(M),b=ye(d,(-m-x)/y);if(me(b,p),b=xe(b),!e)return b;var _,w=n[0],S=t[0],k=n[1],E=t[1];w>S&&(_=w,w=S,S=_);var A=S-w,N=ga(A-qa)<Ca,C=N||Ca>A;if(!N&&k>E&&(_=k,k=E,E=_),C?N?k+E>0^b[1]<(ga(b[0]-w)<Ca?k:E):k<=b[1]&&b[1]<=E:A>qa^(w<=b[0]&&b[0]<=S)){var z=ye(d,(-m+x)/y);return me(z,p),[b,xe(z)]}}}function u(t,e){var r=o?n:qa-n,u=0;return-r>t?u|=1:t>r&&(u|=2),-r>e?u|=4:e>r&&(u|=8),u}var i=Math.cos(n),o=i>0,a=ga(i)>Ca,c=gr(n,6*Da);return Le(t,e,c,o?[0,-n]:[-qa,n-qa])}function Oe(n,t,e,r){return function(u){var i,o=u.a,a=u.b,c=o.x,l=o.y,s=a.x,f=a.y,h=0,g=1,p=s-c,v=f-l;if(i=n-c,p||!(i>0)){if(i/=p,0>p){if(h>i)return;g>i&&(g=i)}else if(p>0){if(i>g)return;i>h&&(h=i)}if(i=e-c,p||!(0>i)){if(i/=p,0>p){if(i>g)return;i>h&&(h=i)}else if(p>0){if(h>i)return;g>i&&(g=i)}if(i=t-l,v||!(i>0)){if(i/=v,0>v){if(h>i)return;g>i&&(g=i)}else if(v>0){if(i>g)return;i>h&&(h=i)}if(i=r-l,v||!(0>i)){if(i/=v,0>v){if(i>g)return;i>h&&(h=i)}else if(v>0){if(h>i)return;g>i&&(g=i)}return h>0&&(u.a={x:c+h*p,y:l+h*v}),1>g&&(u.b={x:c+g*p,y:l+g*v}),u}}}}}}function Ie(n,t,e,r){function u(r,u){return ga(r[0]-n)<Ca?u>0?0:3:ga(r[0]-e)<Ca?u>0?2:1:ga(r[1]-t)<Ca?u>0?1:0:u>0?3:2}function i(n,t){return o(n.x,t.x)}function o(n,t){var e=u(n,1),r=u(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(a){function c(n){for(var t=0,e=d.length,r=n[1],u=0;e>u;++u)for(var i,o=1,a=d[u],c=a.length,l=a[0];c>o;++o)i=a[o],l[1]<=r?i[1]>r&&Q(l,i,n)>0&&++t:i[1]<=r&&Q(l,i,n)<0&&--t,l=i;return 0!==t}function l(i,a,c,l){var s=0,f=0;if(null==i||(s=u(i,c))!==(f=u(a,c))||o(i,a)<0^c>0){do l.point(0===s||3===s?n:e,s>1?r:t);while((s=(s+c+4)%4)!==f)}else l.point(a[0],a[1])}function s(u,i){return u>=n&&e>=u&&i>=t&&r>=i}function f(n,t){s(n,t)&&a.point(n,t)}function h(){C.point=p,d&&d.push(m=[]),S=!0,w=!1,b=_=0/0}function g(){v&&(p(y,M),x&&w&&A.rejoin(),v.push(A.buffer())),C.point=f,w&&a.lineEnd()}function p(n,t){n=Math.max(-Tc,Math.min(Tc,n)),t=Math.max(-Tc,Math.min(Tc,t));var e=s(n,t);if(d&&m.push([n,t]),S)y=n,M=t,x=e,S=!1,e&&(a.lineStart(),a.point(n,t));else if(e&&w)a.point(n,t);else{var r={a:{x:b,y:_},b:{x:n,y:t}};N(r)?(w||(a.lineStart(),a.point(r.a.x,r.a.y)),a.point(r.b.x,r.b.y),e||a.lineEnd(),k=!1):e&&(a.lineStart(),a.point(n,t),k=!1)}b=n,_=t,w=e}var v,d,m,y,M,x,b,_,w,S,k,E=a,A=Re(),N=Oe(n,t,e,r),C={point:f,lineStart:h,lineEnd:g,polygonStart:function(){a=A,v=[],d=[],k=!0},polygonEnd:function(){a=E,v=ta.merge(v);var t=c([n,r]),e=k&&t,u=v.length;(e||u)&&(a.polygonStart(),e&&(a.lineStart(),l(null,null,1,a),a.lineEnd()),u&&Ce(v,i,t,l,a),a.polygonEnd()),v=d=m=null}};return C}}function Ye(n){var t=0,e=qa/3,r=ir(n),u=r(t,e);return u.parallels=function(n){return arguments.length?r(t=n[0]*qa/180,e=n[1]*qa/180):[t/qa*180,e/qa*180]},u}function Ze(n,t){function e(n,t){var e=Math.sqrt(i-2*u*Math.sin(t))/u;return[e*Math.sin(n*=u),o-e*Math.cos(n)]}var r=Math.sin(n),u=(r+Math.sin(t))/2,i=1+r*(2*u-r),o=Math.sqrt(i)/u;return e.invert=function(n,t){var e=o-t;return[Math.atan2(n,e)/u,tt((i-(n*n+e*e)*u*u)/(2*u))]},e}function Ve(){function n(n,t){Dc+=u*n-r*t,r=n,u=t}var t,e,r,u;Hc.point=function(i,o){Hc.point=n,t=r=i,e=u=o},Hc.lineEnd=function(){n(t,e)}}function Xe(n,t){Pc>n&&(Pc=n),n>jc&&(jc=n),Uc>t&&(Uc=t),t>Fc&&(Fc=t)}function $e(){function n(n,t){o.push("M",n,",",t,i)}function t(n,t){o.push("M",n,",",t),a.point=e}function e(n,t){o.push("L",n,",",t)}function r(){a.point=n}function u(){o.push("Z")}var i=Be(4.5),o=[],a={point:n,lineStart:function(){a.point=t},lineEnd:r,polygonStart:function(){a.lineEnd=u},polygonEnd:function(){a.lineEnd=r,a.point=n},pointRadius:function(n){return i=Be(n),a},result:function(){if(o.length){var n=o.join("");return o=[],n}}};return a}function Be(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function We(n,t){_c+=n,wc+=t,++Sc}function Je(){function n(n,r){var u=n-t,i=r-e,o=Math.sqrt(u*u+i*i);kc+=o*(t+n)/2,Ec+=o*(e+r)/2,Ac+=o,We(t=n,e=r)}var t,e;Ic.point=function(r,u){Ic.point=n,We(t=r,e=u)}}function Ge(){Ic.point=We}function Ke(){function n(n,t){var e=n-r,i=t-u,o=Math.sqrt(e*e+i*i);kc+=o*(r+n)/2,Ec+=o*(u+t)/2,Ac+=o,o=u*n-r*t,Nc+=o*(r+n),Cc+=o*(u+t),zc+=3*o,We(r=n,u=t)}var t,e,r,u;Ic.point=function(i,o){Ic.point=n,We(t=r=i,e=u=o)},Ic.lineEnd=function(){n(t,e)}}function Qe(n){function t(t,e){n.moveTo(t+o,e),n.arc(t,e,o,0,La)}function e(t,e){n.moveTo(t,e),a.point=r}function r(t,e){n.lineTo(t,e)}function u(){a.point=t}function i(){n.closePath()}var o=4.5,a={point:t,lineStart:function(){a.point=e},lineEnd:u,polygonStart:function(){a.lineEnd=i},polygonEnd:function(){a.lineEnd=u,a.point=t},pointRadius:function(n){return o=n,a},result:b};return a}function nr(n){function t(n){return(a?r:e)(n)}function e(t){return rr(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){M=0/0,S.point=i,t.lineStart()}function i(e,r){var i=pe([e,r]),o=n(e,r);u(M,x,y,b,_,w,M=o[0],x=o[1],y=e,b=i[0],_=i[1],w=i[2],a,t),t.point(M,x)}function o(){S.point=e,t.lineEnd()}function c(){r(),S.point=l,S.lineEnd=s}function l(n,t){i(f=n,h=t),g=M,p=x,v=b,d=_,m=w,S.point=i}function s(){u(M,x,y,b,_,w,g,p,f,v,d,m,a,t),S.lineEnd=o,o()}var f,h,g,p,v,d,m,y,M,x,b,_,w,S={point:e,lineStart:r,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=c},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function u(t,e,r,a,c,l,s,f,h,g,p,v,d,m){var y=s-t,M=f-e,x=y*y+M*M;if(x>4*i&&d--){var b=a+g,_=c+p,w=l+v,S=Math.sqrt(b*b+_*_+w*w),k=Math.asin(w/=S),E=ga(ga(w)-1)<Ca||ga(r-h)<Ca?(r+h)/2:Math.atan2(_,b),A=n(E,k),N=A[0],C=A[1],z=N-t,q=C-e,L=M*z-y*q;(L*L/x>i||ga((y*z+M*q)/x-.5)>.3||o>a*g+c*p+l*v)&&(u(t,e,r,a,c,l,N,C,E,b/=S,_/=S,w,d,m),m.point(N,C),u(N,C,E,b,_,w,s,f,h,g,p,v,d,m))}}var i=.5,o=Math.cos(30*Da),a=16;return t.precision=function(n){return arguments.length?(a=(i=n*n)>0&&16,t):Math.sqrt(i)},t}function tr(n){var t=nr(function(t,e){return n([t*Pa,e*Pa])});return function(n){return or(t(n))}}function er(n){this.stream=n}function rr(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function ur(n){return ir(function(){return n})()}function ir(n){function t(n){return n=a(n[0]*Da,n[1]*Da),[n[0]*h+c,l-n[1]*h]}function e(n){return n=a.invert((n[0]-c)/h,(l-n[1])/h),n&&[n[0]*Pa,n[1]*Pa]}function r(){a=Ae(o=lr(m,M,x),i);var n=i(v,d);return c=g-n[0]*h,l=p+n[1]*h,u()}function u(){return s&&(s.valid=!1,s=null),t}var i,o,a,c,l,s,f=nr(function(n,t){return n=i(n,t),[n[0]*h+c,l-n[1]*h]}),h=150,g=480,p=250,v=0,d=0,m=0,M=0,x=0,b=Lc,_=y,w=null,S=null;return t.stream=function(n){return s&&(s.valid=!1),s=or(b(o,f(_(n)))),s.valid=!0,s},t.clipAngle=function(n){return arguments.length?(b=null==n?(w=n,Lc):He((w=+n)*Da),u()):w},t.clipExtent=function(n){return arguments.length?(S=n,_=n?Ie(n[0][0],n[0][1],n[1][0],n[1][1]):y,u()):S},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(g=+n[0],p=+n[1],r()):[g,p]},t.center=function(n){return arguments.length?(v=n[0]%360*Da,d=n[1]%360*Da,r()):[v*Pa,d*Pa]},t.rotate=function(n){return arguments.length?(m=n[0]%360*Da,M=n[1]%360*Da,x=n.length>2?n[2]%360*Da:0,r()):[m*Pa,M*Pa,x*Pa]},ta.rebind(t,f,"precision"),function(){return i=n.apply(this,arguments),t.invert=i.invert&&e,r()}}function or(n){return rr(n,function(t,e){n.point(t*Da,e*Da)})}function ar(n,t){return[n,t]}function cr(n,t){return[n>qa?n-La:-qa>n?n+La:n,t]}function lr(n,t,e){return n?t||e?Ae(fr(n),hr(t,e)):fr(n):t||e?hr(t,e):cr}function sr(n){return function(t,e){return t+=n,[t>qa?t-La:-qa>t?t+La:t,e]}}function fr(n){var t=sr(n);return t.invert=sr(-n),t}function hr(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,l=Math.sin(t),s=l*r+a*u;return[Math.atan2(c*i-s*o,a*r-l*u),tt(s*i+c*o)]}var r=Math.cos(n),u=Math.sin(n),i=Math.cos(t),o=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,l=Math.sin(t),s=l*i-c*o;return[Math.atan2(c*i+l*o,a*r+s*u),tt(s*r-a*u)]},e}function gr(n,t){var e=Math.cos(n),r=Math.sin(n);return function(u,i,o,a){var c=o*t;null!=u?(u=pr(e,u),i=pr(e,i),(o>0?i>u:u>i)&&(u+=o*La)):(u=n+o*La,i=n-.5*c);for(var l,s=u;o>0?s>i:i>s;s-=c)a.point((l=xe([e,-r*Math.cos(s),-r*Math.sin(s)]))[0],l[1])}}function pr(n,t){var e=pe(t);e[0]-=n,Me(e);var r=nt(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Ca)%(2*Math.PI)}function vr(n,t,e){var r=ta.range(n,t-Ca,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function dr(n,t,e){var r=ta.range(n,t-Ca,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function mr(n){return n.source}function yr(n){return n.target}function Mr(n,t,e,r){var u=Math.cos(t),i=Math.sin(t),o=Math.cos(r),a=Math.sin(r),c=u*Math.cos(n),l=u*Math.sin(n),s=o*Math.cos(e),f=o*Math.sin(e),h=2*Math.asin(Math.sqrt(it(r-t)+u*o*it(e-n))),g=1/Math.sin(h),p=h?function(n){var t=Math.sin(n*=h)*g,e=Math.sin(h-n)*g,r=e*c+t*s,u=e*l+t*f,o=e*i+t*a;return[Math.atan2(u,r)*Pa,Math.atan2(o,Math.sqrt(r*r+u*u))*Pa]}:function(){return[n*Pa,t*Pa]};return p.distance=h,p}function xr(){function n(n,u){var i=Math.sin(u*=Da),o=Math.cos(u),a=ga((n*=Da)-t),c=Math.cos(a);Yc+=Math.atan2(Math.sqrt((a=o*Math.sin(a))*a+(a=r*i-e*o*c)*a),e*i+r*o*c),t=n,e=i,r=o}var t,e,r;Zc.point=function(u,i){t=u*Da,e=Math.sin(i*=Da),r=Math.cos(i),Zc.point=n},Zc.lineEnd=function(){Zc.point=Zc.lineEnd=b}}function br(n,t){function e(t,e){var r=Math.cos(t),u=Math.cos(e),i=n(r*u);return[i*u*Math.sin(t),i*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),u=t(r),i=Math.sin(u),o=Math.cos(u);return[Math.atan2(n*i,r*o),Math.asin(r&&e*i/r)]},e}function _r(n,t){function e(n,t){o>0?-Ra+Ca>t&&(t=-Ra+Ca):t>Ra-Ca&&(t=Ra-Ca);var e=o/Math.pow(u(t),i);return[e*Math.sin(i*n),o-e*Math.cos(i*n)]}var r=Math.cos(n),u=function(n){return Math.tan(qa/4+n/2)},i=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(u(t)/u(n)),o=r*Math.pow(u(n),i)/i;return i?(e.invert=function(n,t){var e=o-t,r=K(i)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/i,2*Math.atan(Math.pow(o/r,1/i))-Ra]},e):Sr}function wr(n,t){function e(n,t){var e=i-t;return[e*Math.sin(u*n),i-e*Math.cos(u*n)]}var r=Math.cos(n),u=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),i=r/u+n;return ga(u)<Ca?ar:(e.invert=function(n,t){var e=i-t;return[Math.atan2(n,e)/u,i-K(u)*Math.sqrt(n*n+e*e)]},e)}function Sr(n,t){return[n,Math.log(Math.tan(qa/4+t/2))]}function kr(n){var t,e=ur(n),r=e.scale,u=e.translate,i=e.clipExtent;return e.scale=function(){var n=r.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.translate=function(){var n=u.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.clipExtent=function(n){var o=i.apply(e,arguments);if(o===e){if(t=null==n){var a=qa*r(),c=u();i([[c[0]-a,c[1]-a],[c[0]+a,c[1]+a]])}}else t&&(o=null);return o},e.clipExtent(null)}function Er(n,t){return[Math.log(Math.tan(qa/4+t/2)),-n]}function Ar(n){return n[0]}function Nr(n){return n[1]}function Cr(n){for(var t=n.length,e=[0,1],r=2,u=2;t>u;u++){for(;r>1&&Q(n[e[r-2]],n[e[r-1]],n[u])<=0;)--r;e[r++]=u}return e.slice(0,r)}function zr(n,t){return n[0]-t[0]||n[1]-t[1]}function qr(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Lr(n,t,e,r){var u=n[0],i=e[0],o=t[0]-u,a=r[0]-i,c=n[1],l=e[1],s=t[1]-c,f=r[1]-l,h=(a*(c-l)-f*(u-i))/(f*o-a*s);return[u+h*o,c+h*s]}function Tr(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Rr(){tu(this),this.edge=this.site=this.circle=null}function Dr(n){var t=el.pop()||new Rr;return t.site=n,t}function Pr(n){Xr(n),Qc.remove(n),el.push(n),tu(n)}function Ur(n){var t=n.circle,e=t.x,r=t.cy,u={x:e,y:r},i=n.P,o=n.N,a=[n];Pr(n);for(var c=i;c.circle&&ga(e-c.circle.x)<Ca&&ga(r-c.circle.cy)<Ca;)i=c.P,a.unshift(c),Pr(c),c=i;a.unshift(c),Xr(c);for(var l=o;l.circle&&ga(e-l.circle.x)<Ca&&ga(r-l.circle.cy)<Ca;)o=l.N,a.push(l),Pr(l),l=o;a.push(l),Xr(l);var s,f=a.length;for(s=1;f>s;++s)l=a[s],c=a[s-1],Kr(l.edge,c.site,l.site,u);c=a[0],l=a[f-1],l.edge=Jr(c.site,l.site,null,u),Vr(c),Vr(l)}function jr(n){for(var t,e,r,u,i=n.x,o=n.y,a=Qc._;a;)if(r=Fr(a,o)-i,r>Ca)a=a.L;else{if(u=i-Hr(a,o),!(u>Ca)){r>-Ca?(t=a.P,e=a):u>-Ca?(t=a,e=a.N):t=e=a;break}if(!a.R){t=a;break}a=a.R}var c=Dr(n);if(Qc.insert(t,c),t||e){if(t===e)return Xr(t),e=Dr(t.site),Qc.insert(c,e),c.edge=e.edge=Jr(t.site,c.site),Vr(t),void Vr(e);if(!e)return void(c.edge=Jr(t.site,c.site));Xr(t),Xr(e);var l=t.site,s=l.x,f=l.y,h=n.x-s,g=n.y-f,p=e.site,v=p.x-s,d=p.y-f,m=2*(h*d-g*v),y=h*h+g*g,M=v*v+d*d,x={x:(d*y-g*M)/m+s,y:(h*M-v*y)/m+f};Kr(e.edge,l,p,x),c.edge=Jr(l,n,null,x),e.edge=Jr(n,p,null,x),Vr(t),Vr(e)}}function Fr(n,t){var e=n.site,r=e.x,u=e.y,i=u-t;if(!i)return r;var o=n.P;if(!o)return-1/0;e=o.site;var a=e.x,c=e.y,l=c-t;if(!l)return a;var s=a-r,f=1/i-1/l,h=s/l;return f?(-h+Math.sqrt(h*h-2*f*(s*s/(-2*l)-c+l/2+u-i/2)))/f+r:(r+a)/2}function Hr(n,t){var e=n.N;if(e)return Fr(e,t);var r=n.site;return r.y===t?r.x:1/0}function Or(n){this.site=n,this.edges=[]}function Ir(n){for(var t,e,r,u,i,o,a,c,l,s,f=n[0][0],h=n[1][0],g=n[0][1],p=n[1][1],v=Kc,d=v.length;d--;)if(i=v[d],i&&i.prepare())for(a=i.edges,c=a.length,o=0;c>o;)s=a[o].end(),r=s.x,u=s.y,l=a[++o%c].start(),t=l.x,e=l.y,(ga(r-t)>Ca||ga(u-e)>Ca)&&(a.splice(o,0,new Qr(Gr(i.site,s,ga(r-f)<Ca&&p-u>Ca?{x:f,y:ga(t-f)<Ca?e:p}:ga(u-p)<Ca&&h-r>Ca?{x:ga(e-p)<Ca?t:h,y:p}:ga(r-h)<Ca&&u-g>Ca?{x:h,y:ga(t-h)<Ca?e:g}:ga(u-g)<Ca&&r-f>Ca?{x:ga(e-g)<Ca?t:f,y:g}:null),i.site,null)),++c)}function Yr(n,t){return t.angle-n.angle}function Zr(){tu(this),this.x=this.y=this.arc=this.site=this.cy=null}function Vr(n){var t=n.P,e=n.N;if(t&&e){var r=t.site,u=n.site,i=e.site;if(r!==i){var o=u.x,a=u.y,c=r.x-o,l=r.y-a,s=i.x-o,f=i.y-a,h=2*(c*f-l*s);if(!(h>=-za)){var g=c*c+l*l,p=s*s+f*f,v=(f*g-l*p)/h,d=(c*p-s*g)/h,f=d+a,m=rl.pop()||new Zr;m.arc=n,m.site=u,m.x=v+o,m.y=f+Math.sqrt(v*v+d*d),m.cy=f,n.circle=m;for(var y=null,M=tl._;M;)if(m.y<M.y||m.y===M.y&&m.x<=M.x){if(!M.L){y=M.P;break}M=M.L}else{if(!M.R){y=M;break}M=M.R}tl.insert(y,m),y||(nl=m)}}}}function Xr(n){var t=n.circle;t&&(t.P||(nl=t.N),tl.remove(t),rl.push(t),tu(t),n.circle=null)}function $r(n){for(var t,e=Gc,r=Oe(n[0][0],n[0][1],n[1][0],n[1][1]),u=e.length;u--;)t=e[u],(!Br(t,n)||!r(t)||ga(t.a.x-t.b.x)<Ca&&ga(t.a.y-t.b.y)<Ca)&&(t.a=t.b=null,e.splice(u,1))}function Br(n,t){var e=n.b;if(e)return!0;var r,u,i=n.a,o=t[0][0],a=t[1][0],c=t[0][1],l=t[1][1],s=n.l,f=n.r,h=s.x,g=s.y,p=f.x,v=f.y,d=(h+p)/2,m=(g+v)/2;if(v===g){if(o>d||d>=a)return;if(h>p){if(i){if(i.y>=l)return}else i={x:d,y:c};e={x:d,y:l}}else{if(i){if(i.y<c)return}else i={x:d,y:l};e={x:d,y:c}}}else if(r=(h-p)/(v-g),u=m-r*d,-1>r||r>1)if(h>p){if(i){if(i.y>=l)return}else i={x:(c-u)/r,y:c};e={x:(l-u)/r,y:l}}else{if(i){if(i.y<c)return}else i={x:(l-u)/r,y:l};e={x:(c-u)/r,y:c}}else if(v>g){if(i){if(i.x>=a)return}else i={x:o,y:r*o+u};e={x:a,y:r*a+u}}else{if(i){if(i.x<o)return}else i={x:a,y:r*a+u};e={x:o,y:r*o+u}}return n.a=i,n.b=e,!0}function Wr(n,t){this.l=n,this.r=t,this.a=this.b=null}function Jr(n,t,e,r){var u=new Wr(n,t);return Gc.push(u),e&&Kr(u,n,t,e),r&&Kr(u,t,n,r),Kc[n.i].edges.push(new Qr(u,n,t)),Kc[t.i].edges.push(new Qr(u,t,n)),u}function Gr(n,t,e){var r=new Wr(n,null);return r.a=t,r.b=e,Gc.push(r),r}function Kr(n,t,e,r){n.a||n.b?n.l===e?n.b=r:n.a=r:(n.a=r,n.l=t,n.r=e)}function Qr(n,t,e){var r=n.a,u=n.b;this.edge=n,this.site=t,this.angle=e?Math.atan2(e.y-t.y,e.x-t.x):n.l===t?Math.atan2(u.x-r.x,r.y-u.y):Math.atan2(r.x-u.x,u.y-r.y)}function nu(){this._=null}function tu(n){n.U=n.C=n.L=n.R=n.P=n.N=null}function eu(n,t){var e=t,r=t.R,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.R=r.L,e.R&&(e.R.U=e),r.L=e}function ru(n,t){var e=t,r=t.L,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.L=r.R,e.L&&(e.L.U=e),r.R=e}function uu(n){for(;n.L;)n=n.L;return n}function iu(n,t){var e,r,u,i=n.sort(ou).pop();for(Gc=[],Kc=new Array(n.length),Qc=new nu,tl=new nu;;)if(u=nl,i&&(!u||i.y<u.y||i.y===u.y&&i.x<u.x))(i.x!==e||i.y!==r)&&(Kc[i.i]=new Or(i),jr(i),e=i.x,r=i.y),i=n.pop();else{if(!u)break;Ur(u.arc)}t&&($r(t),Ir(t));var o={cells:Kc,edges:Gc};return Qc=tl=Gc=Kc=null,o}function ou(n,t){return t.y-n.y||t.x-n.x}function au(n,t,e){return(n.x-e.x)*(t.y-n.y)-(n.x-t.x)*(e.y-n.y)}function cu(n){return n.x}function lu(n){return n.y}function su(){return{leaf:!0,nodes:[],point:null,x:null,y:null}}function fu(n,t,e,r,u,i){if(!n(t,e,r,u,i)){var o=.5*(e+u),a=.5*(r+i),c=t.nodes;c[0]&&fu(n,c[0],e,r,o,a),c[1]&&fu(n,c[1],o,r,u,a),c[2]&&fu(n,c[2],e,a,o,i),c[3]&&fu(n,c[3],o,a,u,i)}}function hu(n,t,e,r,u,i,o){var a,c=1/0;return function l(n,s,f,h,g){if(!(s>i||f>o||r>h||u>g)){if(p=n.point){var p,v=t-n.x,d=e-n.y,m=v*v+d*d;if(c>m){var y=Math.sqrt(c=m);r=t-y,u=e-y,i=t+y,o=e+y,a=p}}for(var M=n.nodes,x=.5*(s+h),b=.5*(f+g),_=t>=x,w=e>=b,S=w<<1|_,k=S+4;k>S;++S)if(n=M[3&S])switch(3&S){case 0:l(n,s,f,x,b);break;case 1:l(n,x,f,h,b);break;case 2:l(n,s,b,x,g);break;case 3:l(n,x,b,h,g)}}}(n,r,u,i,o),a}function gu(n,t){n=ta.rgb(n),t=ta.rgb(t);var e=n.r,r=n.g,u=n.b,i=t.r-e,o=t.g-r,a=t.b-u;return function(n){return"#"+xt(Math.round(e+i*n))+xt(Math.round(r+o*n))+xt(Math.round(u+a*n))}}function pu(n,t){var e,r={},u={};for(e in n)e in t?r[e]=mu(n[e],t[e]):u[e]=n[e];for(e in t)e in n||(u[e]=t[e]);return function(n){for(e in r)u[e]=r[e](n);return u}}function vu(n,t){return n=+n,t=+t,function(e){return n*(1-e)+t*e}}function du(n,t){var e,r,u,i=il.lastIndex=ol.lastIndex=0,o=-1,a=[],c=[];for(n+="",t+="";(e=il.exec(n))&&(r=ol.exec(t));)(u=r.index)>i&&(u=t.slice(i,u),a[o]?a[o]+=u:a[++o]=u),(e=e[0])===(r=r[0])?a[o]?a[o]+=r:a[++o]=r:(a[++o]=null,c.push({i:o,x:vu(e,r)})),i=ol.lastIndex;return i<t.length&&(u=t.slice(i),a[o]?a[o]+=u:a[++o]=u),a.length<2?c[0]?(t=c[0].x,function(n){return t(n)+""}):function(){return t}:(t=c.length,function(n){for(var e,r=0;t>r;++r)a[(e=c[r]).i]=e.x(n);return a.join("")})}function mu(n,t){for(var e,r=ta.interpolators.length;--r>=0&&!(e=ta.interpolators[r](n,t)););return e}function yu(n,t){var e,r=[],u=[],i=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;a>e;++e)r.push(mu(n[e],t[e]));for(;i>e;++e)u[e]=n[e];for(;o>e;++e)u[e]=t[e];return function(n){for(e=0;a>e;++e)u[e]=r[e](n);return u}}function Mu(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function xu(n){return function(t){return 1-n(1-t)}}function bu(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function _u(n){return n*n}function wu(n){return n*n*n}function Su(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function ku(n){return function(t){return Math.pow(t,n)}}function Eu(n){return 1-Math.cos(n*Ra)}function Au(n){return Math.pow(2,10*(n-1))}function Nu(n){return 1-Math.sqrt(1-n*n)}function Cu(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/La*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*La/t)}}function zu(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function qu(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Lu(n,t){n=ta.hcl(n),t=ta.hcl(t);var e=n.h,r=n.c,u=n.l,i=t.h-e,o=t.c-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.c:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return st(e+i*n,r+o*n,u+a*n)+""}}function Tu(n,t){n=ta.hsl(n),t=ta.hsl(t);var e=n.h,r=n.s,u=n.l,i=t.h-e,o=t.s-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.s:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return ct(e+i*n,r+o*n,u+a*n)+""}}function Ru(n,t){n=ta.lab(n),t=ta.lab(t);var e=n.l,r=n.a,u=n.b,i=t.l-e,o=t.a-r,a=t.b-u;return function(n){return ht(e+i*n,r+o*n,u+a*n)+""}}function Du(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function Pu(n){var t=[n.a,n.b],e=[n.c,n.d],r=ju(t),u=Uu(t,e),i=ju(Fu(e,t,-u))||0;t[0]*e[1]<e[0]*t[1]&&(t[0]*=-1,t[1]*=-1,r*=-1,u*=-1),this.rotate=(r?Math.atan2(t[1],t[0]):Math.atan2(-e[0],e[1]))*Pa,this.translate=[n.e,n.f],this.scale=[r,i],this.skew=i?Math.atan2(u,i)*Pa:0}function Uu(n,t){return n[0]*t[0]+n[1]*t[1]}function ju(n){var t=Math.sqrt(Uu(n,n));return t&&(n[0]/=t,n[1]/=t),t}function Fu(n,t,e){return n[0]+=e*t[0],n[1]+=e*t[1],n}function Hu(n,t){var e,r=[],u=[],i=ta.transform(n),o=ta.transform(t),a=i.translate,c=o.translate,l=i.rotate,s=o.rotate,f=i.skew,h=o.skew,g=i.scale,p=o.scale;return a[0]!=c[0]||a[1]!=c[1]?(r.push("translate(",null,",",null,")"),u.push({i:1,x:vu(a[0],c[0])},{i:3,x:vu(a[1],c[1])})):r.push(c[0]||c[1]?"translate("+c+")":""),l!=s?(l-s>180?s+=360:s-l>180&&(l+=360),u.push({i:r.push(r.pop()+"rotate(",null,")")-2,x:vu(l,s)})):s&&r.push(r.pop()+"rotate("+s+")"),f!=h?u.push({i:r.push(r.pop()+"skewX(",null,")")-2,x:vu(f,h)}):h&&r.push(r.pop()+"skewX("+h+")"),g[0]!=p[0]||g[1]!=p[1]?(e=r.push(r.pop()+"scale(",null,",",null,")"),u.push({i:e-4,x:vu(g[0],p[0])},{i:e-2,x:vu(g[1],p[1])})):(1!=p[0]||1!=p[1])&&r.push(r.pop()+"scale("+p+")"),e=u.length,function(n){for(var t,i=-1;++i<e;)r[(t=u[i]).i]=t.x(n);return r.join("")}}function Ou(n,t){return t=(t-=n=+n)||1/t,function(e){return(e-n)/t}}function Iu(n,t){return t=(t-=n=+n)||1/t,function(e){return Math.max(0,Math.min(1,(e-n)/t))}}function Yu(n){for(var t=n.source,e=n.target,r=Vu(t,e),u=[t];t!==r;)t=t.parent,u.push(t);for(var i=u.length;e!==r;)u.splice(i,0,e),e=e.parent;return u}function Zu(n){for(var t=[],e=n.parent;null!=e;)t.push(n),n=e,e=e.parent;return t.push(n),t}function Vu(n,t){if(n===t)return n;for(var e=Zu(n),r=Zu(t),u=e.pop(),i=r.pop(),o=null;u===i;)o=u,u=e.pop(),i=r.pop();return o}function Xu(n){n.fixed|=2}function $u(n){n.fixed&=-7}function Bu(n){n.fixed|=4,n.px=n.x,n.py=n.y}function Wu(n){n.fixed&=-5}function Ju(n,t,e){var r=0,u=0;if(n.charge=0,!n.leaf)for(var i,o=n.nodes,a=o.length,c=-1;++c<a;)i=o[c],null!=i&&(Ju(i,t,e),n.charge+=i.charge,r+=i.charge*i.cx,u+=i.charge*i.cy);if(n.point){n.leaf||(n.point.x+=Math.random()-.5,n.point.y+=Math.random()-.5);var l=t*e[n.point.index];n.charge+=n.pointCharge=l,r+=l*n.point.x,u+=l*n.point.y}n.cx=r/n.charge,n.cy=u/n.charge}function Gu(n,t){return ta.rebind(n,t,"sort","children","value"),n.nodes=n,n.links=ri,n}function Ku(n,t){for(var e=[n];null!=(n=e.pop());)if(t(n),(u=n.children)&&(r=u.length))for(var r,u;--r>=0;)e.push(u[r])}function Qu(n,t){for(var e=[n],r=[];null!=(n=e.pop());)if(r.push(n),(i=n.children)&&(u=i.length))for(var u,i,o=-1;++o<u;)e.push(i[o]);for(;null!=(n=r.pop());)t(n)}function ni(n){return n.children}function ti(n){return n.value}function ei(n,t){return t.value-n.value}function ri(n){return ta.merge(n.map(function(n){return(n.children||[]).map(function(t){return{source:n,target:t}})}))}function ui(n){return n.x}function ii(n){return n.y}function oi(n,t,e){n.y0=t,n.y=e}function ai(n){return ta.range(n.length)}function ci(n){for(var t=-1,e=n[0].length,r=[];++t<e;)r[t]=0;return r}function li(n){for(var t,e=1,r=0,u=n[0][1],i=n.length;i>e;++e)(t=n[e][1])>u&&(r=e,u=t);return r}function si(n){return n.reduce(fi,0)}function fi(n,t){return n+t[1]}function hi(n,t){return gi(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function gi(n,t){for(var e=-1,r=+n[0],u=(n[1]-r)/t,i=[];++e<=t;)i[e]=u*e+r;return i}function pi(n){return[ta.min(n),ta.max(n)]}function vi(n,t){return n.value-t.value}function di(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function mi(n,t){n._pack_next=t,t._pack_prev=n}function yi(n,t){var e=t.x-n.x,r=t.y-n.y,u=n.r+t.r;return.999*u*u>e*e+r*r}function Mi(n){function t(n){s=Math.min(n.x-n.r,s),f=Math.max(n.x+n.r,f),h=Math.min(n.y-n.r,h),g=Math.max(n.y+n.r,g)}if((e=n.children)&&(l=e.length)){var e,r,u,i,o,a,c,l,s=1/0,f=-1/0,h=1/0,g=-1/0;if(e.forEach(xi),r=e[0],r.x=-r.r,r.y=0,t(r),l>1&&(u=e[1],u.x=u.r,u.y=0,t(u),l>2))for(i=e[2],wi(r,u,i),t(i),di(r,i),r._pack_prev=i,di(i,u),u=r._pack_next,o=3;l>o;o++){wi(r,u,i=e[o]);var p=0,v=1,d=1;for(a=u._pack_next;a!==u;a=a._pack_next,v++)if(yi(a,i)){p=1;break}if(1==p)for(c=r._pack_prev;c!==a._pack_prev&&!yi(c,i);c=c._pack_prev,d++);p?(d>v||v==d&&u.r<r.r?mi(r,u=a):mi(r=c,u),o--):(di(r,i),u=i,t(i))}var m=(s+f)/2,y=(h+g)/2,M=0;for(o=0;l>o;o++)i=e[o],i.x-=m,i.y-=y,M=Math.max(M,i.r+Math.sqrt(i.x*i.x+i.y*i.y));n.r=M,e.forEach(bi)}}function xi(n){n._pack_next=n._pack_prev=n}function bi(n){delete n._pack_next,delete n._pack_prev}function _i(n,t,e,r){var u=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,u)for(var i=-1,o=u.length;++i<o;)_i(u[i],t,e,r)}function wi(n,t,e){var r=n.r+e.r,u=t.x-n.x,i=t.y-n.y;if(r&&(u||i)){var o=t.r+e.r,a=u*u+i*i;o*=o,r*=r;var c=.5+(r-o)/(2*a),l=Math.sqrt(Math.max(0,2*o*(r+a)-(r-=a)*r-o*o))/(2*a);e.x=n.x+c*u+l*i,e.y=n.y+c*i-l*u}else e.x=n.x+r,e.y=n.y}function Si(n,t){return n.parent==t.parent?1:2}function ki(n){var t=n.children;return t.length?t[0]:n.t}function Ei(n){var t,e=n.children;return(t=e.length)?e[t-1]:n.t}function Ai(n,t,e){var r=e/(t.i-n.i);t.c-=r,t.s+=e,n.c+=r,t.z+=e,t.m+=e}function Ni(n){for(var t,e=0,r=0,u=n.children,i=u.length;--i>=0;)t=u[i],t.z+=e,t.m+=e,e+=t.s+(r+=t.c)}function Ci(n,t,e){return n.a.parent===t.parent?n.a:e}function zi(n){return 1+ta.max(n,function(n){return n.y})}function qi(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Li(n){var t=n.children;return t&&t.length?Li(t[0]):n}function Ti(n){var t,e=n.children;return e&&(t=e.length)?Ti(e[t-1]):n}function Ri(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Di(n,t){var e=n.x+t[3],r=n.y+t[0],u=n.dx-t[1]-t[3],i=n.dy-t[0]-t[2];return 0>u&&(e+=u/2,u=0),0>i&&(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function Pi(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Ui(n){return n.rangeExtent?n.rangeExtent():Pi(n.range())}function ji(n,t,e,r){var u=e(n[0],n[1]),i=r(t[0],t[1]);return function(n){return i(u(n))}}function Fi(n,t){var e,r=0,u=n.length-1,i=n[r],o=n[u];return i>o&&(e=r,r=u,u=e,e=i,i=o,o=e),n[r]=t.floor(i),n[u]=t.ceil(o),n}function Hi(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:ml}function Oi(n,t,e,r){var u=[],i=[],o=0,a=Math.min(n.length,t.length)-1;for(n[a]<n[0]&&(n=n.slice().reverse(),t=t.slice().reverse());++o<=a;)u.push(e(n[o-1],n[o])),i.push(r(t[o-1],t[o]));return function(t){var e=ta.bisect(n,t,1,a)-1;return i[e](u[e](t))}}function Ii(n,t,e,r){function u(){var u=Math.min(n.length,t.length)>2?Oi:ji,c=r?Iu:Ou;return o=u(n,t,c,e),a=u(t,n,c,mu),i}function i(n){return o(n)}var o,a;return i.invert=function(n){return a(n)},i.domain=function(t){return arguments.length?(n=t.map(Number),u()):n},i.range=function(n){return arguments.length?(t=n,u()):t},i.rangeRound=function(n){return i.range(n).interpolate(Du)},i.clamp=function(n){return arguments.length?(r=n,u()):r},i.interpolate=function(n){return arguments.length?(e=n,u()):e},i.ticks=function(t){return Xi(n,t)},i.tickFormat=function(t,e){return $i(n,t,e)},i.nice=function(t){return Zi(n,t),u()},i.copy=function(){return Ii(n,t,e,r)},u()}function Yi(n,t){return ta.rebind(n,t,"range","rangeRound","interpolate","clamp")}function Zi(n,t){return Fi(n,Hi(Vi(n,t)[2]))}function Vi(n,t){null==t&&(t=10);var e=Pi(n),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),i=t/r*u;return.15>=i?u*=10:.35>=i?u*=5:.75>=i&&(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function Xi(n,t){return ta.range.apply(ta,Vi(n,t))}function $i(n,t,e){var r=Vi(n,t);if(e){var u=ic.exec(e);if(u.shift(),"s"===u[8]){var i=ta.formatPrefix(Math.max(ga(r[0]),ga(r[1])));return u[7]||(u[7]="."+Bi(i.scale(r[2]))),u[8]="f",e=ta.format(u.join("")),function(n){return e(i.scale(n))+i.symbol}}u[7]||(u[7]="."+Wi(u[8],r)),e=u.join("")}else e=",."+Bi(r[2])+"f";return ta.format(e)}function Bi(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function Wi(n,t){var e=Bi(t[2]);return n in yl?Math.abs(e-Bi(Math.max(ga(t[0]),ga(t[1]))))+ +("e"!==n):e-2*("%"===n)}function Ji(n,t,e,r){function u(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function i(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function o(t){return n(u(t))}return o.invert=function(t){return i(n.invert(t))},o.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(u)),o):r},o.base=function(e){return arguments.length?(t=+e,n.domain(r.map(u)),o):t},o.nice=function(){var t=Fi(r.map(u),e?Math:xl);return n.domain(t),r=t.map(i),o},o.ticks=function(){var n=Pi(r),o=[],a=n[0],c=n[1],l=Math.floor(u(a)),s=Math.ceil(u(c)),f=t%1?2:t;if(isFinite(s-l)){if(e){for(;s>l;l++)for(var h=1;f>h;h++)o.push(i(l)*h);o.push(i(l))}else for(o.push(i(l));l++<s;)for(var h=f-1;h>0;h--)o.push(i(l)*h);for(l=0;o[l]<a;l++);for(s=o.length;o[s-1]>c;s--);o=o.slice(l,s)}return o},o.tickFormat=function(n,t){if(!arguments.length)return Ml;arguments.length<2?t=Ml:"function"!=typeof t&&(t=ta.format(t));var r,a=Math.max(.1,n/o.ticks().length),c=e?(r=1e-12,Math.ceil):(r=-1e-12,Math.floor);return function(n){return n/i(c(u(n)+r))<=a?t(n):""}},o.copy=function(){return Ji(n.copy(),t,e,r)},Yi(o,n)}function Gi(n,t,e){function r(t){return n(u(t))}var u=Ki(t),i=Ki(1/t);return r.invert=function(t){return i(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(u)),r):e},r.ticks=function(n){return Xi(e,n)},r.tickFormat=function(n,t){return $i(e,n,t)},r.nice=function(n){return r.domain(Zi(e,n))},r.exponent=function(o){return arguments.length?(u=Ki(t=o),i=Ki(1/t),n.domain(e.map(u)),r):t},r.copy=function(){return Gi(n.copy(),t,e)},Yi(r,n)}function Ki(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function Qi(n,t){function e(e){return i[((u.get(e)||("range"===t.t?u.set(e,n.push(e)):0/0))-1)%i.length]}function r(t,e){return ta.range(n.length).map(function(n){return t+e*n})}var u,i,o;return e.domain=function(r){if(!arguments.length)return n;n=[],u=new l;for(var i,o=-1,a=r.length;++o<a;)u.has(i=r[o])||u.set(i,n.push(i));return e[t.t].apply(e,t.a)},e.range=function(n){return arguments.length?(i=n,o=0,t={t:"range",a:arguments},e):i},e.rangePoints=function(u,a){arguments.length<2&&(a=0);var c=u[0],l=u[1],s=n.length<2?(c=(c+l)/2,0):(l-c)/(n.length-1+a);return i=r(c+s*a/2,s),o=0,t={t:"rangePoints",a:arguments},e},e.rangeRoundPoints=function(u,a){arguments.length<2&&(a=0);var c=u[0],l=u[1],s=n.length<2?(c=l=Math.round((c+l)/2),0):(l-c)/(n.length-1+a)|0;return i=r(c+Math.round(s*a/2+(l-c-(n.length-1+a)*s)/2),s),o=0,t={t:"rangeRoundPoints",a:arguments},e},e.rangeBands=function(u,a,c){arguments.length<2&&(a=0),arguments.length<3&&(c=a);var l=u[1]<u[0],s=u[l-0],f=u[1-l],h=(f-s)/(n.length-a+2*c);return i=r(s+h*c,h),l&&i.reverse(),o=h*(1-a),t={t:"rangeBands",a:arguments},e},e.rangeRoundBands=function(u,a,c){arguments.length<2&&(a=0),arguments.length<3&&(c=a);var l=u[1]<u[0],s=u[l-0],f=u[1-l],h=Math.floor((f-s)/(n.length-a+2*c));return i=r(s+Math.round((f-s-(n.length-a)*h)/2),h),l&&i.reverse(),o=Math.round(h*(1-a)),t={t:"rangeRoundBands",a:arguments},e},e.rangeBand=function(){return o},e.rangeExtent=function(){return Pi(t.a[0])},e.copy=function(){return Qi(n,t)},e.domain(n)}function no(n,t){function i(){var e=0,r=t.length;for(a=[];++e<r;)a[e-1]=ta.quantile(n,e/r);return o}function o(n){return isNaN(n=+n)?void 0:t[ta.bisect(a,n)]}var a;return o.domain=function(t){return arguments.length?(n=t.map(r).filter(u).sort(e),i()):n},o.range=function(n){return arguments.length?(t=n,i()):t},o.quantiles=function(){return a},o.invertExtent=function(e){return e=t.indexOf(e),0>e?[0/0,0/0]:[e>0?a[e-1]:n[0],e<a.length?a[e]:n[n.length-1]]},o.copy=function(){return no(n,t)},i()}function to(n,t,e){function r(t){return e[Math.max(0,Math.min(o,Math.floor(i*(t-n))))]}function u(){return i=e.length/(t-n),o=e.length-1,r}var i,o;return r.domain=function(e){return arguments.length?(n=+e[0],t=+e[e.length-1],u()):[n,t]},r.range=function(n){return arguments.length?(e=n,u()):e},r.invertExtent=function(t){return t=e.indexOf(t),t=0>t?0/0:t/i+n,[t,t+1/i]},r.copy=function(){return to(n,t,e)},u()}function eo(n,t){function e(e){return e>=e?t[ta.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return eo(n,t)},e}function ro(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return Xi(n,t)},t.tickFormat=function(t,e){return $i(n,t,e)},t.copy=function(){return ro(n)},t}function uo(){return 0}function io(n){return n.innerRadius}function oo(n){return n.outerRadius}function ao(n){return n.startAngle}function co(n){return n.endAngle}function lo(n){return n&&n.padAngle}function so(n,t,e,r){return(n-e)*t-(t-r)*n>0?0:1}function fo(n,t,e,r,u){var i=n[0]-t[0],o=n[1]-t[1],a=(u?r:-r)/Math.sqrt(i*i+o*o),c=a*o,l=-a*i,s=n[0]+c,f=n[1]+l,h=t[0]+c,g=t[1]+l,p=(s+h)/2,v=(f+g)/2,d=h-s,m=g-f,y=d*d+m*m,M=e-r,x=s*g-h*f,b=(0>m?-1:1)*Math.sqrt(M*M*y-x*x),_=(x*m-d*b)/y,w=(-x*d-m*b)/y,S=(x*m+d*b)/y,k=(-x*d+m*b)/y,E=_-p,A=w-v,N=S-p,C=k-v;return E*E+A*A>N*N+C*C&&(_=S,w=k),[[_-c,w-l],[_*e/M,w*e/M]]}function ho(n){function t(t){function o(){l.push("M",i(n(s),a))}for(var c,l=[],s=[],f=-1,h=t.length,g=Et(e),p=Et(r);++f<h;)u.call(this,c=t[f],f)?s.push([+g.call(this,c,f),+p.call(this,c,f)]):s.length&&(o(),s=[]);return s.length&&o(),l.length?l.join(""):null}var e=Ar,r=Nr,u=Ne,i=go,o=i.key,a=.7;return t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t.defined=function(n){return arguments.length?(u=n,t):u},t.interpolate=function(n){return arguments.length?(o="function"==typeof n?i=n:(i=El.get(n)||go).key,t):o},t.tension=function(n){return arguments.length?(a=n,t):a},t}function go(n){return n.join("L")}function po(n){return go(n)+"Z"}function vo(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("H",(r[0]+(r=n[t])[0])/2,"V",r[1]);return e>1&&u.push("H",r[0]),u.join("")}function mo(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("V",(r=n[t])[1],"H",r[0]);return u.join("")}function yo(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("H",(r=n[t])[0],"V",r[1]);return u.join("")}function Mo(n,t){return n.length<4?go(n):n[1]+_o(n.slice(1,-1),wo(n,t))}function xo(n,t){return n.length<3?go(n):n[0]+_o((n.push(n[0]),n),wo([n[n.length-2]].concat(n,[n[1]]),t))}function bo(n,t){return n.length<3?go(n):n[0]+_o(n,wo(n,t))}function _o(n,t){if(t.length<1||n.length!=t.length&&n.length!=t.length+2)return go(n);var e=n.length!=t.length,r="",u=n[0],i=n[1],o=t[0],a=o,c=1;if(e&&(r+="Q"+(i[0]-2*o[0]/3)+","+(i[1]-2*o[1]/3)+","+i[0]+","+i[1],u=n[1],c=2),t.length>1){a=t[1],i=n[c],c++,r+="C"+(u[0]+o[0])+","+(u[1]+o[1])+","+(i[0]-a[0])+","+(i[1]-a[1])+","+i[0]+","+i[1];for(var l=2;l<t.length;l++,c++)i=n[c],a=t[l],r+="S"+(i[0]-a[0])+","+(i[1]-a[1])+","+i[0]+","+i[1]}if(e){var s=n[c];r+="Q"+(i[0]+2*a[0]/3)+","+(i[1]+2*a[1]/3)+","+s[0]+","+s[1]}return r}function wo(n,t){for(var e,r=[],u=(1-t)/2,i=n[0],o=n[1],a=1,c=n.length;++a<c;)e=i,i=o,o=n[a],r.push([u*(o[0]-e[0]),u*(o[1]-e[1])]);return r}function So(n){if(n.length<3)return go(n);var t=1,e=n.length,r=n[0],u=r[0],i=r[1],o=[u,u,u,(r=n[1])[0]],a=[i,i,i,r[1]],c=[u,",",i,"L",No(Cl,o),",",No(Cl,a)];for(n.push(n[e-1]);++t<=e;)r=n[t],o.shift(),o.push(r[0]),a.shift(),a.push(r[1]),Co(c,o,a);return n.pop(),c.push("L",r),c.join("")}function ko(n){if(n.length<4)return go(n);for(var t,e=[],r=-1,u=n.length,i=[0],o=[0];++r<3;)t=n[r],i.push(t[0]),o.push(t[1]);for(e.push(No(Cl,i)+","+No(Cl,o)),--r;++r<u;)t=n[r],i.shift(),i.push(t[0]),o.shift(),o.push(t[1]),Co(e,i,o);return e.join("")}function Eo(n){for(var t,e,r=-1,u=n.length,i=u+4,o=[],a=[];++r<4;)e=n[r%u],o.push(e[0]),a.push(e[1]);for(t=[No(Cl,o),",",No(Cl,a)],--r;++r<i;)e=n[r%u],o.shift(),o.push(e[0]),a.shift(),a.push(e[1]),Co(t,o,a);return t.join("")}function Ao(n,t){var e=n.length-1;if(e)for(var r,u,i=n[0][0],o=n[0][1],a=n[e][0]-i,c=n[e][1]-o,l=-1;++l<=e;)r=n[l],u=l/e,r[0]=t*r[0]+(1-t)*(i+u*a),r[1]=t*r[1]+(1-t)*(o+u*c);return So(n)}function No(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]+n[3]*t[3]}function Co(n,t,e){n.push("C",No(Al,t),",",No(Al,e),",",No(Nl,t),",",No(Nl,e),",",No(Cl,t),",",No(Cl,e))}function zo(n,t){return(t[1]-n[1])/(t[0]-n[0])}function qo(n){for(var t=0,e=n.length-1,r=[],u=n[0],i=n[1],o=r[0]=zo(u,i);++t<e;)r[t]=(o+(o=zo(u=i,i=n[t+1])))/2;return r[t]=o,r}function Lo(n){for(var t,e,r,u,i=[],o=qo(n),a=-1,c=n.length-1;++a<c;)t=zo(n[a],n[a+1]),ga(t)<Ca?o[a]=o[a+1]=0:(e=o[a]/t,r=o[a+1]/t,u=e*e+r*r,u>9&&(u=3*t/Math.sqrt(u),o[a]=u*e,o[a+1]=u*r));for(a=-1;++a<=c;)u=(n[Math.min(c,a+1)][0]-n[Math.max(0,a-1)][0])/(6*(1+o[a]*o[a])),i.push([u||0,o[a]*u||0]);return i}function To(n){return n.length<3?go(n):n[0]+_o(n,Lo(n))}function Ro(n){for(var t,e,r,u=-1,i=n.length;++u<i;)t=n[u],e=t[0],r=t[1]-Ra,t[0]=e*Math.cos(r),t[1]=e*Math.sin(r);return n}function Do(n){function t(t){function c(){v.push("M",a(n(m),f),s,l(n(d.reverse()),f),"Z")}for(var h,g,p,v=[],d=[],m=[],y=-1,M=t.length,x=Et(e),b=Et(u),_=e===r?function(){return g}:Et(r),w=u===i?function(){return p}:Et(i);++y<M;)o.call(this,h=t[y],y)?(d.push([g=+x.call(this,h,y),p=+b.call(this,h,y)]),m.push([+_.call(this,h,y),+w.call(this,h,y)])):d.length&&(c(),d=[],m=[]);return d.length&&c(),v.length?v.join(""):null}var e=Ar,r=Ar,u=0,i=Nr,o=Ne,a=go,c=a.key,l=a,s="L",f=.7;return t.x=function(n){return arguments.length?(e=r=n,t):r},t.x0=function(n){return arguments.length?(e=n,t):e},t.x1=function(n){return arguments.length?(r=n,t):r},t.y=function(n){return arguments.length?(u=i=n,t):i},t.y0=function(n){return arguments.length?(u=n,t):u},t.y1=function(n){return arguments.length?(i=n,t):i},t.defined=function(n){return arguments.length?(o=n,t):o},t.interpolate=function(n){return arguments.length?(c="function"==typeof n?a=n:(a=El.get(n)||go).key,l=a.reverse||a,s=a.closed?"M":"L",t):c},t.tension=function(n){return arguments.length?(f=n,t):f},t}function Po(n){return n.radius}function Uo(n){return[n.x,n.y]}function jo(n){return function(){var t=n.apply(this,arguments),e=t[0],r=t[1]-Ra;return[e*Math.cos(r),e*Math.sin(r)]}}function Fo(){return 64}function Ho(){return"circle"}function Oo(n){var t=Math.sqrt(n/qa);return"M0,"+t+"A"+t+","+t+" 0 1,1 0,"+-t+"A"+t+","+t+" 0 1,1 0,"+t+"Z"}function Io(n){return function(){var t,e;(t=this[n])&&(e=t[t.active])&&(--t.count?delete t[t.active]:delete this[n],t.active+=.5,e.event&&e.event.interrupt.call(this,this.__data__,e.index))}}function Yo(n,t,e){return ya(n,Pl),n.namespace=t,n.id=e,n}function Zo(n,t,e,r){var u=n.id,i=n.namespace;return Y(n,"function"==typeof e?function(n,o,a){n[i][u].tween.set(t,r(e.call(n,n.__data__,o,a)))}:(e=r(e),function(n){n[i][u].tween.set(t,e)}))}function Vo(n){return null==n&&(n=""),function(){this.textContent=n}}function Xo(n){return null==n?"__transition__":"__transition_"+n+"__"}function $o(n,t,e,r,u){var i=n[e]||(n[e]={active:0,count:0}),o=i[r];if(!o){var a=u.time;o=i[r]={tween:new l,time:a,delay:u.delay,duration:u.duration,ease:u.ease,index:t},u=null,++i.count,ta.timer(function(u){function c(e){if(i.active>r)return s();var u=i[i.active];u&&(--i.count,delete i[i.active],u.event&&u.event.interrupt.call(n,n.__data__,u.index)),i.active=r,o.event&&o.event.start.call(n,n.__data__,t),o.tween.forEach(function(e,r){(r=r.call(n,n.__data__,t))&&v.push(r)}),h=o.ease,f=o.duration,ta.timer(function(){return p.c=l(e||1)?Ne:l,1},0,a)}function l(e){if(i.active!==r)return 1;for(var u=e/f,a=h(u),c=v.length;c>0;)v[--c].call(n,a);return u>=1?(o.event&&o.event.end.call(n,n.__data__,t),s()):void 0}function s(){return--i.count?delete i[r]:delete n[e],1}var f,h,g=o.delay,p=ec,v=[];return p.t=g+a,u>=g?c(u-g):void(p.c=c)},0,a)}}function Bo(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate("+(isFinite(r)?r:e(n))+",0)"})}function Wo(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate(0,"+(isFinite(r)?r:e(n))+")"})}function Jo(n){return n.toISOString()}function Go(n,t,e){function r(t){return n(t)}function u(n,e){var r=n[1]-n[0],u=r/e,i=ta.bisect(Vl,u);return i==Vl.length?[t.year,Vi(n.map(function(n){return n/31536e6}),e)[2]]:i?t[u/Vl[i-1]<Vl[i]/u?i-1:i]:[Bl,Vi(n,e)[2]]}return r.invert=function(t){return Ko(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain(t),r):n.domain().map(Ko)},r.nice=function(n,t){function e(e){return!isNaN(e)&&!n.range(e,Ko(+e+1),t).length}var i=r.domain(),o=Pi(i),a=null==n?u(o,10):"number"==typeof n&&u(o,n);return a&&(n=a[0],t=a[1]),r.domain(Fi(i,t>1?{floor:function(t){for(;e(t=n.floor(t));)t=Ko(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=Ko(+t+1);return t}}:n))},r.ticks=function(n,t){var e=Pi(r.domain()),i=null==n?u(e,10):"number"==typeof n?u(e,n):!n.range&&[{range:n},t];return i&&(n=i[0],t=i[1]),n.range(e[0],Ko(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return Go(n.copy(),t,e)},Yi(r,n)}function Ko(n){return new Date(n)}function Qo(n){return JSON.parse(n.responseText)}function na(n){var t=ua.createRange();return t.selectNode(ua.body),t.createContextualFragment(n.responseText)}var ta={version:"3.5.6"},ea=[].slice,ra=function(n){return ea.call(n)},ua=this.document;if(ua)try{ra(ua.documentElement.childNodes)[0].nodeType}catch(ia){ra=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}if(Date.now||(Date.now=function(){return+new Date}),ua)try{ua.createElement("DIV").style.setProperty("opacity",0,"")}catch(oa){var aa=this.Element.prototype,ca=aa.setAttribute,la=aa.setAttributeNS,sa=this.CSSStyleDeclaration.prototype,fa=sa.setProperty;aa.setAttribute=function(n,t){ca.call(this,n,t+"")},aa.setAttributeNS=function(n,t,e){la.call(this,n,t,e+"")},sa.setProperty=function(n,t,e){fa.call(this,n,t+"",e)}}ta.ascending=e,ta.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:0/0},ta.min=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i;)if(null!=(r=n[u])&&r>=r){e=r;break}for(;++u<i;)null!=(r=n[u])&&e>r&&(e=r)}else{for(;++u<i;)if(null!=(r=t.call(n,n[u],u))&&r>=r){e=r;break}for(;++u<i;)null!=(r=t.call(n,n[u],u))&&e>r&&(e=r)}return e},ta.max=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i;)if(null!=(r=n[u])&&r>=r){e=r;break}for(;++u<i;)null!=(r=n[u])&&r>e&&(e=r)}else{for(;++u<i;)if(null!=(r=t.call(n,n[u],u))&&r>=r){e=r;break}for(;++u<i;)null!=(r=t.call(n,n[u],u))&&r>e&&(e=r)}return e},ta.extent=function(n,t){var e,r,u,i=-1,o=n.length;if(1===arguments.length){for(;++i<o;)if(null!=(r=n[i])&&r>=r){e=u=r;break}for(;++i<o;)null!=(r=n[i])&&(e>r&&(e=r),r>u&&(u=r))}else{for(;++i<o;)if(null!=(r=t.call(n,n[i],i))&&r>=r){e=u=r;break}for(;++i<o;)null!=(r=t.call(n,n[i],i))&&(e>r&&(e=r),r>u&&(u=r))}return[e,u]},ta.sum=function(n,t){var e,r=0,i=n.length,o=-1;if(1===arguments.length)for(;++o<i;)u(e=+n[o])&&(r+=e);else for(;++o<i;)u(e=+t.call(n,n[o],o))&&(r+=e);return r},ta.mean=function(n,t){var e,i=0,o=n.length,a=-1,c=o;if(1===arguments.length)for(;++a<o;)u(e=r(n[a]))?i+=e:--c;else for(;++a<o;)u(e=r(t.call(n,n[a],a)))?i+=e:--c;return c?i/c:void 0},ta.quantile=function(n,t){var e=(n.length-1)*t+1,r=Math.floor(e),u=+n[r-1],i=e-r;return i?u+i*(n[r]-u):u},ta.median=function(n,t){var i,o=[],a=n.length,c=-1;if(1===arguments.length)for(;++c<a;)u(i=r(n[c]))&&o.push(i);else for(;++c<a;)u(i=r(t.call(n,n[c],c)))&&o.push(i);return o.length?ta.quantile(o.sort(e),.5):void 0},ta.variance=function(n,t){var e,i,o=n.length,a=0,c=0,l=-1,s=0;if(1===arguments.length)for(;++l<o;)u(e=r(n[l]))&&(i=e-a,a+=i/++s,c+=i*(e-a));else for(;++l<o;)u(e=r(t.call(n,n[l],l)))&&(i=e-a,a+=i/++s,c+=i*(e-a));return s>1?c/(s-1):void 0},ta.deviation=function(){var n=ta.variance.apply(this,arguments);return n?Math.sqrt(n):n};var ha=i(e);ta.bisectLeft=ha.left,ta.bisect=ta.bisectRight=ha.right,ta.bisector=function(n){return i(1===n.length?function(t,r){return e(n(t),r)}:n)},ta.shuffle=function(n,t,e){(i=arguments.length)<3&&(e=n.length,2>i&&(t=0));for(var r,u,i=e-t;i;)u=Math.random()*i--|0,r=n[i+t],n[i+t]=n[u+t],n[u+t]=r;return n},ta.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},ta.pairs=function(n){for(var t,e=0,r=n.length-1,u=n[0],i=new Array(0>r?0:r);r>e;)i[e]=[t=u,u=n[++e]];return i},ta.zip=function(){if(!(r=arguments.length))return[];for(var n=-1,t=ta.min(arguments,o),e=new Array(t);++n<t;)for(var r,u=-1,i=e[n]=new Array(r);++u<r;)i[u]=arguments[u][n];return e},ta.transpose=function(n){return ta.zip.apply(ta,n)},ta.keys=function(n){var t=[];for(var e in n)t.push(e);return t},ta.values=function(n){var t=[];for(var e in n)t.push(n[e]);return t},ta.entries=function(n){var t=[];for(var e in n)t.push({key:e,value:n[e]});return t},ta.merge=function(n){for(var t,e,r,u=n.length,i=-1,o=0;++i<u;)o+=n[i].length;for(e=new Array(o);--u>=0;)for(r=n[u],t=r.length;--t>=0;)e[--o]=r[t];return e};var ga=Math.abs;ta.range=function(n,t,e){if(arguments.length<3&&(e=1,arguments.length<2&&(t=n,n=0)),(t-n)/e===1/0)throw new Error("infinite range");var r,u=[],i=a(ga(e)),o=-1;if(n*=i,t*=i,e*=i,0>e)for(;(r=n+e*++o)>t;)u.push(r/i);else for(;(r=n+e*++o)<t;)u.push(r/i);return u},ta.map=function(n,t){var e=new l;if(n instanceof l)n.forEach(function(n,t){e.set(n,t)});else if(Array.isArray(n)){var r,u=-1,i=n.length;if(1===arguments.length)for(;++u<i;)e.set(u,n[u]);else for(;++u<i;)e.set(t.call(n,r=n[u],u),r)}else for(var o in n)e.set(o,n[o]);return e};var pa="__proto__",va="\x00";c(l,{has:h,get:function(n){return this._[s(n)]},set:function(n,t){return this._[s(n)]=t},remove:g,keys:p,values:function(){var n=[];for(var t in this._)n.push(this._[t]);return n},entries:function(){var n=[];for(var t in this._)n.push({key:f(t),value:this._[t]});return n},size:v,empty:d,forEach:function(n){for(var t in this._)n.call(this,f(t),this._[t])}}),ta.nest=function(){function n(t,o,a){if(a>=i.length)return r?r.call(u,o):e?o.sort(e):o;for(var c,s,f,h,g=-1,p=o.length,v=i[a++],d=new l;++g<p;)(h=d.get(c=v(s=o[g])))?h.push(s):d.set(c,[s]);return t?(s=t(),f=function(e,r){s.set(e,n(t,r,a))}):(s={},f=function(e,r){s[e]=n(t,r,a)}),d.forEach(f),s}function t(n,e){if(e>=i.length)return n;var r=[],u=o[e++];return n.forEach(function(n,u){r.push({key:n,values:t(u,e)})}),u?r.sort(function(n,t){return u(n.key,t.key)}):r}var e,r,u={},i=[],o=[];return u.map=function(t,e){return n(e,t,0)},u.entries=function(e){return t(n(ta.map,e,0),0)},u.key=function(n){return i.push(n),u},u.sortKeys=function(n){return o[i.length-1]=n,u},u.sortValues=function(n){return e=n,u},u.rollup=function(n){return r=n,u},u},ta.set=function(n){var t=new m;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},c(m,{has:h,add:function(n){return this._[s(n+="")]=!0,n},remove:g,values:p,size:v,empty:d,forEach:function(n){for(var t in this._)n.call(this,f(t))}}),ta.behavior={},ta.rebind=function(n,t){for(var e,r=1,u=arguments.length;++r<u;)n[e=arguments[r]]=M(n,t,t[e]);return n};var da=["webkit","ms","moz","Moz","o","O"];ta.dispatch=function(){for(var n=new _,t=-1,e=arguments.length;++t<e;)n[arguments[t]]=w(n);return n},_.prototype.on=function(n,t){var e=n.indexOf("."),r="";if(e>=0&&(r=n.slice(e+1),n=n.slice(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},ta.event=null,ta.requote=function(n){return n.replace(ma,"\\$&")};var ma=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,ya={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},Ma=function(n,t){return t.querySelector(n)},xa=function(n,t){return t.querySelectorAll(n)},ba=function(n,t){var e=n.matches||n[x(n,"matchesSelector")];return(ba=function(n,t){return e.call(n,t)})(n,t)};"function"==typeof Sizzle&&(Ma=function(n,t){return Sizzle(n,t)[0]||null},xa=Sizzle,ba=Sizzle.matchesSelector),ta.selection=function(){return ta.select(ua.documentElement)};var _a=ta.selection.prototype=[];_a.select=function(n){var t,e,r,u,i=[];n=N(n);for(var o=-1,a=this.length;++o<a;){i.push(t=[]),t.parentNode=(r=this[o]).parentNode;for(var c=-1,l=r.length;++c<l;)(u=r[c])?(t.push(e=n.call(u,u.__data__,c,o)),e&&"__data__"in u&&(e.__data__=u.__data__)):t.push(null)}return A(i)},_a.selectAll=function(n){var t,e,r=[];n=C(n);for(var u=-1,i=this.length;++u<i;)for(var o=this[u],a=-1,c=o.length;++a<c;)(e=o[a])&&(r.push(t=ra(n.call(e,e.__data__,a,u))),t.parentNode=e);return A(r)};var wa={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};ta.ns={prefix:wa,qualify:function(n){var t=n.indexOf(":"),e=n;return t>=0&&(e=n.slice(0,t),n=n.slice(t+1)),wa.hasOwnProperty(e)?{space:wa[e],local:n}:n}},_a.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=ta.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(z(t,n[t]));return this}return this.each(z(n,t))},_a.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=T(n)).length,u=-1;if(t=e.classList){for(;++u<r;)if(!t.contains(n[u]))return!1}else for(t=e.getAttribute("class");++u<r;)if(!L(n[u]).test(t))return!1;return!0}for(t in n)this.each(R(t,n[t]));return this}return this.each(R(n,t))},_a.style=function(n,e,r){var u=arguments.length;if(3>u){if("string"!=typeof n){2>u&&(e="");for(r in n)this.each(P(r,n[r],e));return this}if(2>u){var i=this.node();return t(i).getComputedStyle(i,null).getPropertyValue(n)}r=""}return this.each(P(n,e,r))},_a.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(U(t,n[t]));return this}return this.each(U(n,t))},_a.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},_a.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},_a.append=function(n){return n=j(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},_a.insert=function(n,t){return n=j(n),t=N(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},_a.remove=function(){return this.each(F)},_a.data=function(n,t){function e(n,e){var r,u,i,o=n.length,f=e.length,h=Math.min(o,f),g=new Array(f),p=new Array(f),v=new Array(o);if(t){var d,m=new l,y=new Array(o);for(r=-1;++r<o;)m.has(d=t.call(u=n[r],u.__data__,r))?v[r]=u:m.set(d,u),y[r]=d;for(r=-1;++r<f;)(u=m.get(d=t.call(e,i=e[r],r)))?u!==!0&&(g[r]=u,u.__data__=i):p[r]=H(i),m.set(d,!0);for(r=-1;++r<o;)m.get(y[r])!==!0&&(v[r]=n[r])}else{for(r=-1;++r<h;)u=n[r],i=e[r],u?(u.__data__=i,g[r]=u):p[r]=H(i);for(;f>r;++r)p[r]=H(e[r]);for(;o>r;++r)v[r]=n[r]}p.update=g,p.parentNode=g.parentNode=v.parentNode=n.parentNode,a.push(p),c.push(g),s.push(v)}var r,u,i=-1,o=this.length;if(!arguments.length){for(n=new Array(o=(r=this[0]).length);++i<o;)(u=r[i])&&(n[i]=u.__data__);return n}var a=Z([]),c=A([]),s=A([]);if("function"==typeof n)for(;++i<o;)e(r=this[i],n.call(r,r.parentNode.__data__,i));else for(;++i<o;)e(r=this[i],n);return c.enter=function(){return a},c.exit=function(){return s},c},_a.datum=function(n){return arguments.length?this.property("__data__",n):this.property("__data__")},_a.filter=function(n){var t,e,r,u=[];"function"!=typeof n&&(n=O(n));for(var i=0,o=this.length;o>i;i++){u.push(t=[]),t.parentNode=(e=this[i]).parentNode;for(var a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a,i)&&t.push(r)}return A(u)},_a.order=function(){for(var n=-1,t=this.length;++n<t;)for(var e,r=this[n],u=r.length-1,i=r[u];--u>=0;)(e=r[u])&&(i&&i!==e.nextSibling&&i.parentNode.insertBefore(e,i),i=e);return this},_a.sort=function(n){n=I.apply(this,arguments);for(var t=-1,e=this.length;++t<e;)this[t].sort(n);return this.order()},_a.each=function(n){return Y(this,function(t,e,r){n.call(t,t.__data__,e,r)})},_a.call=function(n){var t=ra(arguments);return n.apply(t[0]=this,t),this},_a.empty=function(){return!this.node()},_a.node=function(){for(var n=0,t=this.length;t>n;n++)for(var e=this[n],r=0,u=e.length;u>r;r++){var i=e[r];if(i)return i}return null},_a.size=function(){var n=0;return Y(this,function(){++n}),n};var Sa=[];ta.selection.enter=Z,ta.selection.enter.prototype=Sa,Sa.append=_a.append,Sa.empty=_a.empty,Sa.node=_a.node,Sa.call=_a.call,Sa.size=_a.size,Sa.select=function(n){for(var t,e,r,u,i,o=[],a=-1,c=this.length;++a<c;){r=(u=this[a]).update,o.push(t=[]),t.parentNode=u.parentNode;for(var l=-1,s=u.length;++l<s;)(i=u[l])?(t.push(r[l]=e=n.call(u.parentNode,i.__data__,l,a)),e.__data__=i.__data__):t.push(null)}return A(o)},Sa.insert=function(n,t){return arguments.length<2&&(t=V(this)),_a.insert.call(this,n,t)},ta.select=function(t){var e;return"string"==typeof t?(e=[Ma(t,ua)],e.parentNode=ua.documentElement):(e=[t],e.parentNode=n(t)),A([e])},ta.selectAll=function(n){var t;return"string"==typeof n?(t=ra(xa(n,ua)),t.parentNode=ua.documentElement):(t=n,t.parentNode=null),A([t])},_a.on=function(n,t,e){var r=arguments.length;if(3>r){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(X(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(X(n,t,e))};var ka=ta.map({mouseenter:"mouseover",mouseleave:"mouseout"});ua&&ka.forEach(function(n){"on"+n in ua&&ka.remove(n)});var Ea,Aa=0;ta.mouse=function(n){return J(n,k())};var Na=this.navigator&&/WebKit/.test(this.navigator.userAgent)?-1:0;ta.touch=function(n,t,e){if(arguments.length<3&&(e=t,t=k().changedTouches),t)for(var r,u=0,i=t.length;i>u;++u)if((r=t[u]).identifier===e)return J(n,r)},ta.behavior.drag=function(){function n(){this.on("mousedown.drag",i).on("touchstart.drag",o)}function e(n,t,e,i,o){return function(){function a(){var n,e,r=t(h,v);r&&(n=r[0]-M[0],e=r[1]-M[1],p|=n|e,M=r,g({type:"drag",x:r[0]+l[0],y:r[1]+l[1],dx:n,dy:e}))}function c(){t(h,v)&&(m.on(i+d,null).on(o+d,null),y(p&&ta.event.target===f),g({type:"dragend"}))}var l,s=this,f=ta.event.target,h=s.parentNode,g=r.of(s,arguments),p=0,v=n(),d=".drag"+(null==v?"":"-"+v),m=ta.select(e(f)).on(i+d,a).on(o+d,c),y=W(f),M=t(h,v);u?(l=u.apply(s,arguments),l=[l.x-M[0],l.y-M[1]]):l=[0,0],g({type:"dragstart"})}}var r=E(n,"drag","dragstart","dragend"),u=null,i=e(b,ta.mouse,t,"mousemove","mouseup"),o=e(G,ta.touch,y,"touchmove","touchend");return n.origin=function(t){return arguments.length?(u=t,n):u},ta.rebind(n,r,"on")},ta.touches=function(n,t){return arguments.length<2&&(t=k().touches),t?ra(t).map(function(t){var e=J(n,t);return e.identifier=t.identifier,e}):[]};var Ca=1e-6,za=Ca*Ca,qa=Math.PI,La=2*qa,Ta=La-Ca,Ra=qa/2,Da=qa/180,Pa=180/qa,Ua=Math.SQRT2,ja=2,Fa=4;ta.interpolateZoom=function(n,t){function e(n){var t=n*y;if(m){var e=rt(v),o=i/(ja*h)*(e*ut(Ua*t+v)-et(v));return[r+o*l,u+o*s,i*e/rt(Ua*t+v)]}return[r+n*l,u+n*s,i*Math.exp(Ua*t)]}var r=n[0],u=n[1],i=n[2],o=t[0],a=t[1],c=t[2],l=o-r,s=a-u,f=l*l+s*s,h=Math.sqrt(f),g=(c*c-i*i+Fa*f)/(2*i*ja*h),p=(c*c-i*i-Fa*f)/(2*c*ja*h),v=Math.log(Math.sqrt(g*g+1)-g),d=Math.log(Math.sqrt(p*p+1)-p),m=d-v,y=(m||Math.log(c/i))/Ua;return e.duration=1e3*y,e},ta.behavior.zoom=function(){function n(n){n.on(q,f).on(Oa+".zoom",g).on("dblclick.zoom",p).on(R,h)}function e(n){return[(n[0]-k.x)/k.k,(n[1]-k.y)/k.k]}function r(n){return[n[0]*k.k+k.x,n[1]*k.k+k.y]}function u(n){k.k=Math.max(N[0],Math.min(N[1],n))}function i(n,t){t=r(t),k.x+=n[0]-t[0],k.y+=n[1]-t[1]}function o(t,e,r,o){t.__chart__={x:k.x,y:k.y,k:k.k},u(Math.pow(2,o)),i(d=e,r),t=ta.select(t),C>0&&(t=t.transition().duration(C)),t.call(n.event)}function a(){b&&b.domain(x.range().map(function(n){return(n-k.x)/k.k}).map(x.invert)),w&&w.domain(_.range().map(function(n){return(n-k.y)/k.k}).map(_.invert))}function c(n){z++||n({type:"zoomstart"})}function l(n){a(),n({type:"zoom",scale:k.k,translate:[k.x,k.y]})}function s(n){--z||(n({type:"zoomend"}),d=null)}function f(){function n(){f=1,i(ta.mouse(u),g),l(a)}function r(){h.on(L,null).on(T,null),p(f&&ta.event.target===o),s(a)}var u=this,o=ta.event.target,a=D.of(u,arguments),f=0,h=ta.select(t(u)).on(L,n).on(T,r),g=e(ta.mouse(u)),p=W(u);Dl.call(u),c(a)}function h(){function n(){var n=ta.touches(p);return g=k.k,n.forEach(function(n){n.identifier in d&&(d[n.identifier]=e(n))}),n}function t(){var t=ta.event.target;ta.select(t).on(x,r).on(b,a),_.push(t);for(var e=ta.event.changedTouches,u=0,i=e.length;i>u;++u)d[e[u].identifier]=null;var c=n(),l=Date.now();if(1===c.length){if(500>l-M){var s=c[0];o(p,s,d[s.identifier],Math.floor(Math.log(k.k)/Math.LN2)+1),S()}M=l}else if(c.length>1){var s=c[0],f=c[1],h=s[0]-f[0],g=s[1]-f[1];m=h*h+g*g}}function r(){var n,t,e,r,o=ta.touches(p);Dl.call(p);for(var a=0,c=o.length;c>a;++a,r=null)if(e=o[a],r=d[e.identifier]){if(t)break;n=e,t=r}if(r){var s=(s=e[0]-n[0])*s+(s=e[1]-n[1])*s,f=m&&Math.sqrt(s/m);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+r[0])/2,(t[1]+r[1])/2],u(f*g)}M=null,i(n,t),l(v)}function a(){if(ta.event.touches.length){for(var t=ta.event.changedTouches,e=0,r=t.length;r>e;++e)delete d[t[e].identifier];for(var u in d)return void n()}ta.selectAll(_).on(y,null),w.on(q,f).on(R,h),E(),s(v)}var g,p=this,v=D.of(p,arguments),d={},m=0,y=".zoom-"+ta.event.changedTouches[0].identifier,x="touchmove"+y,b="touchend"+y,_=[],w=ta.select(p),E=W(p);t(),c(v),w.on(q,null).on(R,t)}function g(){var n=D.of(this,arguments);y?clearTimeout(y):(Dl.call(this),v=e(d=m||ta.mouse(this)),c(n)),y=setTimeout(function(){y=null,s(n)},50),S(),u(Math.pow(2,.002*Ha())*k.k),i(d,v),l(n)}function p(){var n=ta.mouse(this),t=Math.log(k.k)/Math.LN2;o(this,n,e(n),ta.event.shiftKey?Math.ceil(t)-1:Math.floor(t)+1)}var v,d,m,y,M,x,b,_,w,k={x:0,y:0,k:1},A=[960,500],N=Ia,C=250,z=0,q="mousedown.zoom",L="mousemove.zoom",T="mouseup.zoom",R="touchstart.zoom",D=E(n,"zoomstart","zoom","zoomend");return Oa||(Oa="onwheel"in ua?(Ha=function(){return-ta.event.deltaY*(ta.event.deltaMode?120:1)},"wheel"):"onmousewheel"in ua?(Ha=function(){return ta.event.wheelDelta},"mousewheel"):(Ha=function(){return-ta.event.detail},"MozMousePixelScroll")),n.event=function(n){n.each(function(){var n=D.of(this,arguments),t=k;Tl?ta.select(this).transition().each("start.zoom",function(){k=this.__chart__||{x:0,y:0,k:1},c(n)}).tween("zoom:zoom",function(){var e=A[0],r=A[1],u=d?d[0]:e/2,i=d?d[1]:r/2,o=ta.interpolateZoom([(u-k.x)/k.k,(i-k.y)/k.k,e/k.k],[(u-t.x)/t.k,(i-t.y)/t.k,e/t.k]);return function(t){var r=o(t),a=e/r[2];this.__chart__=k={x:u-r[0]*a,y:i-r[1]*a,k:a},l(n)}}).each("interrupt.zoom",function(){s(n)}).each("end.zoom",function(){s(n)}):(this.__chart__=k,c(n),l(n),s(n))})},n.translate=function(t){return arguments.length?(k={x:+t[0],y:+t[1],k:k.k},a(),n):[k.x,k.y]},n.scale=function(t){return arguments.length?(k={x:k.x,y:k.y,k:+t},a(),n):k.k},n.scaleExtent=function(t){return arguments.length?(N=null==t?Ia:[+t[0],+t[1]],n):N},n.center=function(t){return arguments.length?(m=t&&[+t[0],+t[1]],n):m},n.size=function(t){return arguments.length?(A=t&&[+t[0],+t[1]],n):A},n.duration=function(t){return arguments.length?(C=+t,n):C},n.x=function(t){return arguments.length?(b=t,x=t.copy(),k={x:0,y:0,k:1},n):b},n.y=function(t){return arguments.length?(w=t,_=t.copy(),k={x:0,y:0,k:1},n):w},ta.rebind(n,D,"on")};var Ha,Oa,Ia=[0,1/0];ta.color=ot,ot.prototype.toString=function(){return this.rgb()+""},ta.hsl=at;var Ya=at.prototype=new ot;Ya.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),new at(this.h,this.s,this.l/n)},Ya.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new at(this.h,this.s,n*this.l)},Ya.rgb=function(){return ct(this.h,this.s,this.l)},ta.hcl=lt;var Za=lt.prototype=new ot;Za.brighter=function(n){return new lt(this.h,this.c,Math.min(100,this.l+Va*(arguments.length?n:1)))},Za.darker=function(n){return new lt(this.h,this.c,Math.max(0,this.l-Va*(arguments.length?n:1)))},Za.rgb=function(){return st(this.h,this.c,this.l).rgb()},ta.lab=ft;var Va=18,Xa=.95047,$a=1,Ba=1.08883,Wa=ft.prototype=new ot;Wa.brighter=function(n){return new ft(Math.min(100,this.l+Va*(arguments.length?n:1)),this.a,this.b)},Wa.darker=function(n){return new ft(Math.max(0,this.l-Va*(arguments.length?n:1)),this.a,this.b)},Wa.rgb=function(){return ht(this.l,this.a,this.b)},ta.rgb=mt;var Ja=mt.prototype=new ot;Ja.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,u=30;return t||e||r?(t&&u>t&&(t=u),e&&u>e&&(e=u),r&&u>r&&(r=u),new mt(Math.min(255,t/n),Math.min(255,e/n),Math.min(255,r/n))):new mt(u,u,u)},Ja.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new mt(n*this.r,n*this.g,n*this.b)},Ja.hsl=function(){return _t(this.r,this.g,this.b)},Ja.toString=function(){return"#"+xt(this.r)+xt(this.g)+xt(this.b)};var Ga=ta.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});Ga.forEach(function(n,t){Ga.set(n,yt(t))}),ta.functor=Et,ta.xhr=At(y),ta.dsv=function(n,t){function e(n,e,i){arguments.length<3&&(i=e,e=null);var o=Nt(n,t,null==e?r:u(e),i);return o.row=function(n){return arguments.length?o.response(null==(e=n)?r:u(n)):e},o}function r(n){return e.parse(n.responseText)}function u(n){return function(t){return e.parse(t.responseText,n)}}function i(t){return t.map(o).join(n)}function o(n){return a.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var a=new RegExp('["'+n+"\n]"),c=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var u=new Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(u(n),e)}:u})},e.parseRows=function(n,t){function e(){if(s>=l)return o;if(u)return u=!1,i;var t=s;if(34===n.charCodeAt(t)){for(var e=t;e++<l;)if(34===n.charCodeAt(e)){if(34!==n.charCodeAt(e+1))break;++e}s=e+2;var r=n.charCodeAt(e+1);return 13===r?(u=!0,10===n.charCodeAt(e+2)&&++s):10===r&&(u=!0),n.slice(t+1,e).replace(/""/g,'"')}for(;l>s;){var r=n.charCodeAt(s++),a=1;if(10===r)u=!0;else if(13===r)u=!0,10===n.charCodeAt(s)&&(++s,++a);else if(r!==c)continue;return n.slice(t,s-a)}return n.slice(t)}for(var r,u,i={},o={},a=[],l=n.length,s=0,f=0;(r=e())!==o;){for(var h=[];r!==i&&r!==o;)h.push(r),r=e();t&&null==(h=t(h,f++))||a.push(h)}return a},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new m,u=[];return t.forEach(function(n){for(var t in n)r.has(t)||u.push(r.add(t))}),[u.map(o).join(n)].concat(t.map(function(t){return u.map(function(n){return o(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(i).join("\n")},e},ta.csv=ta.dsv(",","text/csv"),ta.tsv=ta.dsv(" ","text/tab-separated-values");var Ka,Qa,nc,tc,ec,rc=this[x(this,"requestAnimationFrame")]||function(n){setTimeout(n,17)};ta.timer=function(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var u=e+t,i={c:n,t:u,f:!1,n:null};Qa?Qa.n=i:Ka=i,Qa=i,nc||(tc=clearTimeout(tc),nc=1,rc(qt))},ta.timer.flush=function(){Lt(),Tt()},ta.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)};var uc=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"].map(Dt);ta.formatPrefix=function(n,t){var e=0;return n&&(0>n&&(n*=-1),t&&(n=ta.round(n,Rt(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((e-1)/3)))),uc[8+e/3]};var ic=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,oc=ta.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=ta.round(n,Rt(n,t))).toFixed(Math.max(0,Math.min(20,Rt(n*(1+1e-15),t))))}}),ac=ta.time={},cc=Date;jt.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){lc.setUTCDate.apply(this._,arguments)},setDay:function(){lc.setUTCDay.apply(this._,arguments)},setFullYear:function(){lc.setUTCFullYear.apply(this._,arguments)},setHours:function(){lc.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){lc.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){lc.setUTCMinutes.apply(this._,arguments)},setMonth:function(){lc.setUTCMonth.apply(this._,arguments)},setSeconds:function(){lc.setUTCSeconds.apply(this._,arguments)},setTime:function(){lc.setTime.apply(this._,arguments)}};var lc=Date.prototype;ac.year=Ft(function(n){return n=ac.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),ac.years=ac.year.range,ac.years.utc=ac.year.utc.range,ac.day=Ft(function(n){var t=new cc(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),ac.days=ac.day.range,ac.days.utc=ac.day.utc.range,ac.dayOfYear=function(n){var t=ac.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(n,t){t=7-t;var e=ac[n]=Ft(function(n){return(n=ac.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=ac.year(n).getDay();return Math.floor((ac.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});ac[n+"s"]=e.range,ac[n+"s"].utc=e.utc.range,ac[n+"OfYear"]=function(n){var e=ac.year(n).getDay();return Math.floor((ac.dayOfYear(n)+(e+t)%7)/7)}}),ac.week=ac.sunday,ac.weeks=ac.sunday.range,ac.weeks.utc=ac.sunday.utc.range,ac.weekOfYear=ac.sundayOfYear;var sc={"-":"",_:" ",0:"0"},fc=/^\s*\d+/,hc=/^%/;ta.locale=function(n){return{numberFormat:Pt(n),timeFormat:Ot(n)}};var gc=ta.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});ta.format=gc.numberFormat,ta.geo={},ce.prototype={s:0,t:0,add:function(n){le(n,this.t,pc),le(pc.s,this.s,this),this.s?this.t+=pc.t:this.s=pc.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var pc=new ce;ta.geo.stream=function(n,t){n&&vc.hasOwnProperty(n.type)?vc[n.type](n,t):se(n,t)};var vc={Feature:function(n,t){se(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,u=e.length;++r<u;)se(e[r].geometry,t)}},dc={Sphere:function(n,t){t.sphere()},Point:function(n,t){n=n.coordinates,t.point(n[0],n[1],n[2])},MultiPoint:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)n=e[r],t.point(n[0],n[1],n[2])},LineString:function(n,t){fe(n.coordinates,t,0)},MultiLineString:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)fe(e[r],t,0)},Polygon:function(n,t){he(n.coordinates,t)},MultiPolygon:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)he(e[r],t)},GeometryCollection:function(n,t){for(var e=n.geometries,r=-1,u=e.length;++r<u;)se(e[r],t)}};ta.geo.area=function(n){return mc=0,ta.geo.stream(n,Mc),mc};var mc,yc=new ce,Mc={sphere:function(){mc+=4*qa},point:b,lineStart:b,lineEnd:b,polygonStart:function(){yc.reset(),Mc.lineStart=ge},polygonEnd:function(){var n=2*yc;mc+=0>n?4*qa+n:n,Mc.lineStart=Mc.lineEnd=Mc.point=b}};ta.geo.bounds=function(){function n(n,t){M.push(x=[s=n,h=n]),f>t&&(f=t),t>g&&(g=t)}function t(t,e){var r=pe([t*Da,e*Da]);if(m){var u=de(m,r),i=[u[1],-u[0],0],o=de(i,u);Me(o),o=xe(o);var c=t-p,l=c>0?1:-1,v=o[0]*Pa*l,d=ga(c)>180;if(d^(v>l*p&&l*t>v)){var y=o[1]*Pa;y>g&&(g=y)}else if(v=(v+360)%360-180,d^(v>l*p&&l*t>v)){var y=-o[1]*Pa;f>y&&(f=y)}else f>e&&(f=e),e>g&&(g=e);d?p>t?a(s,t)>a(s,h)&&(h=t):a(t,h)>a(s,h)&&(s=t):h>=s?(s>t&&(s=t),t>h&&(h=t)):t>p?a(s,t)>a(s,h)&&(h=t):a(t,h)>a(s,h)&&(s=t)}else n(t,e);m=r,p=t}function e(){b.point=t}function r(){x[0]=s,x[1]=h,b.point=n,m=null}function u(n,e){if(m){var r=n-p;y+=ga(r)>180?r+(r>0?360:-360):r}else v=n,d=e;Mc.point(n,e),t(n,e)}function i(){Mc.lineStart()}function o(){u(v,d),Mc.lineEnd(),ga(y)>Ca&&(s=-(h=180)),x[0]=s,x[1]=h,m=null}function a(n,t){return(t-=n)<0?t+360:t}function c(n,t){return n[0]-t[0]}function l(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:n<t[0]||t[1]<n}var s,f,h,g,p,v,d,m,y,M,x,b={point:n,lineStart:e,lineEnd:r,polygonStart:function(){b.point=u,b.lineStart=i,b.lineEnd=o,y=0,Mc.polygonStart()},polygonEnd:function(){Mc.polygonEnd(),b.point=n,b.lineStart=e,b.lineEnd=r,0>yc?(s=-(h=180),f=-(g=90)):y>Ca?g=90:-Ca>y&&(f=-90),x[0]=s,x[1]=h}};return function(n){g=h=-(s=f=1/0),M=[],ta.geo.stream(n,b);var t=M.length;if(t){M.sort(c);for(var e,r=1,u=M[0],i=[u];t>r;++r)e=M[r],l(e[0],u)||l(e[1],u)?(a(u[0],e[1])>a(u[0],u[1])&&(u[1]=e[1]),a(e[0],u[1])>a(u[0],u[1])&&(u[0]=e[0])):i.push(u=e);for(var o,e,p=-1/0,t=i.length-1,r=0,u=i[t];t>=r;u=e,++r)e=i[r],(o=a(u[1],e[0]))>p&&(p=o,s=e[0],h=u[1])}return M=x=null,1/0===s||1/0===f?[[0/0,0/0],[0/0,0/0]]:[[s,f],[h,g]]}}(),ta.geo.centroid=function(n){xc=bc=_c=wc=Sc=kc=Ec=Ac=Nc=Cc=zc=0,ta.geo.stream(n,qc);var t=Nc,e=Cc,r=zc,u=t*t+e*e+r*r;return za>u&&(t=kc,e=Ec,r=Ac,Ca>bc&&(t=_c,e=wc,r=Sc),u=t*t+e*e+r*r,za>u)?[0/0,0/0]:[Math.atan2(e,t)*Pa,tt(r/Math.sqrt(u))*Pa]};var xc,bc,_c,wc,Sc,kc,Ec,Ac,Nc,Cc,zc,qc={sphere:b,point:_e,lineStart:Se,lineEnd:ke,polygonStart:function(){qc.lineStart=Ee},polygonEnd:function(){qc.lineStart=Se}},Lc=Le(Ne,Pe,je,[-qa,-qa/2]),Tc=1e9;ta.geo.clipExtent=function(){var n,t,e,r,u,i,o={stream:function(n){return u&&(u.valid=!1),u=i(n),u.valid=!0,u},extent:function(a){return arguments.length?(i=Ie(n=+a[0][0],t=+a[0][1],e=+a[1][0],r=+a[1][1]),u&&(u.valid=!1,u=null),o):[[n,t],[e,r]]}};return o.extent([[0,0],[960,500]])},(ta.geo.conicEqualArea=function(){return Ye(Ze)}).raw=Ze,ta.geo.albers=function(){return ta.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},ta.geo.albersUsa=function(){function n(n){var i=n[0],o=n[1];return t=null,e(i,o),t||(r(i,o),t)||u(i,o),t}var t,e,r,u,i=ta.geo.albers(),o=ta.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),a=ta.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),c={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=i.scale(),e=i.translate(),r=(n[0]-e[0])/t,u=(n[1]-e[1])/t;return(u>=.12&&.234>u&&r>=-.425&&-.214>r?o:u>=.166&&.234>u&&r>=-.214&&-.115>r?a:i).invert(n)},n.stream=function(n){var t=i.stream(n),e=o.stream(n),r=a.stream(n);return{point:function(n,u){t.point(n,u),e.point(n,u),r.point(n,u)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(i.precision(t),o.precision(t),a.precision(t),n):i.precision()},n.scale=function(t){return arguments.length?(i.scale(t),o.scale(.35*t),a.scale(t),n.translate(i.translate())):i.scale()},n.translate=function(t){if(!arguments.length)return i.translate();var l=i.scale(),s=+t[0],f=+t[1];return e=i.translate(t).clipExtent([[s-.455*l,f-.238*l],[s+.455*l,f+.238*l]]).stream(c).point,r=o.translate([s-.307*l,f+.201*l]).clipExtent([[s-.425*l+Ca,f+.12*l+Ca],[s-.214*l-Ca,f+.234*l-Ca]]).stream(c).point,u=a.translate([s-.205*l,f+.212*l]).clipExtent([[s-.214*l+Ca,f+.166*l+Ca],[s-.115*l-Ca,f+.234*l-Ca]]).stream(c).point,n},n.scale(1070)};var Rc,Dc,Pc,Uc,jc,Fc,Hc={point:b,lineStart:b,lineEnd:b,polygonStart:function(){Dc=0,Hc.lineStart=Ve},polygonEnd:function(){Hc.lineStart=Hc.lineEnd=Hc.point=b,Rc+=ga(Dc/2)}},Oc={point:Xe,lineStart:b,lineEnd:b,polygonStart:b,polygonEnd:b},Ic={point:We,lineStart:Je,lineEnd:Ge,polygonStart:function(){Ic.lineStart=Ke},polygonEnd:function(){Ic.point=We,Ic.lineStart=Je,Ic.lineEnd=Ge}};ta.geo.path=function(){function n(n){return n&&("function"==typeof a&&i.pointRadius(+a.apply(this,arguments)),o&&o.valid||(o=u(i)),ta.geo.stream(n,o)),i.result()}function t(){return o=null,n}var e,r,u,i,o,a=4.5;return n.area=function(n){return Rc=0,ta.geo.stream(n,u(Hc)),Rc},n.centroid=function(n){return _c=wc=Sc=kc=Ec=Ac=Nc=Cc=zc=0,ta.geo.stream(n,u(Ic)),zc?[Nc/zc,Cc/zc]:Ac?[kc/Ac,Ec/Ac]:Sc?[_c/Sc,wc/Sc]:[0/0,0/0]},n.bounds=function(n){return jc=Fc=-(Pc=Uc=1/0),ta.geo.stream(n,u(Oc)),[[Pc,Uc],[jc,Fc]]},n.projection=function(n){return arguments.length?(u=(e=n)?n.stream||tr(n):y,t()):e},n.context=function(n){return arguments.length?(i=null==(r=n)?new $e:new Qe(n),"function"!=typeof a&&i.pointRadius(a),t()):r},n.pointRadius=function(t){return arguments.length?(a="function"==typeof t?t:(i.pointRadius(+t),+t),n):a},n.projection(ta.geo.albersUsa()).context(null)},ta.geo.transform=function(n){return{stream:function(t){var e=new er(t);for(var r in n)e[r]=n[r];return e}}},er.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},ta.geo.projection=ur,ta.geo.projectionMutator=ir,(ta.geo.equirectangular=function(){return ur(ar)}).raw=ar.invert=ar,ta.geo.rotation=function(n){function t(t){return t=n(t[0]*Da,t[1]*Da),t[0]*=Pa,t[1]*=Pa,t}return n=lr(n[0]%360*Da,n[1]*Da,n.length>2?n[2]*Da:0),t.invert=function(t){return t=n.invert(t[0]*Da,t[1]*Da),t[0]*=Pa,t[1]*=Pa,t},t},cr.invert=ar,ta.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=lr(-n[0]*Da,-n[1]*Da,0).invert,u=[];return e(null,null,1,{point:function(n,e){u.push(n=t(n,e)),n[0]*=Pa,n[1]*=Pa}}),{type:"Polygon",coordinates:[u]}}var t,e,r=[0,0],u=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=gr((t=+r)*Da,u*Da),n):t},n.precision=function(r){return arguments.length?(e=gr(t*Da,(u=+r)*Da),n):u},n.angle(90)},ta.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Da,u=n[1]*Da,i=t[1]*Da,o=Math.sin(r),a=Math.cos(r),c=Math.sin(u),l=Math.cos(u),s=Math.sin(i),f=Math.cos(i);return Math.atan2(Math.sqrt((e=f*o)*e+(e=l*s-c*f*a)*e),c*s+l*f*a)},ta.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return ta.range(Math.ceil(i/d)*d,u,d).map(h).concat(ta.range(Math.ceil(l/m)*m,c,m).map(g)).concat(ta.range(Math.ceil(r/p)*p,e,p).filter(function(n){return ga(n%d)>Ca}).map(s)).concat(ta.range(Math.ceil(a/v)*v,o,v).filter(function(n){return ga(n%m)>Ca}).map(f))}var e,r,u,i,o,a,c,l,s,f,h,g,p=10,v=p,d=90,m=360,y=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(i).concat(g(c).slice(1),h(u).reverse().slice(1),g(l).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(i=+t[0][0],u=+t[1][0],l=+t[0][1],c=+t[1][1],i>u&&(t=i,i=u,u=t),l>c&&(t=l,l=c,c=t),n.precision(y)):[[i,l],[u,c]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],a=+t[0][1],o=+t[1][1],r>e&&(t=r,r=e,e=t),a>o&&(t=a,a=o,o=t),n.precision(y)):[[r,a],[e,o]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],m=+t[1],n):[d,m]},n.minorStep=function(t){return arguments.length?(p=+t[0],v=+t[1],n):[p,v]},n.precision=function(t){return arguments.length?(y=+t,s=vr(a,o,90),f=dr(r,e,y),h=vr(l,c,90),g=dr(i,u,y),n):y},n.majorExtent([[-180,-90+Ca],[180,90-Ca]]).minorExtent([[-180,-80-Ca],[180,80+Ca]])},ta.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||u.apply(this,arguments)]}}var t,e,r=mr,u=yr;return n.distance=function(){return ta.geo.distance(t||r.apply(this,arguments),e||u.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(u=t,e="function"==typeof t?null:t,n):u},n.precision=function(){return arguments.length?n:0},n},ta.geo.interpolate=function(n,t){return Mr(n[0]*Da,n[1]*Da,t[0]*Da,t[1]*Da)},ta.geo.length=function(n){return Yc=0,ta.geo.stream(n,Zc),Yc};var Yc,Zc={sphere:b,point:b,lineStart:xr,lineEnd:b,polygonStart:b,polygonEnd:b},Vc=br(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(ta.geo.azimuthalEqualArea=function(){return ur(Vc)}).raw=Vc;var Xc=br(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},y);(ta.geo.azimuthalEquidistant=function(){return ur(Xc)}).raw=Xc,(ta.geo.conicConformal=function(){return Ye(_r)}).raw=_r,(ta.geo.conicEquidistant=function(){return Ye(wr)}).raw=wr;var $c=br(function(n){return 1/n},Math.atan);(ta.geo.gnomonic=function(){return ur($c)}).raw=$c,Sr.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Ra]},(ta.geo.mercator=function(){return kr(Sr)}).raw=Sr;var Bc=br(function(){return 1},Math.asin);(ta.geo.orthographic=function(){return ur(Bc)}).raw=Bc;var Wc=br(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(ta.geo.stereographic=function(){return ur(Wc)}).raw=Wc,Er.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-Ra]},(ta.geo.transverseMercator=function(){var n=kr(Er),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[n[1],-n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length>2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},e([0,0,90])}).raw=Er,ta.geom={},ta.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,u=Et(e),i=Et(r),o=n.length,a=[],c=[];for(t=0;o>t;t++)a.push([+u.call(this,n[t],t),+i.call(this,n[t],t),t]);for(a.sort(zr),t=0;o>t;t++)c.push([a[t][0],-a[t][1]]);var l=Cr(a),s=Cr(c),f=s[0]===l[0],h=s[s.length-1]===l[l.length-1],g=[];for(t=l.length-1;t>=0;--t)g.push(n[a[l[t]][2]]);for(t=+f;t<s.length-h;++t)g.push(n[a[s[t]][2]]);return g}var e=Ar,r=Nr;return arguments.length?t(n):(t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t)},ta.geom.polygon=function(n){return ya(n,Jc),n};var Jc=ta.geom.polygon.prototype=[];Jc.area=function(){for(var n,t=-1,e=this.length,r=this[e-1],u=0;++t<e;)n=r,r=this[t],u+=n[1]*r[0]-n[0]*r[1];return.5*u},Jc.centroid=function(n){var t,e,r=-1,u=this.length,i=0,o=0,a=this[u-1];for(arguments.length||(n=-1/(6*this.area()));++r<u;)t=a,a=this[r],e=t[0]*a[1]-a[0]*t[1],i+=(t[0]+a[0])*e,o+=(t[1]+a[1])*e;return[i*n,o*n]},Jc.clip=function(n){for(var t,e,r,u,i,o,a=Tr(n),c=-1,l=this.length-Tr(this),s=this[l-1];++c<l;){for(t=n.slice(),n.length=0,u=this[c],i=t[(r=t.length-a)-1],e=-1;++e<r;)o=t[e],qr(o,s,u)?(qr(i,s,u)||n.push(Lr(i,o,s,u)),n.push(o)):qr(i,s,u)&&n.push(Lr(i,o,s,u)),i=o;a&&n.push(n[0]),s=u}return n};var Gc,Kc,Qc,nl,tl,el=[],rl=[];Or.prototype.prepare=function(){for(var n,t=this.edges,e=t.length;e--;)n=t[e].edge,n.b&&n.a||t.splice(e,1);return t.sort(Yr),t.length},Qr.prototype={start:function(){return this.edge.l===this.site?this.edge.a:this.edge.b},end:function(){return this.edge.l===this.site?this.edge.b:this.edge.a}},nu.prototype={insert:function(n,t){var e,r,u;if(n){if(t.P=n,t.N=n.N,n.N&&(n.N.P=t),n.N=t,n.R){for(n=n.R;n.L;)n=n.L;n.L=t}else n.R=t;e=n}else this._?(n=uu(this._),t.P=null,t.N=n,n.P=n.L=t,e=n):(t.P=t.N=null,this._=t,e=null);for(t.L=t.R=null,t.U=e,t.C=!0,n=t;e&&e.C;)r=e.U,e===r.L?(u=r.R,u&&u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.R&&(eu(this,e),n=e,e=n.U),e.C=!1,r.C=!0,ru(this,r))):(u=r.L,u&&u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.L&&(ru(this,e),n=e,e=n.U),e.C=!1,r.C=!0,eu(this,r))),e=n.U;this._.C=!1},remove:function(n){n.N&&(n.N.P=n.P),n.P&&(n.P.N=n.N),n.N=n.P=null;var t,e,r,u=n.U,i=n.L,o=n.R;if(e=i?o?uu(o):i:o,u?u.L===n?u.L=e:u.R=e:this._=e,i&&o?(r=e.C,e.C=n.C,e.L=i,i.U=e,e!==o?(u=e.U,e.U=n.U,n=e.R,u.L=n,e.R=o,o.U=e):(e.U=u,u=e,n=e.R)):(r=n.C,n=e),n&&(n.U=u),!r){if(n&&n.C)return void(n.C=!1);do{if(n===this._)break;if(n===u.L){if(t=u.R,t.C&&(t.C=!1,u.C=!0,eu(this,u),t=u.R),t.L&&t.L.C||t.R&&t.R.C){t.R&&t.R.C||(t.L.C=!1,t.C=!0,ru(this,t),t=u.R),t.C=u.C,u.C=t.R.C=!1,eu(this,u),n=this._;break}}else if(t=u.L,t.C&&(t.C=!1,u.C=!0,ru(this,u),t=u.L),t.L&&t.L.C||t.R&&t.R.C){t.L&&t.L.C||(t.R.C=!1,t.C=!0,eu(this,t),t=u.L),t.C=u.C,u.C=t.L.C=!1,ru(this,u),n=this._;break}t.C=!0,n=u,u=u.U}while(!n.C);n&&(n.C=!1)}}},ta.geom.voronoi=function(n){function t(n){var t=new Array(n.length),r=a[0][0],u=a[0][1],i=a[1][0],o=a[1][1];return iu(e(n),a).cells.forEach(function(e,a){var c=e.edges,l=e.site,s=t[a]=c.length?c.map(function(n){var t=n.start();return[t.x,t.y]}):l.x>=r&&l.x<=i&&l.y>=u&&l.y<=o?[[r,o],[i,o],[i,u],[r,u]]:[];s.point=n[a]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(i(n,t)/Ca)*Ca,y:Math.round(o(n,t)/Ca)*Ca,i:t}})}var r=Ar,u=Nr,i=r,o=u,a=ul;return n?t(n):(t.links=function(n){return iu(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return iu(e(n)).cells.forEach(function(e,r){for(var u,i,o=e.site,a=e.edges.sort(Yr),c=-1,l=a.length,s=a[l-1].edge,f=s.l===o?s.r:s.l;++c<l;)u=s,i=f,s=a[c].edge,f=s.l===o?s.r:s.l,r<i.i&&r<f.i&&au(o,i,f)<0&&t.push([n[r],n[i.i],n[f.i]])}),t},t.x=function(n){return arguments.length?(i=Et(r=n),t):r},t.y=function(n){return arguments.length?(o=Et(u=n),t):u},t.clipExtent=function(n){return arguments.length?(a=null==n?ul:n,t):a===ul?null:a},t.size=function(n){return arguments.length?t.clipExtent(n&&[[0,0],n]):a===ul?null:a&&a[1]},t)};var ul=[[-1e6,-1e6],[1e6,1e6]];ta.geom.delaunay=function(n){return ta.geom.voronoi().triangles(n)},ta.geom.quadtree=function(n,t,e,r,u){function i(n){function i(n,t,e,r,u,i,o,a){if(!isNaN(e)&&!isNaN(r))if(n.leaf){var c=n.x,s=n.y;if(null!=c)if(ga(c-e)+ga(s-r)<.01)l(n,t,e,r,u,i,o,a);else{var f=n.point;n.x=n.y=n.point=null,l(n,f,c,s,u,i,o,a),l(n,t,e,r,u,i,o,a)}else n.x=e,n.y=r,n.point=t}else l(n,t,e,r,u,i,o,a)}function l(n,t,e,r,u,o,a,c){var l=.5*(u+a),s=.5*(o+c),f=e>=l,h=r>=s,g=h<<1|f;n.leaf=!1,n=n.nodes[g]||(n.nodes[g]=su()),f?u=l:a=l,h?o=s:c=s,i(n,t,e,r,u,o,a,c)}var s,f,h,g,p,v,d,m,y,M=Et(a),x=Et(c);if(null!=t)v=t,d=e,m=r,y=u;else if(m=y=-(v=d=1/0),f=[],h=[],p=n.length,o)for(g=0;p>g;++g)s=n[g],s.x<v&&(v=s.x),s.y<d&&(d=s.y),s.x>m&&(m=s.x),s.y>y&&(y=s.y),f.push(s.x),h.push(s.y);else for(g=0;p>g;++g){var b=+M(s=n[g],g),_=+x(s,g);v>b&&(v=b),d>_&&(d=_),b>m&&(m=b),_>y&&(y=_),f.push(b),h.push(_)}var w=m-v,S=y-d;w>S?y=d+w:m=v+S;var k=su();if(k.add=function(n){i(k,n,+M(n,++g),+x(n,g),v,d,m,y)},k.visit=function(n){fu(n,k,v,d,m,y)},k.find=function(n){return hu(k,n[0],n[1],v,d,m,y)},g=-1,null==t){for(;++g<p;)i(k,n[g],f[g],h[g],v,d,m,y);--g}else n.forEach(k.add);return f=h=n=s=null,k}var o,a=Ar,c=Nr;return(o=arguments.length)?(a=cu,c=lu,3===o&&(u=e,r=t,e=t=0),i(n)):(i.x=function(n){return arguments.length?(a=n,i):a},i.y=function(n){return arguments.length?(c=n,i):c},i.extent=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=+n[0][0],e=+n[0][1],r=+n[1][0],u=+n[1][1]),i):null==t?null:[[t,e],[r,u]]},i.size=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=e=0,r=+n[0],u=+n[1]),i):null==t?null:[r-t,u-e]},i)},ta.interpolateRgb=gu,ta.interpolateObject=pu,ta.interpolateNumber=vu,ta.interpolateString=du;var il=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,ol=new RegExp(il.source,"g");ta.interpolate=mu,ta.interpolators=[function(n,t){var e=typeof t;return("string"===e?Ga.has(t.toLowerCase())||/^(#|rgb\(|hsl\()/i.test(t)?gu:du:t instanceof ot?gu:Array.isArray(t)?yu:"object"===e&&isNaN(t)?pu:vu)(n,t)}],ta.interpolateArray=yu;var al=function(){return y},cl=ta.map({linear:al,poly:ku,quad:function(){return _u},cubic:function(){return wu},sin:function(){return Eu},exp:function(){return Au},circle:function(){return Nu},elastic:Cu,back:zu,bounce:function(){return qu}}),ll=ta.map({"in":y,out:xu,"in-out":bu,"out-in":function(n){return bu(xu(n))}});ta.ease=function(n){var t=n.indexOf("-"),e=t>=0?n.slice(0,t):n,r=t>=0?n.slice(t+1):"in";return e=cl.get(e)||al,r=ll.get(r)||y,Mu(r(e.apply(null,ea.call(arguments,1))))},ta.interpolateHcl=Lu,ta.interpolateHsl=Tu,ta.interpolateLab=Ru,ta.interpolateRound=Du,ta.transform=function(n){var t=ua.createElementNS(ta.ns.prefix.svg,"g");return(ta.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new Pu(e?e.matrix:sl)})(n)},Pu.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var sl={a:1,b:0,c:0,d:1,e:0,f:0};ta.interpolateTransform=Hu,ta.layout={},ta.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++e<r;)t.push(Yu(n[e]));return t}},ta.layout.chord=function(){function n(){var n,l,f,h,g,p={},v=[],d=ta.range(i),m=[];for(e=[],r=[],n=0,h=-1;++h<i;){for(l=0,g=-1;++g<i;)l+=u[h][g];v.push(l),m.push(ta.range(i)),n+=l}for(o&&d.sort(function(n,t){return o(v[n],v[t])}),a&&m.forEach(function(n,t){n.sort(function(n,e){return a(u[t][n],u[t][e])})}),n=(La-s*i)/n,l=0,h=-1;++h<i;){for(f=l,g=-1;++g<i;){var y=d[h],M=m[y][g],x=u[y][M],b=l,_=l+=x*n;p[y+"-"+M]={index:y,subindex:M,startAngle:b,endAngle:_,value:x}}r[y]={index:y,startAngle:f,endAngle:l,value:(l-f)/n},l+=s}for(h=-1;++h<i;)for(g=h-1;++g<i;){var w=p[h+"-"+g],S=p[g+"-"+h];(w.value||S.value)&&e.push(w.value<S.value?{source:S,target:w}:{source:w,target:S})}c&&t()}function t(){e.sort(function(n,t){return c((n.source.value+n.target.value)/2,(t.source.value+t.target.value)/2)})}var e,r,u,i,o,a,c,l={},s=0;return l.matrix=function(n){return arguments.length?(i=(u=n)&&u.length,e=r=null,l):u},l.padding=function(n){return arguments.length?(s=n,e=r=null,l):s},l.sortGroups=function(n){return arguments.length?(o=n,e=r=null,l):o},l.sortSubgroups=function(n){return arguments.length?(a=n,e=null,l):a},l.sortChords=function(n){return arguments.length?(c=n,e&&t(),l):c},l.chords=function(){return e||n(),e},l.groups=function(){return r||n(),r},l},ta.layout.force=function(){function n(n){return function(t,e,r,u){if(t.point!==n){var i=t.cx-n.x,o=t.cy-n.y,a=u-e,c=i*i+o*o;if(c>a*a/d){if(p>c){var l=t.charge/c;n.px-=i*l,n.py-=o*l}return!0}if(t.point&&c&&p>c){var l=t.pointCharge/c;n.px-=i*l,n.py-=o*l}}return!t.charge}}function t(n){n.px=ta.event.x,n.py=ta.event.y,a.resume()}var e,r,u,i,o,a={},c=ta.dispatch("start","tick","end"),l=[1,1],s=.9,f=fl,h=hl,g=-30,p=gl,v=.1,d=.64,m=[],M=[];return a.tick=function(){if((r*=.99)<.005)return c.end({type:"end",alpha:r=0}),!0;var t,e,a,f,h,p,d,y,x,b=m.length,_=M.length;for(e=0;_>e;++e)a=M[e],f=a.source,h=a.target,y=h.x-f.x,x=h.y-f.y,(p=y*y+x*x)&&(p=r*i[e]*((p=Math.sqrt(p))-u[e])/p,y*=p,x*=p,h.x-=y*(d=f.weight/(h.weight+f.weight)),h.y-=x*d,f.x+=y*(d=1-d),f.y+=x*d);if((d=r*v)&&(y=l[0]/2,x=l[1]/2,e=-1,d))for(;++e<b;)a=m[e],a.x+=(y-a.x)*d,a.y+=(x-a.y)*d;if(g)for(Ju(t=ta.geom.quadtree(m),r,o),e=-1;++e<b;)(a=m[e]).fixed||t.visit(n(a));for(e=-1;++e<b;)a=m[e],a.fixed?(a.x=a.px,a.y=a.py):(a.x-=(a.px-(a.px=a.x))*s,a.y-=(a.py-(a.py=a.y))*s);c.tick({type:"tick",alpha:r})},a.nodes=function(n){return arguments.length?(m=n,a):m},a.links=function(n){return arguments.length?(M=n,a):M},a.size=function(n){return arguments.length?(l=n,a):l},a.linkDistance=function(n){return arguments.length?(f="function"==typeof n?n:+n,a):f},a.distance=a.linkDistance,a.linkStrength=function(n){return arguments.length?(h="function"==typeof n?n:+n,a):h},a.friction=function(n){return arguments.length?(s=+n,a):s},a.charge=function(n){return arguments.length?(g="function"==typeof n?n:+n,a):g},a.chargeDistance=function(n){return arguments.length?(p=n*n,a):Math.sqrt(p)},a.gravity=function(n){return arguments.length?(v=+n,a):v},a.theta=function(n){return arguments.length?(d=n*n,a):Math.sqrt(d)},a.alpha=function(n){return arguments.length?(n=+n,r?r=n>0?n:0:n>0&&(c.start({type:"start",alpha:r=n}),ta.timer(a.tick)),a):r},a.start=function(){function n(n,r){if(!e){for(e=new Array(c),a=0;c>a;++a)e[a]=[];for(a=0;s>a;++a){var u=M[a];e[u.source.index].push(u.target),e[u.target.index].push(u.source)}}for(var i,o=e[t],a=-1,l=o.length;++a<l;)if(!isNaN(i=o[a][n]))return i;return Math.random()*r}var t,e,r,c=m.length,s=M.length,p=l[0],v=l[1];for(t=0;c>t;++t)(r=m[t]).index=t,r.weight=0;for(t=0;s>t;++t)r=M[t],"number"==typeof r.source&&(r.source=m[r.source]),"number"==typeof r.target&&(r.target=m[r.target]),++r.source.weight,++r.target.weight;for(t=0;c>t;++t)r=m[t],isNaN(r.x)&&(r.x=n("x",p)),isNaN(r.y)&&(r.y=n("y",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(u=[],"function"==typeof f)for(t=0;s>t;++t)u[t]=+f.call(this,M[t],t);else for(t=0;s>t;++t)u[t]=f;if(i=[],"function"==typeof h)for(t=0;s>t;++t)i[t]=+h.call(this,M[t],t);else for(t=0;s>t;++t)i[t]=h;if(o=[],"function"==typeof g)for(t=0;c>t;++t)o[t]=+g.call(this,m[t],t);else for(t=0;c>t;++t)o[t]=g;return a.resume()},a.resume=function(){return a.alpha(.1)},a.stop=function(){return a.alpha(0)},a.drag=function(){return e||(e=ta.behavior.drag().origin(y).on("dragstart.force",Xu).on("drag.force",t).on("dragend.force",$u)),arguments.length?void this.on("mouseover.force",Bu).on("mouseout.force",Wu).call(e):e},ta.rebind(a,c,"on")};var fl=20,hl=1,gl=1/0;ta.layout.hierarchy=function(){function n(u){var i,o=[u],a=[];for(u.depth=0;null!=(i=o.pop());)if(a.push(i),(l=e.call(n,i,i.depth))&&(c=l.length)){for(var c,l,s;--c>=0;)o.push(s=l[c]),s.parent=i,s.depth=i.depth+1;r&&(i.value=0),i.children=l}else r&&(i.value=+r.call(n,i,i.depth)||0),delete i.children;return Qu(u,function(n){var e,u;t&&(e=n.children)&&e.sort(t),r&&(u=n.parent)&&(u.value+=n.value)}),a}var t=ei,e=ni,r=ti;return n.sort=function(e){return arguments.length?(t=e,n):t},n.children=function(t){return arguments.length?(e=t,n):e},n.value=function(t){return arguments.length?(r=t,n):r},n.revalue=function(t){return r&&(Ku(t,function(n){n.children&&(n.value=0)}),Qu(t,function(t){var e;t.children||(t.value=+r.call(n,t,t.depth)||0),(e=t.parent)&&(e.value+=t.value)})),t},n},ta.layout.partition=function(){function n(t,e,r,u){var i=t.children;if(t.x=e,t.y=t.depth*u,t.dx=r,t.dy=u,i&&(o=i.length)){var o,a,c,l=-1;for(r=t.value?r/t.value:0;++l<o;)n(a=i[l],e,c=a.value*r,u),e+=c}}function t(n){var e=n.children,r=0;if(e&&(u=e.length))for(var u,i=-1;++i<u;)r=Math.max(r,t(e[i]));return 1+r}function e(e,i){var o=r.call(this,e,i);return n(o[0],0,u[0],u[1]/t(o[0])),o}var r=ta.layout.hierarchy(),u=[1,1];return e.size=function(n){return arguments.length?(u=n,e):u},Gu(e,r)},ta.layout.pie=function(){function n(o){var a,c=o.length,l=o.map(function(e,r){return+t.call(n,e,r)}),s=+("function"==typeof r?r.apply(this,arguments):r),f=("function"==typeof u?u.apply(this,arguments):u)-s,h=Math.min(Math.abs(f)/c,+("function"==typeof i?i.apply(this,arguments):i)),g=h*(0>f?-1:1),p=(f-c*g)/ta.sum(l),v=ta.range(c),d=[];return null!=e&&v.sort(e===pl?function(n,t){return l[t]-l[n]}:function(n,t){return e(o[n],o[t])}),v.forEach(function(n){d[n]={data:o[n],value:a=l[n],startAngle:s,endAngle:s+=a*p+g,padAngle:h}}),d}var t=Number,e=pl,r=0,u=La,i=0;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(u=t,n):u},n.padAngle=function(t){return arguments.length?(i=t,n):i},n};var pl={};ta.layout.stack=function(){function n(a,c){if(!(h=a.length))return a;var l=a.map(function(e,r){return t.call(n,e,r)}),s=l.map(function(t){return t.map(function(t,e){return[i.call(n,t,e),o.call(n,t,e)]})}),f=e.call(n,s,c);l=ta.permute(l,f),s=ta.permute(s,f);var h,g,p,v,d=r.call(n,s,c),m=l[0].length;for(p=0;m>p;++p)for(u.call(n,l[0][p],v=d[p],s[0][p][1]),g=1;h>g;++g)u.call(n,l[g][p],v+=s[g-1][p][1],s[g][p][1]);return a}var t=y,e=ai,r=ci,u=oi,i=ui,o=ii;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:vl.get(t)||ai,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:dl.get(t)||ci,n):r},n.x=function(t){return arguments.length?(i=t,n):i},n.y=function(t){return arguments.length?(o=t,n):o},n.out=function(t){return arguments.length?(u=t,n):u},n};var vl=ta.map({"inside-out":function(n){var t,e,r=n.length,u=n.map(li),i=n.map(si),o=ta.range(r).sort(function(n,t){return u[n]-u[t]}),a=0,c=0,l=[],s=[];for(t=0;r>t;++t)e=o[t],c>a?(a+=i[e],l.push(e)):(c+=i[e],s.push(e));return s.reverse().concat(l)},reverse:function(n){return ta.range(n.length).reverse()},"default":ai}),dl=ta.map({silhouette:function(n){var t,e,r,u=n.length,i=n[0].length,o=[],a=0,c=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];r>a&&(a=r),o.push(r)}for(e=0;i>e;++e)c[e]=(a-o[e])/2;return c},wiggle:function(n){var t,e,r,u,i,o,a,c,l,s=n.length,f=n[0],h=f.length,g=[];for(g[0]=c=l=0,e=1;h>e;++e){for(t=0,u=0;s>t;++t)u+=n[t][e][1];for(t=0,i=0,a=f[e][0]-f[e-1][0];s>t;++t){for(r=0,o=(n[t][e][1]-n[t][e-1][1])/(2*a);t>r;++r)o+=(n[r][e][1]-n[r][e-1][1])/a;i+=o*n[t][e][1]}g[e]=c-=u?i/u*a:0,l>c&&(l=c)}for(e=0;h>e;++e)g[e]-=l;return g},expand:function(n){var t,e,r,u=n.length,i=n[0].length,o=1/u,a=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];if(r)for(t=0;u>t;t++)n[t][e][1]/=r;else for(t=0;u>t;t++)n[t][e][1]=o}for(e=0;i>e;++e)a[e]=0;return a},zero:ci});ta.layout.histogram=function(){function n(n,i){for(var o,a,c=[],l=n.map(e,this),s=r.call(this,l,i),f=u.call(this,s,l,i),i=-1,h=l.length,g=f.length-1,p=t?1:1/h;++i<g;)o=c[i]=[],o.dx=f[i+1]-(o.x=f[i]),o.y=0;if(g>0)for(i=-1;++i<h;)a=l[i],a>=s[0]&&a<=s[1]&&(o=c[ta.bisect(f,a,1,g)-1],o.y+=p,o.push(n[i]));return c}var t=!0,e=Number,r=pi,u=hi;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=Et(t),n):r},n.bins=function(t){return arguments.length?(u="number"==typeof t?function(n){return gi(n,t)}:Et(t),n):u},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},ta.layout.pack=function(){function n(n,i){var o=e.call(this,n,i),a=o[0],c=u[0],l=u[1],s=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(a.x=a.y=0,Qu(a,function(n){n.r=+s(n.value)}),Qu(a,Mi),r){var f=r*(t?1:Math.max(2*a.r/c,2*a.r/l))/2;Qu(a,function(n){n.r+=f}),Qu(a,Mi),Qu(a,function(n){n.r-=f})}return _i(a,c/2,l/2,t?1:1/Math.max(2*a.r/c,2*a.r/l)),o}var t,e=ta.layout.hierarchy().sort(vi),r=0,u=[1,1];return n.size=function(t){return arguments.length?(u=t,n):u},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},Gu(n,e)},ta.layout.tree=function(){function n(n,u){var s=o.call(this,n,u),f=s[0],h=t(f);if(Qu(h,e),h.parent.m=-h.z,Ku(h,r),l)Ku(f,i);else{var g=f,p=f,v=f;Ku(f,function(n){n.x<g.x&&(g=n),n.x>p.x&&(p=n),n.depth>v.depth&&(v=n)});var d=a(g,p)/2-g.x,m=c[0]/(p.x+a(p,g)/2+d),y=c[1]/(v.depth||1);Ku(f,function(n){n.x=(n.x+d)*m,n.y=n.depth*y})}return s}function t(n){for(var t,e={A:null,children:[n]},r=[e];null!=(t=r.pop());)for(var u,i=t.children,o=0,a=i.length;a>o;++o)r.push((i[o]=u={_:i[o],parent:t,children:(u=i[o].children)&&u.slice()||[],A:null,a:null,z:0,m:0,c:0,s:0,t:null,i:o}).a=u);return e.children[0]}function e(n){var t=n.children,e=n.parent.children,r=n.i?e[n.i-1]:null;if(t.length){Ni(n);var i=(t[0].z+t[t.length-1].z)/2;r?(n.z=r.z+a(n._,r._),n.m=n.z-i):n.z=i}else r&&(n.z=r.z+a(n._,r._));n.parent.A=u(n,r,n.parent.A||e[0])}function r(n){n._.x=n.z+n.parent.m,n.m+=n.parent.m}function u(n,t,e){if(t){for(var r,u=n,i=n,o=t,c=u.parent.children[0],l=u.m,s=i.m,f=o.m,h=c.m;o=Ei(o),u=ki(u),o&&u;)c=ki(c),i=Ei(i),i.a=n,r=o.z+f-u.z-l+a(o._,u._),r>0&&(Ai(Ci(o,n,e),n,r),l+=r,s+=r),f+=o.m,l+=u.m,h+=c.m,s+=i.m;o&&!Ei(i)&&(i.t=o,i.m+=f-s),u&&!ki(c)&&(c.t=u,c.m+=l-h,e=n)}return e}function i(n){n.x*=c[0],n.y=n.depth*c[1]}var o=ta.layout.hierarchy().sort(null).value(null),a=Si,c=[1,1],l=null;return n.separation=function(t){return arguments.length?(a=t,n):a},n.size=function(t){return arguments.length?(l=null==(c=t)?i:null,n):l?null:c},n.nodeSize=function(t){return arguments.length?(l=null==(c=t)?null:i,n):l?c:null},Gu(n,o)},ta.layout.cluster=function(){function n(n,i){var o,a=t.call(this,n,i),c=a[0],l=0;Qu(c,function(n){var t=n.children;t&&t.length?(n.x=qi(t),n.y=zi(t)):(n.x=o?l+=e(n,o):0,n.y=0,o=n)});var s=Li(c),f=Ti(c),h=s.x-e(s,f)/2,g=f.x+e(f,s)/2;return Qu(c,u?function(n){n.x=(n.x-c.x)*r[0],n.y=(c.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(g-h)*r[0],n.y=(1-(c.y?n.y/c.y:1))*r[1]}),a}var t=ta.layout.hierarchy().sort(null).value(null),e=Si,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},Gu(n,t)},ta.layout.treemap=function(){function n(n,t){for(var e,r,u=-1,i=n.length;++u<i;)r=(e=n[u]).value*(0>t?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var i=e.children;if(i&&i.length){var o,a,c,l=f(e),s=[],h=i.slice(),p=1/0,v="slice"===g?l.dx:"dice"===g?l.dy:"slice-dice"===g?1&e.depth?l.dy:l.dx:Math.min(l.dx,l.dy);for(n(h,l.dx*l.dy/e.value),s.area=0;(c=h.length)>0;)s.push(o=h[c-1]),s.area+=o.area,"squarify"!==g||(a=r(s,v))<=p?(h.pop(),p=a):(s.area-=s.pop().area,u(s,v,l,!1),v=Math.min(l.dx,l.dy),s.length=s.area=0,p=1/0);s.length&&(u(s,v,l,!0),s.length=s.area=0),i.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var i,o=f(t),a=r.slice(),c=[];for(n(a,o.dx*o.dy/t.value),c.area=0;i=a.pop();)c.push(i),c.area+=i.area,null!=i.z&&(u(c,i.z?o.dx:o.dy,o,!a.length),c.length=c.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,u=0,i=1/0,o=-1,a=n.length;++o<a;)(e=n[o].area)&&(i>e&&(i=e),e>u&&(u=e));return r*=r,t*=t,r?Math.max(t*u*p/r,r/(t*i*p)):1/0}function u(n,t,e,r){var u,i=-1,o=n.length,a=e.x,l=e.y,s=t?c(n.area/t):0;if(t==e.dx){for((r||s>e.dy)&&(s=e.dy);++i<o;)u=n[i],u.x=a,u.y=l,u.dy=s,a+=u.dx=Math.min(e.x+e.dx-a,s?c(u.area/s):0);u.z=!0,u.dx+=e.x+e.dx-a,e.y+=s,e.dy-=s}else{for((r||s>e.dx)&&(s=e.dx);++i<o;)u=n[i],u.x=a,u.y=l,u.dx=s,l+=u.dy=Math.min(e.y+e.dy-l,s?c(u.area/s):0);u.z=!1,u.dy+=e.y+e.dy-l,e.x+=s,e.dx-=s}}function i(r){var u=o||a(r),i=u[0];return i.x=0,i.y=0,i.dx=l[0],i.dy=l[1],o&&a.revalue(i),n([i],i.dx*i.dy/i.value),(o?e:t)(i),h&&(o=u),u}var o,a=ta.layout.hierarchy(),c=Math.round,l=[1,1],s=null,f=Ri,h=!1,g="squarify",p=.5*(1+Math.sqrt(5));return i.size=function(n){return arguments.length?(l=n,i):l},i.padding=function(n){function t(t){var e=n.call(i,t,t.depth);return null==e?Ri(t):Di(t,"number"==typeof e?[e,e,e,e]:e)}function e(t){return Di(t,n)}if(!arguments.length)return s;var r;return f=null==(s=n)?Ri:"function"==(r=typeof n)?t:"number"===r?(n=[n,n,n,n],e):e,i},i.round=function(n){return arguments.length?(c=n?Math.round:Number,i):c!=Number},i.sticky=function(n){return arguments.length?(h=n,o=null,i):h},i.ratio=function(n){return arguments.length?(p=n,i):p},i.mode=function(n){return arguments.length?(g=n+"",i):g},Gu(i,a)},ta.random={normal:function(n,t){var e=arguments.length;return 2>e&&(t=1),1>e&&(n=0),function(){var e,r,u;do e=2*Math.random()-1,r=2*Math.random()-1,u=e*e+r*r;while(!u||u>1);return n+t*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(){var n=ta.random.normal.apply(ta,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=ta.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t}}},ta.scale={};var ml={floor:y,ceil:y};ta.scale.linear=function(){return Ii([0,1],[0,1],mu,!1)};var yl={s:1,g:1,p:1,r:1,e:1};ta.scale.log=function(){return Ji(ta.scale.linear().domain([0,1]),10,!0,[1,10])};var Ml=ta.format(".0e"),xl={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};ta.scale.pow=function(){return Gi(ta.scale.linear(),1,[0,1])},ta.scale.sqrt=function(){return ta.scale.pow().exponent(.5)},ta.scale.ordinal=function(){return Qi([],{t:"range",a:[[]]})},ta.scale.category10=function(){return ta.scale.ordinal().range(bl)},ta.scale.category20=function(){return ta.scale.ordinal().range(_l)},ta.scale.category20b=function(){return ta.scale.ordinal().range(wl)},ta.scale.category20c=function(){return ta.scale.ordinal().range(Sl)};var bl=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(Mt),_l=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(Mt),wl=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(Mt),Sl=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(Mt);ta.scale.quantile=function(){return no([],[])},ta.scale.quantize=function(){return to(0,1,[0,1])},ta.scale.threshold=function(){return eo([.5],[0,1])},ta.scale.identity=function(){return ro([0,1])},ta.svg={},ta.svg.arc=function(){function n(){var n=Math.max(0,+e.apply(this,arguments)),l=Math.max(0,+r.apply(this,arguments)),s=o.apply(this,arguments)-Ra,f=a.apply(this,arguments)-Ra,h=Math.abs(f-s),g=s>f?0:1;if(n>l&&(p=l,l=n,n=p),h>=Ta)return t(l,g)+(n?t(n,1-g):"")+"Z";var p,v,d,m,y,M,x,b,_,w,S,k,E=0,A=0,N=[];if((m=(+c.apply(this,arguments)||0)/2)&&(d=i===kl?Math.sqrt(n*n+l*l):+i.apply(this,arguments),g||(A*=-1),l&&(A=tt(d/l*Math.sin(m))),n&&(E=tt(d/n*Math.sin(m)))),l){y=l*Math.cos(s+A),M=l*Math.sin(s+A),x=l*Math.cos(f-A),b=l*Math.sin(f-A);var C=Math.abs(f-s-2*A)<=qa?0:1;if(A&&so(y,M,x,b)===g^C){var z=(s+f)/2;y=l*Math.cos(z),M=l*Math.sin(z),x=b=null}}else y=M=0;if(n){_=n*Math.cos(f-E),w=n*Math.sin(f-E),S=n*Math.cos(s+E),k=n*Math.sin(s+E);var q=Math.abs(s-f+2*E)<=qa?0:1;if(E&&so(_,w,S,k)===1-g^q){var L=(s+f)/2;_=n*Math.cos(L),w=n*Math.sin(L),S=k=null}}else _=w=0;if((p=Math.min(Math.abs(l-n)/2,+u.apply(this,arguments)))>.001){v=l>n^g?0:1;var T=null==S?[_,w]:null==x?[y,M]:Lr([y,M],[S,k],[x,b],[_,w]),R=y-T[0],D=M-T[1],P=x-T[0],U=b-T[1],j=1/Math.sin(Math.acos((R*P+D*U)/(Math.sqrt(R*R+D*D)*Math.sqrt(P*P+U*U)))/2),F=Math.sqrt(T[0]*T[0]+T[1]*T[1]);if(null!=x){var H=Math.min(p,(l-F)/(j+1)),O=fo(null==S?[_,w]:[S,k],[y,M],l,H,g),I=fo([x,b],[_,w],l,H,g);p===H?N.push("M",O[0],"A",H,",",H," 0 0,",v," ",O[1],"A",l,",",l," 0 ",1-g^so(O[1][0],O[1][1],I[1][0],I[1][1]),",",g," ",I[1],"A",H,",",H," 0 0,",v," ",I[0]):N.push("M",O[0],"A",H,",",H," 0 1,",v," ",I[0])}else N.push("M",y,",",M);if(null!=S){var Y=Math.min(p,(n-F)/(j-1)),Z=fo([y,M],[S,k],n,-Y,g),V=fo([_,w],null==x?[y,M]:[x,b],n,-Y,g);p===Y?N.push("L",V[0],"A",Y,",",Y," 0 0,",v," ",V[1],"A",n,",",n," 0 ",g^so(V[1][0],V[1][1],Z[1][0],Z[1][1]),",",1-g," ",Z[1],"A",Y,",",Y," 0 0,",v," ",Z[0]):N.push("L",V[0],"A",Y,",",Y," 0 0,",v," ",Z[0])}else N.push("L",_,",",w)}else N.push("M",y,",",M),null!=x&&N.push("A",l,",",l," 0 ",C,",",g," ",x,",",b),N.push("L",_,",",w),null!=S&&N.push("A",n,",",n," 0 ",q,",",1-g," ",S,",",k);return N.push("Z"),N.join("")}function t(n,t){return"M0,"+n+"A"+n+","+n+" 0 1,"+t+" 0,"+-n+"A"+n+","+n+" 0 1,"+t+" 0,"+n}var e=io,r=oo,u=uo,i=kl,o=ao,a=co,c=lo;return n.innerRadius=function(t){return arguments.length?(e=Et(t),n):e},n.outerRadius=function(t){return arguments.length?(r=Et(t),n):r},n.cornerRadius=function(t){return arguments.length?(u=Et(t),n):u},n.padRadius=function(t){return arguments.length?(i=t==kl?kl:Et(t),n):i},n.startAngle=function(t){return arguments.length?(o=Et(t),n):o},n.endAngle=function(t){return arguments.length?(a=Et(t),n):a},n.padAngle=function(t){return arguments.length?(c=Et(t),n):c},n.centroid=function(){var n=(+e.apply(this,arguments)+ +r.apply(this,arguments))/2,t=(+o.apply(this,arguments)+ +a.apply(this,arguments))/2-Ra;return[Math.cos(t)*n,Math.sin(t)*n]},n};var kl="auto";ta.svg.line=function(){return ho(y)};var El=ta.map({linear:go,"linear-closed":po,step:vo,"step-before":mo,"step-after":yo,basis:So,"basis-open":ko,"basis-closed":Eo,bundle:Ao,cardinal:bo,"cardinal-open":Mo,"cardinal-closed":xo,monotone:To});El.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var Al=[0,2/3,1/3,0],Nl=[0,1/3,2/3,0],Cl=[0,1/6,2/3,1/6];ta.svg.line.radial=function(){var n=ho(Ro);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},mo.reverse=yo,yo.reverse=mo,ta.svg.area=function(){return Do(y)},ta.svg.area.radial=function(){var n=Do(Ro);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},ta.svg.chord=function(){function n(n,a){var c=t(this,i,n,a),l=t(this,o,n,a);return"M"+c.p0+r(c.r,c.p1,c.a1-c.a0)+(e(c,l)?u(c.r,c.p1,c.r,c.p0):u(c.r,c.p1,l.r,l.p0)+r(l.r,l.p1,l.a1-l.a0)+u(l.r,l.p1,c.r,c.p0))+"Z"}function t(n,t,e,r){var u=t.call(n,e,r),i=a.call(n,u,r),o=c.call(n,u,r)-Ra,s=l.call(n,u,r)-Ra;return{r:i,a0:o,a1:s,p0:[i*Math.cos(o),i*Math.sin(o)],p1:[i*Math.cos(s),i*Math.sin(s)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>qa)+",1 "+t}function u(n,t,e,r){return"Q 0,0 "+r}var i=mr,o=yr,a=Po,c=ao,l=co;return n.radius=function(t){return arguments.length?(a=Et(t),n):a},n.source=function(t){return arguments.length?(i=Et(t),n):i},n.target=function(t){return arguments.length?(o=Et(t),n):o},n.startAngle=function(t){return arguments.length?(c=Et(t),n):c},n.endAngle=function(t){return arguments.length?(l=Et(t),n):l},n},ta.svg.diagonal=function(){function n(n,u){var i=t.call(this,n,u),o=e.call(this,n,u),a=(i.y+o.y)/2,c=[i,{x:i.x,y:a},{x:o.x,y:a},o];return c=c.map(r),"M"+c[0]+"C"+c[1]+" "+c[2]+" "+c[3]}var t=mr,e=yr,r=Uo;return n.source=function(e){return arguments.length?(t=Et(e),n):t},n.target=function(t){return arguments.length?(e=Et(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},ta.svg.diagonal.radial=function(){var n=ta.svg.diagonal(),t=Uo,e=n.projection;return n.projection=function(n){return arguments.length?e(jo(t=n)):t},n},ta.svg.symbol=function(){function n(n,r){return(zl.get(t.call(this,n,r))||Oo)(e.call(this,n,r))}var t=Ho,e=Fo;return n.type=function(e){return arguments.length?(t=Et(e),n):t},n.size=function(t){return arguments.length?(e=Et(t),n):e},n};var zl=ta.map({circle:Oo,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*Ll)),e=t*Ll;return"M0,"+-t+"L"+e+",0 0,"+t+" "+-e+",0Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/ql),e=t*ql/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/ql),e=t*ql/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});ta.svg.symbolTypes=zl.keys();var ql=Math.sqrt(3),Ll=Math.tan(30*Da);_a.transition=function(n){for(var t,e,r=Tl||++Ul,u=Xo(n),i=[],o=Rl||{time:Date.now(),ease:Su,delay:0,duration:250},a=-1,c=this.length;++a<c;){i.push(t=[]);for(var l=this[a],s=-1,f=l.length;++s<f;)(e=l[s])&&$o(e,s,u,r,o),t.push(e)}return Yo(i,u,r)},_a.interrupt=function(n){return this.each(null==n?Dl:Io(Xo(n)))};var Tl,Rl,Dl=Io(Xo()),Pl=[],Ul=0;Pl.call=_a.call,Pl.empty=_a.empty,Pl.node=_a.node,Pl.size=_a.size,ta.transition=function(n,t){return n&&n.transition?Tl?n.transition(t):n:ta.selection().transition(n)},ta.transition.prototype=Pl,Pl.select=function(n){var t,e,r,u=this.id,i=this.namespace,o=[];n=N(n);for(var a=-1,c=this.length;++a<c;){o.push(t=[]);for(var l=this[a],s=-1,f=l.length;++s<f;)(r=l[s])&&(e=n.call(r,r.__data__,s,a))?("__data__"in r&&(e.__data__=r.__data__),$o(e,s,i,u,r[i][u]),t.push(e)):t.push(null)}return Yo(o,i,u)},Pl.selectAll=function(n){var t,e,r,u,i,o=this.id,a=this.namespace,c=[];n=C(n);for(var l=-1,s=this.length;++l<s;)for(var f=this[l],h=-1,g=f.length;++h<g;)if(r=f[h]){i=r[a][o],e=n.call(r,r.__data__,h,l),c.push(t=[]);for(var p=-1,v=e.length;++p<v;)(u=e[p])&&$o(u,p,a,o,i),t.push(u)}return Yo(c,a,o)},Pl.filter=function(n){var t,e,r,u=[];"function"!=typeof n&&(n=O(n));for(var i=0,o=this.length;o>i;i++){u.push(t=[]);for(var e=this[i],a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a,i)&&t.push(r)}return Yo(u,this.namespace,this.id)},Pl.tween=function(n,t){var e=this.id,r=this.namespace;return arguments.length<2?this.node()[r][e].tween.get(n):Y(this,null==t?function(t){t[r][e].tween.remove(n)}:function(u){u[r][e].tween.set(n,t)})},Pl.attr=function(n,t){function e(){this.removeAttribute(a)}function r(){this.removeAttributeNS(a.space,a.local)}function u(n){return null==n?e:(n+="",function(){var t,e=this.getAttribute(a);return e!==n&&(t=o(e,n),function(n){this.setAttribute(a,t(n))})})}function i(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(a.space,a.local);return e!==n&&(t=o(e,n),function(n){this.setAttributeNS(a.space,a.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var o="transform"==n?Hu:mu,a=ta.ns.qualify(n);return Zo(this,"attr."+n,t,a.local?i:u)},Pl.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(u));return r&&function(n){this.setAttribute(u,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(u.space,u.local));return r&&function(n){this.setAttributeNS(u.space,u.local,r(n))}}var u=ta.ns.qualify(n);return this.tween("attr."+n,u.local?r:e)},Pl.style=function(n,e,r){function u(){this.style.removeProperty(n)}function i(e){return null==e?u:(e+="",function(){var u,i=t(this).getComputedStyle(this,null).getPropertyValue(n);return i!==e&&(u=mu(i,e),function(t){this.style.setProperty(n,u(t),r)})})}var o=arguments.length;if(3>o){if("string"!=typeof n){2>o&&(e="");for(r in n)this.style(r,n[r],e);return this}r=""}return Zo(this,"style."+n,e,i)},Pl.styleTween=function(n,e,r){function u(u,i){var o=e.call(this,u,i,t(this).getComputedStyle(this,null).getPropertyValue(n));return o&&function(t){this.style.setProperty(n,o(t),r)}}return arguments.length<3&&(r=""),this.tween("style."+n,u)},Pl.text=function(n){return Zo(this,"text",n,Vo)},Pl.remove=function(){var n=this.namespace;return this.each("end.transition",function(){var t;this[n].count<2&&(t=this.parentNode)&&t.removeChild(this)})},Pl.ease=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].ease:("function"!=typeof n&&(n=ta.ease.apply(ta,arguments)),Y(this,function(r){r[e][t].ease=n}))},Pl.delay=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].delay:Y(this,"function"==typeof n?function(r,u,i){r[e][t].delay=+n.call(r,r.__data__,u,i)}:(n=+n,function(r){r[e][t].delay=n}))},Pl.duration=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].duration:Y(this,"function"==typeof n?function(r,u,i){r[e][t].duration=Math.max(1,n.call(r,r.__data__,u,i))}:(n=Math.max(1,n),function(r){r[e][t].duration=n}))},Pl.each=function(n,t){var e=this.id,r=this.namespace;if(arguments.length<2){var u=Rl,i=Tl;try{Tl=e,Y(this,function(t,u,i){Rl=t[r][e],n.call(t,t.__data__,u,i)})}finally{Rl=u,Tl=i}}else Y(this,function(u){var i=u[r][e];(i.event||(i.event=ta.dispatch("start","end","interrupt"))).on(n,t)});return this},Pl.transition=function(){for(var n,t,e,r,u=this.id,i=++Ul,o=this.namespace,a=[],c=0,l=this.length;l>c;c++){a.push(n=[]);for(var t=this[c],s=0,f=t.length;f>s;s++)(e=t[s])&&(r=e[o][u],$o(e,s,o,i,{time:r.time,ease:r.ease,delay:r.delay+r.duration,duration:r.duration})),n.push(e)}return Yo(a,o,i)},ta.svg.axis=function(){function n(n){n.each(function(){var n,l=ta.select(this),s=this.__chart__||e,f=this.__chart__=e.copy(),h=null==c?f.ticks?f.ticks.apply(f,a):f.domain():c,g=null==t?f.tickFormat?f.tickFormat.apply(f,a):y:t,p=l.selectAll(".tick").data(h,f),v=p.enter().insert("g",".domain").attr("class","tick").style("opacity",Ca),d=ta.transition(p.exit()).style("opacity",Ca).remove(),m=ta.transition(p.order()).style("opacity",1),M=Math.max(u,0)+o,x=Ui(f),b=l.selectAll(".domain").data([0]),_=(b.enter().append("path").attr("class","domain"),ta.transition(b));v.append("line"),v.append("text");var w,S,k,E,A=v.select("line"),N=m.select("line"),C=p.select("text").text(g),z=v.select("text"),q=m.select("text"),L="top"===r||"left"===r?-1:1;if("bottom"===r||"top"===r?(n=Bo,w="x",k="y",S="x2",E="y2",C.attr("dy",0>L?"0em":".71em").style("text-anchor","middle"),_.attr("d","M"+x[0]+","+L*i+"V0H"+x[1]+"V"+L*i)):(n=Wo,w="y",k="x",S="y2",E="x2",C.attr("dy",".32em").style("text-anchor",0>L?"end":"start"),_.attr("d","M"+L*i+","+x[0]+"H0V"+x[1]+"H"+L*i)),A.attr(E,L*u),z.attr(k,L*M),N.attr(S,0).attr(E,L*u),q.attr(w,0).attr(k,L*M),f.rangeBand){var T=f,R=T.rangeBand()/2;s=f=function(n){return T(n)+R}}else s.rangeBand?s=f:d.call(n,f,s);v.call(n,s,f),m.call(n,f,f)})}var t,e=ta.scale.linear(),r=jl,u=6,i=6,o=3,a=[10],c=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in Fl?t+"":jl,n):r},n.ticks=function(){return arguments.length?(a=arguments,n):a},n.tickValues=function(t){return arguments.length?(c=t,n):c},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(u=+t,i=+arguments[e-1],n):u},n.innerTickSize=function(t){return arguments.length?(u=+t,n):u},n.outerTickSize=function(t){return arguments.length?(i=+t,n):i},n.tickPadding=function(t){return arguments.length?(o=+t,n):o},n.tickSubdivide=function(){return arguments.length&&n},n};var jl="bottom",Fl={top:1,right:1,bottom:1,left:1};ta.svg.brush=function(){function n(t){t.each(function(){var t=ta.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",i).on("touchstart.brush",i),o=t.selectAll(".background").data([0]);o.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),t.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var a=t.selectAll(".resize").data(v,y);a.exit().remove(),a.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return Hl[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),a.style("display",n.empty()?"none":null);var c,f=ta.transition(t),h=ta.transition(o);l&&(c=Ui(l),h.attr("x",c[0]).attr("width",c[1]-c[0]),r(f)),s&&(c=Ui(s),h.attr("y",c[0]).attr("height",c[1]-c[0]),u(f)),e(f)})}function e(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+f[+/e$/.test(n)]+","+h[+/^s/.test(n)]+")"})}function r(n){n.select(".extent").attr("x",f[0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",f[1]-f[0])}function u(n){n.select(".extent").attr("y",h[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",h[1]-h[0])}function i(){function i(){32==ta.event.keyCode&&(C||(M=null,q[0]-=f[1],q[1]-=h[1],C=2),S())}function v(){32==ta.event.keyCode&&2==C&&(q[0]+=f[1],q[1]+=h[1],C=0,S())}function d(){var n=ta.mouse(b),t=!1;x&&(n[0]+=x[0],n[1]+=x[1]),C||(ta.event.altKey?(M||(M=[(f[0]+f[1])/2,(h[0]+h[1])/2]),q[0]=f[+(n[0]<M[0])],q[1]=h[+(n[1]<M[1])]):M=null),A&&m(n,l,0)&&(r(k),t=!0),N&&m(n,s,1)&&(u(k),t=!0),t&&(e(k),w({type:"brush",mode:C?"move":"resize"}))}function m(n,t,e){var r,u,i=Ui(t),c=i[0],l=i[1],s=q[e],v=e?h:f,d=v[1]-v[0];return C&&(c-=s,l-=d+s),r=(e?p:g)?Math.max(c,Math.min(l,n[e])):n[e],C?u=(r+=s)+d:(M&&(s=Math.max(c,Math.min(l,2*M[e]-r))),r>s?(u=r,r=s):u=s),v[0]!=r||v[1]!=u?(e?a=null:o=null,v[0]=r,v[1]=u,!0):void 0}function y(){d(),k.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),ta.select("body").style("cursor",null),L.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),z(),w({type:"brushend"})}var M,x,b=this,_=ta.select(ta.event.target),w=c.of(b,arguments),k=ta.select(b),E=_.datum(),A=!/^(n|s)$/.test(E)&&l,N=!/^(e|w)$/.test(E)&&s,C=_.classed("extent"),z=W(b),q=ta.mouse(b),L=ta.select(t(b)).on("keydown.brush",i).on("keyup.brush",v);if(ta.event.changedTouches?L.on("touchmove.brush",d).on("touchend.brush",y):L.on("mousemove.brush",d).on("mouseup.brush",y),k.interrupt().selectAll("*").interrupt(),C)q[0]=f[0]-q[0],q[1]=h[0]-q[1];else if(E){var T=+/w$/.test(E),R=+/^n/.test(E);x=[f[1-T]-q[0],h[1-R]-q[1]],q[0]=f[T],q[1]=h[R]}else ta.event.altKey&&(M=q.slice());k.style("pointer-events","none").selectAll(".resize").style("display",null),ta.select("body").style("cursor",_.style("cursor")),w({type:"brushstart"}),d()}var o,a,c=E(n,"brushstart","brush","brushend"),l=null,s=null,f=[0,0],h=[0,0],g=!0,p=!0,v=Ol[0];return n.event=function(n){n.each(function(){var n=c.of(this,arguments),t={x:f,y:h,i:o,j:a},e=this.__chart__||t;this.__chart__=t,Tl?ta.select(this).transition().each("start.brush",function(){o=e.i,a=e.j,f=e.x,h=e.y,n({type:"brushstart"})}).tween("brush:brush",function(){var e=yu(f,t.x),r=yu(h,t.y);return o=a=null,function(u){f=t.x=e(u),h=t.y=r(u),n({type:"brush",mode:"resize"})}}).each("end.brush",function(){o=t.i,a=t.j,n({type:"brush",mode:"resize"}),n({type:"brushend"})}):(n({type:"brushstart"}),n({type:"brush",mode:"resize"}),n({type:"brushend"}))})},n.x=function(t){return arguments.length?(l=t,v=Ol[!l<<1|!s],n):l},n.y=function(t){return arguments.length?(s=t,v=Ol[!l<<1|!s],n):s},n.clamp=function(t){return arguments.length?(l&&s?(g=!!t[0],p=!!t[1]):l?g=!!t:s&&(p=!!t),n):l&&s?[g,p]:l?g:s?p:null},n.extent=function(t){var e,r,u,i,c;return arguments.length?(l&&(e=t[0],r=t[1],s&&(e=e[0],r=r[0]),o=[e,r],l.invert&&(e=l(e),r=l(r)),e>r&&(c=e,e=r,r=c),(e!=f[0]||r!=f[1])&&(f=[e,r])),s&&(u=t[0],i=t[1],l&&(u=u[1],i=i[1]),a=[u,i],s.invert&&(u=s(u),i=s(i)),u>i&&(c=u,u=i,i=c),(u!=h[0]||i!=h[1])&&(h=[u,i])),n):(l&&(o?(e=o[0],r=o[1]):(e=f[0],r=f[1],l.invert&&(e=l.invert(e),r=l.invert(r)),e>r&&(c=e,e=r,r=c))),s&&(a?(u=a[0],i=a[1]):(u=h[0],i=h[1],s.invert&&(u=s.invert(u),i=s.invert(i)),u>i&&(c=u,u=i,i=c))),l&&s?[[e,u],[r,i]]:l?[e,r]:s&&[u,i])},n.clear=function(){return n.empty()||(f=[0,0],h=[0,0],o=a=null),n},n.empty=function(){return!!l&&f[0]==f[1]||!!s&&h[0]==h[1]},ta.rebind(n,c,"on")};var Hl={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Ol=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Il=ac.format=gc.timeFormat,Yl=Il.utc,Zl=Yl("%Y-%m-%dT%H:%M:%S.%LZ");Il.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?Jo:Zl,Jo.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},Jo.toString=Zl.toString,ac.second=Ft(function(n){return new cc(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),ac.seconds=ac.second.range,ac.seconds.utc=ac.second.utc.range,ac.minute=Ft(function(n){return new cc(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),ac.minutes=ac.minute.range,ac.minutes.utc=ac.minute.utc.range,ac.hour=Ft(function(n){var t=n.getTimezoneOffset()/60;return new cc(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),ac.hours=ac.hour.range,ac.hours.utc=ac.hour.utc.range,ac.month=Ft(function(n){return n=ac.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),ac.months=ac.month.range,ac.months.utc=ac.month.utc.range;var Vl=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Xl=[[ac.second,1],[ac.second,5],[ac.second,15],[ac.second,30],[ac.minute,1],[ac.minute,5],[ac.minute,15],[ac.minute,30],[ac.hour,1],[ac.hour,3],[ac.hour,6],[ac.hour,12],[ac.day,1],[ac.day,2],[ac.week,1],[ac.month,1],[ac.month,3],[ac.year,1]],$l=Il.multi([[".%L",function(n){return n.getMilliseconds()}],[":%S",function(n){return n.getSeconds()}],["%I:%M",function(n){return n.getMinutes()}],["%I %p",function(n){return n.getHours()}],["%a %d",function(n){return n.getDay()&&1!=n.getDate()}],["%b %d",function(n){return 1!=n.getDate()}],["%B",function(n){return n.getMonth()}],["%Y",Ne]]),Bl={range:function(n,t,e){return ta.range(Math.ceil(n/e)*e,+t,e).map(Ko)},floor:y,ceil:y};Xl.year=ac.year,ac.scale=function(){return Go(ta.scale.linear(),Xl,$l)};var Wl=Xl.map(function(n){return[n[0].utc,n[1]]}),Jl=Yl.multi([[".%L",function(n){return n.getUTCMilliseconds()}],[":%S",function(n){return n.getUTCSeconds()}],["%I:%M",function(n){return n.getUTCMinutes()}],["%I %p",function(n){return n.getUTCHours()}],["%a %d",function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],["%b %d",function(n){return 1!=n.getUTCDate()}],["%B",function(n){return n.getUTCMonth()}],["%Y",Ne]]);Wl.year=ac.year.utc,ac.scale.utc=function(){return Go(ta.scale.linear(),Wl,Jl)},ta.text=At(function(n){return n.responseText}),ta.json=function(n,t){return Nt(n,"application/json",Qo,t)},ta.html=function(n,t){return Nt(n,"text/html",na,t)},ta.xml=At(function(n){return n.responseXML}),"function"==typeof define&&define.amd?define(ta):"object"==typeof module&&module.exports&&(module.exports=ta),this.d3=ta}(); \ No newline at end of file diff --git a/goaccess++/resources/js/hogan.min.js b/goaccess++/resources/js/hogan.min.js new file mode 100644 index 0000000..437c5d4 --- /dev/null +++ b/goaccess++/resources/js/hogan.min.js @@ -0,0 +1,5 @@ +/** +* @preserve Copyright 2012 Twitter, Inc. +* @license http://www.apache.org/licenses/LICENSE-2.0.txt +*/ +var Hogan={};!function(t){function n(t,n,e){var i;return n&&"object"==typeof n&&(void 0!==n[t]?i=n[t]:e&&n.get&&"function"==typeof n.get&&(i=n.get(t))),i}function e(t,n,e,i,r,s){function a(){}function o(){}a.prototype=t,o.prototype=t.subs;var u,c=new a;c.subs=new o,c.subsText={},c.buf="",i=i||{},c.stackSubs=i,c.subsText=s;for(u in n)i[u]||(i[u]=n[u]);for(u in i)c.subs[u]=i[u];r=r||{},c.stackPartials=r;for(u in e)r[u]||(r[u]=e[u]);for(u in r)c.partials[u]=r[u];return c}function i(t){return String(null===t||void 0===t?"":t)}function r(t){return t=i(t),l.test(t)?t.replace(s,"&").replace(a,"<").replace(o,">").replace(u,"'").replace(c,"""):t}t.Template=function(t,n,e,i){t=t||{},this.r=t.code||this.r,this.c=e,this.options=i||{},this.text=n||"",this.partials=t.partials||{},this.subs=t.subs||{},this.buf=""},t.Template.prototype={r:function(){return""},v:r,t:i,render:function(t,n,e){return this.ri([t],n||{},e)},ri:function(t,n,e){return this.r(t,n,e)},ep:function(t,n){var i=this.partials[t],r=n[i.name];if(i.instance&&i.base==r)return i.instance;if("string"==typeof r){if(!this.c)throw new Error("No compiler available.");r=this.c.compile(r,this.options)}if(!r)return null;if(this.partials[t].base=r,i.subs){n.stackText||(n.stackText={});for(key in i.subs)n.stackText[key]||(n.stackText[key]=void 0!==this.activeSub&&n.stackText[this.activeSub]?n.stackText[this.activeSub]:this.text);r=e(r,i.subs,i.partials,this.stackSubs,this.stackPartials,n.stackText)}return this.partials[t].instance=r,r},rp:function(t,n,e,i){var r=this.ep(t,e);return r?r.ri(n,e,i):""},rs:function(t,n,e){var i=t[t.length-1];if(!f(i))return void e(t,n,this);for(var r=0;r<i.length;r++)t.push(i[r]),e(t,n,this),t.pop()},s:function(t,n,e,i,r,s,a){var o;return f(t)&&0===t.length?!1:("function"==typeof t&&(t=this.ms(t,n,e,i,r,s,a)),o=!!t,!i&&o&&n&&n.push("object"==typeof t?t:n[n.length-1]),o)},d:function(t,e,i,r){var s,a=t.split("."),o=this.f(a[0],e,i,r),u=this.options.modelGet,c=null;if("."===t&&f(e[e.length-2]))o=e[e.length-1];else for(var l=1;l<a.length;l++)s=n(a[l],o,u),void 0!==s?(c=o,o=s):o="";return r&&!o?!1:(r||"function"!=typeof o||(e.push(c),o=this.mv(o,e,i),e.pop()),o)},f:function(t,e,i,r){for(var s=!1,a=null,o=!1,u=this.options.modelGet,c=e.length-1;c>=0;c--)if(a=e[c],s=n(t,a,u),void 0!==s){o=!0;break}return o?(r||"function"!=typeof s||(s=this.mv(s,e,i)),s):r?!1:""},ls:function(t,n,e,r,s){var a=this.options.delimiters;return this.options.delimiters=s,this.b(this.ct(i(t.call(n,r)),n,e)),this.options.delimiters=a,!1},ct:function(t,n,e){if(this.options.disableLambda)throw new Error("Lambda features disabled.");return this.c.compile(t,this.options).render(n,e)},b:function(t){this.buf+=t},fl:function(){var t=this.buf;return this.buf="",t},ms:function(t,n,e,i,r,s,a){var o,u=n[n.length-1],c=t.call(u);return"function"==typeof c?i?!0:(o=this.activeSub&&this.subsText&&this.subsText[this.activeSub]?this.subsText[this.activeSub]:this.text,this.ls(c,u,e,o.substring(r,s),a)):c},mv:function(t,n,e){var r=n[n.length-1],s=t.call(r);return"function"==typeof s?this.ct(i(s.call(r)),r,e):s},sub:function(t,n,e,i){var r=this.subs[t];r&&(this.activeSub=t,r(n,e,this,i),this.activeSub=!1)}};var s=/&/g,a=/</g,o=/>/g,u=/\'/g,c=/\"/g,l=/[&<>\"\']/,f=Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)}}("undefined"!=typeof exports?exports:Hogan),function(t){function n(t){"}"===t.n.substr(t.n.length-1)&&(t.n=t.n.substring(0,t.n.length-1))}function e(t){return t.trim?t.trim():t.replace(/^\s*|\s*$/g,"")}function i(t,n,e){if(n.charAt(e)!=t.charAt(0))return!1;for(var i=1,r=t.length;r>i;i++)if(n.charAt(e+i)!=t.charAt(i))return!1;return!0}function r(n,e,i,o){var u=[],c=null,l=null,f=null;for(l=i[i.length-1];n.length>0;){if(f=n.shift(),l&&"<"==l.tag&&!(f.tag in k))throw new Error("Illegal content in < super tag.");if(t.tags[f.tag]<=t.tags.$||s(f,o))i.push(f),f.nodes=r(n,f.tag,i,o);else{if("/"==f.tag){if(0===i.length)throw new Error("Closing tag without opener: /"+f.n);if(c=i.pop(),f.n!=c.n&&!a(f.n,c.n,o))throw new Error("Nesting error: "+c.n+" vs. "+f.n);return c.end=f.i,u}"\n"==f.tag&&(f.last=0==n.length||"\n"==n[0].tag)}u.push(f)}if(i.length>0)throw new Error("missing closing tag: "+i.pop().n);return u}function s(t,n){for(var e=0,i=n.length;i>e;e++)if(n[e].o==t.n)return t.tag="#",!0}function a(t,n,e){for(var i=0,r=e.length;r>i;i++)if(e[i].c==t&&e[i].o==n)return!0}function o(t){var n=[];for(var e in t)n.push('"'+c(e)+'": function(c,p,t,i) {'+t[e]+"}");return"{ "+n.join(",")+" }"}function u(t){var n=[];for(var e in t.partials)n.push('"'+c(e)+'":{name:"'+c(t.partials[e].name)+'", '+u(t.partials[e])+"}");return"partials: {"+n.join(",")+"}, subs: "+o(t.subs)}function c(t){return t.replace(m,"\\\\").replace(v,'\\"').replace(b,"\\n").replace(d,"\\r").replace(x,"\\u2028").replace(w,"\\u2029")}function l(t){return~t.indexOf(".")?"d":"f"}function f(t,n){var e="<"+(n.prefix||""),i=e+t.n+y++;return n.partials[i]={name:t.n,partials:{}},n.code+='t.b(t.rp("'+c(i)+'",c,p,"'+(t.indent||"")+'"));',i}function h(t,n){n.code+="t.b(t.t(t."+l(t.n)+'("'+c(t.n)+'",c,p,0)));'}function p(t){return"t.b("+t+");"}var g=/\S/,v=/\"/g,b=/\n/g,d=/\r/g,m=/\\/g,x=/\u2028/,w=/\u2029/;t.tags={"#":1,"^":2,"<":3,$:4,"/":5,"!":6,">":7,"=":8,_v:9,"{":10,"&":11,_t:12},t.scan=function(r,s){function a(){m.length>0&&(x.push({tag:"_t",text:new String(m)}),m="")}function o(){for(var n=!0,e=y;e<x.length;e++)if(n=t.tags[x[e].tag]<t.tags._v||"_t"==x[e].tag&&null===x[e].text.match(g),!n)return!1;return n}function u(t,n){if(a(),t&&o())for(var e,i=y;i<x.length;i++)x[i].text&&((e=x[i+1])&&">"==e.tag&&(e.indent=x[i].text.toString()),x.splice(i,1));else n||x.push({tag:"\n"});w=!1,y=x.length}function c(t,n){var i="="+S,r=t.indexOf(i,n),s=e(t.substring(t.indexOf("=",n)+1,r)).split(" ");return T=s[0],S=s[s.length-1],r+i.length-1}var l=r.length,f=0,h=1,p=2,v=f,b=null,d=null,m="",x=[],w=!1,k=0,y=0,T="{{",S="}}";for(s&&(s=s.split(" "),T=s[0],S=s[1]),k=0;l>k;k++)v==f?i(T,r,k)?(--k,a(),v=h):"\n"==r.charAt(k)?u(w):m+=r.charAt(k):v==h?(k+=T.length-1,d=t.tags[r.charAt(k+1)],b=d?r.charAt(k+1):"_v","="==b?(k=c(r,k),v=f):(d&&k++,v=p),w=k):i(S,r,k)?(x.push({tag:b,n:e(m),otag:T,ctag:S,i:"/"==b?w-T.length:k+S.length}),m="",k+=S.length-1,v=f,"{"==b&&("}}"==S?k++:n(x[x.length-1]))):m+=r.charAt(k);return u(w,!0),x};var k={_t:!0,"\n":!0,$:!0,"/":!0};t.stringify=function(n){return"{code: function (c,p,i) { "+t.wrapMain(n.code)+" },"+u(n)+"}"};var y=0;t.generate=function(n,e,i){y=0;var r={code:"",subs:{},partials:{}};return t.walk(n,r),i.asString?this.stringify(r,e,i):this.makeTemplate(r,e,i)},t.wrapMain=function(t){return'var t=this;t.b(i=i||"");'+t+"return t.fl();"},t.template=t.Template,t.makeTemplate=function(t,n,e){var i=this.makePartials(t);return i.code=new Function("c","p","i",this.wrapMain(t.code)),new this.template(i,n,this,e)},t.makePartials=function(t){var n,e={subs:{},partials:t.partials,name:t.name};for(n in e.partials)e.partials[n]=this.makePartials(e.partials[n]);for(n in t.subs)e.subs[n]=new Function("c","p","t","i",t.subs[n]);return e},t.codegen={"#":function(n,e){e.code+="if(t.s(t."+l(n.n)+'("'+c(n.n)+'",c,p,1),c,p,0,'+n.i+","+n.end+',"'+n.otag+" "+n.ctag+'")){t.rs(c,p,function(c,p,t){',t.walk(n.nodes,e),e.code+="});c.pop();}"},"^":function(n,e){e.code+="if(!t.s(t."+l(n.n)+'("'+c(n.n)+'",c,p,1),c,p,1,0,0,"")){',t.walk(n.nodes,e),e.code+="};"},">":f,"<":function(n,e){var i={partials:{},code:"",subs:{},inPartial:!0};t.walk(n.nodes,i);var r=e.partials[f(n,e)];r.subs=i.subs,r.partials=i.partials},$:function(n,e){var i={subs:{},code:"",partials:e.partials,prefix:n.n};t.walk(n.nodes,i),e.subs[n.n]=i.code,e.inPartial||(e.code+='t.sub("'+c(n.n)+'",c,p,i);')},"\n":function(t,n){n.code+=p('"\\n"'+(t.last?"":" + i"))},_v:function(t,n){n.code+="t.b(t.v(t."+l(t.n)+'("'+c(t.n)+'",c,p,0)));'},_t:function(t,n){n.code+=p('"'+c(t.text)+'"')},"{":h,"&":h},t.walk=function(n,e){for(var i,r=0,s=n.length;s>r;r++)i=t.codegen[n[r].tag],i&&i(n[r],e);return e},t.parse=function(t,n,e){return e=e||{},r(t,"",[],e.sectionTags||[])},t.cache={},t.cacheKey=function(t,n){return[t,!!n.asString,!!n.disableLambda,n.delimiters,!!n.modelGet].join("||")},t.compile=function(n,e){e=e||{};var i=t.cacheKey(n,e),r=this.cache[i];if(r){var s=r.partials;for(var a in s)delete s[a].instance;return r}return r=this.generate(this.parse(this.scan(n,e.delimiters),n,e),n,e),this.cache[i]=r}}("undefined"!=typeof exports?exports:Hogan); \ No newline at end of file diff --git a/goaccess++/resources/js/hogan.min.js.tmp b/goaccess++/resources/js/hogan.min.js.tmp new file mode 100644 index 0000000..9d0688e --- /dev/null +++ b/goaccess++/resources/js/hogan.min.js.tmp @@ -0,0 +1 @@ +/*** @preserve Copyright 2012 Twitter, Inc.* @license http://www.apache.org/licenses/LICENSE-2.0.txt*/var Hogan={};!function(t){function n(t,n,e){var i;return n&&"object"==typeof n&&(void 0!==n[t]?i=n[t]:e&&n.get&&"function"==typeof n.get&&(i=n.get(t))),i}function e(t,n,e,i,r,s){function a(){}function o(){}a.prototype=t,o.prototype=t.subs;var u,c=new a;c.subs=new o,c.subsText={},c.buf="",i=i||{},c.stackSubs=i,c.subsText=s;for(u in n)i[u]||(i[u]=n[u]);for(u in i)c.subs[u]=i[u];r=r||{},c.stackPartials=r;for(u in e)r[u]||(r[u]=e[u]);for(u in r)c.partials[u]=r[u];return c}function i(t){return String(null===t||void 0===t?"":t)}function r(t){return t=i(t),l.test(t)?t.replace(s,"&").replace(a,"<").replace(o,">").replace(u,"'").replace(c,"""):t}t.Template=function(t,n,e,i){t=t||{},this.r=t.code||this.r,this.c=e,this.options=i||{},this.text=n||"",this.partials=t.partials||{},this.subs=t.subs||{},this.buf=""},t.Template.prototype={r:function(){return""},v:r,t:i,render:function(t,n,e){return this.ri([t],n||{},e)},ri:function(t,n,e){return this.r(t,n,e)},ep:function(t,n){var i=this.partials[t],r=n[i.name];if(i.instance&&i.base==r)return i.instance;if("string"==typeof r){if(!this.c)throw new Error("No compiler available.");r=this.c.compile(r,this.options)}if(!r)return null;if(this.partials[t].base=r,i.subs){n.stackText||(n.stackText={});for(key in i.subs)n.stackText[key]||(n.stackText[key]=void 0!==this.activeSub&&n.stackText[this.activeSub]?n.stackText[this.activeSub]:this.text);r=e(r,i.subs,i.partials,this.stackSubs,this.stackPartials,n.stackText)}return this.partials[t].instance=r,r},rp:function(t,n,e,i){var r=this.ep(t,e);return r?r.ri(n,e,i):""},rs:function(t,n,e){var i=t[t.length-1];if(!f(i))return void e(t,n,this);for(var r=0;r<i.length;r++)t.push(i[r]),e(t,n,this),t.pop()},s:function(t,n,e,i,r,s,a){var o;return f(t)&&0===t.length?!1:("function"==typeof t&&(t=this.ms(t,n,e,i,r,s,a)),o=!!t,!i&&o&&n&&n.push("object"==typeof t?t:n[n.length-1]),o)},d:function(t,e,i,r){var s,a=t.split("."),o=this.f(a[0],e,i,r),u=this.options.modelGet,c=null;if("."===t&&f(e[e.length-2]))o=e[e.length-1];else for(var l=1;l<a.length;l++)s=n(a[l],o,u),void 0!==s?(c=o,o=s):o="";return r&&!o?!1:(r||"function"!=typeof o||(e.push(c),o=this.mv(o,e,i),e.pop()),o)},f:function(t,e,i,r){for(var s=!1,a=null,o=!1,u=this.options.modelGet,c=e.length-1;c>=0;c--)if(a=e[c],s=n(t,a,u),void 0!==s){o=!0;break}return o?(r||"function"!=typeof s||(s=this.mv(s,e,i)),s):r?!1:""},ls:function(t,n,e,r,s){var a=this.options.delimiters;return this.options.delimiters=s,this.b(this.ct(i(t.call(n,r)),n,e)),this.options.delimiters=a,!1},ct:function(t,n,e){if(this.options.disableLambda)throw new Error("Lambda features disabled.");return this.c.compile(t,this.options).render(n,e)},b:function(t){this.buf+=t},fl:function(){var t=this.buf;return this.buf="",t},ms:function(t,n,e,i,r,s,a){var o,u=n[n.length-1],c=t.call(u);return"function"==typeof c?i?!0:(o=this.activeSub&&this.subsText&&this.subsText[this.activeSub]?this.subsText[this.activeSub]:this.text,this.ls(c,u,e,o.substring(r,s),a)):c},mv:function(t,n,e){var r=n[n.length-1],s=t.call(r);return"function"==typeof s?this.ct(i(s.call(r)),r,e):s},sub:function(t,n,e,i){var r=this.subs[t];r&&(this.activeSub=t,r(n,e,this,i),this.activeSub=!1)}};var s=/&/g,a=/</g,o=/>/g,u=/\'/g,c=/\"/g,l=/[&<>\"\']/,f=Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)}}("undefined"!=typeof exports?exports:Hogan),function(t){function n(t){"}"===t.n.substr(t.n.length-1)&&(t.n=t.n.substring(0,t.n.length-1))}function e(t){return t.trim?t.trim():t.replace(/^\s*|\s*$/g,"")}function i(t,n,e){if(n.charAt(e)!=t.charAt(0))return!1;for(var i=1,r=t.length;r>i;i++)if(n.charAt(e+i)!=t.charAt(i))return!1;return!0}function r(n,e,i,o){var u=[],c=null,l=null,f=null;for(l=i[i.length-1];n.length>0;){if(f=n.shift(),l&&"<"==l.tag&&!(f.tag in k))throw new Error("Illegal content in < super tag.");if(t.tags[f.tag]<=t.tags.$||s(f,o))i.push(f),f.nodes=r(n,f.tag,i,o);else{if("/"==f.tag){if(0===i.length)throw new Error("Closing tag without opener: /"+f.n);if(c=i.pop(),f.n!=c.n&&!a(f.n,c.n,o))throw new Error("Nesting error: "+c.n+" vs. "+f.n);return c.end=f.i,u}"\n"==f.tag&&(f.last=0==n.length||"\n"==n[0].tag)}u.push(f)}if(i.length>0)throw new Error("missing closing tag: "+i.pop().n);return u}function s(t,n){for(var e=0,i=n.length;i>e;e++)if(n[e].o==t.n)return t.tag="#",!0}function a(t,n,e){for(var i=0,r=e.length;r>i;i++)if(e[i].c==t&&e[i].o==n)return!0}function o(t){var n=[];for(var e in t)n.push('"'+c(e)+'": function(c,p,t,i) {'+t[e]+"}");return"{ "+n.join(",")+" }"}function u(t){var n=[];for(var e in t.partials)n.push('"'+c(e)+'":{name:"'+c(t.partials[e].name)+'", '+u(t.partials[e])+"}");return"partials: {"+n.join(",")+"}, subs: "+o(t.subs)}function c(t){return t.replace(m,"\\\\").replace(v,'\\"').replace(b,"\\n").replace(d,"\\r").replace(x,"\\u2028").replace(w,"\\u2029")}function l(t){return~t.indexOf(".")?"d":"f"}function f(t,n){var e="<"+(n.prefix||""),i=e+t.n+y++;return n.partials[i]={name:t.n,partials:{}},n.code+='t.b(t.rp("'+c(i)+'",c,p,"'+(t.indent||"")+'"));',i}function h(t,n){n.code+="t.b(t.t(t."+l(t.n)+'("'+c(t.n)+'",c,p,0)));'}function p(t){return"t.b("+t+");"}var g=/\S/,v=/\"/g,b=/\n/g,d=/\r/g,m=/\\/g,x=/\u2028/,w=/\u2029/;t.tags={"#":1,"^":2,"<":3,$:4,"/":5,"!":6,">":7,"=":8,_v:9,"{":10,"&":11,_t:12},t.scan=function(r,s){function a(){m.length>0&&(x.push({tag:"_t",text:new String(m)}),m="")}function o(){for(var n=!0,e=y;e<x.length;e++)if(n=t.tags[x[e].tag]<t.tags._v||"_t"==x[e].tag&&null===x[e].text.match(g),!n)return!1;return n}function u(t,n){if(a(),t&&o())for(var e,i=y;i<x.length;i++)x[i].text&&((e=x[i+1])&&">"==e.tag&&(e.indent=x[i].text.toString()),x.splice(i,1));else n||x.push({tag:"\n"});w=!1,y=x.length}function c(t,n){var i="="+S,r=t.indexOf(i,n),s=e(t.substring(t.indexOf("=",n)+1,r)).split(" ");return T=s[0],S=s[s.length-1],r+i.length-1}var l=r.length,f=0,h=1,p=2,v=f,b=null,d=null,m="",x=[],w=!1,k=0,y=0,T="{{",S="}}";for(s&&(s=s.split(" "),T=s[0],S=s[1]),k=0;l>k;k++)v==f?i(T,r,k)?(--k,a(),v=h):"\n"==r.charAt(k)?u(w):m+=r.charAt(k):v==h?(k+=T.length-1,d=t.tags[r.charAt(k+1)],b=d?r.charAt(k+1):"_v","="==b?(k=c(r,k),v=f):(d&&k++,v=p),w=k):i(S,r,k)?(x.push({tag:b,n:e(m),otag:T,ctag:S,i:"/"==b?w-T.length:k+S.length}),m="",k+=S.length-1,v=f,"{"==b&&("}}"==S?k++:n(x[x.length-1]))):m+=r.charAt(k);return u(w,!0),x};var k={_t:!0,"\n":!0,$:!0,"/":!0};t.stringify=function(n){return"{code: function (c,p,i) { "+t.wrapMain(n.code)+" },"+u(n)+"}"};var y=0;t.generate=function(n,e,i){y=0;var r={code:"",subs:{},partials:{}};return t.walk(n,r),i.asString?this.stringify(r,e,i):this.makeTemplate(r,e,i)},t.wrapMain=function(t){return'var t=this;t.b(i=i||"");'+t+"return t.fl();"},t.template=t.Template,t.makeTemplate=function(t,n,e){var i=this.makePartials(t);return i.code=new Function("c","p","i",this.wrapMain(t.code)),new this.template(i,n,this,e)},t.makePartials=function(t){var n,e={subs:{},partials:t.partials,name:t.name};for(n in e.partials)e.partials[n]=this.makePartials(e.partials[n]);for(n in t.subs)e.subs[n]=new Function("c","p","t","i",t.subs[n]);return e},t.codegen={"#":function(n,e){e.code+="if(t.s(t."+l(n.n)+'("'+c(n.n)+'",c,p,1),c,p,0,'+n.i+","+n.end+',"'+n.otag+" "+n.ctag+'")){t.rs(c,p,function(c,p,t){',t.walk(n.nodes,e),e.code+="});c.pop();}"},"^":function(n,e){e.code+="if(!t.s(t."+l(n.n)+'("'+c(n.n)+'",c,p,1),c,p,1,0,0,"")){',t.walk(n.nodes,e),e.code+="};"},">":f,"<":function(n,e){var i={partials:{},code:"",subs:{},inPartial:!0};t.walk(n.nodes,i);var r=e.partials[f(n,e)];r.subs=i.subs,r.partials=i.partials},$:function(n,e){var i={subs:{},code:"",partials:e.partials,prefix:n.n};t.walk(n.nodes,i),e.subs[n.n]=i.code,e.inPartial||(e.code+='t.sub("'+c(n.n)+'",c,p,i);')},"\n":function(t,n){n.code+=p('"\\n"'+(t.last?"":" + i"))},_v:function(t,n){n.code+="t.b(t.v(t."+l(t.n)+'("'+c(t.n)+'",c,p,0)));'},_t:function(t,n){n.code+=p('"'+c(t.text)+'"')},"{":h,"&":h},t.walk=function(n,e){for(var i,r=0,s=n.length;s>r;r++)i=t.codegen[n[r].tag],i&&i(n[r],e);return e},t.parse=function(t,n,e){return e=e||{},r(t,"",[],e.sectionTags||[])},t.cache={},t.cacheKey=function(t,n){return[t,!!n.asString,!!n.disableLambda,n.delimiters,!!n.modelGet].join("||")},t.compile=function(n,e){e=e||{};var i=t.cacheKey(n,e),r=this.cache[i];if(r){var s=r.partials;for(var a in s)delete s[a].instance;return r}return r=this.generate(this.parse(this.scan(n,e.delimiters),n,e),n,e),this.cache[i]=r}}("undefined"!=typeof exports?exports:Hogan); \ No newline at end of file diff --git a/goaccess++/resources/tpls.html b/goaccess++/resources/tpls.html new file mode 100644 index 0000000..584b3e0 --- /dev/null +++ b/goaccess++/resources/tpls.html @@ -0,0 +1,276 @@ +<!-- TPL General --> +<script id="tpl-general" type="text/template"> + <h4 class="hidden-xs gheader">{{head}}<span class="pull-right">{{#from}}<span class="from">{{from}}</span>{{/from}}{{#to}} — <span class="to">{{to}}</span>{{/to}}</span></h4> + <h5 class="visible-xs hidden-sm hidden-md hidden-lg gheader">{{head}}  {{#from}}<span class="from">{{from}}</span>{{/from}}{{#to}} — <span class="to">{{to}}</span>{{/to}}</h5> + <div class="wrap-general-items"></div> +</script> + +<!-- TPL General Items --> +<script id="tpl-general-items" type="text/template"> + <div class="col-md-2"> + <div class="grid-module {{#className}}{{className}}{{/className}}{{^className}}gray{{/className}}"> + <div class="col-title"> + <i class="fa fa-bar-chart"></i> {{#label}}{{label}}{{/label}} + </div> + <h3 id="{{id}}" style="padding-top: 0;">{{value}}</h3> + </div> + </div> +</script> + +<!-- TPL Panel Table --> +<script id="tpl-table-row" type="text/template"> + {{#rows}} + <tr class="{{#className}}{{className}}{{/className}} {{#hasSubItems}}{{#items}}expandable{{/items}}{{/hasSubItems}}" {{#idx}}data-pid="{{idx}}"{{/idx}} data-panel="{{panel}}" {{#key}}data-key="{{key}}"{{/key}}> + {{#hasSubItems}} + <td class="row-expandable text-center {{#items}}clickable{{/items}}"> + {{#items}}<i class="fa {{#expanded}}fa-caret-down{{/expanded}}{{^expanded}}fa fa-caret-right{{/expanded}}"></i>{{/items}} + {{^items}}<i></i>{{/items}} + </td> + {{/hasSubItems}} + <td class="row-idx text-right"> + {{#idx}}{{idx}}{{/idx}} + </td> + {{#cells}} + <td class="{{className}}" {{#colspan}}colspan="{{colspan}}"{{/colspan}}> + <span class="value">{{{value}}}</span>{{#percent}}<span class="percent"> ({{percent}})</span>{{/percent}} + </td> + {{/cells}} + </tr> + {{/rows}} +</script> + +<!-- TPL Panel Table Meta --> +<script id="tpl-table-row-meta" type="text/template"> + {{#row}} + <tr> + {{#hasSubItems}} + <td class=""></td> + {{/hasSubItems}} + <td class=""></td> + {{#cells}} + <td class="{{className}}" {{#colspan}}colspan="{{colspan}}"{{/colspan}}> + {{#value}} + <h4 class="value"><span title="{{title}}">{{value}}</span>{{#label}}<small> {{label}}</small>{{/label}}{{#max}}<br><small>Max: {{max}}</small>{{/max}}{{#min}}<br><small>Min: {{min}}</small>{{/min}}</h4> + {{/value}} + </td> + {{/cells}} + </tr> + {{/row}} +</script> + +<!-- TPL Table thead --> +<script id="tpl-table-thead" type="text/template"> + <tr> + {{#hasSubItems}} + <th></th> + {{/hasSubItems}} + <th>#</th> + {{#items}} + <th class="{{dataType}} {{#key}}sortable{{/key}}" data-key="{{key}}" {{#sort}}data-order="{{#asc}}asc{{/asc}}{{^asc}}desc{{/asc}}"{{/sort}}> + {{label}} <i class="fa fa-{{^sort}}sort{{/sort}}{{#sort}}{{#asc}}caret-up{{/asc}}{{^asc}}caret-down{{/asc}}{{/sort}}"></i> + </th> + {{/items}} + </tr> +</script> + +<!-- TPL Panel Options DropDown --> +<script id="tpl-panel-opts" type="text/template"> + <li class="dropdown-header">{{ labels.chart_opts }}</li> + <li><a href="javascript:void(0);" data-panel="{{id}}" data-chart="{{showChart}}"><i class="fa fa-{{#showChart}}check-{{/showChart}}square-o"></i> {{labels.chart}}</a></li> + + {{#plot.length}} + <li class="dropdown-header">{{ labels.type }}</li> + <li><a href="javascript:void(0);" data-panel="{{id}}" data-chart-type="area-spline"><i class="fa fa-circle{{^area-spline}}-o{{/area-spline}}"></i> {{labels.area_spline}}</a></li> + <li><a href="javascript:void(0);" data-panel="{{id}}" data-chart-type="bar"><i class="fa fa-circle{{^bar}}-o{{/bar}}"></i> {{labels.bar}}</a></li> + <li class="dropdown-header">{{labels.plot_metric}}</li> + {{#plot}} + <li><a href="javascript:void(0);" data-panel="{{id}}" data-plot="{{className}}" class="panel-plot-{{className}}"><i class="fa fa-circle{{^selected}}-o{{/selected}}"></i> {{label}}</a></li> + {{/plot}} + {{/plot.length}} + + <li class="dropdown-header">{{labels.table_columns}}</li> + {{#items}} + <li><a href="javascript:void(0);" data-panel="{{id}}" data-metric="{{key}}"><i class="fa fa-{{^hide}}check-{{/hide}}square-o"></i> {{label}}</a></li> + {{/items}} +</script> + +<!-- TPL Table colgroup --> +<script id="tpl-table-colgroup" type="text/template"> + {{#hasSubItems}} + <col style="width: 2%;"> <!-- right-caret --> + {{/hasSubItems}} + <col style="width: 3%;"> <!-- row # --> + {{#items}} + <col style="width:{{colWidth}}"> + {{/items}} +</script> + +<!-- TPL Panel --> +<script id="tpl-panel" type="text/template"> + <div class="row"> + <div class="col-md-12"> + <div class="form-group clearfix panel-header"> + <h4 class="pull-left hidden-xs gheader" id="{{id}}">{{head}}<br><small>{{desc}}</small></h4> + <h5 class="pull-left visible-xs hidden-sm hidden-md hidden-lg gheader" id="{{id}}">{{head}}<br><small>{{desc}}</small></h5> + <div class="panel-plot-wrap"> + <div class="dropdown"> + <button class="btn btn-default btn-sm dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true" data-panel="{{id}}"> + <i class="fa fa-gear"></i> {{labels.panel_opts}} <span class="fa fa-caret-down"></span> + </button> + <ul class="dropdown-menu dropdown-menu-right panel-opts-{{id}}"> + </ul> + </div> + </div> + </div> + </div> + </div> + {{#chart}} + <div class="row"> + <div class="col-md-12"> + <div id="chart-{{id}}" class="chart-wrap"></div> + </div> + </div> + {{/chart}} + {{#table}} + <div class="row clearfix table-wrapper {{#autoHideTables}}hidden-xs{{/autoHideTables}}"> + <div class="col-md-12"> + <div class="table-responsive"> + <table data-panel="{{id}}" class="table table-borderless table-hover table-{{id}}"> + <colgroup> + </colgroup> + <thead> + </thead> + <tbody class="tbody-meta"> + </tbody> + <tbody class="tbody-data"> + </tbody> + </table> + </div> + + <ul class="pagination pagination-sm pull-left"> + <li class="disabled"> + <a class="panel-first" href="javascript:void(0);" aria-label="{{labels.first}}" data-panel="{{id}}" title="{{labels.first}}"> + <i class="fa fa-angle-double-left"></i> + </a> + </li> + <li class="disabled"> + <a class="panel-prev" href="javascript:void(0);" aria-label="{{labels.previous}}" data-panel="{{id}}" title="{{labels.previous}}"> + <i class="fa fa-angle-left"></i> + </a> + </li> + <li> + <a class="panel-next" href="javascript:void(0);" aria-label="{{labels.next}}" data-panel="{{id}}" title="{{labels.next}}"> + <i class="fa fa-angle-right"></i> + </a> + </li> + <li> + <a class="panel-last" href="javascript:void(0);" aria-label="{{labels.last}}" data-panel="{{id}}" title="{{labels.last}}"> + <i class="fa fa-angle-double-right"></i> + </a> + </li> + </ul> + </div> + </div> + {{/table}} +</script> + +<!-- TPL Nav Bar wrapper --> +<script id="tpl-nav-wrap" type="text/template"> + <div class="nav-bars fa fa-bars"></div> + <div class="nav-gears fa fa-cog"></div> + <div class="nav-ws-status fa fa-circle"></div> + <div class="nav-list"></div> + <div class="powered hidden-xs hidden-sm">by <a href="https://goaccess.io/">GoAccess</a> <span>v{{version}}</span> and <a href="http://gwsocket.io/">GWSocket</a></div> +</script> + +<!-- TPL Nav Bar items --> +<script id="tpl-nav-menu" type="text/template"> + <h3>{{labels.panels}}</h3> + <ul> + <li {{#overall}}class="active"{{/overall}}><a href="#"><i class="fa fa-bar-chart"></i> {{labels.thead}}</a></li> + {{#nav}} + <li {{#current}}class="active"{{/current}}><a href="#{{key}}"><i class="fa fa-{{icon}}"></i> {{head}}</a></li> + {{/nav}} + </ul> +</script> + +<!-- TPL Nav Bar options --> +<script id="tpl-nav-opts" type="text/template"> + <h3><i class="fa fa-hashtag"></i> {{labels.theme}}</h3> + <ul> + <li {{#darkGray}}class="active"{{/darkGray}}> + <a href="javascript:void(0);" class="theme-dark-gray"><i class="fa fa-circle{{^darkGray}}-o{{/darkGray}}"></i> {{labels.dark_gray}}</a> + </li> + <li {{#bright}}class="active"{{/bright}}> + <a href="javascript:void(0);" class="theme-bright"><i class="fa fa-circle{{^bright}}-o{{/bright}}"></i> {{labels.bright}}</a> + </li> + <li {{#darkBlue}}class="active"{{/darkBlue}}> + <a href="javascript:void(0);" class="theme-dark-blue"><i class="fa fa-circle{{^darkBlue}}-o{{/darkBlue}}"></i> {{labels.dark_blue}}</a> + </li> + <li {{#darkPurple}}class="active"{{/darkPurple}}> + <a href="javascript:void(0);" class="theme-dark-purple"><i class="fa fa-circle{{^darkPurple}}-o{{/darkPurple}}"></i> {{labels.dark_purple}}</a> + </li> + </ul> + <h3><i class="fa fa-list-alt"></i> {{labels.panels}}</h3> + <ul class="perpage-wrap"> + <li class="dropdown-header"><i class="fa fa-list"></i> {{labels.items_per_page}}</li> + <li {{#perPage5}}class="active"{{/perPage5}}> + <a href="javascript:void(0);" data-perpage="5"><i class="fa fa-circle{{^perPage5}}-o{{/perPage5}}"></i> 5</a> + </li> + <li {{#perPage7}}class="active"{{/perPage7}}> + <a href="javascript:void(0);" data-perpage="7"><i class="fa fa-circle{{^perPage7}}-o{{/perPage7}}"></i> 7</a> + </li> + <li {{#perPage10}}class="active"{{/perPage10}}> + <a href="javascript:void(0);" data-perpage="10"><i class="fa fa-circle{{^perPage10}}-o{{/perPage10}}"></i> 10</a> + </li> + <li {{#perPage15}}class="active"{{/perPage15}}> + <a href="javascript:void(0);" data-perpage="15"><i class="fa fa-circle{{^perPage15}}-o{{/perPage15}}"></i> 15</a> + </li> + <li {{#perPage20}}class="active"{{/perPage20}}> + <a href="javascript:void(0);" data-perpage="20"><i class="fa fa-circle{{^perPage20}}-o{{/perPage20}}"></i> 20</a> + </li> + <li class="dropdown-header"><i class="fa fa-table"></i> {{labels.tables}}</li> + <li {{#showTables}}class="active"{{/showTables}}> + <a href="javascript:void(0);" data-show-tables="1"><i class="fa fa-{{#showTables}}check-{{/showTables}}square-o"></i> {{labels.display_tables}}</a> + </li> + <li {{#autoHideTables}}class="active"{{/autoHideTables}}> + <a href="javascript:void(0);" data-autohide-tables="1" title="{{labels.ah_small_title}}"> + <i class="fa fa-{{#autoHideTables}}check-{{/autoHideTables}}square-o"></i> {{labels.ah_small}} + </a> + </li> + </ul> + <h3><i class="fa fa-th-large"></i> {{labels.layout}}</h3> + <ul> + <li {{#horizontal}}class="active"{{/horizontal}}> + <a href="javascript:void(0);" class="layout-horizontal"><i class="fa fa-circle{{^horizontal}}-o{{/horizontal}}"></i> {{labels.horizontal}}</a> + </li> + <li {{#vertical}}class="active"{{/vertical}}> + <a href="javascript:void(0);" class="layout-vertical"><i class="fa fa-circle{{^vertical}}-o{{/vertical}}"></i> {{labels.vertical}}</a> + </li> + </ul> + <h3><i class="fa fa-cog"></i> {{labels.file_opts}}</h3> + <ul> + <li><a href="javascript:void(0);" class="export-json"><i class="fa fa-code"></i> {{labels.export_json}}</a></li> + </ul> +</script> + +<!-- TPL Chart tooltip --> +<script id="tpl-chart-tooltip" type="text/template"> + <table class="chart-tooltip"> + <tbody> + <tr> + <th colspan="2">{{data.0}}</th> + </tr> + <tr> + <td class="name"><span class="blue"></span>hits</td> + <td class="value">{{data.1}}</td> + </tr> + {{#data.2}} + <tr> + <td class="name"><span class="red"></span>visitors</td> + <td class="value">{{data.2}}</td> + </tr> + {{/data.2}} + </tbody> + </table> +</script> diff --git a/goaccess++/resources/tpls.html.tmp b/goaccess++/resources/tpls.html.tmp new file mode 100644 index 0000000..e864ed3 --- /dev/null +++ b/goaccess++/resources/tpls.html.tmp @@ -0,0 +1 @@ +<!-- TPL General --><script id="tpl-general" type="text/template"><h4 class="hidden-xs gheader">{{head}}<span class="pull-right">{{#from}}<span class="from">{{from}}</span>{{/from}}{{#to}} — <span class="to">{{to}}</span>{{/to}}</span></h4><h5 class="visible-xs hidden-sm hidden-md hidden-lg gheader">{{head}}  {{#from}}<span class="from">{{from}}</span>{{/from}}{{#to}} — <span class="to">{{to}}</span>{{/to}}</h5><div class="wrap-general-items"></div></script><!-- TPL General Items --><script id="tpl-general-items" type="text/template"><div class="col-md-2"><div class="grid-module {{#className}}{{className}}{{/className}}{{^className}}gray{{/className}}"><div class="col-title"><i class="fa fa-bar-chart"></i> {{#label}}{{label}}{{/label}}</div><h3 id="{{id}}" style="padding-top: 0;">{{value}}</h3></div></div></script><!-- TPL Panel Table --><script id="tpl-table-row" type="text/template">{{#rows}}<tr class="{{#className}}{{className}}{{/className}} {{#hasSubItems}}{{#items}}expandable{{/items}}{{/hasSubItems}}" {{#idx}}data-pid="{{idx}}"{{/idx}} data-panel="{{panel}}" {{#key}}data-key="{{key}}"{{/key}}>{{#hasSubItems}}<td class="row-expandable text-center {{#items}}clickable{{/items}}">{{#items}}<i class="fa {{#expanded}}fa-caret-down{{/expanded}}{{^expanded}}fa fa-caret-right{{/expanded}}"></i>{{/items}}{{^items}}<i></i>{{/items}}</td>{{/hasSubItems}}<td class="row-idx text-right">{{#idx}}{{idx}}{{/idx}}</td>{{#cells}}<td class="{{className}}" {{#colspan}}colspan="{{colspan}}"{{/colspan}}><span class="value">{{{value}}}</span>{{#percent}}<span class="percent"> ({{percent}})</span>{{/percent}}</td>{{/cells}}</tr>{{/rows}}</script><!-- TPL Panel Table Meta --><script id="tpl-table-row-meta" type="text/template">{{#row}}<tr>{{#hasSubItems}}<td class=""></td>{{/hasSubItems}}<td class=""></td>{{#cells}}<td class="{{className}}" {{#colspan}}colspan="{{colspan}}"{{/colspan}}>{{#value}}<h4 class="value"><span title="{{title}}">{{value}}</span>{{#label}}<small> {{label}}</small>{{/label}}{{#max}}<br><small>Max: {{max}}</small>{{/max}}{{#min}}<br><small>Min: {{min}}</small>{{/min}}</h4>{{/value}}</td>{{/cells}}</tr>{{/row}}</script><!-- TPL Table thead --><script id="tpl-table-thead" type="text/template"><tr>{{#hasSubItems}}<th></th>{{/hasSubItems}}<th>#</th>{{#items}}<th class="{{dataType}} {{#key}}sortable{{/key}}" data-key="{{key}}" {{#sort}}data-order="{{#asc}}asc{{/asc}}{{^asc}}desc{{/asc}}"{{/sort}}>{{label}} <i class="fa fa-{{^sort}}sort{{/sort}}{{#sort}}{{#asc}}caret-up{{/asc}}{{^asc}}caret-down{{/asc}}{{/sort}}"></i></th>{{/items}}</tr></script><!-- TPL Panel Options DropDown --><script id="tpl-panel-opts" type="text/template"><li class="dropdown-header">{{ labels.chart_opts }}</li><li><a href="javascript:void(0);" data-panel="{{id}}" data-chart="{{showChart}}"><i class="fa fa-{{#showChart}}check-{{/showChart}}square-o"></i> {{labels.chart}}</a></li>{{#plot.length}}<li class="dropdown-header">{{ labels.type }}</li><li><a href="javascript:void(0);" data-panel="{{id}}" data-chart-type="area-spline"><i class="fa fa-circle{{^area-spline}}-o{{/area-spline}}"></i> {{labels.area_spline}}</a></li><li><a href="javascript:void(0);" data-panel="{{id}}" data-chart-type="bar"><i class="fa fa-circle{{^bar}}-o{{/bar}}"></i> {{labels.bar}}</a></li><li class="dropdown-header">{{labels.plot_metric}}</li>{{#plot}}<li><a href="javascript:void(0);" data-panel="{{id}}" data-plot="{{className}}" class="panel-plot-{{className}}"><i class="fa fa-circle{{^selected}}-o{{/selected}}"></i> {{label}}</a></li>{{/plot}}{{/plot.length}}<li class="dropdown-header">{{labels.table_columns}}</li>{{#items}}<li><a href="javascript:void(0);" data-panel="{{id}}" data-metric="{{key}}"><i class="fa fa-{{^hide}}check-{{/hide}}square-o"></i> {{label}}</a></li>{{/items}}</script><!-- TPL Table colgroup --><script id="tpl-table-colgroup" type="text/template">{{#hasSubItems}}<col style="width: 2%;"> <!-- right-caret -->{{/hasSubItems}}<col style="width: 3%;"> <!-- row # -->{{#items}}<col style="width:{{colWidth}}">{{/items}}</script><!-- TPL Panel --><script id="tpl-panel" type="text/template"><div class="row"><div class="col-md-12"><div class="form-group clearfix panel-header"><h4 class="pull-left hidden-xs gheader" id="{{id}}">{{head}}<br><small>{{desc}}</small></h4><h5 class="pull-left visible-xs hidden-sm hidden-md hidden-lg gheader" id="{{id}}">{{head}}<br><small>{{desc}}</small></h5><div class="panel-plot-wrap"><div class="dropdown"><button class="btn btn-default btn-sm dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true" data-panel="{{id}}"><i class="fa fa-gear"></i> {{labels.panel_opts}} <span class="fa fa-caret-down"></span></button><ul class="dropdown-menu dropdown-menu-right panel-opts-{{id}}"></ul></div></div></div></div></div>{{#chart}}<div class="row"><div class="col-md-12"><div id="chart-{{id}}" class="chart-wrap"></div></div></div>{{/chart}}{{#table}}<div class="row clearfix table-wrapper {{#autoHideTables}}hidden-xs{{/autoHideTables}}"><div class="col-md-12"><div class="table-responsive"><table data-panel="{{id}}" class="table table-borderless table-hover table-{{id}}"><colgroup></colgroup><thead></thead><tbody class="tbody-meta"></tbody><tbody class="tbody-data"></tbody></table></div><ul class="pagination pagination-sm pull-left"><li class="disabled"><a class="panel-first" href="javascript:void(0);" aria-label="{{labels.first}}" data-panel="{{id}}" title="{{labels.first}}"><i class="fa fa-angle-double-left"></i></a></li><li class="disabled"><a class="panel-prev" href="javascript:void(0);" aria-label="{{labels.previous}}" data-panel="{{id}}" title="{{labels.previous}}"><i class="fa fa-angle-left"></i></a></li><li><a class="panel-next" href="javascript:void(0);" aria-label="{{labels.next}}" data-panel="{{id}}" title="{{labels.next}}"><i class="fa fa-angle-right"></i></a></li><li><a class="panel-last" href="javascript:void(0);" aria-label="{{labels.last}}" data-panel="{{id}}" title="{{labels.last}}"><i class="fa fa-angle-double-right"></i></a></li></ul></div></div>{{/table}}</script><!-- TPL Nav Bar wrapper --><script id="tpl-nav-wrap" type="text/template"><div class="nav-bars fa fa-bars"></div><div class="nav-gears fa fa-cog"></div><div class="nav-ws-status fa fa-circle"></div><div class="nav-list"></div><div class="powered hidden-xs hidden-sm">by <a href="https://goaccess.io/">GoAccess</a> <span>v{{version}}</span> and <a href="http://gwsocket.io/">GWSocket</a></div></script><!-- TPL Nav Bar items --><script id="tpl-nav-menu" type="text/template"><h3>{{labels.panels}}</h3><ul><li {{#overall}}class="active"{{/overall}}><a href="#"><i class="fa fa-bar-chart"></i> {{labels.thead}}</a></li>{{#nav}}<li {{#current}}class="active"{{/current}}><a href="#{{key}}"><i class="fa fa-{{icon}}"></i> {{head}}</a></li>{{/nav}}</ul></script><!-- TPL Nav Bar options --><script id="tpl-nav-opts" type="text/template"><h3><i class="fa fa-hashtag"></i> {{labels.theme}}</h3><ul><li {{#darkGray}}class="active"{{/darkGray}}><a href="javascript:void(0);" class="theme-dark-gray"><i class="fa fa-circle{{^darkGray}}-o{{/darkGray}}"></i> {{labels.dark_gray}}</a></li><li {{#bright}}class="active"{{/bright}}><a href="javascript:void(0);" class="theme-bright"><i class="fa fa-circle{{^bright}}-o{{/bright}}"></i> {{labels.bright}}</a></li><li {{#darkBlue}}class="active"{{/darkBlue}}><a href="javascript:void(0);" class="theme-dark-blue"><i class="fa fa-circle{{^darkBlue}}-o{{/darkBlue}}"></i> {{labels.dark_blue}}</a></li><li {{#darkPurple}}class="active"{{/darkPurple}}><a href="javascript:void(0);" class="theme-dark-purple"><i class="fa fa-circle{{^darkPurple}}-o{{/darkPurple}}"></i> {{labels.dark_purple}}</a></li></ul><h3><i class="fa fa-list-alt"></i> {{labels.panels}}</h3><ul class="perpage-wrap"><li class="dropdown-header"><i class="fa fa-list"></i> {{labels.items_per_page}}</li><li {{#perPage5}}class="active"{{/perPage5}}><a href="javascript:void(0);" data-perpage="5"><i class="fa fa-circle{{^perPage5}}-o{{/perPage5}}"></i> 5</a></li><li {{#perPage7}}class="active"{{/perPage7}}><a href="javascript:void(0);" data-perpage="7"><i class="fa fa-circle{{^perPage7}}-o{{/perPage7}}"></i> 7</a></li><li {{#perPage10}}class="active"{{/perPage10}}><a href="javascript:void(0);" data-perpage="10"><i class="fa fa-circle{{^perPage10}}-o{{/perPage10}}"></i> 10</a></li><li {{#perPage15}}class="active"{{/perPage15}}><a href="javascript:void(0);" data-perpage="15"><i class="fa fa-circle{{^perPage15}}-o{{/perPage15}}"></i> 15</a></li><li {{#perPage20}}class="active"{{/perPage20}}><a href="javascript:void(0);" data-perpage="20"><i class="fa fa-circle{{^perPage20}}-o{{/perPage20}}"></i> 20</a></li><li class="dropdown-header"><i class="fa fa-table"></i> {{labels.tables}}</li><li {{#showTables}}class="active"{{/showTables}}><a href="javascript:void(0);" data-show-tables="1"><i class="fa fa-{{#showTables}}check-{{/showTables}}square-o"></i> {{labels.display_tables}}</a></li><li {{#autoHideTables}}class="active"{{/autoHideTables}}><a href="javascript:void(0);" data-autohide-tables="1" title="{{labels.ah_small_title}}"><i class="fa fa-{{#autoHideTables}}check-{{/autoHideTables}}square-o"></i> {{labels.ah_small}}</a></li></ul><h3><i class="fa fa-th-large"></i> {{labels.layout}}</h3><ul><li {{#horizontal}}class="active"{{/horizontal}}><a href="javascript:void(0);" class="layout-horizontal"><i class="fa fa-circle{{^horizontal}}-o{{/horizontal}}"></i> {{labels.horizontal}}</a></li><li {{#vertical}}class="active"{{/vertical}}><a href="javascript:void(0);" class="layout-vertical"><i class="fa fa-circle{{^vertical}}-o{{/vertical}}"></i> {{labels.vertical}}</a></li></ul><h3><i class="fa fa-cog"></i> {{labels.file_opts}}</h3><ul><li><a href="javascript:void(0);" class="export-json"><i class="fa fa-code"></i> {{labels.export_json}}</a></li></ul></script><!-- TPL Chart tooltip --><script id="tpl-chart-tooltip" type="text/template"><table class="chart-tooltip"><tbody><tr><th colspan="2">{{data.0}}</th></tr><tr><td class="name"><span class="blue"></span>hits</td><td class="value">{{data.1}}</td></tr>{{#data.2}}<tr><td class="name"><span class="red"></span>visitors</td><td class="value">{{data.2}}</td></tr>{{/data.2}}</tbody></table></script> \ No newline at end of file diff --git a/goaccess++/src/.deps/.dirstamp b/goaccess++/src/.deps/.dirstamp new file mode 100644 index 0000000..e69de29 diff --git a/goaccess++/src/.deps/base64.Po b/goaccess++/src/.deps/base64.Po new file mode 100644 index 0000000..9cd55dd --- /dev/null +++ b/goaccess++/src/.deps/base64.Po @@ -0,0 +1,151 @@ +src/base64.o: src/base64.c /usr/include/stdc-predef.h \ + /usr/include/stdlib.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ + /usr/include/x86_64-linux-gnu/bits/floatn.h \ + /usr/include/x86_64-linux-gnu/bits/floatn-common.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/timesize.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/time64.h \ + /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/timer_t.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endianness.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/bits/uintn-identity.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \ + /usr/include/x86_64-linux-gnu/bits/select2.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ + /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \ + /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \ + /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib.h /usr/include/string.h \ + /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /usr/include/x86_64-linux-gnu/bits/strings_fortified.h \ + /usr/include/x86_64-linux-gnu/bits/string_fortified.h src/base64.h + +/usr/include/stdc-predef.h: + +/usr/include/stdlib.h: + +/usr/include/x86_64-linux-gnu/bits/libc-header-start.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/bits/long-double.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/x86_64-linux-gnu/bits/floatn.h: + +/usr/include/x86_64-linux-gnu/bits/floatn-common.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/timesize.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/x86_64-linux-gnu/bits/time64.h: + +/usr/include/x86_64-linux-gnu/bits/types/clock_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/time_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/timer_t.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-intn.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endianness.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/bits/uintn-identity.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h: + +/usr/include/x86_64-linux-gnu/bits/select2.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h: + +/usr/include/x86_64-linux-gnu/bits/struct_mutex.h: + +/usr/include/x86_64-linux-gnu/bits/struct_rwlock.h: + +/usr/include/alloca.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-float.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib.h: + +/usr/include/string.h: + +/usr/include/x86_64-linux-gnu/bits/types/locale_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h: + +/usr/include/strings.h: + +/usr/include/x86_64-linux-gnu/bits/strings_fortified.h: + +/usr/include/x86_64-linux-gnu/bits/string_fortified.h: + +src/base64.h: diff --git a/goaccess++/src/.deps/bin2c.Po b/goaccess++/src/.deps/bin2c.Po new file mode 100644 index 0000000..d42955d --- /dev/null +++ b/goaccess++/src/.deps/bin2c.Po @@ -0,0 +1,185 @@ +src/bin2c.o: src/bin2c.c /usr/include/stdc-predef.h /usr/include/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/timesize.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/time64.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/stdio2.h /usr/include/string.h \ + /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /usr/include/x86_64-linux-gnu/bits/strings_fortified.h \ + /usr/include/x86_64-linux-gnu/bits/string_fortified.h \ + /usr/include/stdlib.h /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ + /usr/include/x86_64-linux-gnu/bits/floatn.h \ + /usr/include/x86_64-linux-gnu/bits/floatn-common.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/timer_t.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endianness.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/bits/uintn-identity.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \ + /usr/include/x86_64-linux-gnu/bits/select2.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ + /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \ + /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \ + /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib.h /usr/include/assert.h + +/usr/include/stdc-predef.h: + +/usr/include/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/libc-header-start.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/bits/long-double.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/timesize.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/x86_64-linux-gnu/bits/time64.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/stdio2.h: + +/usr/include/string.h: + +/usr/include/x86_64-linux-gnu/bits/types/locale_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h: + +/usr/include/strings.h: + +/usr/include/x86_64-linux-gnu/bits/strings_fortified.h: + +/usr/include/x86_64-linux-gnu/bits/string_fortified.h: + +/usr/include/stdlib.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/x86_64-linux-gnu/bits/floatn.h: + +/usr/include/x86_64-linux-gnu/bits/floatn-common.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types/clock_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/time_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/timer_t.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-intn.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endianness.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/bits/uintn-identity.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h: + +/usr/include/x86_64-linux-gnu/bits/select2.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h: + +/usr/include/x86_64-linux-gnu/bits/struct_mutex.h: + +/usr/include/x86_64-linux-gnu/bits/struct_rwlock.h: + +/usr/include/alloca.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-float.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib.h: + +/usr/include/assert.h: diff --git a/goaccess++/src/.deps/browsers.Po b/goaccess++/src/.deps/browsers.Po new file mode 100644 index 0000000..d512671 --- /dev/null +++ b/goaccess++/src/.deps/browsers.Po @@ -0,0 +1,250 @@ +src/browsers.o: src/browsers.c /usr/include/stdc-predef.h \ + /usr/include/errno.h /usr/include/features.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/x86_64-linux-gnu/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/timesize.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/time64.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/stdio2.h /usr/include/stdlib.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ + /usr/include/x86_64-linux-gnu/bits/floatn.h \ + /usr/include/x86_64-linux-gnu/bits/floatn-common.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/timer_t.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endianness.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/bits/uintn-identity.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \ + /usr/include/x86_64-linux-gnu/bits/select2.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ + /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \ + /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \ + /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib.h /usr/include/string.h \ + /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /usr/include/x86_64-linux-gnu/bits/strings_fortified.h \ + /usr/include/x86_64-linux-gnu/bits/string_fortified.h src/browsers.h \ + src/error.h src/commons.h src/config.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_tm.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h /usr/include/stdint.h \ + /usr/include/x86_64-linux-gnu/bits/wchar.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h /usr/include/curses.h \ + /usr/include/ncurses_dll.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h /usr/include/unctrl.h \ + /usr/include/curses.h src/settings.h src/util.h src/xmalloc.h + +/usr/include/stdc-predef.h: + +/usr/include/errno.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/bits/long-double.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/errno.h: + +/usr/include/linux/errno.h: + +/usr/include/x86_64-linux-gnu/asm/errno.h: + +/usr/include/asm-generic/errno.h: + +/usr/include/asm-generic/errno-base.h: + +/usr/include/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/libc-header-start.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/timesize.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/x86_64-linux-gnu/bits/time64.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/stdio2.h: + +/usr/include/stdlib.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/x86_64-linux-gnu/bits/floatn.h: + +/usr/include/x86_64-linux-gnu/bits/floatn-common.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types/clock_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/time_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/timer_t.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-intn.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endianness.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/bits/uintn-identity.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h: + +/usr/include/x86_64-linux-gnu/bits/select2.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h: + +/usr/include/x86_64-linux-gnu/bits/struct_mutex.h: + +/usr/include/x86_64-linux-gnu/bits/struct_rwlock.h: + +/usr/include/alloca.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-float.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib.h: + +/usr/include/string.h: + +/usr/include/x86_64-linux-gnu/bits/types/locale_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h: + +/usr/include/strings.h: + +/usr/include/x86_64-linux-gnu/bits/strings_fortified.h: + +/usr/include/x86_64-linux-gnu/bits/string_fortified.h: + +src/browsers.h: + +src/error.h: + +src/commons.h: + +src/config.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h: + +/usr/include/stdint.h: + +/usr/include/x86_64-linux-gnu/bits/wchar.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h: + +/usr/include/curses.h: + +/usr/include/ncurses_dll.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h: + +/usr/include/unctrl.h: + +/usr/include/curses.h: + +src/settings.h: + +src/util.h: + +src/xmalloc.h: diff --git a/goaccess++/src/.deps/color.Po b/goaccess++/src/.deps/color.Po new file mode 100644 index 0000000..5299254 --- /dev/null +++ b/goaccess++/src/.deps/color.Po @@ -0,0 +1,253 @@ +src/color.o: src/color.c /usr/include/stdc-predef.h src/config.h \ + /usr/include/errno.h /usr/include/features.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/x86_64-linux-gnu/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/timesize.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/time64.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/stdio2.h /usr/include/stdlib.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ + /usr/include/x86_64-linux-gnu/bits/floatn.h \ + /usr/include/x86_64-linux-gnu/bits/floatn-common.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/timer_t.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endianness.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/bits/uintn-identity.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \ + /usr/include/x86_64-linux-gnu/bits/select2.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ + /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \ + /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \ + /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib.h /usr/include/string.h \ + /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /usr/include/x86_64-linux-gnu/bits/strings_fortified.h \ + /usr/include/x86_64-linux-gnu/bits/string_fortified.h src/color.h \ + src/commons.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_tm.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h /usr/include/stdint.h \ + /usr/include/x86_64-linux-gnu/bits/wchar.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h src/error.h \ + /usr/include/curses.h /usr/include/ncurses_dll.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h /usr/include/unctrl.h \ + /usr/include/curses.h src/settings.h src/gslist.h src/util.h \ + src/xmalloc.h + +/usr/include/stdc-predef.h: + +src/config.h: + +/usr/include/errno.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/bits/long-double.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/errno.h: + +/usr/include/linux/errno.h: + +/usr/include/x86_64-linux-gnu/asm/errno.h: + +/usr/include/asm-generic/errno.h: + +/usr/include/asm-generic/errno-base.h: + +/usr/include/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/libc-header-start.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/timesize.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/x86_64-linux-gnu/bits/time64.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/stdio2.h: + +/usr/include/stdlib.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/x86_64-linux-gnu/bits/floatn.h: + +/usr/include/x86_64-linux-gnu/bits/floatn-common.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types/clock_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/time_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/timer_t.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-intn.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endianness.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/bits/uintn-identity.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h: + +/usr/include/x86_64-linux-gnu/bits/select2.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h: + +/usr/include/x86_64-linux-gnu/bits/struct_mutex.h: + +/usr/include/x86_64-linux-gnu/bits/struct_rwlock.h: + +/usr/include/alloca.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-float.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib.h: + +/usr/include/string.h: + +/usr/include/x86_64-linux-gnu/bits/types/locale_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h: + +/usr/include/strings.h: + +/usr/include/x86_64-linux-gnu/bits/strings_fortified.h: + +/usr/include/x86_64-linux-gnu/bits/string_fortified.h: + +src/color.h: + +src/commons.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h: + +/usr/include/stdint.h: + +/usr/include/x86_64-linux-gnu/bits/wchar.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h: + +src/error.h: + +/usr/include/curses.h: + +/usr/include/ncurses_dll.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h: + +/usr/include/unctrl.h: + +/usr/include/curses.h: + +src/settings.h: + +src/gslist.h: + +src/util.h: + +src/xmalloc.h: diff --git a/goaccess++/src/.deps/commons.Po b/goaccess++/src/.deps/commons.Po new file mode 100644 index 0000000..38334b5 --- /dev/null +++ b/goaccess++/src/.deps/commons.Po @@ -0,0 +1,264 @@ +src/commons.o: src/commons.c /usr/include/stdc-predef.h src/config.h \ + /usr/include/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/timesize.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/time64.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/stdio2.h /usr/include/stdlib.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ + /usr/include/x86_64-linux-gnu/bits/floatn.h \ + /usr/include/x86_64-linux-gnu/bits/floatn-common.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/timer_t.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endianness.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/bits/uintn-identity.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \ + /usr/include/x86_64-linux-gnu/bits/select2.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ + /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \ + /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \ + /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib.h /usr/include/string.h \ + /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /usr/include/x86_64-linux-gnu/bits/strings_fortified.h \ + /usr/include/x86_64-linux-gnu/bits/string_fortified.h \ + /usr/include/time.h /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_tm.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h \ + /usr/include/unistd.h /usr/include/x86_64-linux-gnu/bits/posix_opt.h \ + /usr/include/x86_64-linux-gnu/bits/environments.h \ + /usr/include/x86_64-linux-gnu/bits/confname.h \ + /usr/include/x86_64-linux-gnu/bits/getopt_posix.h \ + /usr/include/x86_64-linux-gnu/bits/getopt_core.h \ + /usr/include/x86_64-linux-gnu/bits/unistd.h \ + /usr/include/x86_64-linux-gnu/bits/unistd_ext.h src/commons.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h /usr/include/stdint.h \ + /usr/include/x86_64-linux-gnu/bits/wchar.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h src/error.h \ + /usr/include/curses.h /usr/include/ncurses_dll.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h /usr/include/unctrl.h \ + /usr/include/curses.h src/settings.h src/labels.h /usr/include/libintl.h \ + /usr/include/locale.h /usr/include/x86_64-linux-gnu/bits/locale.h \ + src/util.h src/xmalloc.h + +/usr/include/stdc-predef.h: + +src/config.h: + +/usr/include/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/libc-header-start.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/bits/long-double.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/timesize.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/x86_64-linux-gnu/bits/time64.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/stdio2.h: + +/usr/include/stdlib.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/x86_64-linux-gnu/bits/floatn.h: + +/usr/include/x86_64-linux-gnu/bits/floatn-common.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types/clock_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/time_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/timer_t.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-intn.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endianness.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/bits/uintn-identity.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h: + +/usr/include/x86_64-linux-gnu/bits/select2.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h: + +/usr/include/x86_64-linux-gnu/bits/struct_mutex.h: + +/usr/include/x86_64-linux-gnu/bits/struct_rwlock.h: + +/usr/include/alloca.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-float.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib.h: + +/usr/include/string.h: + +/usr/include/x86_64-linux-gnu/bits/types/locale_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h: + +/usr/include/strings.h: + +/usr/include/x86_64-linux-gnu/bits/strings_fortified.h: + +/usr/include/x86_64-linux-gnu/bits/string_fortified.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h: + +/usr/include/unistd.h: + +/usr/include/x86_64-linux-gnu/bits/posix_opt.h: + +/usr/include/x86_64-linux-gnu/bits/environments.h: + +/usr/include/x86_64-linux-gnu/bits/confname.h: + +/usr/include/x86_64-linux-gnu/bits/getopt_posix.h: + +/usr/include/x86_64-linux-gnu/bits/getopt_core.h: + +/usr/include/x86_64-linux-gnu/bits/unistd.h: + +/usr/include/x86_64-linux-gnu/bits/unistd_ext.h: + +src/commons.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h: + +/usr/include/stdint.h: + +/usr/include/x86_64-linux-gnu/bits/wchar.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h: + +src/error.h: + +/usr/include/curses.h: + +/usr/include/ncurses_dll.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h: + +/usr/include/unctrl.h: + +/usr/include/curses.h: + +src/settings.h: + +src/labels.h: + +/usr/include/libintl.h: + +/usr/include/locale.h: + +/usr/include/x86_64-linux-gnu/bits/locale.h: + +src/util.h: + +src/xmalloc.h: diff --git a/goaccess++/src/.deps/csv.Po b/goaccess++/src/.deps/csv.Po new file mode 100644 index 0000000..2ff32fa --- /dev/null +++ b/goaccess++/src/.deps/csv.Po @@ -0,0 +1,344 @@ +src/csv.o: src/csv.c /usr/include/stdc-predef.h /usr/include/ctype.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/timesize.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/time64.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endianness.h \ + /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h \ + /usr/include/errno.h /usr/include/x86_64-linux-gnu/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/x86_64-linux-gnu/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/stdio2.h /usr/include/stdlib.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ + /usr/include/x86_64-linux-gnu/bits/floatn.h \ + /usr/include/x86_64-linux-gnu/bits/floatn-common.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/timer_t.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/bits/uintn-identity.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \ + /usr/include/x86_64-linux-gnu/bits/select2.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ + /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \ + /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \ + /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib.h /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/x86_64-linux-gnu/bits/strings_fortified.h \ + /usr/include/x86_64-linux-gnu/bits/string_fortified.h \ + /usr/include/x86_64-linux-gnu/sys/stat.h \ + /usr/include/x86_64-linux-gnu/bits/stat.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_tm.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h \ + /usr/include/unistd.h /usr/include/x86_64-linux-gnu/bits/posix_opt.h \ + /usr/include/x86_64-linux-gnu/bits/environments.h \ + /usr/include/x86_64-linux-gnu/bits/confname.h \ + /usr/include/x86_64-linux-gnu/bits/getopt_posix.h \ + /usr/include/x86_64-linux-gnu/bits/getopt_core.h \ + /usr/include/x86_64-linux-gnu/bits/unistd.h \ + /usr/include/x86_64-linux-gnu/bits/unistd_ext.h /usr/include/inttypes.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h /usr/include/stdint.h \ + /usr/include/x86_64-linux-gnu/bits/wchar.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h src/csv.h src/config.h \ + src/parser.h src/commons.h src/settings.h src/gkhash.h src/gslist.h \ + src/gstorage.h src/khash.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/limits.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/syslimits.h \ + /usr/include/limits.h /usr/include/x86_64-linux-gnu/bits/posix1_lim.h \ + /usr/include/x86_64-linux-gnu/bits/local_lim.h \ + /usr/include/linux/limits.h \ + /usr/include/x86_64-linux-gnu/bits/posix2_lim.h src/error.h \ + /usr/include/curses.h /usr/include/ncurses_dll.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h /usr/include/unctrl.h \ + /usr/include/curses.h src/ui.h /usr/include/pthread.h \ + /usr/include/sched.h /usr/include/x86_64-linux-gnu/bits/sched.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h \ + /usr/include/x86_64-linux-gnu/bits/cpu-set.h \ + /usr/include/x86_64-linux-gnu/bits/setjmp.h src/labels.h \ + /usr/include/libintl.h /usr/include/locale.h \ + /usr/include/x86_64-linux-gnu/bits/locale.h src/color.h src/sort.h \ + src/util.h + +/usr/include/stdc-predef.h: + +/usr/include/ctype.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/bits/long-double.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/timesize.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/x86_64-linux-gnu/bits/time64.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endianness.h: + +/usr/include/x86_64-linux-gnu/bits/types/locale_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h: + +/usr/include/errno.h: + +/usr/include/x86_64-linux-gnu/bits/errno.h: + +/usr/include/linux/errno.h: + +/usr/include/x86_64-linux-gnu/asm/errno.h: + +/usr/include/asm-generic/errno.h: + +/usr/include/asm-generic/errno-base.h: + +/usr/include/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/libc-header-start.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/stdio2.h: + +/usr/include/stdlib.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/x86_64-linux-gnu/bits/floatn.h: + +/usr/include/x86_64-linux-gnu/bits/floatn-common.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types/clock_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/time_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/timer_t.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-intn.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/bits/uintn-identity.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h: + +/usr/include/x86_64-linux-gnu/bits/select2.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h: + +/usr/include/x86_64-linux-gnu/bits/struct_mutex.h: + +/usr/include/x86_64-linux-gnu/bits/struct_rwlock.h: + +/usr/include/alloca.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-float.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib.h: + +/usr/include/string.h: + +/usr/include/strings.h: + +/usr/include/x86_64-linux-gnu/bits/strings_fortified.h: + +/usr/include/x86_64-linux-gnu/bits/string_fortified.h: + +/usr/include/x86_64-linux-gnu/sys/stat.h: + +/usr/include/x86_64-linux-gnu/bits/stat.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h: + +/usr/include/unistd.h: + +/usr/include/x86_64-linux-gnu/bits/posix_opt.h: + +/usr/include/x86_64-linux-gnu/bits/environments.h: + +/usr/include/x86_64-linux-gnu/bits/confname.h: + +/usr/include/x86_64-linux-gnu/bits/getopt_posix.h: + +/usr/include/x86_64-linux-gnu/bits/getopt_core.h: + +/usr/include/x86_64-linux-gnu/bits/unistd.h: + +/usr/include/x86_64-linux-gnu/bits/unistd_ext.h: + +/usr/include/inttypes.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h: + +/usr/include/stdint.h: + +/usr/include/x86_64-linux-gnu/bits/wchar.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h: + +src/csv.h: + +src/config.h: + +src/parser.h: + +src/commons.h: + +src/settings.h: + +src/gkhash.h: + +src/gslist.h: + +src/gstorage.h: + +src/khash.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/limits.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/syslimits.h: + +/usr/include/limits.h: + +/usr/include/x86_64-linux-gnu/bits/posix1_lim.h: + +/usr/include/x86_64-linux-gnu/bits/local_lim.h: + +/usr/include/linux/limits.h: + +/usr/include/x86_64-linux-gnu/bits/posix2_lim.h: + +src/error.h: + +/usr/include/curses.h: + +/usr/include/ncurses_dll.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h: + +/usr/include/unctrl.h: + +/usr/include/curses.h: + +src/ui.h: + +/usr/include/pthread.h: + +/usr/include/sched.h: + +/usr/include/x86_64-linux-gnu/bits/sched.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h: + +/usr/include/x86_64-linux-gnu/bits/cpu-set.h: + +/usr/include/x86_64-linux-gnu/bits/setjmp.h: + +src/labels.h: + +/usr/include/libintl.h: + +/usr/include/locale.h: + +/usr/include/x86_64-linux-gnu/bits/locale.h: + +src/color.h: + +src/sort.h: + +src/util.h: diff --git a/goaccess++/src/.deps/error.Po b/goaccess++/src/.deps/error.Po new file mode 100644 index 0000000..38cff93 --- /dev/null +++ b/goaccess++/src/.deps/error.Po @@ -0,0 +1,313 @@ +src/error.o: src/error.c /usr/include/stdc-predef.h src/config.h \ + /usr/include/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/timesize.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/time64.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/stdio2.h /usr/include/stdlib.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ + /usr/include/x86_64-linux-gnu/bits/floatn.h \ + /usr/include/x86_64-linux-gnu/bits/floatn-common.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/timer_t.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endianness.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/bits/uintn-identity.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \ + /usr/include/x86_64-linux-gnu/bits/select2.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ + /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \ + /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \ + /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib.h /usr/include/signal.h \ + /usr/include/x86_64-linux-gnu/bits/signum.h \ + /usr/include/x86_64-linux-gnu/bits/signum-generic.h \ + /usr/include/x86_64-linux-gnu/bits/types/sig_atomic_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__sigval_t.h \ + /usr/include/x86_64-linux-gnu/bits/siginfo-arch.h \ + /usr/include/x86_64-linux-gnu/bits/siginfo-consts.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigval_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigevent_t.h \ + /usr/include/x86_64-linux-gnu/bits/sigevent-consts.h \ + /usr/include/x86_64-linux-gnu/bits/sigaction.h \ + /usr/include/x86_64-linux-gnu/bits/sigcontext.h \ + /usr/include/x86_64-linux-gnu/bits/types/stack_t.h \ + /usr/include/x86_64-linux-gnu/sys/ucontext.h \ + /usr/include/x86_64-linux-gnu/bits/sigstack.h \ + /usr/include/x86_64-linux-gnu/bits/ss_flags.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_sigstack.h \ + /usr/include/x86_64-linux-gnu/bits/sigthread.h \ + /usr/include/x86_64-linux-gnu/bits/signal_ext.h /usr/include/execinfo.h \ + /usr/include/unistd.h /usr/include/x86_64-linux-gnu/bits/posix_opt.h \ + /usr/include/x86_64-linux-gnu/bits/environments.h \ + /usr/include/x86_64-linux-gnu/bits/confname.h \ + /usr/include/x86_64-linux-gnu/bits/getopt_posix.h \ + /usr/include/x86_64-linux-gnu/bits/getopt_core.h \ + /usr/include/x86_64-linux-gnu/bits/unistd.h \ + /usr/include/x86_64-linux-gnu/bits/unistd_ext.h src/error.h \ + src/commons.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_tm.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h \ + /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h /usr/include/stdint.h \ + /usr/include/x86_64-linux-gnu/bits/wchar.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h /usr/include/curses.h \ + /usr/include/ncurses_dll.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h /usr/include/unctrl.h \ + /usr/include/curses.h src/settings.h src/labels.h /usr/include/libintl.h \ + /usr/include/locale.h /usr/include/x86_64-linux-gnu/bits/locale.h \ + src/parser.h + +/usr/include/stdc-predef.h: + +src/config.h: + +/usr/include/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/libc-header-start.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/bits/long-double.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/timesize.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/x86_64-linux-gnu/bits/time64.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/stdio2.h: + +/usr/include/stdlib.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/x86_64-linux-gnu/bits/floatn.h: + +/usr/include/x86_64-linux-gnu/bits/floatn-common.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types/clock_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/time_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/timer_t.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-intn.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endianness.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/bits/uintn-identity.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h: + +/usr/include/x86_64-linux-gnu/bits/select2.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h: + +/usr/include/x86_64-linux-gnu/bits/struct_mutex.h: + +/usr/include/x86_64-linux-gnu/bits/struct_rwlock.h: + +/usr/include/alloca.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-float.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib.h: + +/usr/include/signal.h: + +/usr/include/x86_64-linux-gnu/bits/signum.h: + +/usr/include/x86_64-linux-gnu/bits/signum-generic.h: + +/usr/include/x86_64-linux-gnu/bits/types/sig_atomic_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__sigval_t.h: + +/usr/include/x86_64-linux-gnu/bits/siginfo-arch.h: + +/usr/include/x86_64-linux-gnu/bits/siginfo-consts.h: + +/usr/include/x86_64-linux-gnu/bits/types/sigval_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/sigevent_t.h: + +/usr/include/x86_64-linux-gnu/bits/sigevent-consts.h: + +/usr/include/x86_64-linux-gnu/bits/sigaction.h: + +/usr/include/x86_64-linux-gnu/bits/sigcontext.h: + +/usr/include/x86_64-linux-gnu/bits/types/stack_t.h: + +/usr/include/x86_64-linux-gnu/sys/ucontext.h: + +/usr/include/x86_64-linux-gnu/bits/sigstack.h: + +/usr/include/x86_64-linux-gnu/bits/ss_flags.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_sigstack.h: + +/usr/include/x86_64-linux-gnu/bits/sigthread.h: + +/usr/include/x86_64-linux-gnu/bits/signal_ext.h: + +/usr/include/execinfo.h: + +/usr/include/unistd.h: + +/usr/include/x86_64-linux-gnu/bits/posix_opt.h: + +/usr/include/x86_64-linux-gnu/bits/environments.h: + +/usr/include/x86_64-linux-gnu/bits/confname.h: + +/usr/include/x86_64-linux-gnu/bits/getopt_posix.h: + +/usr/include/x86_64-linux-gnu/bits/getopt_core.h: + +/usr/include/x86_64-linux-gnu/bits/unistd.h: + +/usr/include/x86_64-linux-gnu/bits/unistd_ext.h: + +src/error.h: + +src/commons.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h: + +/usr/include/x86_64-linux-gnu/bits/types/locale_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h: + +/usr/include/stdint.h: + +/usr/include/x86_64-linux-gnu/bits/wchar.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h: + +/usr/include/curses.h: + +/usr/include/ncurses_dll.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h: + +/usr/include/unctrl.h: + +/usr/include/curses.h: + +src/settings.h: + +src/labels.h: + +/usr/include/libintl.h: + +/usr/include/locale.h: + +/usr/include/x86_64-linux-gnu/bits/locale.h: + +src/parser.h: diff --git a/goaccess++/src/.deps/gdashboard.Po b/goaccess++/src/.deps/gdashboard.Po new file mode 100644 index 0000000..b095058 --- /dev/null +++ b/goaccess++/src/.deps/gdashboard.Po @@ -0,0 +1,312 @@ +src/gdashboard.o: src/gdashboard.c /usr/include/stdc-predef.h \ + /usr/include/ctype.h /usr/include/features.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/timesize.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/time64.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endianness.h \ + /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h \ + /usr/include/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/stdio2.h /usr/include/stdlib.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ + /usr/include/x86_64-linux-gnu/bits/floatn.h \ + /usr/include/x86_64-linux-gnu/bits/floatn-common.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/timer_t.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-intn.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ + /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \ + /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \ + /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib.h /usr/include/string.h \ + /usr/include/x86_64-linux-gnu/bits/string_fortified.h \ + /usr/include/unistd.h /usr/include/x86_64-linux-gnu/bits/posix_opt.h \ + /usr/include/x86_64-linux-gnu/bits/environments.h \ + /usr/include/x86_64-linux-gnu/bits/confname.h \ + /usr/include/x86_64-linux-gnu/bits/getopt_posix.h \ + /usr/include/x86_64-linux-gnu/bits/getopt_core.h \ + /usr/include/x86_64-linux-gnu/bits/unistd.h \ + /usr/include/x86_64-linux-gnu/bits/unistd_ext.h /usr/include/regex.h \ + src/gdashboard.h src/config.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h /usr/include/stdint.h \ + /usr/include/x86_64-linux-gnu/bits/wchar.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h src/ui.h \ + /usr/include/curses.h /usr/include/ncurses_dll.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h /usr/include/wchar.h \ + /usr/include/x86_64-linux-gnu/bits/types/wint_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/wctype-wchar.h \ + /usr/include/x86_64-linux-gnu/bits/wchar2.h /usr/include/unctrl.h \ + /usr/include/curses.h /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \ + /usr/include/x86_64-linux-gnu/bits/sched.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h \ + /usr/include/x86_64-linux-gnu/bits/cpu-set.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_tm.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h \ + /usr/include/x86_64-linux-gnu/bits/setjmp.h src/labels.h \ + /usr/include/libintl.h /usr/include/locale.h \ + /usr/include/x86_64-linux-gnu/bits/locale.h src/color.h src/commons.h \ + src/sort.h src/parser.h src/gkhash.h src/gslist.h src/gstorage.h \ + src/khash.h /usr/lib/gcc/x86_64-linux-gnu/9/include/limits.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/syslimits.h \ + /usr/include/limits.h /usr/include/x86_64-linux-gnu/bits/posix1_lim.h \ + /usr/include/x86_64-linux-gnu/bits/local_lim.h \ + /usr/include/linux/limits.h \ + /usr/include/x86_64-linux-gnu/bits/posix2_lim.h \ + /usr/include/x86_64-linux-gnu/bits/xopen_lim.h \ + /usr/include/x86_64-linux-gnu/bits/uio_lim.h src/error.h src/settings.h \ + src/util.h src/xmalloc.h + +/usr/include/stdc-predef.h: + +/usr/include/ctype.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/bits/long-double.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/timesize.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/x86_64-linux-gnu/bits/time64.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endianness.h: + +/usr/include/x86_64-linux-gnu/bits/types/locale_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h: + +/usr/include/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/libc-header-start.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/stdio2.h: + +/usr/include/stdlib.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/x86_64-linux-gnu/bits/floatn.h: + +/usr/include/x86_64-linux-gnu/bits/floatn-common.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types/clock_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/time_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/timer_t.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-intn.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h: + +/usr/include/x86_64-linux-gnu/bits/struct_mutex.h: + +/usr/include/x86_64-linux-gnu/bits/struct_rwlock.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-float.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib.h: + +/usr/include/string.h: + +/usr/include/x86_64-linux-gnu/bits/string_fortified.h: + +/usr/include/unistd.h: + +/usr/include/x86_64-linux-gnu/bits/posix_opt.h: + +/usr/include/x86_64-linux-gnu/bits/environments.h: + +/usr/include/x86_64-linux-gnu/bits/confname.h: + +/usr/include/x86_64-linux-gnu/bits/getopt_posix.h: + +/usr/include/x86_64-linux-gnu/bits/getopt_core.h: + +/usr/include/x86_64-linux-gnu/bits/unistd.h: + +/usr/include/x86_64-linux-gnu/bits/unistd_ext.h: + +/usr/include/regex.h: + +src/gdashboard.h: + +src/config.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h: + +/usr/include/stdint.h: + +/usr/include/x86_64-linux-gnu/bits/wchar.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h: + +src/ui.h: + +/usr/include/curses.h: + +/usr/include/ncurses_dll.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h: + +/usr/include/wchar.h: + +/usr/include/x86_64-linux-gnu/bits/types/wint_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/mbstate_t.h: + +/usr/include/x86_64-linux-gnu/bits/wctype-wchar.h: + +/usr/include/x86_64-linux-gnu/bits/wchar2.h: + +/usr/include/unctrl.h: + +/usr/include/curses.h: + +/usr/include/pthread.h: + +/usr/include/sched.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h: + +/usr/include/x86_64-linux-gnu/bits/sched.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h: + +/usr/include/x86_64-linux-gnu/bits/cpu-set.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h: + +/usr/include/x86_64-linux-gnu/bits/setjmp.h: + +src/labels.h: + +/usr/include/libintl.h: + +/usr/include/locale.h: + +/usr/include/x86_64-linux-gnu/bits/locale.h: + +src/color.h: + +src/commons.h: + +src/sort.h: + +src/parser.h: + +src/gkhash.h: + +src/gslist.h: + +src/gstorage.h: + +src/khash.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/limits.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/syslimits.h: + +/usr/include/limits.h: + +/usr/include/x86_64-linux-gnu/bits/posix1_lim.h: + +/usr/include/x86_64-linux-gnu/bits/local_lim.h: + +/usr/include/linux/limits.h: + +/usr/include/x86_64-linux-gnu/bits/posix2_lim.h: + +/usr/include/x86_64-linux-gnu/bits/xopen_lim.h: + +/usr/include/x86_64-linux-gnu/bits/uio_lim.h: + +src/error.h: + +src/settings.h: + +src/util.h: + +src/xmalloc.h: diff --git a/goaccess++/src/.deps/gdns.Po b/goaccess++/src/.deps/gdns.Po new file mode 100644 index 0000000..404afec --- /dev/null +++ b/goaccess++/src/.deps/gdns.Po @@ -0,0 +1,414 @@ +src/gdns.o: src/gdns.c /usr/include/stdc-predef.h src/config.h \ + /usr/include/pthread.h /usr/include/features.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h /usr/include/sched.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/timesize.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/time64.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h \ + /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endianness.h \ + /usr/include/x86_64-linux-gnu/bits/sched.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h \ + /usr/include/x86_64-linux-gnu/bits/cpu-set.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_tm.h \ + /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/timer_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h \ + /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ + /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \ + /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \ + /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h \ + /usr/include/x86_64-linux-gnu/bits/setjmp.h /usr/include/netinet/in.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h \ + /usr/include/x86_64-linux-gnu/sys/socket.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_iovec.h \ + /usr/include/x86_64-linux-gnu/bits/socket.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/bits/uintn-identity.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \ + /usr/include/x86_64-linux-gnu/bits/select2.h \ + /usr/include/x86_64-linux-gnu/bits/socket_type.h \ + /usr/include/x86_64-linux-gnu/bits/sockaddr.h \ + /usr/include/x86_64-linux-gnu/asm/socket.h \ + /usr/include/asm-generic/socket.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h \ + /usr/include/x86_64-linux-gnu/asm/posix_types.h \ + /usr/include/x86_64-linux-gnu/asm/posix_types_64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/x86_64-linux-gnu/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/x86_64-linux-gnu/asm/sockios.h \ + /usr/include/asm-generic/sockios.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_osockaddr.h \ + /usr/include/x86_64-linux-gnu/bits/socket2.h \ + /usr/include/x86_64-linux-gnu/bits/in.h /usr/include/arpa/inet.h \ + /usr/include/ctype.h /usr/include/errno.h \ + /usr/include/x86_64-linux-gnu/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/x86_64-linux-gnu/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/netdb.h /usr/include/rpc/netdb.h \ + /usr/include/x86_64-linux-gnu/bits/netdb.h /usr/include/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/stdio2.h /usr/include/stdlib.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ + /usr/include/x86_64-linux-gnu/bits/floatn.h \ + /usr/include/x86_64-linux-gnu/bits/floatn-common.h /usr/include/alloca.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib.h /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/x86_64-linux-gnu/bits/strings_fortified.h \ + /usr/include/x86_64-linux-gnu/bits/string_fortified.h \ + /usr/include/x86_64-linux-gnu/sys/stat.h \ + /usr/include/x86_64-linux-gnu/bits/stat.h /usr/include/unistd.h \ + /usr/include/x86_64-linux-gnu/bits/posix_opt.h \ + /usr/include/x86_64-linux-gnu/bits/environments.h \ + /usr/include/x86_64-linux-gnu/bits/confname.h \ + /usr/include/x86_64-linux-gnu/bits/getopt_posix.h \ + /usr/include/x86_64-linux-gnu/bits/getopt_core.h \ + /usr/include/x86_64-linux-gnu/bits/unistd.h \ + /usr/include/x86_64-linux-gnu/bits/unistd_ext.h src/gdns.h src/gkhash.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h /usr/include/stdint.h \ + /usr/include/x86_64-linux-gnu/bits/wchar.h src/gslist.h src/gstorage.h \ + src/commons.h src/khash.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/limits.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/syslimits.h \ + /usr/include/limits.h /usr/include/x86_64-linux-gnu/bits/posix1_lim.h \ + /usr/include/x86_64-linux-gnu/bits/local_lim.h \ + /usr/include/linux/limits.h \ + /usr/include/x86_64-linux-gnu/bits/posix2_lim.h src/parser.h src/error.h \ + /usr/include/curses.h /usr/include/ncurses_dll.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h /usr/include/unctrl.h \ + /usr/include/curses.h src/settings.h src/goaccess.h src/ui.h \ + src/labels.h /usr/include/libintl.h /usr/include/locale.h \ + /usr/include/x86_64-linux-gnu/bits/locale.h src/color.h src/sort.h \ + src/util.h src/xmalloc.h + +/usr/include/stdc-predef.h: + +src/config.h: + +/usr/include/pthread.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/bits/long-double.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/sched.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/timesize.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/x86_64-linux-gnu/bits/time64.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h: + +/usr/include/x86_64-linux-gnu/bits/types/time_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endianness.h: + +/usr/include/x86_64-linux-gnu/bits/sched.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h: + +/usr/include/x86_64-linux-gnu/bits/cpu-set.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/bits/types/clock_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h: + +/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/timer_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h: + +/usr/include/x86_64-linux-gnu/bits/types/locale_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h: + +/usr/include/x86_64-linux-gnu/bits/struct_mutex.h: + +/usr/include/x86_64-linux-gnu/bits/struct_rwlock.h: + +/usr/include/x86_64-linux-gnu/bits/setjmp.h: + +/usr/include/netinet/in.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h: + +/usr/include/x86_64-linux-gnu/sys/socket.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_iovec.h: + +/usr/include/x86_64-linux-gnu/bits/socket.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-intn.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/bits/uintn-identity.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h: + +/usr/include/x86_64-linux-gnu/bits/select2.h: + +/usr/include/x86_64-linux-gnu/bits/socket_type.h: + +/usr/include/x86_64-linux-gnu/bits/sockaddr.h: + +/usr/include/x86_64-linux-gnu/asm/socket.h: + +/usr/include/asm-generic/socket.h: + +/usr/include/linux/posix_types.h: + +/usr/include/linux/stddef.h: + +/usr/include/x86_64-linux-gnu/asm/posix_types.h: + +/usr/include/x86_64-linux-gnu/asm/posix_types_64.h: + +/usr/include/asm-generic/posix_types.h: + +/usr/include/x86_64-linux-gnu/asm/bitsperlong.h: + +/usr/include/asm-generic/bitsperlong.h: + +/usr/include/x86_64-linux-gnu/asm/sockios.h: + +/usr/include/asm-generic/sockios.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_osockaddr.h: + +/usr/include/x86_64-linux-gnu/bits/socket2.h: + +/usr/include/x86_64-linux-gnu/bits/in.h: + +/usr/include/arpa/inet.h: + +/usr/include/ctype.h: + +/usr/include/errno.h: + +/usr/include/x86_64-linux-gnu/bits/errno.h: + +/usr/include/linux/errno.h: + +/usr/include/x86_64-linux-gnu/asm/errno.h: + +/usr/include/asm-generic/errno.h: + +/usr/include/asm-generic/errno-base.h: + +/usr/include/netdb.h: + +/usr/include/rpc/netdb.h: + +/usr/include/x86_64-linux-gnu/bits/netdb.h: + +/usr/include/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/libc-header-start.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/stdio2.h: + +/usr/include/stdlib.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/x86_64-linux-gnu/bits/floatn.h: + +/usr/include/x86_64-linux-gnu/bits/floatn-common.h: + +/usr/include/alloca.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-float.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib.h: + +/usr/include/string.h: + +/usr/include/strings.h: + +/usr/include/x86_64-linux-gnu/bits/strings_fortified.h: + +/usr/include/x86_64-linux-gnu/bits/string_fortified.h: + +/usr/include/x86_64-linux-gnu/sys/stat.h: + +/usr/include/x86_64-linux-gnu/bits/stat.h: + +/usr/include/unistd.h: + +/usr/include/x86_64-linux-gnu/bits/posix_opt.h: + +/usr/include/x86_64-linux-gnu/bits/environments.h: + +/usr/include/x86_64-linux-gnu/bits/confname.h: + +/usr/include/x86_64-linux-gnu/bits/getopt_posix.h: + +/usr/include/x86_64-linux-gnu/bits/getopt_core.h: + +/usr/include/x86_64-linux-gnu/bits/unistd.h: + +/usr/include/x86_64-linux-gnu/bits/unistd_ext.h: + +src/gdns.h: + +src/gkhash.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h: + +/usr/include/stdint.h: + +/usr/include/x86_64-linux-gnu/bits/wchar.h: + +src/gslist.h: + +src/gstorage.h: + +src/commons.h: + +src/khash.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/limits.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/syslimits.h: + +/usr/include/limits.h: + +/usr/include/x86_64-linux-gnu/bits/posix1_lim.h: + +/usr/include/x86_64-linux-gnu/bits/local_lim.h: + +/usr/include/linux/limits.h: + +/usr/include/x86_64-linux-gnu/bits/posix2_lim.h: + +src/parser.h: + +src/error.h: + +/usr/include/curses.h: + +/usr/include/ncurses_dll.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h: + +/usr/include/unctrl.h: + +/usr/include/curses.h: + +src/settings.h: + +src/goaccess.h: + +src/ui.h: + +src/labels.h: + +/usr/include/libintl.h: + +/usr/include/locale.h: + +/usr/include/x86_64-linux-gnu/bits/locale.h: + +src/color.h: + +src/sort.h: + +src/util.h: + +src/xmalloc.h: diff --git a/goaccess++/src/.deps/geoip1.Po b/goaccess++/src/.deps/geoip1.Po new file mode 100644 index 0000000..8539f92 --- /dev/null +++ b/goaccess++/src/.deps/geoip1.Po @@ -0,0 +1,304 @@ +src/geoip1.o: src/geoip1.c /usr/include/stdc-predef.h src/config.h \ + /usr/include/GeoIP.h /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/timesize.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/time64.h \ + /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/timer_t.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endianness.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/bits/uintn-identity.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \ + /usr/include/x86_64-linux-gnu/bits/select2.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ + /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \ + /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \ + /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h \ + /usr/include/arpa/inet.h /usr/include/netinet/in.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h \ + /usr/include/x86_64-linux-gnu/sys/socket.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_iovec.h \ + /usr/include/x86_64-linux-gnu/bits/socket.h \ + /usr/include/x86_64-linux-gnu/bits/socket_type.h \ + /usr/include/x86_64-linux-gnu/bits/sockaddr.h \ + /usr/include/x86_64-linux-gnu/asm/socket.h \ + /usr/include/asm-generic/socket.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h \ + /usr/include/x86_64-linux-gnu/asm/posix_types.h \ + /usr/include/x86_64-linux-gnu/asm/posix_types_64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/x86_64-linux-gnu/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/x86_64-linux-gnu/asm/sockios.h \ + /usr/include/asm-generic/sockios.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_osockaddr.h \ + /usr/include/x86_64-linux-gnu/bits/socket2.h \ + /usr/include/x86_64-linux-gnu/bits/in.h /usr/include/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/stdio2.h /usr/include/stdlib.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ + /usr/include/x86_64-linux-gnu/bits/floatn.h \ + /usr/include/x86_64-linux-gnu/bits/floatn-common.h /usr/include/alloca.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib.h /usr/include/string.h \ + /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /usr/include/x86_64-linux-gnu/bits/strings_fortified.h \ + /usr/include/x86_64-linux-gnu/bits/string_fortified.h \ + /usr/include/x86_64-linux-gnu/sys/stat.h \ + /usr/include/x86_64-linux-gnu/bits/stat.h /usr/include/GeoIPCity.h \ + /usr/include/GeoIP.h src/geoip1.h src/commons.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_tm.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h /usr/include/stdint.h \ + /usr/include/x86_64-linux-gnu/bits/wchar.h src/error.h \ + /usr/include/curses.h /usr/include/ncurses_dll.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h /usr/include/unctrl.h \ + /usr/include/curses.h src/settings.h src/util.h + +/usr/include/stdc-predef.h: + +src/config.h: + +/usr/include/GeoIP.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/bits/long-double.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/timesize.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/x86_64-linux-gnu/bits/time64.h: + +/usr/include/x86_64-linux-gnu/bits/types/clock_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/time_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/timer_t.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-intn.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endianness.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/bits/uintn-identity.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h: + +/usr/include/x86_64-linux-gnu/bits/select2.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h: + +/usr/include/x86_64-linux-gnu/bits/struct_mutex.h: + +/usr/include/x86_64-linux-gnu/bits/struct_rwlock.h: + +/usr/include/arpa/inet.h: + +/usr/include/netinet/in.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h: + +/usr/include/x86_64-linux-gnu/sys/socket.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_iovec.h: + +/usr/include/x86_64-linux-gnu/bits/socket.h: + +/usr/include/x86_64-linux-gnu/bits/socket_type.h: + +/usr/include/x86_64-linux-gnu/bits/sockaddr.h: + +/usr/include/x86_64-linux-gnu/asm/socket.h: + +/usr/include/asm-generic/socket.h: + +/usr/include/linux/posix_types.h: + +/usr/include/linux/stddef.h: + +/usr/include/x86_64-linux-gnu/asm/posix_types.h: + +/usr/include/x86_64-linux-gnu/asm/posix_types_64.h: + +/usr/include/asm-generic/posix_types.h: + +/usr/include/x86_64-linux-gnu/asm/bitsperlong.h: + +/usr/include/asm-generic/bitsperlong.h: + +/usr/include/x86_64-linux-gnu/asm/sockios.h: + +/usr/include/asm-generic/sockios.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_osockaddr.h: + +/usr/include/x86_64-linux-gnu/bits/socket2.h: + +/usr/include/x86_64-linux-gnu/bits/in.h: + +/usr/include/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/libc-header-start.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/stdio2.h: + +/usr/include/stdlib.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/x86_64-linux-gnu/bits/floatn.h: + +/usr/include/x86_64-linux-gnu/bits/floatn-common.h: + +/usr/include/alloca.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-float.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib.h: + +/usr/include/string.h: + +/usr/include/x86_64-linux-gnu/bits/types/locale_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h: + +/usr/include/strings.h: + +/usr/include/x86_64-linux-gnu/bits/strings_fortified.h: + +/usr/include/x86_64-linux-gnu/bits/string_fortified.h: + +/usr/include/x86_64-linux-gnu/sys/stat.h: + +/usr/include/x86_64-linux-gnu/bits/stat.h: + +/usr/include/GeoIPCity.h: + +/usr/include/GeoIP.h: + +src/geoip1.h: + +src/commons.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h: + +/usr/include/stdint.h: + +/usr/include/x86_64-linux-gnu/bits/wchar.h: + +src/error.h: + +/usr/include/curses.h: + +/usr/include/ncurses_dll.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h: + +/usr/include/unctrl.h: + +/usr/include/curses.h: + +src/settings.h: + +src/util.h: diff --git a/goaccess++/src/.deps/geoip2.Po b/goaccess++/src/.deps/geoip2.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/goaccess++/src/.deps/geoip2.Po @@ -0,0 +1 @@ +# dummy diff --git a/goaccess++/src/.deps/gholder.Po b/goaccess++/src/.deps/gholder.Po new file mode 100644 index 0000000..4df1970 --- /dev/null +++ b/goaccess++/src/.deps/gholder.Po @@ -0,0 +1,348 @@ +src/gholder.o: src/gholder.c /usr/include/stdc-predef.h \ + /usr/include/pthread.h /usr/include/features.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h /usr/include/sched.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/timesize.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/time64.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h \ + /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endianness.h \ + /usr/include/x86_64-linux-gnu/bits/sched.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h \ + /usr/include/x86_64-linux-gnu/bits/cpu-set.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_tm.h \ + /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/timer_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h \ + /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ + /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \ + /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \ + /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h \ + /usr/include/x86_64-linux-gnu/bits/setjmp.h /usr/include/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/stdio2.h /usr/include/stdlib.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ + /usr/include/x86_64-linux-gnu/bits/floatn.h \ + /usr/include/x86_64-linux-gnu/bits/floatn-common.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/bits/uintn-identity.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \ + /usr/include/x86_64-linux-gnu/bits/select2.h /usr/include/alloca.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib.h /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/x86_64-linux-gnu/bits/strings_fortified.h \ + /usr/include/x86_64-linux-gnu/bits/string_fortified.h \ + /usr/include/netinet/in.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h \ + /usr/include/x86_64-linux-gnu/sys/socket.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_iovec.h \ + /usr/include/x86_64-linux-gnu/bits/socket.h \ + /usr/include/x86_64-linux-gnu/bits/socket_type.h \ + /usr/include/x86_64-linux-gnu/bits/sockaddr.h \ + /usr/include/x86_64-linux-gnu/asm/socket.h \ + /usr/include/asm-generic/socket.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h \ + /usr/include/x86_64-linux-gnu/asm/posix_types.h \ + /usr/include/x86_64-linux-gnu/asm/posix_types_64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/x86_64-linux-gnu/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/x86_64-linux-gnu/asm/sockios.h \ + /usr/include/asm-generic/sockios.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_osockaddr.h \ + /usr/include/x86_64-linux-gnu/bits/socket2.h \ + /usr/include/x86_64-linux-gnu/bits/in.h /usr/include/arpa/inet.h \ + src/gkhash.h /usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h \ + /usr/include/stdint.h /usr/include/x86_64-linux-gnu/bits/wchar.h \ + src/gslist.h src/gstorage.h src/commons.h src/config.h src/khash.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/limits.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/syslimits.h \ + /usr/include/limits.h /usr/include/x86_64-linux-gnu/bits/posix1_lim.h \ + /usr/include/x86_64-linux-gnu/bits/local_lim.h \ + /usr/include/linux/limits.h \ + /usr/include/x86_64-linux-gnu/bits/posix2_lim.h src/parser.h \ + src/geoip1.h src/gholder.h src/sort.h src/error.h /usr/include/curses.h \ + /usr/include/ncurses_dll.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h /usr/include/unctrl.h \ + /usr/include/curses.h src/settings.h src/gdns.h src/util.h src/xmalloc.h + +/usr/include/stdc-predef.h: + +/usr/include/pthread.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/bits/long-double.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/sched.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/timesize.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/x86_64-linux-gnu/bits/time64.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h: + +/usr/include/x86_64-linux-gnu/bits/types/time_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endianness.h: + +/usr/include/x86_64-linux-gnu/bits/sched.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h: + +/usr/include/x86_64-linux-gnu/bits/cpu-set.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/bits/types/clock_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h: + +/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/timer_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h: + +/usr/include/x86_64-linux-gnu/bits/types/locale_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h: + +/usr/include/x86_64-linux-gnu/bits/struct_mutex.h: + +/usr/include/x86_64-linux-gnu/bits/struct_rwlock.h: + +/usr/include/x86_64-linux-gnu/bits/setjmp.h: + +/usr/include/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/libc-header-start.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/stdio2.h: + +/usr/include/stdlib.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/x86_64-linux-gnu/bits/floatn.h: + +/usr/include/x86_64-linux-gnu/bits/floatn-common.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-intn.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/bits/uintn-identity.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h: + +/usr/include/x86_64-linux-gnu/bits/select2.h: + +/usr/include/alloca.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-float.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib.h: + +/usr/include/string.h: + +/usr/include/strings.h: + +/usr/include/x86_64-linux-gnu/bits/strings_fortified.h: + +/usr/include/x86_64-linux-gnu/bits/string_fortified.h: + +/usr/include/netinet/in.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h: + +/usr/include/x86_64-linux-gnu/sys/socket.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_iovec.h: + +/usr/include/x86_64-linux-gnu/bits/socket.h: + +/usr/include/x86_64-linux-gnu/bits/socket_type.h: + +/usr/include/x86_64-linux-gnu/bits/sockaddr.h: + +/usr/include/x86_64-linux-gnu/asm/socket.h: + +/usr/include/asm-generic/socket.h: + +/usr/include/linux/posix_types.h: + +/usr/include/linux/stddef.h: + +/usr/include/x86_64-linux-gnu/asm/posix_types.h: + +/usr/include/x86_64-linux-gnu/asm/posix_types_64.h: + +/usr/include/asm-generic/posix_types.h: + +/usr/include/x86_64-linux-gnu/asm/bitsperlong.h: + +/usr/include/asm-generic/bitsperlong.h: + +/usr/include/x86_64-linux-gnu/asm/sockios.h: + +/usr/include/asm-generic/sockios.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_osockaddr.h: + +/usr/include/x86_64-linux-gnu/bits/socket2.h: + +/usr/include/x86_64-linux-gnu/bits/in.h: + +/usr/include/arpa/inet.h: + +src/gkhash.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h: + +/usr/include/stdint.h: + +/usr/include/x86_64-linux-gnu/bits/wchar.h: + +src/gslist.h: + +src/gstorage.h: + +src/commons.h: + +src/config.h: + +src/khash.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/limits.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/syslimits.h: + +/usr/include/limits.h: + +/usr/include/x86_64-linux-gnu/bits/posix1_lim.h: + +/usr/include/x86_64-linux-gnu/bits/local_lim.h: + +/usr/include/linux/limits.h: + +/usr/include/x86_64-linux-gnu/bits/posix2_lim.h: + +src/parser.h: + +src/geoip1.h: + +src/gholder.h: + +src/sort.h: + +src/error.h: + +/usr/include/curses.h: + +/usr/include/ncurses_dll.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h: + +/usr/include/unctrl.h: + +/usr/include/curses.h: + +src/settings.h: + +src/gdns.h: + +src/util.h: + +src/xmalloc.h: diff --git a/goaccess++/src/.deps/gkhash.Po b/goaccess++/src/.deps/gkhash.Po new file mode 100644 index 0000000..2409eab --- /dev/null +++ b/goaccess++/src/.deps/gkhash.Po @@ -0,0 +1,280 @@ +src/gkhash.o: src/gkhash.c /usr/include/stdc-predef.h src/config.h \ + /usr/include/errno.h /usr/include/features.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/x86_64-linux-gnu/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/timesize.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/time64.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/stdio2.h /usr/include/stdlib.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ + /usr/include/x86_64-linux-gnu/bits/floatn.h \ + /usr/include/x86_64-linux-gnu/bits/floatn-common.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/timer_t.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endianness.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/bits/uintn-identity.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \ + /usr/include/x86_64-linux-gnu/bits/select2.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ + /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \ + /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \ + /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib.h /usr/include/string.h \ + /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /usr/include/x86_64-linux-gnu/bits/strings_fortified.h \ + /usr/include/x86_64-linux-gnu/bits/string_fortified.h src/gkhash.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h /usr/include/stdint.h \ + /usr/include/x86_64-linux-gnu/bits/wchar.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h src/gslist.h \ + src/gstorage.h src/commons.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_tm.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h src/khash.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/limits.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/syslimits.h \ + /usr/include/limits.h /usr/include/x86_64-linux-gnu/bits/posix1_lim.h \ + /usr/include/x86_64-linux-gnu/bits/local_lim.h \ + /usr/include/linux/limits.h \ + /usr/include/x86_64-linux-gnu/bits/posix2_lim.h src/parser.h src/error.h \ + /usr/include/curses.h /usr/include/ncurses_dll.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h /usr/include/unctrl.h \ + /usr/include/curses.h src/settings.h src/sort.h src/util.h src/xmalloc.h + +/usr/include/stdc-predef.h: + +src/config.h: + +/usr/include/errno.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/bits/long-double.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/errno.h: + +/usr/include/linux/errno.h: + +/usr/include/x86_64-linux-gnu/asm/errno.h: + +/usr/include/asm-generic/errno.h: + +/usr/include/asm-generic/errno-base.h: + +/usr/include/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/libc-header-start.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/timesize.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/x86_64-linux-gnu/bits/time64.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/stdio2.h: + +/usr/include/stdlib.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/x86_64-linux-gnu/bits/floatn.h: + +/usr/include/x86_64-linux-gnu/bits/floatn-common.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types/clock_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/time_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/timer_t.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-intn.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endianness.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/bits/uintn-identity.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h: + +/usr/include/x86_64-linux-gnu/bits/select2.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h: + +/usr/include/x86_64-linux-gnu/bits/struct_mutex.h: + +/usr/include/x86_64-linux-gnu/bits/struct_rwlock.h: + +/usr/include/alloca.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-float.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib.h: + +/usr/include/string.h: + +/usr/include/x86_64-linux-gnu/bits/types/locale_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h: + +/usr/include/strings.h: + +/usr/include/x86_64-linux-gnu/bits/strings_fortified.h: + +/usr/include/x86_64-linux-gnu/bits/string_fortified.h: + +src/gkhash.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h: + +/usr/include/stdint.h: + +/usr/include/x86_64-linux-gnu/bits/wchar.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h: + +src/gslist.h: + +src/gstorage.h: + +src/commons.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h: + +src/khash.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/limits.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/syslimits.h: + +/usr/include/limits.h: + +/usr/include/x86_64-linux-gnu/bits/posix1_lim.h: + +/usr/include/x86_64-linux-gnu/bits/local_lim.h: + +/usr/include/linux/limits.h: + +/usr/include/x86_64-linux-gnu/bits/posix2_lim.h: + +src/parser.h: + +src/error.h: + +/usr/include/curses.h: + +/usr/include/ncurses_dll.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h: + +/usr/include/unctrl.h: + +/usr/include/curses.h: + +src/settings.h: + +src/sort.h: + +src/util.h: + +src/xmalloc.h: diff --git a/goaccess++/src/.deps/gmenu.Po b/goaccess++/src/.deps/gmenu.Po new file mode 100644 index 0000000..75a2ac0 --- /dev/null +++ b/goaccess++/src/.deps/gmenu.Po @@ -0,0 +1,264 @@ +src/gmenu.o: src/gmenu.c /usr/include/stdc-predef.h /usr/include/ctype.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/timesize.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/time64.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endianness.h \ + /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h \ + /usr/include/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/stdio2.h /usr/include/stdlib.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ + /usr/include/x86_64-linux-gnu/bits/floatn.h \ + /usr/include/x86_64-linux-gnu/bits/floatn-common.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/timer_t.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/bits/uintn-identity.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \ + /usr/include/x86_64-linux-gnu/bits/select2.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ + /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \ + /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \ + /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib.h /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/x86_64-linux-gnu/bits/strings_fortified.h \ + /usr/include/x86_64-linux-gnu/bits/string_fortified.h src/gmenu.h \ + src/config.h /usr/include/curses.h /usr/include/ncurses_dll.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h /usr/include/stdint.h \ + /usr/include/x86_64-linux-gnu/bits/wchar.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h /usr/include/unctrl.h \ + /usr/include/curses.h src/xmalloc.h src/ui.h /usr/include/pthread.h \ + /usr/include/sched.h /usr/include/x86_64-linux-gnu/bits/sched.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h \ + /usr/include/x86_64-linux-gnu/bits/cpu-set.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_tm.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h \ + /usr/include/x86_64-linux-gnu/bits/setjmp.h src/labels.h \ + /usr/include/libintl.h /usr/include/locale.h \ + /usr/include/x86_64-linux-gnu/bits/locale.h src/color.h src/commons.h \ + src/sort.h src/parser.h + +/usr/include/stdc-predef.h: + +/usr/include/ctype.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/bits/long-double.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/timesize.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/x86_64-linux-gnu/bits/time64.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endianness.h: + +/usr/include/x86_64-linux-gnu/bits/types/locale_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h: + +/usr/include/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/libc-header-start.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/stdio2.h: + +/usr/include/stdlib.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/x86_64-linux-gnu/bits/floatn.h: + +/usr/include/x86_64-linux-gnu/bits/floatn-common.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types/clock_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/time_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/timer_t.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-intn.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/bits/uintn-identity.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h: + +/usr/include/x86_64-linux-gnu/bits/select2.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h: + +/usr/include/x86_64-linux-gnu/bits/struct_mutex.h: + +/usr/include/x86_64-linux-gnu/bits/struct_rwlock.h: + +/usr/include/alloca.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-float.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib.h: + +/usr/include/string.h: + +/usr/include/strings.h: + +/usr/include/x86_64-linux-gnu/bits/strings_fortified.h: + +/usr/include/x86_64-linux-gnu/bits/string_fortified.h: + +src/gmenu.h: + +src/config.h: + +/usr/include/curses.h: + +/usr/include/ncurses_dll.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h: + +/usr/include/stdint.h: + +/usr/include/x86_64-linux-gnu/bits/wchar.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h: + +/usr/include/unctrl.h: + +/usr/include/curses.h: + +src/xmalloc.h: + +src/ui.h: + +/usr/include/pthread.h: + +/usr/include/sched.h: + +/usr/include/x86_64-linux-gnu/bits/sched.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h: + +/usr/include/x86_64-linux-gnu/bits/cpu-set.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h: + +/usr/include/x86_64-linux-gnu/bits/setjmp.h: + +src/labels.h: + +/usr/include/libintl.h: + +/usr/include/locale.h: + +/usr/include/x86_64-linux-gnu/bits/locale.h: + +src/color.h: + +src/commons.h: + +src/sort.h: + +src/parser.h: diff --git a/goaccess++/src/.deps/goaccess.Po b/goaccess++/src/.deps/goaccess.Po new file mode 100644 index 0000000..a4246bb --- /dev/null +++ b/goaccess++/src/.deps/goaccess.Po @@ -0,0 +1,497 @@ +src/goaccess.o: src/goaccess.c /usr/include/stdc-predef.h \ + /usr/include/assert.h /usr/include/features.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h /usr/include/ctype.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/timesize.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/time64.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endianness.h \ + /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h \ + /usr/include/errno.h /usr/include/x86_64-linux-gnu/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/x86_64-linux-gnu/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/locale.h /usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h \ + /usr/include/x86_64-linux-gnu/bits/locale.h src/config.h \ + /usr/include/fcntl.h /usr/include/x86_64-linux-gnu/bits/fcntl.h \ + /usr/include/x86_64-linux-gnu/bits/fcntl-linux.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \ + /usr/include/x86_64-linux-gnu/bits/stat.h \ + /usr/include/x86_64-linux-gnu/bits/fcntl2.h /usr/include/pthread.h \ + /usr/include/sched.h /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ + /usr/include/x86_64-linux-gnu/bits/sched.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h \ + /usr/include/x86_64-linux-gnu/bits/cpu-set.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_tm.h \ + /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/timer_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ + /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \ + /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \ + /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h \ + /usr/include/x86_64-linux-gnu/bits/setjmp.h /usr/include/signal.h \ + /usr/include/x86_64-linux-gnu/bits/signum.h \ + /usr/include/x86_64-linux-gnu/bits/signum-generic.h \ + /usr/include/x86_64-linux-gnu/bits/types/sig_atomic_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__sigval_t.h \ + /usr/include/x86_64-linux-gnu/bits/siginfo-arch.h \ + /usr/include/x86_64-linux-gnu/bits/siginfo-consts.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigval_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigevent_t.h \ + /usr/include/x86_64-linux-gnu/bits/sigevent-consts.h \ + /usr/include/x86_64-linux-gnu/bits/sigaction.h \ + /usr/include/x86_64-linux-gnu/bits/sigcontext.h \ + /usr/include/x86_64-linux-gnu/bits/types/stack_t.h \ + /usr/include/x86_64-linux-gnu/sys/ucontext.h \ + /usr/include/x86_64-linux-gnu/bits/sigstack.h \ + /usr/include/x86_64-linux-gnu/bits/ss_flags.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_sigstack.h \ + /usr/include/x86_64-linux-gnu/bits/sigthread.h \ + /usr/include/x86_64-linux-gnu/bits/signal_ext.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h /usr/include/stdint.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/include/x86_64-linux-gnu/bits/wchar.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-intn.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/stdio2.h /usr/include/stdlib.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ + /usr/include/x86_64-linux-gnu/bits/floatn.h \ + /usr/include/x86_64-linux-gnu/bits/floatn-common.h \ + /usr/include/x86_64-linux-gnu/sys/types.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/bits/uintn-identity.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \ + /usr/include/x86_64-linux-gnu/bits/select2.h /usr/include/alloca.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib.h /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/x86_64-linux-gnu/bits/strings_fortified.h \ + /usr/include/x86_64-linux-gnu/bits/string_fortified.h \ + /usr/include/x86_64-linux-gnu/sys/stat.h /usr/include/unistd.h \ + /usr/include/x86_64-linux-gnu/bits/posix_opt.h \ + /usr/include/x86_64-linux-gnu/bits/environments.h \ + /usr/include/x86_64-linux-gnu/bits/confname.h \ + /usr/include/x86_64-linux-gnu/bits/getopt_posix.h \ + /usr/include/x86_64-linux-gnu/bits/getopt_core.h \ + /usr/include/x86_64-linux-gnu/bits/unistd.h \ + /usr/include/x86_64-linux-gnu/bits/unistd_ext.h src/gkhash.h \ + src/gslist.h src/gstorage.h src/commons.h src/khash.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/limits.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/syslimits.h \ + /usr/include/limits.h /usr/include/x86_64-linux-gnu/bits/posix1_lim.h \ + /usr/include/x86_64-linux-gnu/bits/local_lim.h \ + /usr/include/linux/limits.h \ + /usr/include/x86_64-linux-gnu/bits/posix2_lim.h src/parser.h \ + src/geoip1.h src/browsers.h src/csv.h src/settings.h src/error.h \ + /usr/include/curses.h /usr/include/ncurses_dll.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h /usr/include/unctrl.h \ + /usr/include/curses.h src/gdashboard.h src/ui.h src/labels.h \ + /usr/include/libintl.h src/color.h src/sort.h src/gdns.h src/gholder.h \ + src/goaccess.h src/gwsocket.h src/websocket.h /usr/include/netinet/in.h \ + /usr/include/x86_64-linux-gnu/sys/socket.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_iovec.h \ + /usr/include/x86_64-linux-gnu/bits/socket.h \ + /usr/include/x86_64-linux-gnu/bits/socket_type.h \ + /usr/include/x86_64-linux-gnu/bits/sockaddr.h \ + /usr/include/x86_64-linux-gnu/asm/socket.h \ + /usr/include/asm-generic/socket.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h \ + /usr/include/x86_64-linux-gnu/asm/posix_types.h \ + /usr/include/x86_64-linux-gnu/asm/posix_types_64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/x86_64-linux-gnu/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/x86_64-linux-gnu/asm/sockios.h \ + /usr/include/asm-generic/sockios.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_osockaddr.h \ + /usr/include/x86_64-linux-gnu/bits/socket2.h \ + /usr/include/x86_64-linux-gnu/bits/in.h src/json.h src/options.h \ + src/output.h src/util.h src/xmalloc.h + +/usr/include/stdc-predef.h: + +/usr/include/assert.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/bits/long-double.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/ctype.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/timesize.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/x86_64-linux-gnu/bits/time64.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endianness.h: + +/usr/include/x86_64-linux-gnu/bits/types/locale_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h: + +/usr/include/errno.h: + +/usr/include/x86_64-linux-gnu/bits/errno.h: + +/usr/include/linux/errno.h: + +/usr/include/x86_64-linux-gnu/asm/errno.h: + +/usr/include/asm-generic/errno.h: + +/usr/include/asm-generic/errno-base.h: + +/usr/include/locale.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h: + +/usr/include/x86_64-linux-gnu/bits/locale.h: + +src/config.h: + +/usr/include/fcntl.h: + +/usr/include/x86_64-linux-gnu/bits/fcntl.h: + +/usr/include/x86_64-linux-gnu/bits/fcntl-linux.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h: + +/usr/include/x86_64-linux-gnu/bits/stat.h: + +/usr/include/x86_64-linux-gnu/bits/fcntl2.h: + +/usr/include/pthread.h: + +/usr/include/sched.h: + +/usr/include/x86_64-linux-gnu/bits/types/time_t.h: + +/usr/include/x86_64-linux-gnu/bits/sched.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h: + +/usr/include/x86_64-linux-gnu/bits/cpu-set.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/bits/types/clock_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h: + +/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/timer_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h: + +/usr/include/x86_64-linux-gnu/bits/struct_mutex.h: + +/usr/include/x86_64-linux-gnu/bits/struct_rwlock.h: + +/usr/include/x86_64-linux-gnu/bits/setjmp.h: + +/usr/include/signal.h: + +/usr/include/x86_64-linux-gnu/bits/signum.h: + +/usr/include/x86_64-linux-gnu/bits/signum-generic.h: + +/usr/include/x86_64-linux-gnu/bits/types/sig_atomic_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__sigval_t.h: + +/usr/include/x86_64-linux-gnu/bits/siginfo-arch.h: + +/usr/include/x86_64-linux-gnu/bits/siginfo-consts.h: + +/usr/include/x86_64-linux-gnu/bits/types/sigval_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/sigevent_t.h: + +/usr/include/x86_64-linux-gnu/bits/sigevent-consts.h: + +/usr/include/x86_64-linux-gnu/bits/sigaction.h: + +/usr/include/x86_64-linux-gnu/bits/sigcontext.h: + +/usr/include/x86_64-linux-gnu/bits/types/stack_t.h: + +/usr/include/x86_64-linux-gnu/sys/ucontext.h: + +/usr/include/x86_64-linux-gnu/bits/sigstack.h: + +/usr/include/x86_64-linux-gnu/bits/ss_flags.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_sigstack.h: + +/usr/include/x86_64-linux-gnu/bits/sigthread.h: + +/usr/include/x86_64-linux-gnu/bits/signal_ext.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h: + +/usr/include/stdint.h: + +/usr/include/x86_64-linux-gnu/bits/libc-header-start.h: + +/usr/include/x86_64-linux-gnu/bits/wchar.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-intn.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h: + +/usr/include/stdio.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/stdio2.h: + +/usr/include/stdlib.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/x86_64-linux-gnu/bits/floatn.h: + +/usr/include/x86_64-linux-gnu/bits/floatn-common.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/bits/uintn-identity.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h: + +/usr/include/x86_64-linux-gnu/bits/select2.h: + +/usr/include/alloca.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-float.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib.h: + +/usr/include/string.h: + +/usr/include/strings.h: + +/usr/include/x86_64-linux-gnu/bits/strings_fortified.h: + +/usr/include/x86_64-linux-gnu/bits/string_fortified.h: + +/usr/include/x86_64-linux-gnu/sys/stat.h: + +/usr/include/unistd.h: + +/usr/include/x86_64-linux-gnu/bits/posix_opt.h: + +/usr/include/x86_64-linux-gnu/bits/environments.h: + +/usr/include/x86_64-linux-gnu/bits/confname.h: + +/usr/include/x86_64-linux-gnu/bits/getopt_posix.h: + +/usr/include/x86_64-linux-gnu/bits/getopt_core.h: + +/usr/include/x86_64-linux-gnu/bits/unistd.h: + +/usr/include/x86_64-linux-gnu/bits/unistd_ext.h: + +src/gkhash.h: + +src/gslist.h: + +src/gstorage.h: + +src/commons.h: + +src/khash.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/limits.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/syslimits.h: + +/usr/include/limits.h: + +/usr/include/x86_64-linux-gnu/bits/posix1_lim.h: + +/usr/include/x86_64-linux-gnu/bits/local_lim.h: + +/usr/include/linux/limits.h: + +/usr/include/x86_64-linux-gnu/bits/posix2_lim.h: + +src/parser.h: + +src/geoip1.h: + +src/browsers.h: + +src/csv.h: + +src/settings.h: + +src/error.h: + +/usr/include/curses.h: + +/usr/include/ncurses_dll.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h: + +/usr/include/unctrl.h: + +/usr/include/curses.h: + +src/gdashboard.h: + +src/ui.h: + +src/labels.h: + +/usr/include/libintl.h: + +src/color.h: + +src/sort.h: + +src/gdns.h: + +src/gholder.h: + +src/goaccess.h: + +src/gwsocket.h: + +src/websocket.h: + +/usr/include/netinet/in.h: + +/usr/include/x86_64-linux-gnu/sys/socket.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_iovec.h: + +/usr/include/x86_64-linux-gnu/bits/socket.h: + +/usr/include/x86_64-linux-gnu/bits/socket_type.h: + +/usr/include/x86_64-linux-gnu/bits/sockaddr.h: + +/usr/include/x86_64-linux-gnu/asm/socket.h: + +/usr/include/asm-generic/socket.h: + +/usr/include/linux/posix_types.h: + +/usr/include/linux/stddef.h: + +/usr/include/x86_64-linux-gnu/asm/posix_types.h: + +/usr/include/x86_64-linux-gnu/asm/posix_types_64.h: + +/usr/include/asm-generic/posix_types.h: + +/usr/include/x86_64-linux-gnu/asm/bitsperlong.h: + +/usr/include/asm-generic/bitsperlong.h: + +/usr/include/x86_64-linux-gnu/asm/sockios.h: + +/usr/include/asm-generic/sockios.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_osockaddr.h: + +/usr/include/x86_64-linux-gnu/bits/socket2.h: + +/usr/include/x86_64-linux-gnu/bits/in.h: + +src/json.h: + +src/options.h: + +src/output.h: + +src/util.h: + +src/xmalloc.h: diff --git a/goaccess++/src/.deps/gslist.Po b/goaccess++/src/.deps/gslist.Po new file mode 100644 index 0000000..3e7e4bb --- /dev/null +++ b/goaccess++/src/.deps/gslist.Po @@ -0,0 +1,191 @@ +src/gslist.o: src/gslist.c /usr/include/stdc-predef.h \ + /usr/include/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/timesize.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/time64.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/stdio2.h /usr/include/stdlib.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ + /usr/include/x86_64-linux-gnu/bits/floatn.h \ + /usr/include/x86_64-linux-gnu/bits/floatn-common.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/timer_t.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endianness.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/bits/uintn-identity.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \ + /usr/include/x86_64-linux-gnu/bits/select2.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ + /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \ + /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \ + /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib.h /usr/include/string.h \ + /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /usr/include/x86_64-linux-gnu/bits/strings_fortified.h \ + /usr/include/x86_64-linux-gnu/bits/string_fortified.h \ + /usr/include/ctype.h src/gslist.h src/xmalloc.h + +/usr/include/stdc-predef.h: + +/usr/include/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/libc-header-start.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/bits/long-double.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/timesize.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/x86_64-linux-gnu/bits/time64.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/stdio2.h: + +/usr/include/stdlib.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/x86_64-linux-gnu/bits/floatn.h: + +/usr/include/x86_64-linux-gnu/bits/floatn-common.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types/clock_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/time_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/timer_t.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-intn.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endianness.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/bits/uintn-identity.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h: + +/usr/include/x86_64-linux-gnu/bits/select2.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h: + +/usr/include/x86_64-linux-gnu/bits/struct_mutex.h: + +/usr/include/x86_64-linux-gnu/bits/struct_rwlock.h: + +/usr/include/alloca.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-float.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib.h: + +/usr/include/string.h: + +/usr/include/x86_64-linux-gnu/bits/types/locale_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h: + +/usr/include/strings.h: + +/usr/include/x86_64-linux-gnu/bits/strings_fortified.h: + +/usr/include/x86_64-linux-gnu/bits/string_fortified.h: + +/usr/include/ctype.h: + +src/gslist.h: + +src/xmalloc.h: diff --git a/goaccess++/src/.deps/gstorage.Po b/goaccess++/src/.deps/gstorage.Po new file mode 100644 index 0000000..fc5ad28 --- /dev/null +++ b/goaccess++/src/.deps/gstorage.Po @@ -0,0 +1,260 @@ +src/gstorage.o: src/gstorage.c /usr/include/stdc-predef.h \ + /usr/include/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/timesize.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/time64.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/stdio2.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h /usr/include/stdint.h \ + /usr/include/x86_64-linux-gnu/bits/wchar.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-intn.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h /usr/include/stdlib.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ + /usr/include/x86_64-linux-gnu/bits/floatn.h \ + /usr/include/x86_64-linux-gnu/bits/floatn-common.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/timer_t.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endianness.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/bits/uintn-identity.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \ + /usr/include/x86_64-linux-gnu/bits/select2.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ + /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \ + /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \ + /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib.h /usr/include/string.h \ + /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /usr/include/x86_64-linux-gnu/bits/strings_fortified.h \ + /usr/include/x86_64-linux-gnu/bits/string_fortified.h src/gkhash.h \ + src/gslist.h src/gstorage.h src/commons.h src/config.h \ + /usr/include/time.h /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_tm.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h src/khash.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/limits.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/syslimits.h \ + /usr/include/limits.h /usr/include/x86_64-linux-gnu/bits/posix1_lim.h \ + /usr/include/x86_64-linux-gnu/bits/local_lim.h \ + /usr/include/linux/limits.h \ + /usr/include/x86_64-linux-gnu/bits/posix2_lim.h src/parser.h src/error.h \ + /usr/include/curses.h /usr/include/ncurses_dll.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h /usr/include/unctrl.h \ + /usr/include/curses.h src/settings.h src/xmalloc.h + +/usr/include/stdc-predef.h: + +/usr/include/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/libc-header-start.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/bits/long-double.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/timesize.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/x86_64-linux-gnu/bits/time64.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/stdio2.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h: + +/usr/include/stdint.h: + +/usr/include/x86_64-linux-gnu/bits/wchar.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-intn.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h: + +/usr/include/stdlib.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/x86_64-linux-gnu/bits/floatn.h: + +/usr/include/x86_64-linux-gnu/bits/floatn-common.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types/clock_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/time_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/timer_t.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endianness.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/bits/uintn-identity.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h: + +/usr/include/x86_64-linux-gnu/bits/select2.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h: + +/usr/include/x86_64-linux-gnu/bits/struct_mutex.h: + +/usr/include/x86_64-linux-gnu/bits/struct_rwlock.h: + +/usr/include/alloca.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-float.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib.h: + +/usr/include/string.h: + +/usr/include/x86_64-linux-gnu/bits/types/locale_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h: + +/usr/include/strings.h: + +/usr/include/x86_64-linux-gnu/bits/strings_fortified.h: + +/usr/include/x86_64-linux-gnu/bits/string_fortified.h: + +src/gkhash.h: + +src/gslist.h: + +src/gstorage.h: + +src/commons.h: + +src/config.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h: + +src/khash.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/limits.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/syslimits.h: + +/usr/include/limits.h: + +/usr/include/x86_64-linux-gnu/bits/posix1_lim.h: + +/usr/include/x86_64-linux-gnu/bits/local_lim.h: + +/usr/include/linux/limits.h: + +/usr/include/x86_64-linux-gnu/bits/posix2_lim.h: + +src/parser.h: + +src/error.h: + +/usr/include/curses.h: + +/usr/include/ncurses_dll.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h: + +/usr/include/unctrl.h: + +/usr/include/curses.h: + +src/settings.h: + +src/xmalloc.h: diff --git a/goaccess++/src/.deps/gwsocket.Po b/goaccess++/src/.deps/gwsocket.Po new file mode 100644 index 0000000..50e1d7f --- /dev/null +++ b/goaccess++/src/.deps/gwsocket.Po @@ -0,0 +1,469 @@ +src/gwsocket.o: src/gwsocket.c /usr/include/stdc-predef.h \ + /usr/include/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/timesize.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/time64.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/stdio2.h /usr/include/signal.h \ + /usr/include/x86_64-linux-gnu/bits/signum.h \ + /usr/include/x86_64-linux-gnu/bits/signum-generic.h \ + /usr/include/x86_64-linux-gnu/bits/types/sig_atomic_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endianness.h \ + /usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__sigval_t.h \ + /usr/include/x86_64-linux-gnu/bits/siginfo-arch.h \ + /usr/include/x86_64-linux-gnu/bits/siginfo-consts.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigval_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigevent_t.h \ + /usr/include/x86_64-linux-gnu/bits/sigevent-consts.h \ + /usr/include/x86_64-linux-gnu/bits/sigaction.h \ + /usr/include/x86_64-linux-gnu/bits/sigcontext.h \ + /usr/include/x86_64-linux-gnu/bits/types/stack_t.h \ + /usr/include/x86_64-linux-gnu/sys/ucontext.h \ + /usr/include/x86_64-linux-gnu/bits/sigstack.h \ + /usr/include/x86_64-linux-gnu/bits/ss_flags.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_sigstack.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ + /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \ + /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \ + /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h \ + /usr/include/x86_64-linux-gnu/bits/sigthread.h \ + /usr/include/x86_64-linux-gnu/bits/signal_ext.h /usr/include/stdlib.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ + /usr/include/x86_64-linux-gnu/bits/floatn.h \ + /usr/include/x86_64-linux-gnu/bits/floatn-common.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/timer_t.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/bits/uintn-identity.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \ + /usr/include/x86_64-linux-gnu/bits/select2.h /usr/include/alloca.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib.h /usr/include/string.h \ + /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /usr/include/x86_64-linux-gnu/bits/strings_fortified.h \ + /usr/include/x86_64-linux-gnu/bits/string_fortified.h \ + /usr/include/errno.h /usr/include/x86_64-linux-gnu/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/x86_64-linux-gnu/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/fcntl.h /usr/include/x86_64-linux-gnu/bits/fcntl.h \ + /usr/include/x86_64-linux-gnu/bits/fcntl-linux.h \ + /usr/include/x86_64-linux-gnu/bits/stat.h \ + /usr/include/x86_64-linux-gnu/bits/fcntl2.h \ + /usr/include/x86_64-linux-gnu/sys/stat.h /usr/include/unistd.h \ + /usr/include/x86_64-linux-gnu/bits/posix_opt.h \ + /usr/include/x86_64-linux-gnu/bits/environments.h \ + /usr/include/x86_64-linux-gnu/bits/confname.h \ + /usr/include/x86_64-linux-gnu/bits/getopt_posix.h \ + /usr/include/x86_64-linux-gnu/bits/getopt_core.h \ + /usr/include/x86_64-linux-gnu/bits/unistd.h \ + /usr/include/x86_64-linux-gnu/bits/unistd_ext.h src/gwsocket.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/x86_64-linux-gnu/bits/sched.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h \ + /usr/include/x86_64-linux-gnu/bits/cpu-set.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_tm.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h \ + /usr/include/x86_64-linux-gnu/bits/setjmp.h src/websocket.h \ + /usr/include/netinet/in.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h \ + /usr/include/x86_64-linux-gnu/sys/socket.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_iovec.h \ + /usr/include/x86_64-linux-gnu/bits/socket.h \ + /usr/include/x86_64-linux-gnu/bits/socket_type.h \ + /usr/include/x86_64-linux-gnu/bits/sockaddr.h \ + /usr/include/x86_64-linux-gnu/asm/socket.h \ + /usr/include/asm-generic/socket.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h \ + /usr/include/x86_64-linux-gnu/asm/posix_types.h \ + /usr/include/x86_64-linux-gnu/asm/posix_types_64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/x86_64-linux-gnu/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/x86_64-linux-gnu/asm/sockios.h \ + /usr/include/asm-generic/sockios.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_osockaddr.h \ + /usr/include/x86_64-linux-gnu/bits/socket2.h \ + /usr/include/x86_64-linux-gnu/bits/in.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/limits.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/syslimits.h \ + /usr/include/limits.h /usr/include/x86_64-linux-gnu/bits/posix1_lim.h \ + /usr/include/x86_64-linux-gnu/bits/local_lim.h \ + /usr/include/linux/limits.h \ + /usr/include/x86_64-linux-gnu/bits/posix2_lim.h src/gslist.h \ + src/commons.h src/config.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h /usr/include/stdint.h \ + /usr/include/x86_64-linux-gnu/bits/wchar.h src/error.h \ + /usr/include/curses.h /usr/include/ncurses_dll.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h /usr/include/unctrl.h \ + /usr/include/curses.h src/settings.h src/goaccess.h src/ui.h \ + src/labels.h /usr/include/libintl.h /usr/include/locale.h \ + /usr/include/x86_64-linux-gnu/bits/locale.h src/color.h src/sort.h \ + src/parser.h src/json.h src/xmalloc.h + +/usr/include/stdc-predef.h: + +/usr/include/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/libc-header-start.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/bits/long-double.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/timesize.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/x86_64-linux-gnu/bits/time64.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/stdio2.h: + +/usr/include/signal.h: + +/usr/include/x86_64-linux-gnu/bits/signum.h: + +/usr/include/x86_64-linux-gnu/bits/signum-generic.h: + +/usr/include/x86_64-linux-gnu/bits/types/sig_atomic_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endianness.h: + +/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__sigval_t.h: + +/usr/include/x86_64-linux-gnu/bits/siginfo-arch.h: + +/usr/include/x86_64-linux-gnu/bits/siginfo-consts.h: + +/usr/include/x86_64-linux-gnu/bits/types/sigval_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/sigevent_t.h: + +/usr/include/x86_64-linux-gnu/bits/sigevent-consts.h: + +/usr/include/x86_64-linux-gnu/bits/sigaction.h: + +/usr/include/x86_64-linux-gnu/bits/sigcontext.h: + +/usr/include/x86_64-linux-gnu/bits/types/stack_t.h: + +/usr/include/x86_64-linux-gnu/sys/ucontext.h: + +/usr/include/x86_64-linux-gnu/bits/sigstack.h: + +/usr/include/x86_64-linux-gnu/bits/ss_flags.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_sigstack.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h: + +/usr/include/x86_64-linux-gnu/bits/struct_mutex.h: + +/usr/include/x86_64-linux-gnu/bits/struct_rwlock.h: + +/usr/include/x86_64-linux-gnu/bits/sigthread.h: + +/usr/include/x86_64-linux-gnu/bits/signal_ext.h: + +/usr/include/stdlib.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/x86_64-linux-gnu/bits/floatn.h: + +/usr/include/x86_64-linux-gnu/bits/floatn-common.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types/clock_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/time_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/timer_t.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-intn.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/bits/uintn-identity.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h: + +/usr/include/x86_64-linux-gnu/bits/select2.h: + +/usr/include/alloca.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-float.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib.h: + +/usr/include/string.h: + +/usr/include/x86_64-linux-gnu/bits/types/locale_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h: + +/usr/include/strings.h: + +/usr/include/x86_64-linux-gnu/bits/strings_fortified.h: + +/usr/include/x86_64-linux-gnu/bits/string_fortified.h: + +/usr/include/errno.h: + +/usr/include/x86_64-linux-gnu/bits/errno.h: + +/usr/include/linux/errno.h: + +/usr/include/x86_64-linux-gnu/asm/errno.h: + +/usr/include/asm-generic/errno.h: + +/usr/include/asm-generic/errno-base.h: + +/usr/include/fcntl.h: + +/usr/include/x86_64-linux-gnu/bits/fcntl.h: + +/usr/include/x86_64-linux-gnu/bits/fcntl-linux.h: + +/usr/include/x86_64-linux-gnu/bits/stat.h: + +/usr/include/x86_64-linux-gnu/bits/fcntl2.h: + +/usr/include/x86_64-linux-gnu/sys/stat.h: + +/usr/include/unistd.h: + +/usr/include/x86_64-linux-gnu/bits/posix_opt.h: + +/usr/include/x86_64-linux-gnu/bits/environments.h: + +/usr/include/x86_64-linux-gnu/bits/confname.h: + +/usr/include/x86_64-linux-gnu/bits/getopt_posix.h: + +/usr/include/x86_64-linux-gnu/bits/getopt_core.h: + +/usr/include/x86_64-linux-gnu/bits/unistd.h: + +/usr/include/x86_64-linux-gnu/bits/unistd_ext.h: + +src/gwsocket.h: + +/usr/include/pthread.h: + +/usr/include/sched.h: + +/usr/include/x86_64-linux-gnu/bits/sched.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h: + +/usr/include/x86_64-linux-gnu/bits/cpu-set.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h: + +/usr/include/x86_64-linux-gnu/bits/setjmp.h: + +src/websocket.h: + +/usr/include/netinet/in.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h: + +/usr/include/x86_64-linux-gnu/sys/socket.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_iovec.h: + +/usr/include/x86_64-linux-gnu/bits/socket.h: + +/usr/include/x86_64-linux-gnu/bits/socket_type.h: + +/usr/include/x86_64-linux-gnu/bits/sockaddr.h: + +/usr/include/x86_64-linux-gnu/asm/socket.h: + +/usr/include/asm-generic/socket.h: + +/usr/include/linux/posix_types.h: + +/usr/include/linux/stddef.h: + +/usr/include/x86_64-linux-gnu/asm/posix_types.h: + +/usr/include/x86_64-linux-gnu/asm/posix_types_64.h: + +/usr/include/asm-generic/posix_types.h: + +/usr/include/x86_64-linux-gnu/asm/bitsperlong.h: + +/usr/include/asm-generic/bitsperlong.h: + +/usr/include/x86_64-linux-gnu/asm/sockios.h: + +/usr/include/asm-generic/sockios.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_osockaddr.h: + +/usr/include/x86_64-linux-gnu/bits/socket2.h: + +/usr/include/x86_64-linux-gnu/bits/in.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/limits.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/syslimits.h: + +/usr/include/limits.h: + +/usr/include/x86_64-linux-gnu/bits/posix1_lim.h: + +/usr/include/x86_64-linux-gnu/bits/local_lim.h: + +/usr/include/linux/limits.h: + +/usr/include/x86_64-linux-gnu/bits/posix2_lim.h: + +src/gslist.h: + +src/commons.h: + +src/config.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h: + +/usr/include/stdint.h: + +/usr/include/x86_64-linux-gnu/bits/wchar.h: + +src/error.h: + +/usr/include/curses.h: + +/usr/include/ncurses_dll.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h: + +/usr/include/unctrl.h: + +/usr/include/curses.h: + +src/settings.h: + +src/goaccess.h: + +src/ui.h: + +src/labels.h: + +/usr/include/libintl.h: + +/usr/include/locale.h: + +/usr/include/x86_64-linux-gnu/bits/locale.h: + +src/color.h: + +src/sort.h: + +src/parser.h: + +src/json.h: + +src/xmalloc.h: diff --git a/goaccess++/src/.deps/json.Po b/goaccess++/src/.deps/json.Po new file mode 100644 index 0000000..3a2c909 --- /dev/null +++ b/goaccess++/src/.deps/json.Po @@ -0,0 +1,406 @@ +src/json.o: src/json.c /usr/include/stdc-predef.h /usr/include/errno.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/x86_64-linux-gnu/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/ctype.h /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/timesize.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/time64.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endianness.h \ + /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h \ + /usr/include/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/stdio2.h /usr/include/stdlib.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ + /usr/include/x86_64-linux-gnu/bits/floatn.h \ + /usr/include/x86_64-linux-gnu/bits/floatn-common.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/timer_t.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/bits/uintn-identity.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \ + /usr/include/x86_64-linux-gnu/bits/select2.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ + /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \ + /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \ + /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib.h /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/x86_64-linux-gnu/bits/strings_fortified.h \ + /usr/include/x86_64-linux-gnu/bits/string_fortified.h \ + /usr/include/x86_64-linux-gnu/sys/stat.h \ + /usr/include/x86_64-linux-gnu/bits/stat.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_tm.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h \ + /usr/include/unistd.h /usr/include/x86_64-linux-gnu/bits/posix_opt.h \ + /usr/include/x86_64-linux-gnu/bits/environments.h \ + /usr/include/x86_64-linux-gnu/bits/confname.h \ + /usr/include/x86_64-linux-gnu/bits/getopt_posix.h \ + /usr/include/x86_64-linux-gnu/bits/getopt_core.h \ + /usr/include/x86_64-linux-gnu/bits/unistd.h \ + /usr/include/x86_64-linux-gnu/bits/unistd_ext.h /usr/include/inttypes.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h /usr/include/stdint.h \ + /usr/include/x86_64-linux-gnu/bits/wchar.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h src/json.h \ + src/config.h src/parser.h src/commons.h src/gkhash.h src/gslist.h \ + src/gstorage.h src/khash.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/limits.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/syslimits.h \ + /usr/include/limits.h /usr/include/x86_64-linux-gnu/bits/posix1_lim.h \ + /usr/include/x86_64-linux-gnu/bits/local_lim.h \ + /usr/include/linux/limits.h \ + /usr/include/x86_64-linux-gnu/bits/posix2_lim.h src/error.h \ + /usr/include/curses.h /usr/include/ncurses_dll.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h /usr/include/unctrl.h \ + /usr/include/curses.h src/settings.h src/ui.h /usr/include/pthread.h \ + /usr/include/sched.h /usr/include/x86_64-linux-gnu/bits/sched.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h \ + /usr/include/x86_64-linux-gnu/bits/cpu-set.h \ + /usr/include/x86_64-linux-gnu/bits/setjmp.h src/labels.h \ + /usr/include/libintl.h /usr/include/locale.h \ + /usr/include/x86_64-linux-gnu/bits/locale.h src/color.h src/sort.h \ + src/util.h src/websocket.h /usr/include/netinet/in.h \ + /usr/include/x86_64-linux-gnu/sys/socket.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_iovec.h \ + /usr/include/x86_64-linux-gnu/bits/socket.h \ + /usr/include/x86_64-linux-gnu/bits/socket_type.h \ + /usr/include/x86_64-linux-gnu/bits/sockaddr.h \ + /usr/include/x86_64-linux-gnu/asm/socket.h \ + /usr/include/asm-generic/socket.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h \ + /usr/include/x86_64-linux-gnu/asm/posix_types.h \ + /usr/include/x86_64-linux-gnu/asm/posix_types_64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/x86_64-linux-gnu/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/x86_64-linux-gnu/asm/sockios.h \ + /usr/include/asm-generic/sockios.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_osockaddr.h \ + /usr/include/x86_64-linux-gnu/bits/socket2.h \ + /usr/include/x86_64-linux-gnu/bits/in.h src/xmalloc.h + +/usr/include/stdc-predef.h: + +/usr/include/errno.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/bits/long-double.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/errno.h: + +/usr/include/linux/errno.h: + +/usr/include/x86_64-linux-gnu/asm/errno.h: + +/usr/include/asm-generic/errno.h: + +/usr/include/asm-generic/errno-base.h: + +/usr/include/ctype.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/timesize.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/x86_64-linux-gnu/bits/time64.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endianness.h: + +/usr/include/x86_64-linux-gnu/bits/types/locale_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h: + +/usr/include/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/libc-header-start.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/stdio2.h: + +/usr/include/stdlib.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/x86_64-linux-gnu/bits/floatn.h: + +/usr/include/x86_64-linux-gnu/bits/floatn-common.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types/clock_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/time_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/timer_t.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-intn.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/bits/uintn-identity.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h: + +/usr/include/x86_64-linux-gnu/bits/select2.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h: + +/usr/include/x86_64-linux-gnu/bits/struct_mutex.h: + +/usr/include/x86_64-linux-gnu/bits/struct_rwlock.h: + +/usr/include/alloca.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-float.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib.h: + +/usr/include/string.h: + +/usr/include/strings.h: + +/usr/include/x86_64-linux-gnu/bits/strings_fortified.h: + +/usr/include/x86_64-linux-gnu/bits/string_fortified.h: + +/usr/include/x86_64-linux-gnu/sys/stat.h: + +/usr/include/x86_64-linux-gnu/bits/stat.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h: + +/usr/include/unistd.h: + +/usr/include/x86_64-linux-gnu/bits/posix_opt.h: + +/usr/include/x86_64-linux-gnu/bits/environments.h: + +/usr/include/x86_64-linux-gnu/bits/confname.h: + +/usr/include/x86_64-linux-gnu/bits/getopt_posix.h: + +/usr/include/x86_64-linux-gnu/bits/getopt_core.h: + +/usr/include/x86_64-linux-gnu/bits/unistd.h: + +/usr/include/x86_64-linux-gnu/bits/unistd_ext.h: + +/usr/include/inttypes.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h: + +/usr/include/stdint.h: + +/usr/include/x86_64-linux-gnu/bits/wchar.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h: + +src/json.h: + +src/config.h: + +src/parser.h: + +src/commons.h: + +src/gkhash.h: + +src/gslist.h: + +src/gstorage.h: + +src/khash.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/limits.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/syslimits.h: + +/usr/include/limits.h: + +/usr/include/x86_64-linux-gnu/bits/posix1_lim.h: + +/usr/include/x86_64-linux-gnu/bits/local_lim.h: + +/usr/include/linux/limits.h: + +/usr/include/x86_64-linux-gnu/bits/posix2_lim.h: + +src/error.h: + +/usr/include/curses.h: + +/usr/include/ncurses_dll.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h: + +/usr/include/unctrl.h: + +/usr/include/curses.h: + +src/settings.h: + +src/ui.h: + +/usr/include/pthread.h: + +/usr/include/sched.h: + +/usr/include/x86_64-linux-gnu/bits/sched.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h: + +/usr/include/x86_64-linux-gnu/bits/cpu-set.h: + +/usr/include/x86_64-linux-gnu/bits/setjmp.h: + +src/labels.h: + +/usr/include/libintl.h: + +/usr/include/locale.h: + +/usr/include/x86_64-linux-gnu/bits/locale.h: + +src/color.h: + +src/sort.h: + +src/util.h: + +src/websocket.h: + +/usr/include/netinet/in.h: + +/usr/include/x86_64-linux-gnu/sys/socket.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_iovec.h: + +/usr/include/x86_64-linux-gnu/bits/socket.h: + +/usr/include/x86_64-linux-gnu/bits/socket_type.h: + +/usr/include/x86_64-linux-gnu/bits/sockaddr.h: + +/usr/include/x86_64-linux-gnu/asm/socket.h: + +/usr/include/asm-generic/socket.h: + +/usr/include/linux/posix_types.h: + +/usr/include/linux/stddef.h: + +/usr/include/x86_64-linux-gnu/asm/posix_types.h: + +/usr/include/x86_64-linux-gnu/asm/posix_types_64.h: + +/usr/include/asm-generic/posix_types.h: + +/usr/include/x86_64-linux-gnu/asm/bitsperlong.h: + +/usr/include/asm-generic/bitsperlong.h: + +/usr/include/x86_64-linux-gnu/asm/sockios.h: + +/usr/include/asm-generic/sockios.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_osockaddr.h: + +/usr/include/x86_64-linux-gnu/bits/socket2.h: + +/usr/include/x86_64-linux-gnu/bits/in.h: + +src/xmalloc.h: diff --git a/goaccess++/src/.deps/opesys.Po b/goaccess++/src/.deps/opesys.Po new file mode 100644 index 0000000..726c11a --- /dev/null +++ b/goaccess++/src/.deps/opesys.Po @@ -0,0 +1,238 @@ +src/opesys.o: src/opesys.c /usr/include/stdc-predef.h \ + /usr/include/ctype.h /usr/include/features.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/timesize.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/time64.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endianness.h \ + /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h \ + /usr/include/errno.h /usr/include/x86_64-linux-gnu/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/x86_64-linux-gnu/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/stdio2.h /usr/include/stdlib.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ + /usr/include/x86_64-linux-gnu/bits/floatn.h \ + /usr/include/x86_64-linux-gnu/bits/floatn-common.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/timer_t.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/bits/uintn-identity.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \ + /usr/include/x86_64-linux-gnu/bits/select2.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ + /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \ + /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \ + /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib.h /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/x86_64-linux-gnu/bits/strings_fortified.h \ + /usr/include/x86_64-linux-gnu/bits/string_fortified.h src/opesys.h \ + src/settings.h /usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h \ + /usr/include/stdint.h /usr/include/x86_64-linux-gnu/bits/wchar.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h src/commons.h \ + src/config.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_tm.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h src/util.h \ + src/xmalloc.h + +/usr/include/stdc-predef.h: + +/usr/include/ctype.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/bits/long-double.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/timesize.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/x86_64-linux-gnu/bits/time64.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endianness.h: + +/usr/include/x86_64-linux-gnu/bits/types/locale_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h: + +/usr/include/errno.h: + +/usr/include/x86_64-linux-gnu/bits/errno.h: + +/usr/include/linux/errno.h: + +/usr/include/x86_64-linux-gnu/asm/errno.h: + +/usr/include/asm-generic/errno.h: + +/usr/include/asm-generic/errno-base.h: + +/usr/include/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/libc-header-start.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/stdio2.h: + +/usr/include/stdlib.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/x86_64-linux-gnu/bits/floatn.h: + +/usr/include/x86_64-linux-gnu/bits/floatn-common.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types/clock_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/time_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/timer_t.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-intn.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/bits/uintn-identity.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h: + +/usr/include/x86_64-linux-gnu/bits/select2.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h: + +/usr/include/x86_64-linux-gnu/bits/struct_mutex.h: + +/usr/include/x86_64-linux-gnu/bits/struct_rwlock.h: + +/usr/include/alloca.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-float.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib.h: + +/usr/include/string.h: + +/usr/include/strings.h: + +/usr/include/x86_64-linux-gnu/bits/strings_fortified.h: + +/usr/include/x86_64-linux-gnu/bits/string_fortified.h: + +src/opesys.h: + +src/settings.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h: + +/usr/include/stdint.h: + +/usr/include/x86_64-linux-gnu/bits/wchar.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h: + +src/commons.h: + +src/config.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h: + +src/util.h: + +src/xmalloc.h: diff --git a/goaccess++/src/.deps/options.Po b/goaccess++/src/.deps/options.Po new file mode 100644 index 0000000..bda2d63 --- /dev/null +++ b/goaccess++/src/.deps/options.Po @@ -0,0 +1,336 @@ +src/options.o: src/options.c /usr/include/stdc-predef.h src/config.h \ + /usr/include/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/timesize.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/time64.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/stdio2.h /usr/include/stdlib.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ + /usr/include/x86_64-linux-gnu/bits/floatn.h \ + /usr/include/x86_64-linux-gnu/bits/floatn-common.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/timer_t.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endianness.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/bits/uintn-identity.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \ + /usr/include/x86_64-linux-gnu/bits/select2.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ + /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \ + /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \ + /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib.h /usr/include/string.h \ + /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /usr/include/x86_64-linux-gnu/bits/strings_fortified.h \ + /usr/include/x86_64-linux-gnu/bits/string_fortified.h \ + /usr/include/getopt.h /usr/include/x86_64-linux-gnu/bits/getopt_core.h \ + /usr/include/x86_64-linux-gnu/bits/getopt_ext.h /usr/include/errno.h \ + /usr/include/x86_64-linux-gnu/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/x86_64-linux-gnu/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/GeoIP.h /usr/include/arpa/inet.h /usr/include/netinet/in.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h \ + /usr/include/x86_64-linux-gnu/sys/socket.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_iovec.h \ + /usr/include/x86_64-linux-gnu/bits/socket.h \ + /usr/include/x86_64-linux-gnu/bits/socket_type.h \ + /usr/include/x86_64-linux-gnu/bits/sockaddr.h \ + /usr/include/x86_64-linux-gnu/asm/socket.h \ + /usr/include/asm-generic/socket.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h \ + /usr/include/x86_64-linux-gnu/asm/posix_types.h \ + /usr/include/x86_64-linux-gnu/asm/posix_types_64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/x86_64-linux-gnu/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/x86_64-linux-gnu/asm/sockios.h \ + /usr/include/asm-generic/sockios.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_osockaddr.h \ + /usr/include/x86_64-linux-gnu/bits/socket2.h \ + /usr/include/x86_64-linux-gnu/bits/in.h \ + /usr/include/x86_64-linux-gnu/sys/stat.h \ + /usr/include/x86_64-linux-gnu/bits/stat.h src/options.h src/error.h \ + src/commons.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_tm.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h /usr/include/stdint.h \ + /usr/include/x86_64-linux-gnu/bits/wchar.h /usr/include/curses.h \ + /usr/include/ncurses_dll.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h /usr/include/unctrl.h \ + /usr/include/curses.h src/settings.h src/labels.h /usr/include/libintl.h \ + /usr/include/locale.h /usr/include/x86_64-linux-gnu/bits/locale.h \ + src/util.h src/xmalloc.h + +/usr/include/stdc-predef.h: + +src/config.h: + +/usr/include/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/libc-header-start.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/bits/long-double.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/timesize.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/x86_64-linux-gnu/bits/time64.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/stdio2.h: + +/usr/include/stdlib.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/x86_64-linux-gnu/bits/floatn.h: + +/usr/include/x86_64-linux-gnu/bits/floatn-common.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types/clock_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/time_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/timer_t.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-intn.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endianness.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/bits/uintn-identity.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h: + +/usr/include/x86_64-linux-gnu/bits/select2.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h: + +/usr/include/x86_64-linux-gnu/bits/struct_mutex.h: + +/usr/include/x86_64-linux-gnu/bits/struct_rwlock.h: + +/usr/include/alloca.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-float.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib.h: + +/usr/include/string.h: + +/usr/include/x86_64-linux-gnu/bits/types/locale_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h: + +/usr/include/strings.h: + +/usr/include/x86_64-linux-gnu/bits/strings_fortified.h: + +/usr/include/x86_64-linux-gnu/bits/string_fortified.h: + +/usr/include/getopt.h: + +/usr/include/x86_64-linux-gnu/bits/getopt_core.h: + +/usr/include/x86_64-linux-gnu/bits/getopt_ext.h: + +/usr/include/errno.h: + +/usr/include/x86_64-linux-gnu/bits/errno.h: + +/usr/include/linux/errno.h: + +/usr/include/x86_64-linux-gnu/asm/errno.h: + +/usr/include/asm-generic/errno.h: + +/usr/include/asm-generic/errno-base.h: + +/usr/include/GeoIP.h: + +/usr/include/arpa/inet.h: + +/usr/include/netinet/in.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h: + +/usr/include/x86_64-linux-gnu/sys/socket.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_iovec.h: + +/usr/include/x86_64-linux-gnu/bits/socket.h: + +/usr/include/x86_64-linux-gnu/bits/socket_type.h: + +/usr/include/x86_64-linux-gnu/bits/sockaddr.h: + +/usr/include/x86_64-linux-gnu/asm/socket.h: + +/usr/include/asm-generic/socket.h: + +/usr/include/linux/posix_types.h: + +/usr/include/linux/stddef.h: + +/usr/include/x86_64-linux-gnu/asm/posix_types.h: + +/usr/include/x86_64-linux-gnu/asm/posix_types_64.h: + +/usr/include/asm-generic/posix_types.h: + +/usr/include/x86_64-linux-gnu/asm/bitsperlong.h: + +/usr/include/asm-generic/bitsperlong.h: + +/usr/include/x86_64-linux-gnu/asm/sockios.h: + +/usr/include/asm-generic/sockios.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_osockaddr.h: + +/usr/include/x86_64-linux-gnu/bits/socket2.h: + +/usr/include/x86_64-linux-gnu/bits/in.h: + +/usr/include/x86_64-linux-gnu/sys/stat.h: + +/usr/include/x86_64-linux-gnu/bits/stat.h: + +src/options.h: + +src/error.h: + +src/commons.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h: + +/usr/include/stdint.h: + +/usr/include/x86_64-linux-gnu/bits/wchar.h: + +/usr/include/curses.h: + +/usr/include/ncurses_dll.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h: + +/usr/include/unctrl.h: + +/usr/include/curses.h: + +src/settings.h: + +src/labels.h: + +/usr/include/libintl.h: + +/usr/include/locale.h: + +/usr/include/x86_64-linux-gnu/bits/locale.h: + +src/util.h: + +src/xmalloc.h: diff --git a/goaccess++/src/.deps/output.Po b/goaccess++/src/.deps/output.Po new file mode 100644 index 0000000..84dea80 --- /dev/null +++ b/goaccess++/src/.deps/output.Po @@ -0,0 +1,398 @@ +src/output.o: src/output.c /usr/include/stdc-predef.h \ + /usr/include/errno.h /usr/include/features.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/x86_64-linux-gnu/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/ctype.h /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/timesize.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/time64.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endianness.h \ + /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h \ + /usr/include/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/stdio2.h /usr/include/stdlib.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ + /usr/include/x86_64-linux-gnu/bits/floatn.h \ + /usr/include/x86_64-linux-gnu/bits/floatn-common.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/timer_t.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/bits/uintn-identity.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \ + /usr/include/x86_64-linux-gnu/bits/select2.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ + /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \ + /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \ + /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib.h /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/x86_64-linux-gnu/bits/strings_fortified.h \ + /usr/include/x86_64-linux-gnu/bits/string_fortified.h src/output.h \ + src/config.h src/commons.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_tm.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h /usr/include/stdint.h \ + /usr/include/x86_64-linux-gnu/bits/wchar.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h src/parser.h \ + src/gkhash.h src/gslist.h src/gstorage.h src/khash.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/limits.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/syslimits.h \ + /usr/include/limits.h /usr/include/x86_64-linux-gnu/bits/posix1_lim.h \ + /usr/include/x86_64-linux-gnu/bits/local_lim.h \ + /usr/include/linux/limits.h \ + /usr/include/x86_64-linux-gnu/bits/posix2_lim.h src/error.h \ + /usr/include/curses.h /usr/include/ncurses_dll.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h /usr/include/unctrl.h \ + /usr/include/curses.h src/settings.h src/gwsocket.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/x86_64-linux-gnu/bits/sched.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h \ + /usr/include/x86_64-linux-gnu/bits/cpu-set.h \ + /usr/include/x86_64-linux-gnu/bits/setjmp.h src/websocket.h \ + /usr/include/netinet/in.h /usr/include/x86_64-linux-gnu/sys/socket.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_iovec.h \ + /usr/include/x86_64-linux-gnu/bits/socket.h \ + /usr/include/x86_64-linux-gnu/bits/socket_type.h \ + /usr/include/x86_64-linux-gnu/bits/sockaddr.h \ + /usr/include/x86_64-linux-gnu/asm/socket.h \ + /usr/include/asm-generic/socket.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h \ + /usr/include/x86_64-linux-gnu/asm/posix_types.h \ + /usr/include/x86_64-linux-gnu/asm/posix_types_64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/x86_64-linux-gnu/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/x86_64-linux-gnu/asm/sockios.h \ + /usr/include/asm-generic/sockios.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_osockaddr.h \ + /usr/include/x86_64-linux-gnu/bits/socket2.h \ + /usr/include/x86_64-linux-gnu/bits/in.h src/json.h src/ui.h src/labels.h \ + /usr/include/libintl.h /usr/include/locale.h \ + /usr/include/x86_64-linux-gnu/bits/locale.h src/color.h src/sort.h \ + src/util.h src/xmalloc.h src/tpls.h src/bootstrapcss.h src/facss.h \ + src/appcss.h src/d3js.h src/hoganjs.h src/chartsjs.h src/appjs.h + +/usr/include/stdc-predef.h: + +/usr/include/errno.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/bits/long-double.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/errno.h: + +/usr/include/linux/errno.h: + +/usr/include/x86_64-linux-gnu/asm/errno.h: + +/usr/include/asm-generic/errno.h: + +/usr/include/asm-generic/errno-base.h: + +/usr/include/ctype.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/timesize.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/x86_64-linux-gnu/bits/time64.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endianness.h: + +/usr/include/x86_64-linux-gnu/bits/types/locale_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h: + +/usr/include/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/libc-header-start.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/stdio2.h: + +/usr/include/stdlib.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/x86_64-linux-gnu/bits/floatn.h: + +/usr/include/x86_64-linux-gnu/bits/floatn-common.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types/clock_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/time_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/timer_t.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-intn.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/bits/uintn-identity.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h: + +/usr/include/x86_64-linux-gnu/bits/select2.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h: + +/usr/include/x86_64-linux-gnu/bits/struct_mutex.h: + +/usr/include/x86_64-linux-gnu/bits/struct_rwlock.h: + +/usr/include/alloca.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-float.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib.h: + +/usr/include/string.h: + +/usr/include/strings.h: + +/usr/include/x86_64-linux-gnu/bits/strings_fortified.h: + +/usr/include/x86_64-linux-gnu/bits/string_fortified.h: + +src/output.h: + +src/config.h: + +src/commons.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h: + +/usr/include/stdint.h: + +/usr/include/x86_64-linux-gnu/bits/wchar.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h: + +src/parser.h: + +src/gkhash.h: + +src/gslist.h: + +src/gstorage.h: + +src/khash.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/limits.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/syslimits.h: + +/usr/include/limits.h: + +/usr/include/x86_64-linux-gnu/bits/posix1_lim.h: + +/usr/include/x86_64-linux-gnu/bits/local_lim.h: + +/usr/include/linux/limits.h: + +/usr/include/x86_64-linux-gnu/bits/posix2_lim.h: + +src/error.h: + +/usr/include/curses.h: + +/usr/include/ncurses_dll.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h: + +/usr/include/unctrl.h: + +/usr/include/curses.h: + +src/settings.h: + +src/gwsocket.h: + +/usr/include/pthread.h: + +/usr/include/sched.h: + +/usr/include/x86_64-linux-gnu/bits/sched.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h: + +/usr/include/x86_64-linux-gnu/bits/cpu-set.h: + +/usr/include/x86_64-linux-gnu/bits/setjmp.h: + +src/websocket.h: + +/usr/include/netinet/in.h: + +/usr/include/x86_64-linux-gnu/sys/socket.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_iovec.h: + +/usr/include/x86_64-linux-gnu/bits/socket.h: + +/usr/include/x86_64-linux-gnu/bits/socket_type.h: + +/usr/include/x86_64-linux-gnu/bits/sockaddr.h: + +/usr/include/x86_64-linux-gnu/asm/socket.h: + +/usr/include/asm-generic/socket.h: + +/usr/include/linux/posix_types.h: + +/usr/include/linux/stddef.h: + +/usr/include/x86_64-linux-gnu/asm/posix_types.h: + +/usr/include/x86_64-linux-gnu/asm/posix_types_64.h: + +/usr/include/asm-generic/posix_types.h: + +/usr/include/x86_64-linux-gnu/asm/bitsperlong.h: + +/usr/include/asm-generic/bitsperlong.h: + +/usr/include/x86_64-linux-gnu/asm/sockios.h: + +/usr/include/asm-generic/sockios.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_osockaddr.h: + +/usr/include/x86_64-linux-gnu/bits/socket2.h: + +/usr/include/x86_64-linux-gnu/bits/in.h: + +src/json.h: + +src/ui.h: + +src/labels.h: + +/usr/include/libintl.h: + +/usr/include/locale.h: + +/usr/include/x86_64-linux-gnu/bits/locale.h: + +src/color.h: + +src/sort.h: + +src/util.h: + +src/xmalloc.h: + +src/tpls.h: + +src/bootstrapcss.h: + +src/facss.h: + +src/appcss.h: + +src/d3js.h: + +src/hoganjs.h: + +src/chartsjs.h: + +src/appjs.h: diff --git a/goaccess++/src/.deps/parser.Po b/goaccess++/src/.deps/parser.Po new file mode 100644 index 0000000..fddf0f5 --- /dev/null +++ b/goaccess++/src/.deps/parser.Po @@ -0,0 +1,375 @@ +src/parser.o: src/parser.c /usr/include/stdc-predef.h \ + /usr/include/ctype.h /usr/include/features.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/timesize.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/time64.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endianness.h \ + /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h \ + /usr/include/errno.h /usr/include/x86_64-linux-gnu/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/x86_64-linux-gnu/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + src/config.h /usr/include/arpa/inet.h /usr/include/netinet/in.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h \ + /usr/include/x86_64-linux-gnu/sys/socket.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_iovec.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h \ + /usr/include/x86_64-linux-gnu/bits/socket.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/timer_t.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-intn.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ + /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \ + /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \ + /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h \ + /usr/include/x86_64-linux-gnu/bits/socket_type.h \ + /usr/include/x86_64-linux-gnu/bits/sockaddr.h \ + /usr/include/x86_64-linux-gnu/bits/socket-constants.h \ + /usr/include/x86_64-linux-gnu/bits/socket2.h \ + /usr/include/x86_64-linux-gnu/bits/in.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/bits/uintn-identity.h /usr/include/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/stdio2.h /usr/include/stdlib.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ + /usr/include/x86_64-linux-gnu/bits/floatn.h \ + /usr/include/x86_64-linux-gnu/bits/floatn-common.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib.h /usr/include/string.h \ + /usr/include/x86_64-linux-gnu/bits/string_fortified.h \ + /usr/include/strings.h /usr/include/x86_64-linux-gnu/sys/stat.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \ + /usr/include/x86_64-linux-gnu/bits/stat.h /usr/include/unistd.h \ + /usr/include/x86_64-linux-gnu/bits/posix_opt.h \ + /usr/include/x86_64-linux-gnu/bits/environments.h \ + /usr/include/x86_64-linux-gnu/bits/confname.h \ + /usr/include/x86_64-linux-gnu/bits/getopt_posix.h \ + /usr/include/x86_64-linux-gnu/bits/getopt_core.h \ + /usr/include/x86_64-linux-gnu/bits/unistd.h \ + /usr/include/x86_64-linux-gnu/bits/unistd_ext.h src/gkhash.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h /usr/include/stdint.h \ + /usr/include/x86_64-linux-gnu/bits/wchar.h src/gslist.h src/gstorage.h \ + src/commons.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_tm.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h src/khash.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/limits.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/syslimits.h \ + /usr/include/limits.h /usr/include/x86_64-linux-gnu/bits/posix1_lim.h \ + /usr/include/x86_64-linux-gnu/bits/local_lim.h \ + /usr/include/linux/limits.h \ + /usr/include/x86_64-linux-gnu/bits/posix2_lim.h \ + /usr/include/x86_64-linux-gnu/bits/xopen_lim.h \ + /usr/include/x86_64-linux-gnu/bits/uio_lim.h src/parser.h src/geoip1.h \ + src/browsers.h src/goaccess.h src/ui.h /usr/include/curses.h \ + /usr/include/ncurses_dll.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h /usr/include/wchar.h \ + /usr/include/x86_64-linux-gnu/bits/types/wint_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/wctype-wchar.h \ + /usr/include/x86_64-linux-gnu/bits/wchar2.h /usr/include/unctrl.h \ + /usr/include/curses.h /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/x86_64-linux-gnu/bits/sched.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h \ + /usr/include/x86_64-linux-gnu/bits/cpu-set.h \ + /usr/include/x86_64-linux-gnu/bits/setjmp.h src/labels.h \ + /usr/include/libintl.h /usr/include/locale.h \ + /usr/include/x86_64-linux-gnu/bits/locale.h src/color.h src/sort.h \ + src/error.h src/settings.h src/opesys.h src/util.h src/xmalloc.h + +/usr/include/stdc-predef.h: + +/usr/include/ctype.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/bits/long-double.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/timesize.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/x86_64-linux-gnu/bits/time64.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endianness.h: + +/usr/include/x86_64-linux-gnu/bits/types/locale_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h: + +/usr/include/errno.h: + +/usr/include/x86_64-linux-gnu/bits/errno.h: + +/usr/include/linux/errno.h: + +/usr/include/x86_64-linux-gnu/asm/errno.h: + +/usr/include/asm-generic/errno.h: + +/usr/include/asm-generic/errno-base.h: + +src/config.h: + +/usr/include/arpa/inet.h: + +/usr/include/netinet/in.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h: + +/usr/include/x86_64-linux-gnu/sys/socket.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_iovec.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h: + +/usr/include/x86_64-linux-gnu/bits/socket.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types/clock_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/time_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/timer_t.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-intn.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h: + +/usr/include/x86_64-linux-gnu/bits/struct_mutex.h: + +/usr/include/x86_64-linux-gnu/bits/struct_rwlock.h: + +/usr/include/x86_64-linux-gnu/bits/socket_type.h: + +/usr/include/x86_64-linux-gnu/bits/sockaddr.h: + +/usr/include/x86_64-linux-gnu/bits/socket-constants.h: + +/usr/include/x86_64-linux-gnu/bits/socket2.h: + +/usr/include/x86_64-linux-gnu/bits/in.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/bits/uintn-identity.h: + +/usr/include/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/libc-header-start.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/stdio2.h: + +/usr/include/stdlib.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/x86_64-linux-gnu/bits/floatn.h: + +/usr/include/x86_64-linux-gnu/bits/floatn-common.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-float.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib.h: + +/usr/include/string.h: + +/usr/include/x86_64-linux-gnu/bits/string_fortified.h: + +/usr/include/strings.h: + +/usr/include/x86_64-linux-gnu/sys/stat.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h: + +/usr/include/x86_64-linux-gnu/bits/stat.h: + +/usr/include/unistd.h: + +/usr/include/x86_64-linux-gnu/bits/posix_opt.h: + +/usr/include/x86_64-linux-gnu/bits/environments.h: + +/usr/include/x86_64-linux-gnu/bits/confname.h: + +/usr/include/x86_64-linux-gnu/bits/getopt_posix.h: + +/usr/include/x86_64-linux-gnu/bits/getopt_core.h: + +/usr/include/x86_64-linux-gnu/bits/unistd.h: + +/usr/include/x86_64-linux-gnu/bits/unistd_ext.h: + +src/gkhash.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h: + +/usr/include/stdint.h: + +/usr/include/x86_64-linux-gnu/bits/wchar.h: + +src/gslist.h: + +src/gstorage.h: + +src/commons.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h: + +src/khash.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/limits.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/syslimits.h: + +/usr/include/limits.h: + +/usr/include/x86_64-linux-gnu/bits/posix1_lim.h: + +/usr/include/x86_64-linux-gnu/bits/local_lim.h: + +/usr/include/linux/limits.h: + +/usr/include/x86_64-linux-gnu/bits/posix2_lim.h: + +/usr/include/x86_64-linux-gnu/bits/xopen_lim.h: + +/usr/include/x86_64-linux-gnu/bits/uio_lim.h: + +src/parser.h: + +src/geoip1.h: + +src/browsers.h: + +src/goaccess.h: + +src/ui.h: + +/usr/include/curses.h: + +/usr/include/ncurses_dll.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h: + +/usr/include/wchar.h: + +/usr/include/x86_64-linux-gnu/bits/types/wint_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/mbstate_t.h: + +/usr/include/x86_64-linux-gnu/bits/wctype-wchar.h: + +/usr/include/x86_64-linux-gnu/bits/wchar2.h: + +/usr/include/unctrl.h: + +/usr/include/curses.h: + +/usr/include/pthread.h: + +/usr/include/sched.h: + +/usr/include/x86_64-linux-gnu/bits/sched.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h: + +/usr/include/x86_64-linux-gnu/bits/cpu-set.h: + +/usr/include/x86_64-linux-gnu/bits/setjmp.h: + +src/labels.h: + +/usr/include/libintl.h: + +/usr/include/locale.h: + +/usr/include/x86_64-linux-gnu/bits/locale.h: + +src/color.h: + +src/sort.h: + +src/error.h: + +src/settings.h: + +src/opesys.h: + +src/util.h: + +src/xmalloc.h: diff --git a/goaccess++/src/.deps/settings.Po b/goaccess++/src/.deps/settings.Po new file mode 100644 index 0000000..ab8fecd --- /dev/null +++ b/goaccess++/src/.deps/settings.Po @@ -0,0 +1,283 @@ +src/settings.o: src/settings.c /usr/include/stdc-predef.h \ + /usr/include/ctype.h /usr/include/features.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/timesize.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/time64.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endianness.h \ + /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h \ + /usr/include/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/stdio2.h /usr/include/stdlib.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ + /usr/include/x86_64-linux-gnu/bits/floatn.h \ + /usr/include/x86_64-linux-gnu/bits/floatn-common.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/timer_t.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/bits/uintn-identity.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \ + /usr/include/x86_64-linux-gnu/bits/select2.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ + /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \ + /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \ + /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib.h /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/x86_64-linux-gnu/bits/strings_fortified.h \ + /usr/include/x86_64-linux-gnu/bits/string_fortified.h \ + /usr/include/unistd.h /usr/include/x86_64-linux-gnu/bits/posix_opt.h \ + /usr/include/x86_64-linux-gnu/bits/environments.h \ + /usr/include/x86_64-linux-gnu/bits/confname.h \ + /usr/include/x86_64-linux-gnu/bits/getopt_posix.h \ + /usr/include/x86_64-linux-gnu/bits/getopt_core.h \ + /usr/include/x86_64-linux-gnu/bits/unistd.h \ + /usr/include/x86_64-linux-gnu/bits/unistd_ext.h /usr/include/errno.h \ + /usr/include/x86_64-linux-gnu/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/x86_64-linux-gnu/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + src/settings.h /usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h \ + /usr/include/stdint.h /usr/include/x86_64-linux-gnu/bits/wchar.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h src/commons.h \ + src/config.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_tm.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h src/error.h \ + /usr/include/curses.h /usr/include/ncurses_dll.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h /usr/include/unctrl.h \ + /usr/include/curses.h src/labels.h /usr/include/libintl.h \ + /usr/include/locale.h /usr/include/x86_64-linux-gnu/bits/locale.h \ + src/util.h src/xmalloc.h + +/usr/include/stdc-predef.h: + +/usr/include/ctype.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/bits/long-double.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/timesize.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/x86_64-linux-gnu/bits/time64.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endianness.h: + +/usr/include/x86_64-linux-gnu/bits/types/locale_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h: + +/usr/include/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/libc-header-start.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/stdio2.h: + +/usr/include/stdlib.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/x86_64-linux-gnu/bits/floatn.h: + +/usr/include/x86_64-linux-gnu/bits/floatn-common.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types/clock_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/time_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/timer_t.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-intn.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/bits/uintn-identity.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h: + +/usr/include/x86_64-linux-gnu/bits/select2.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h: + +/usr/include/x86_64-linux-gnu/bits/struct_mutex.h: + +/usr/include/x86_64-linux-gnu/bits/struct_rwlock.h: + +/usr/include/alloca.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-float.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib.h: + +/usr/include/string.h: + +/usr/include/strings.h: + +/usr/include/x86_64-linux-gnu/bits/strings_fortified.h: + +/usr/include/x86_64-linux-gnu/bits/string_fortified.h: + +/usr/include/unistd.h: + +/usr/include/x86_64-linux-gnu/bits/posix_opt.h: + +/usr/include/x86_64-linux-gnu/bits/environments.h: + +/usr/include/x86_64-linux-gnu/bits/confname.h: + +/usr/include/x86_64-linux-gnu/bits/getopt_posix.h: + +/usr/include/x86_64-linux-gnu/bits/getopt_core.h: + +/usr/include/x86_64-linux-gnu/bits/unistd.h: + +/usr/include/x86_64-linux-gnu/bits/unistd_ext.h: + +/usr/include/errno.h: + +/usr/include/x86_64-linux-gnu/bits/errno.h: + +/usr/include/linux/errno.h: + +/usr/include/x86_64-linux-gnu/asm/errno.h: + +/usr/include/asm-generic/errno.h: + +/usr/include/asm-generic/errno-base.h: + +src/settings.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h: + +/usr/include/stdint.h: + +/usr/include/x86_64-linux-gnu/bits/wchar.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h: + +src/commons.h: + +src/config.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h: + +src/error.h: + +/usr/include/curses.h: + +/usr/include/ncurses_dll.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h: + +/usr/include/unctrl.h: + +/usr/include/curses.h: + +src/labels.h: + +/usr/include/libintl.h: + +/usr/include/locale.h: + +/usr/include/x86_64-linux-gnu/bits/locale.h: + +src/util.h: + +src/xmalloc.h: diff --git a/goaccess++/src/.deps/sha1.Po b/goaccess++/src/.deps/sha1.Po new file mode 100644 index 0000000..e7756bb --- /dev/null +++ b/goaccess++/src/.deps/sha1.Po @@ -0,0 +1,171 @@ +src/sha1.o: src/sha1.c /usr/include/stdc-predef.h /usr/include/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/timesize.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/time64.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/stdio2.h /usr/include/string.h \ + /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /usr/include/x86_64-linux-gnu/bits/strings_fortified.h \ + /usr/include/x86_64-linux-gnu/bits/string_fortified.h src/sha1.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/timer_t.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endianness.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/bits/uintn-identity.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \ + /usr/include/x86_64-linux-gnu/bits/select2.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ + /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \ + /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \ + /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h /usr/include/stdint.h \ + /usr/include/x86_64-linux-gnu/bits/wchar.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h + +/usr/include/stdc-predef.h: + +/usr/include/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/libc-header-start.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/bits/long-double.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/timesize.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/x86_64-linux-gnu/bits/time64.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/stdio2.h: + +/usr/include/string.h: + +/usr/include/x86_64-linux-gnu/bits/types/locale_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h: + +/usr/include/strings.h: + +/usr/include/x86_64-linux-gnu/bits/strings_fortified.h: + +/usr/include/x86_64-linux-gnu/bits/string_fortified.h: + +src/sha1.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types/clock_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/time_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/timer_t.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-intn.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endianness.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/bits/uintn-identity.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h: + +/usr/include/x86_64-linux-gnu/bits/select2.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h: + +/usr/include/x86_64-linux-gnu/bits/struct_mutex.h: + +/usr/include/x86_64-linux-gnu/bits/struct_rwlock.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h: + +/usr/include/stdint.h: + +/usr/include/x86_64-linux-gnu/bits/wchar.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h: diff --git a/goaccess++/src/.deps/sort.Po b/goaccess++/src/.deps/sort.Po new file mode 100644 index 0000000..a93cd26 --- /dev/null +++ b/goaccess++/src/.deps/sort.Po @@ -0,0 +1,257 @@ +src/sort.o: src/sort.c /usr/include/stdc-predef.h src/config.h \ + /usr/include/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/timesize.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/time64.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/stdio2.h /usr/include/stdlib.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ + /usr/include/x86_64-linux-gnu/bits/floatn.h \ + /usr/include/x86_64-linux-gnu/bits/floatn-common.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/timer_t.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endianness.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/bits/uintn-identity.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \ + /usr/include/x86_64-linux-gnu/bits/select2.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ + /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \ + /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \ + /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib.h /usr/include/string.h \ + /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /usr/include/x86_64-linux-gnu/bits/strings_fortified.h \ + /usr/include/x86_64-linux-gnu/bits/string_fortified.h \ + /usr/include/getopt.h /usr/include/x86_64-linux-gnu/bits/getopt_core.h \ + /usr/include/x86_64-linux-gnu/bits/getopt_ext.h /usr/include/errno.h \ + /usr/include/x86_64-linux-gnu/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/x86_64-linux-gnu/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + src/error.h src/commons.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_tm.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h /usr/include/stdint.h \ + /usr/include/x86_64-linux-gnu/bits/wchar.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h /usr/include/curses.h \ + /usr/include/ncurses_dll.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h /usr/include/unctrl.h \ + /usr/include/curses.h src/settings.h src/util.h src/sort.h src/parser.h + +/usr/include/stdc-predef.h: + +src/config.h: + +/usr/include/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/libc-header-start.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/bits/long-double.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/timesize.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/x86_64-linux-gnu/bits/time64.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/stdio2.h: + +/usr/include/stdlib.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/x86_64-linux-gnu/bits/floatn.h: + +/usr/include/x86_64-linux-gnu/bits/floatn-common.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types/clock_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/time_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/timer_t.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-intn.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endianness.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/bits/uintn-identity.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h: + +/usr/include/x86_64-linux-gnu/bits/select2.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h: + +/usr/include/x86_64-linux-gnu/bits/struct_mutex.h: + +/usr/include/x86_64-linux-gnu/bits/struct_rwlock.h: + +/usr/include/alloca.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-float.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib.h: + +/usr/include/string.h: + +/usr/include/x86_64-linux-gnu/bits/types/locale_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h: + +/usr/include/strings.h: + +/usr/include/x86_64-linux-gnu/bits/strings_fortified.h: + +/usr/include/x86_64-linux-gnu/bits/string_fortified.h: + +/usr/include/getopt.h: + +/usr/include/x86_64-linux-gnu/bits/getopt_core.h: + +/usr/include/x86_64-linux-gnu/bits/getopt_ext.h: + +/usr/include/errno.h: + +/usr/include/x86_64-linux-gnu/bits/errno.h: + +/usr/include/linux/errno.h: + +/usr/include/x86_64-linux-gnu/asm/errno.h: + +/usr/include/asm-generic/errno.h: + +/usr/include/asm-generic/errno-base.h: + +src/error.h: + +src/commons.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h: + +/usr/include/stdint.h: + +/usr/include/x86_64-linux-gnu/bits/wchar.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h: + +/usr/include/curses.h: + +/usr/include/ncurses_dll.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h: + +/usr/include/unctrl.h: + +/usr/include/curses.h: + +src/settings.h: + +src/util.h: + +src/sort.h: + +src/parser.h: diff --git a/goaccess++/src/.deps/tcabdb.Po b/goaccess++/src/.deps/tcabdb.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/goaccess++/src/.deps/tcabdb.Po @@ -0,0 +1 @@ +# dummy diff --git a/goaccess++/src/.deps/tcbtdb.Po b/goaccess++/src/.deps/tcbtdb.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/goaccess++/src/.deps/tcbtdb.Po @@ -0,0 +1 @@ +# dummy diff --git a/goaccess++/src/.deps/ui.Po b/goaccess++/src/.deps/ui.Po new file mode 100644 index 0000000..869248a --- /dev/null +++ b/goaccess++/src/.deps/ui.Po @@ -0,0 +1,348 @@ +src/ui.o: src/ui.c /usr/include/stdc-predef.h src/config.h \ + /usr/include/pthread.h /usr/include/features.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h /usr/include/sched.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/timesize.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/time64.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h \ + /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endianness.h \ + /usr/include/x86_64-linux-gnu/bits/sched.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h \ + /usr/include/x86_64-linux-gnu/bits/cpu-set.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_tm.h \ + /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/timer_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h \ + /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ + /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \ + /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \ + /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h \ + /usr/include/x86_64-linux-gnu/bits/setjmp.h /usr/include/ctype.h \ + /usr/include/errno.h /usr/include/x86_64-linux-gnu/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/x86_64-linux-gnu/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/inttypes.h /usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h \ + /usr/include/stdint.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/include/x86_64-linux-gnu/bits/wchar.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-intn.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h /usr/include/locale.h \ + /usr/include/x86_64-linux-gnu/bits/locale.h /usr/include/stdlib.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ + /usr/include/x86_64-linux-gnu/bits/floatn.h \ + /usr/include/x86_64-linux-gnu/bits/floatn-common.h \ + /usr/include/x86_64-linux-gnu/sys/types.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/bits/uintn-identity.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \ + /usr/include/x86_64-linux-gnu/bits/select2.h /usr/include/alloca.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib.h /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/x86_64-linux-gnu/bits/strings_fortified.h \ + /usr/include/x86_64-linux-gnu/bits/string_fortified.h \ + /usr/include/x86_64-linux-gnu/sys/stat.h \ + /usr/include/x86_64-linux-gnu/bits/stat.h /usr/include/unistd.h \ + /usr/include/x86_64-linux-gnu/bits/posix_opt.h \ + /usr/include/x86_64-linux-gnu/bits/environments.h \ + /usr/include/x86_64-linux-gnu/bits/confname.h \ + /usr/include/x86_64-linux-gnu/bits/getopt_posix.h \ + /usr/include/x86_64-linux-gnu/bits/getopt_core.h \ + /usr/include/x86_64-linux-gnu/bits/unistd.h \ + /usr/include/x86_64-linux-gnu/bits/unistd_ext.h src/ui.h \ + /usr/include/curses.h /usr/include/ncurses_dll.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/stdio2.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h /usr/include/unctrl.h \ + /usr/include/curses.h src/labels.h /usr/include/libintl.h src/color.h \ + src/commons.h src/sort.h src/parser.h src/gkhash.h src/gslist.h \ + src/gstorage.h src/khash.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/limits.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/syslimits.h \ + /usr/include/limits.h /usr/include/x86_64-linux-gnu/bits/posix1_lim.h \ + /usr/include/x86_64-linux-gnu/bits/local_lim.h \ + /usr/include/linux/limits.h \ + /usr/include/x86_64-linux-gnu/bits/posix2_lim.h src/error.h \ + src/settings.h src/gmenu.h src/goaccess.h src/util.h src/xmalloc.h + +/usr/include/stdc-predef.h: + +src/config.h: + +/usr/include/pthread.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/bits/long-double.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/sched.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/timesize.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/x86_64-linux-gnu/bits/time64.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h: + +/usr/include/x86_64-linux-gnu/bits/types/time_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endianness.h: + +/usr/include/x86_64-linux-gnu/bits/sched.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h: + +/usr/include/x86_64-linux-gnu/bits/cpu-set.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/bits/types/clock_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h: + +/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/timer_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h: + +/usr/include/x86_64-linux-gnu/bits/types/locale_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h: + +/usr/include/x86_64-linux-gnu/bits/struct_mutex.h: + +/usr/include/x86_64-linux-gnu/bits/struct_rwlock.h: + +/usr/include/x86_64-linux-gnu/bits/setjmp.h: + +/usr/include/ctype.h: + +/usr/include/errno.h: + +/usr/include/x86_64-linux-gnu/bits/errno.h: + +/usr/include/linux/errno.h: + +/usr/include/x86_64-linux-gnu/asm/errno.h: + +/usr/include/asm-generic/errno.h: + +/usr/include/asm-generic/errno-base.h: + +/usr/include/inttypes.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h: + +/usr/include/stdint.h: + +/usr/include/x86_64-linux-gnu/bits/libc-header-start.h: + +/usr/include/x86_64-linux-gnu/bits/wchar.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-intn.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h: + +/usr/include/locale.h: + +/usr/include/x86_64-linux-gnu/bits/locale.h: + +/usr/include/stdlib.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/x86_64-linux-gnu/bits/floatn.h: + +/usr/include/x86_64-linux-gnu/bits/floatn-common.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/bits/uintn-identity.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h: + +/usr/include/x86_64-linux-gnu/bits/select2.h: + +/usr/include/alloca.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-float.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib.h: + +/usr/include/string.h: + +/usr/include/strings.h: + +/usr/include/x86_64-linux-gnu/bits/strings_fortified.h: + +/usr/include/x86_64-linux-gnu/bits/string_fortified.h: + +/usr/include/x86_64-linux-gnu/sys/stat.h: + +/usr/include/x86_64-linux-gnu/bits/stat.h: + +/usr/include/unistd.h: + +/usr/include/x86_64-linux-gnu/bits/posix_opt.h: + +/usr/include/x86_64-linux-gnu/bits/environments.h: + +/usr/include/x86_64-linux-gnu/bits/confname.h: + +/usr/include/x86_64-linux-gnu/bits/getopt_posix.h: + +/usr/include/x86_64-linux-gnu/bits/getopt_core.h: + +/usr/include/x86_64-linux-gnu/bits/unistd.h: + +/usr/include/x86_64-linux-gnu/bits/unistd_ext.h: + +src/ui.h: + +/usr/include/curses.h: + +/usr/include/ncurses_dll.h: + +/usr/include/stdio.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/stdio2.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h: + +/usr/include/unctrl.h: + +/usr/include/curses.h: + +src/labels.h: + +/usr/include/libintl.h: + +src/color.h: + +src/commons.h: + +src/sort.h: + +src/parser.h: + +src/gkhash.h: + +src/gslist.h: + +src/gstorage.h: + +src/khash.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/limits.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/syslimits.h: + +/usr/include/limits.h: + +/usr/include/x86_64-linux-gnu/bits/posix1_lim.h: + +/usr/include/x86_64-linux-gnu/bits/local_lim.h: + +/usr/include/linux/limits.h: + +/usr/include/x86_64-linux-gnu/bits/posix2_lim.h: + +src/error.h: + +src/settings.h: + +src/gmenu.h: + +src/goaccess.h: + +src/util.h: + +src/xmalloc.h: diff --git a/goaccess++/src/.deps/util.Po b/goaccess++/src/.deps/util.Po new file mode 100644 index 0000000..18271a0 --- /dev/null +++ b/goaccess++/src/.deps/util.Po @@ -0,0 +1,310 @@ +src/util.o: src/util.c /usr/include/stdc-predef.h \ + /usr/include/arpa/inet.h /usr/include/features.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h /usr/include/netinet/in.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/timesize.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/time64.h \ + /usr/include/x86_64-linux-gnu/sys/socket.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_iovec.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h \ + /usr/include/x86_64-linux-gnu/bits/socket.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/timer_t.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-intn.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ + /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \ + /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \ + /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h \ + /usr/include/x86_64-linux-gnu/bits/socket_type.h \ + /usr/include/x86_64-linux-gnu/bits/sockaddr.h \ + /usr/include/x86_64-linux-gnu/bits/socket-constants.h \ + /usr/include/x86_64-linux-gnu/bits/socket2.h \ + /usr/include/x86_64-linux-gnu/bits/in.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endianness.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/bits/uintn-identity.h /usr/include/ctype.h \ + /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h \ + /usr/include/errno.h /usr/include/x86_64-linux-gnu/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/x86_64-linux-gnu/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/stdio2.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h /usr/include/stdint.h \ + /usr/include/x86_64-linux-gnu/bits/wchar.h /usr/include/stdlib.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ + /usr/include/x86_64-linux-gnu/bits/floatn.h \ + /usr/include/x86_64-linux-gnu/bits/floatn-common.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib.h /usr/include/string.h \ + /usr/include/x86_64-linux-gnu/bits/string_fortified.h \ + /usr/include/x86_64-linux-gnu/sys/stat.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \ + /usr/include/x86_64-linux-gnu/bits/stat.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_tm.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h \ + /usr/include/netdb.h /usr/include/x86_64-linux-gnu/bits/netdb.h \ + /usr/include/unistd.h /usr/include/x86_64-linux-gnu/bits/posix_opt.h \ + /usr/include/x86_64-linux-gnu/bits/environments.h \ + /usr/include/x86_64-linux-gnu/bits/confname.h \ + /usr/include/x86_64-linux-gnu/bits/getopt_posix.h \ + /usr/include/x86_64-linux-gnu/bits/getopt_core.h \ + /usr/include/x86_64-linux-gnu/bits/unistd.h \ + /usr/include/x86_64-linux-gnu/bits/unistd_ext.h src/util.h src/error.h \ + src/commons.h src/config.h /usr/include/curses.h \ + /usr/include/ncurses_dll.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h /usr/include/wchar.h \ + /usr/include/x86_64-linux-gnu/bits/types/wint_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/wctype-wchar.h \ + /usr/include/x86_64-linux-gnu/bits/wchar2.h /usr/include/unctrl.h \ + /usr/include/curses.h src/settings.h src/labels.h /usr/include/libintl.h \ + /usr/include/locale.h /usr/include/x86_64-linux-gnu/bits/locale.h \ + src/xmalloc.h + +/usr/include/stdc-predef.h: + +/usr/include/arpa/inet.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/bits/long-double.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/netinet/in.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/timesize.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/x86_64-linux-gnu/bits/time64.h: + +/usr/include/x86_64-linux-gnu/sys/socket.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_iovec.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h: + +/usr/include/x86_64-linux-gnu/bits/socket.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types/clock_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/time_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/timer_t.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-intn.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h: + +/usr/include/x86_64-linux-gnu/bits/struct_mutex.h: + +/usr/include/x86_64-linux-gnu/bits/struct_rwlock.h: + +/usr/include/x86_64-linux-gnu/bits/socket_type.h: + +/usr/include/x86_64-linux-gnu/bits/sockaddr.h: + +/usr/include/x86_64-linux-gnu/bits/socket-constants.h: + +/usr/include/x86_64-linux-gnu/bits/socket2.h: + +/usr/include/x86_64-linux-gnu/bits/in.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endianness.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/bits/uintn-identity.h: + +/usr/include/ctype.h: + +/usr/include/x86_64-linux-gnu/bits/types/locale_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h: + +/usr/include/errno.h: + +/usr/include/x86_64-linux-gnu/bits/errno.h: + +/usr/include/linux/errno.h: + +/usr/include/x86_64-linux-gnu/asm/errno.h: + +/usr/include/asm-generic/errno.h: + +/usr/include/asm-generic/errno-base.h: + +/usr/include/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/libc-header-start.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/stdio2.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h: + +/usr/include/stdint.h: + +/usr/include/x86_64-linux-gnu/bits/wchar.h: + +/usr/include/stdlib.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/x86_64-linux-gnu/bits/floatn.h: + +/usr/include/x86_64-linux-gnu/bits/floatn-common.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-float.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib.h: + +/usr/include/string.h: + +/usr/include/x86_64-linux-gnu/bits/string_fortified.h: + +/usr/include/x86_64-linux-gnu/sys/stat.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h: + +/usr/include/x86_64-linux-gnu/bits/stat.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h: + +/usr/include/netdb.h: + +/usr/include/x86_64-linux-gnu/bits/netdb.h: + +/usr/include/unistd.h: + +/usr/include/x86_64-linux-gnu/bits/posix_opt.h: + +/usr/include/x86_64-linux-gnu/bits/environments.h: + +/usr/include/x86_64-linux-gnu/bits/confname.h: + +/usr/include/x86_64-linux-gnu/bits/getopt_posix.h: + +/usr/include/x86_64-linux-gnu/bits/getopt_core.h: + +/usr/include/x86_64-linux-gnu/bits/unistd.h: + +/usr/include/x86_64-linux-gnu/bits/unistd_ext.h: + +src/util.h: + +src/error.h: + +src/commons.h: + +src/config.h: + +/usr/include/curses.h: + +/usr/include/ncurses_dll.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h: + +/usr/include/wchar.h: + +/usr/include/x86_64-linux-gnu/bits/types/wint_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/mbstate_t.h: + +/usr/include/x86_64-linux-gnu/bits/wctype-wchar.h: + +/usr/include/x86_64-linux-gnu/bits/wchar2.h: + +/usr/include/unctrl.h: + +/usr/include/curses.h: + +src/settings.h: + +src/labels.h: + +/usr/include/libintl.h: + +/usr/include/locale.h: + +/usr/include/x86_64-linux-gnu/bits/locale.h: + +src/xmalloc.h: diff --git a/goaccess++/src/.deps/websocket.Po b/goaccess++/src/.deps/websocket.Po new file mode 100644 index 0000000..0b5e6d2 --- /dev/null +++ b/goaccess++/src/.deps/websocket.Po @@ -0,0 +1,412 @@ +src/websocket.o: src/websocket.c /usr/include/stdc-predef.h \ + /usr/include/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/timesize.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/time64.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/stdio2.h /usr/include/stdlib.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ + /usr/include/x86_64-linux-gnu/bits/floatn.h \ + /usr/include/x86_64-linux-gnu/bits/floatn-common.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/timer_t.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endianness.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/bits/uintn-identity.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \ + /usr/include/x86_64-linux-gnu/bits/select2.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ + /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \ + /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \ + /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib.h /usr/include/string.h \ + /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /usr/include/x86_64-linux-gnu/bits/strings_fortified.h \ + /usr/include/x86_64-linux-gnu/bits/string_fortified.h \ + /usr/include/arpa/inet.h /usr/include/netinet/in.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h \ + /usr/include/x86_64-linux-gnu/sys/socket.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_iovec.h \ + /usr/include/x86_64-linux-gnu/bits/socket.h \ + /usr/include/x86_64-linux-gnu/bits/socket_type.h \ + /usr/include/x86_64-linux-gnu/bits/sockaddr.h \ + /usr/include/x86_64-linux-gnu/asm/socket.h \ + /usr/include/asm-generic/socket.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h \ + /usr/include/x86_64-linux-gnu/asm/posix_types.h \ + /usr/include/x86_64-linux-gnu/asm/posix_types_64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/x86_64-linux-gnu/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/x86_64-linux-gnu/asm/sockios.h \ + /usr/include/asm-generic/sockios.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_osockaddr.h \ + /usr/include/x86_64-linux-gnu/bits/socket2.h \ + /usr/include/x86_64-linux-gnu/bits/in.h /usr/include/ctype.h \ + /usr/include/errno.h /usr/include/x86_64-linux-gnu/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/x86_64-linux-gnu/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/fcntl.h /usr/include/x86_64-linux-gnu/bits/fcntl.h \ + /usr/include/x86_64-linux-gnu/bits/fcntl-linux.h \ + /usr/include/x86_64-linux-gnu/bits/stat.h \ + /usr/include/x86_64-linux-gnu/bits/fcntl2.h /usr/include/netdb.h \ + /usr/include/rpc/netdb.h /usr/include/x86_64-linux-gnu/bits/netdb.h \ + /usr/include/x86_64-linux-gnu/sys/stat.h \ + /usr/include/x86_64-linux-gnu/sys/time.h \ + /usr/include/x86_64-linux-gnu/sys/ioctl.h \ + /usr/include/x86_64-linux-gnu/bits/ioctls.h \ + /usr/include/x86_64-linux-gnu/asm/ioctls.h \ + /usr/include/asm-generic/ioctls.h /usr/include/linux/ioctl.h \ + /usr/include/x86_64-linux-gnu/asm/ioctl.h \ + /usr/include/asm-generic/ioctl.h \ + /usr/include/x86_64-linux-gnu/bits/ioctl-types.h \ + /usr/include/x86_64-linux-gnu/sys/ttydefaults.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_tm.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h \ + /usr/include/unistd.h /usr/include/x86_64-linux-gnu/bits/posix_opt.h \ + /usr/include/x86_64-linux-gnu/bits/environments.h \ + /usr/include/x86_64-linux-gnu/bits/confname.h \ + /usr/include/x86_64-linux-gnu/bits/getopt_posix.h \ + /usr/include/x86_64-linux-gnu/bits/getopt_core.h \ + /usr/include/x86_64-linux-gnu/bits/unistd.h \ + /usr/include/x86_64-linux-gnu/bits/unistd_ext.h src/config.h \ + src/websocket.h /usr/lib/gcc/x86_64-linux-gnu/9/include/limits.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/syslimits.h \ + /usr/include/limits.h /usr/include/x86_64-linux-gnu/bits/posix1_lim.h \ + /usr/include/x86_64-linux-gnu/bits/local_lim.h \ + /usr/include/linux/limits.h \ + /usr/include/x86_64-linux-gnu/bits/posix2_lim.h src/gslist.h \ + src/base64.h src/error.h src/commons.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h /usr/include/stdint.h \ + /usr/include/x86_64-linux-gnu/bits/wchar.h /usr/include/curses.h \ + /usr/include/ncurses_dll.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h /usr/include/unctrl.h \ + /usr/include/curses.h src/settings.h src/sha1.h src/xmalloc.h + +/usr/include/stdc-predef.h: + +/usr/include/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/libc-header-start.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/bits/long-double.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/timesize.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/x86_64-linux-gnu/bits/time64.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/stdio2.h: + +/usr/include/stdlib.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/x86_64-linux-gnu/bits/floatn.h: + +/usr/include/x86_64-linux-gnu/bits/floatn-common.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types/clock_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/time_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/timer_t.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-intn.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endianness.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/bits/uintn-identity.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h: + +/usr/include/x86_64-linux-gnu/bits/select2.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h: + +/usr/include/x86_64-linux-gnu/bits/struct_mutex.h: + +/usr/include/x86_64-linux-gnu/bits/struct_rwlock.h: + +/usr/include/alloca.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-float.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib.h: + +/usr/include/string.h: + +/usr/include/x86_64-linux-gnu/bits/types/locale_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h: + +/usr/include/strings.h: + +/usr/include/x86_64-linux-gnu/bits/strings_fortified.h: + +/usr/include/x86_64-linux-gnu/bits/string_fortified.h: + +/usr/include/arpa/inet.h: + +/usr/include/netinet/in.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h: + +/usr/include/x86_64-linux-gnu/sys/socket.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_iovec.h: + +/usr/include/x86_64-linux-gnu/bits/socket.h: + +/usr/include/x86_64-linux-gnu/bits/socket_type.h: + +/usr/include/x86_64-linux-gnu/bits/sockaddr.h: + +/usr/include/x86_64-linux-gnu/asm/socket.h: + +/usr/include/asm-generic/socket.h: + +/usr/include/linux/posix_types.h: + +/usr/include/linux/stddef.h: + +/usr/include/x86_64-linux-gnu/asm/posix_types.h: + +/usr/include/x86_64-linux-gnu/asm/posix_types_64.h: + +/usr/include/asm-generic/posix_types.h: + +/usr/include/x86_64-linux-gnu/asm/bitsperlong.h: + +/usr/include/asm-generic/bitsperlong.h: + +/usr/include/x86_64-linux-gnu/asm/sockios.h: + +/usr/include/asm-generic/sockios.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_osockaddr.h: + +/usr/include/x86_64-linux-gnu/bits/socket2.h: + +/usr/include/x86_64-linux-gnu/bits/in.h: + +/usr/include/ctype.h: + +/usr/include/errno.h: + +/usr/include/x86_64-linux-gnu/bits/errno.h: + +/usr/include/linux/errno.h: + +/usr/include/x86_64-linux-gnu/asm/errno.h: + +/usr/include/asm-generic/errno.h: + +/usr/include/asm-generic/errno-base.h: + +/usr/include/fcntl.h: + +/usr/include/x86_64-linux-gnu/bits/fcntl.h: + +/usr/include/x86_64-linux-gnu/bits/fcntl-linux.h: + +/usr/include/x86_64-linux-gnu/bits/stat.h: + +/usr/include/x86_64-linux-gnu/bits/fcntl2.h: + +/usr/include/netdb.h: + +/usr/include/rpc/netdb.h: + +/usr/include/x86_64-linux-gnu/bits/netdb.h: + +/usr/include/x86_64-linux-gnu/sys/stat.h: + +/usr/include/x86_64-linux-gnu/sys/time.h: + +/usr/include/x86_64-linux-gnu/sys/ioctl.h: + +/usr/include/x86_64-linux-gnu/bits/ioctls.h: + +/usr/include/x86_64-linux-gnu/asm/ioctls.h: + +/usr/include/asm-generic/ioctls.h: + +/usr/include/linux/ioctl.h: + +/usr/include/x86_64-linux-gnu/asm/ioctl.h: + +/usr/include/asm-generic/ioctl.h: + +/usr/include/x86_64-linux-gnu/bits/ioctl-types.h: + +/usr/include/x86_64-linux-gnu/sys/ttydefaults.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h: + +/usr/include/unistd.h: + +/usr/include/x86_64-linux-gnu/bits/posix_opt.h: + +/usr/include/x86_64-linux-gnu/bits/environments.h: + +/usr/include/x86_64-linux-gnu/bits/confname.h: + +/usr/include/x86_64-linux-gnu/bits/getopt_posix.h: + +/usr/include/x86_64-linux-gnu/bits/getopt_core.h: + +/usr/include/x86_64-linux-gnu/bits/unistd.h: + +/usr/include/x86_64-linux-gnu/bits/unistd_ext.h: + +src/config.h: + +src/websocket.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/limits.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/syslimits.h: + +/usr/include/limits.h: + +/usr/include/x86_64-linux-gnu/bits/posix1_lim.h: + +/usr/include/x86_64-linux-gnu/bits/local_lim.h: + +/usr/include/linux/limits.h: + +/usr/include/x86_64-linux-gnu/bits/posix2_lim.h: + +src/gslist.h: + +src/base64.h: + +src/error.h: + +src/commons.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h: + +/usr/include/stdint.h: + +/usr/include/x86_64-linux-gnu/bits/wchar.h: + +/usr/include/curses.h: + +/usr/include/ncurses_dll.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h: + +/usr/include/unctrl.h: + +/usr/include/curses.h: + +src/settings.h: + +src/sha1.h: + +src/xmalloc.h: diff --git a/goaccess++/src/.deps/xmalloc.Po b/goaccess++/src/.deps/xmalloc.Po new file mode 100644 index 0000000..7241dfa --- /dev/null +++ b/goaccess++/src/.deps/xmalloc.Po @@ -0,0 +1,230 @@ +src/xmalloc.o: src/xmalloc.c /usr/include/stdc-predef.h \ + /usr/include/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/timesize.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/time64.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/stdio2.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h /usr/include/stdint.h \ + /usr/include/x86_64-linux-gnu/bits/wchar.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-intn.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h /usr/include/stdlib.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ + /usr/include/x86_64-linux-gnu/bits/floatn.h \ + /usr/include/x86_64-linux-gnu/bits/floatn-common.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/timer_t.h /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endianness.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/bits/uintn-identity.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \ + /usr/include/x86_64-linux-gnu/bits/select2.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ + /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \ + /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \ + /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib.h /usr/include/string.h \ + /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /usr/include/x86_64-linux-gnu/bits/strings_fortified.h \ + /usr/include/x86_64-linux-gnu/bits/string_fortified.h src/error.h \ + src/commons.h src/config.h /usr/include/time.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_tm.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h \ + /usr/include/curses.h /usr/include/ncurses_dll.h \ + /usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h /usr/include/unctrl.h \ + /usr/include/curses.h src/settings.h src/xmalloc.h + +/usr/include/stdc-predef.h: + +/usr/include/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/libc-header-start.h: + +/usr/include/features.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/bits/long-double.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h: + +/usr/include/x86_64-linux-gnu/bits/types.h: + +/usr/include/x86_64-linux-gnu/bits/timesize.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/x86_64-linux-gnu/bits/time64.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/sys_errlist.h: + +/usr/include/x86_64-linux-gnu/bits/stdio.h: + +/usr/include/x86_64-linux-gnu/bits/stdio2.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h: + +/usr/include/stdint.h: + +/usr/include/x86_64-linux-gnu/bits/wchar.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-intn.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h: + +/usr/include/stdlib.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/usr/include/x86_64-linux-gnu/bits/floatn.h: + +/usr/include/x86_64-linux-gnu/bits/floatn-common.h: + +/usr/include/x86_64-linux-gnu/sys/types.h: + +/usr/include/x86_64-linux-gnu/bits/types/clock_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/time_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/timer_t.h: + +/usr/include/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/bits/endianness.h: + +/usr/include/x86_64-linux-gnu/bits/byteswap.h: + +/usr/include/x86_64-linux-gnu/bits/uintn-identity.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h: + +/usr/include/x86_64-linux-gnu/bits/select2.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: + +/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h: + +/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h: + +/usr/include/x86_64-linux-gnu/bits/struct_mutex.h: + +/usr/include/x86_64-linux-gnu/bits/struct_rwlock.h: + +/usr/include/alloca.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib-float.h: + +/usr/include/x86_64-linux-gnu/bits/stdlib.h: + +/usr/include/string.h: + +/usr/include/x86_64-linux-gnu/bits/types/locale_t.h: + +/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h: + +/usr/include/strings.h: + +/usr/include/x86_64-linux-gnu/bits/strings_fortified.h: + +/usr/include/x86_64-linux-gnu/bits/string_fortified.h: + +src/error.h: + +src/commons.h: + +src/config.h: + +/usr/include/time.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h: + +/usr/include/curses.h: + +/usr/include/ncurses_dll.h: + +/usr/lib/gcc/x86_64-linux-gnu/9/include/stdbool.h: + +/usr/include/unctrl.h: + +/usr/include/curses.h: + +src/settings.h: + +src/xmalloc.h: diff --git a/goaccess++/src/.dirstamp b/goaccess++/src/.dirstamp new file mode 100644 index 0000000..e69de29 diff --git a/goaccess++/src/appcss.h b/goaccess++/src/appcss.h new file mode 100644 index 0000000..f819816 --- /dev/null +++ b/goaccess++/src/appcss.h @@ -0,0 +1,1512 @@ +const char app_css[16588] = { + 0x2f, 0x2a, 0x20, 0x47, 0x4c, 0x4f, 0x42, 0x41, 0x4c, 0x20, 0x2a, + 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x2c, 0x62, 0x6f, 0x64, 0x79, 0x20, + 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, + 0x3a, 0x20, 0x23, 0x66, 0x30, 0x66, 0x30, 0x66, 0x30, 0x3b, 0x6f, + 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x2d, 0x78, 0x3a, 0x20, + 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x3b, 0x7d, 0x68, 0x31, 0x20, + 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x3a, 0x20, 0x62, 0x6f, 0x6c, 0x64, 0x3b, 0x6c, 0x65, 0x74, + 0x74, 0x65, 0x72, 0x2d, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, + 0x3a, 0x20, 0x2d, 0x33, 0x70, 0x78, 0x3b, 0x7d, 0x68, 0x33, 0x20, + 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, + 0x20, 0x32, 0x31, 0x70, 0x78, 0x3b, 0x6c, 0x65, 0x74, 0x74, 0x65, + 0x72, 0x2d, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x3a, 0x20, + 0x2d, 0x31, 0x70, 0x78, 0x3b, 0x7d, 0x2e, 0x70, 0x61, 0x67, 0x65, + 0x2d, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x7b, 0x62, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, + 0x3a, 0x20, 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, + 0x20, 0x72, 0x67, 0x62, 0x61, 0x28, 0x30, 0x2c, 0x20, 0x30, 0x2c, + 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x35, 0x29, 0x3b, 0x6d, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x20, 0x32, 0x35, 0x70, 0x78, + 0x20, 0x30, 0x20, 0x32, 0x30, 0x70, 0x78, 0x3b, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x72, 0x65, 0x6c, 0x61, + 0x74, 0x69, 0x76, 0x65, 0x3b, 0x7d, 0x2e, 0x70, 0x61, 0x67, 0x65, + 0x2d, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x68, 0x31, 0x20, + 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x20, 0x30, 0x3b, + 0x7d, 0x2e, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x20, + 0x35, 0x70, 0x78, 0x20, 0x30, 0x3b, 0x7d, 0x2e, 0x63, 0x6c, 0x69, + 0x63, 0x6b, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x2e, 0x65, 0x78, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x64, 0x20, + 0x7b, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x3a, 0x20, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x7d, 0x2e, 0x73, 0x70, 0x69, + 0x6e, 0x6e, 0x65, 0x72, 0x20, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x20, 0x23, 0x39, 0x39, 0x39, 0x3b, 0x6c, 0x65, 0x66, 0x74, + 0x3a, 0x20, 0x35, 0x30, 0x25, 0x3b, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, + 0x74, 0x65, 0x3b, 0x74, 0x6f, 0x70, 0x3a, 0x20, 0x35, 0x30, 0x25, + 0x3b, 0x7d, 0x2e, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x65, 0x64, 0x20, + 0x7b, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x20, 0x31, 0x39, + 0x30, 0x70, 0x78, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, + 0x23, 0x39, 0x45, 0x39, 0x45, 0x39, 0x45, 0x3b, 0x66, 0x6f, 0x6e, + 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x73, 0x6d, 0x61, + 0x6c, 0x6c, 0x65, 0x72, 0x3b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x3a, 0x20, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, + 0x65, 0x3b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x32, 0x30, + 0x70, 0x78, 0x3b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, + 0x6d, 0x2d, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x3a, 0x20, 0x31, + 0x30, 0x30, 0x25, 0x20, 0x30, 0x3b, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x3a, 0x20, 0x72, 0x6f, 0x74, 0x61, 0x74, + 0x65, 0x28, 0x2d, 0x39, 0x30, 0x64, 0x65, 0x67, 0x29, 0x3b, 0x7d, + 0x2e, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x65, 0x64, 0x20, 0x61, 0x20, + 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x36, 0x33, + 0x36, 0x33, 0x36, 0x33, 0x3b, 0x7d, 0x2e, 0x70, 0x6f, 0x77, 0x65, + 0x72, 0x65, 0x64, 0x20, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x7b, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x30, 0x30, 0x37, 0x62, + 0x63, 0x33, 0x3b, 0x7d, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, + 0x77, 0x6e, 0x2d, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x7b, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x30, 0x30, 0x37, + 0x62, 0x63, 0x33, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, + 0x3a, 0x20, 0x33, 0x70, 0x78, 0x20, 0x32, 0x35, 0x70, 0x78, 0x3b, + 0x74, 0x65, 0x78, 0x74, 0x2d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x6f, 0x72, 0x6d, 0x3a, 0x20, 0x75, 0x70, 0x70, 0x65, 0x72, 0x63, + 0x61, 0x73, 0x65, 0x3b, 0x7d, 0x2e, 0x67, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x20, 0x7b, 0x6c, 0x65, 0x74, 0x74, 0x65, 0x72, 0x2d, + 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x2d, 0x31, + 0x70, 0x78, 0x3b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x3a, 0x20, 0x75, 0x70, 0x70, + 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x3b, 0x7d, 0x68, 0x35, 0x2e, + 0x67, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x7b, 0x6c, 0x65, + 0x74, 0x74, 0x65, 0x72, 0x2d, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, + 0x67, 0x3a, 0x20, 0x30, 0x3b, 0x7d, 0x2e, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x2d, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x68, 0x34, + 0x2e, 0x67, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x7b, 0x6d, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x20, + 0x32, 0x30, 0x70, 0x78, 0x3b, 0x7d, 0x2e, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x2d, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x2e, 0x67, + 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x73, 0x6d, 0x61, 0x6c, + 0x6c, 0x20, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, + 0x65, 0x3a, 0x20, 0x36, 0x39, 0x25, 0x3b, 0x7d, 0x2f, 0x2a, 0x20, + 0x4e, 0x41, 0x56, 0x49, 0x47, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x20, + 0x2a, 0x2f, 0x6e, 0x61, 0x76, 0x20, 0x7b, 0x2d, 0x77, 0x65, 0x62, + 0x6b, 0x69, 0x74, 0x2d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x2e, + 0x32, 0x73, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, + 0x6e, 0x64, 0x3a, 0x20, 0x23, 0x31, 0x43, 0x31, 0x43, 0x31, 0x43, + 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x72, 0x69, 0x67, + 0x68, 0x74, 0x3a, 0x20, 0x33, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, + 0x69, 0x64, 0x20, 0x23, 0x35, 0x62, 0x63, 0x30, 0x64, 0x65, 0x3b, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x31, 0x30, 0x30, + 0x25, 0x3b, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x20, 0x2d, 0x32, 0x33, + 0x36, 0x70, 0x78, 0x3b, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, + 0x77, 0x3a, 0x20, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x3b, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x66, 0x69, + 0x78, 0x65, 0x64, 0x3b, 0x74, 0x6f, 0x70, 0x3a, 0x20, 0x30, 0x3b, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, + 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x2e, 0x32, 0x73, 0x3b, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x33, 0x30, 0x30, 0x70, 0x78, + 0x3b, 0x7a, 0x2d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x20, 0x32, + 0x3b, 0x7d, 0x6e, 0x61, 0x76, 0x20, 0x2e, 0x6e, 0x61, 0x76, 0x2d, + 0x6c, 0x69, 0x73, 0x74, 0x20, 0x7b, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x3a, 0x20, 0x31, 0x30, 0x30, 0x25, 0x3b, 0x6f, 0x76, 0x65, + 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x2d, 0x79, 0x3a, 0x20, 0x61, 0x75, + 0x74, 0x6f, 0x3b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x33, + 0x35, 0x30, 0x70, 0x78, 0x3b, 0x7d, 0x6e, 0x61, 0x76, 0x20, 0x68, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x7b, 0x6d, 0x61, 0x72, 0x67, + 0x69, 0x6e, 0x3a, 0x20, 0x34, 0x30, 0x70, 0x78, 0x20, 0x32, 0x30, + 0x70, 0x78, 0x20, 0x33, 0x30, 0x70, 0x78, 0x3b, 0x7d, 0x6e, 0x61, + 0x76, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x61, 0x20, + 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x72, 0x67, 0x62, + 0x61, 0x28, 0x32, 0x34, 0x30, 0x2c, 0x32, 0x34, 0x30, 0x2c, 0x32, + 0x34, 0x30, 0x2c, 0x2e, 0x37, 0x29, 0x3b, 0x66, 0x6f, 0x6e, 0x74, + 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x32, 0x2e, 0x37, 0x65, + 0x6d, 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x3a, 0x20, 0x33, 0x30, 0x30, 0x3b, 0x74, 0x65, 0x78, + 0x74, 0x2d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x3a, 0x20, 0x75, 0x70, 0x70, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, + 0x3b, 0x7d, 0x6e, 0x61, 0x76, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x20, 0x61, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x7b, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x65, 0x65, 0x65, + 0x3b, 0x7d, 0x6e, 0x61, 0x76, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x20, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, + 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x21, 0x69, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x3b, 0x6c, 0x65, 0x66, 0x74, + 0x3a, 0x20, 0x30, 0x3b, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x3a, 0x20, 0x2e, 0x39, 0x37, 0x3b, 0x7d, 0x6e, 0x61, 0x76, 0x3a, + 0x68, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x7e, 0x20, 0x23, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x7b, 0x6f, 0x70, 0x61, 0x63, + 0x69, 0x74, 0x79, 0x3a, 0x20, 0x2e, 0x33, 0x3b, 0x7d, 0x6e, 0x61, + 0x76, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x2e, 0x6e, + 0x61, 0x76, 0x2d, 0x62, 0x61, 0x72, 0x73, 0x2c, 0x6e, 0x61, 0x76, + 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x2e, 0x6e, 0x61, + 0x76, 0x2d, 0x67, 0x65, 0x61, 0x72, 0x73, 0x2c, 0x6e, 0x61, 0x76, + 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x2e, 0x6e, 0x61, + 0x76, 0x2d, 0x77, 0x73, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x20, 0x7b, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x20, + 0x30, 0x3b, 0x7d, 0x6e, 0x61, 0x76, 0x20, 0x2e, 0x6e, 0x61, 0x76, + 0x2d, 0x62, 0x61, 0x72, 0x73, 0x2c, 0x6e, 0x61, 0x76, 0x20, 0x2e, + 0x6e, 0x61, 0x76, 0x2d, 0x67, 0x65, 0x61, 0x72, 0x73, 0x2c, 0x6e, + 0x61, 0x76, 0x20, 0x2e, 0x6e, 0x61, 0x76, 0x2d, 0x77, 0x73, 0x2d, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x7b, 0x2d, 0x77, 0x65, + 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x6f, 0x70, 0x61, 0x63, 0x69, + 0x74, 0x79, 0x20, 0x2e, 0x32, 0x73, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x20, 0x23, 0x39, 0x45, 0x39, 0x45, 0x39, 0x45, 0x3b, + 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x3a, 0x20, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3a, + 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x66, 0x6f, 0x6e, 0x74, + 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x33, 0x36, 0x70, 0x78, + 0x3b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x33, 0x32, + 0x70, 0x78, 0x3b, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x20, 0x31, 0x33, + 0x70, 0x78, 0x3b, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x3a, 0x20, 0x33, 0x32, 0x70, 0x78, 0x3b, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x66, 0x69, + 0x78, 0x65, 0x64, 0x3b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x3a, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x3b, 0x74, 0x6f, 0x70, 0x3a, 0x20, 0x33, 0x30, 0x70, 0x78, 0x3b, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, + 0x20, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x20, 0x2e, 0x32, + 0x73, 0x3b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x33, 0x32, + 0x70, 0x78, 0x3b, 0x7d, 0x6e, 0x61, 0x76, 0x20, 0x2e, 0x6e, 0x61, + 0x76, 0x2d, 0x67, 0x65, 0x61, 0x72, 0x73, 0x20, 0x7b, 0x74, 0x6f, + 0x70, 0x3a, 0x20, 0x31, 0x30, 0x30, 0x70, 0x78, 0x3b, 0x6f, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x20, 0x30, 0x2e, 0x36, 0x3b, + 0x7d, 0x6e, 0x61, 0x76, 0x20, 0x2e, 0x6e, 0x61, 0x76, 0x2d, 0x77, + 0x73, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2c, 0x2e, 0x6e, + 0x61, 0x76, 0x2d, 0x77, 0x73, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x2e, 0x6d, 0x69, 0x6e, 0x69, 0x20, 0x7b, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x36, 0x41, 0x36, 0x41, 0x36, 0x41, + 0x3b, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x3a, 0x20, 0x68, 0x65, + 0x6c, 0x70, 0x3b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, + 0x20, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, + 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x31, 0x32, 0x70, 0x78, 0x3b, + 0x7d, 0x6e, 0x61, 0x76, 0x20, 0x2e, 0x6e, 0x61, 0x76, 0x2d, 0x77, + 0x73, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x7b, 0x6c, + 0x65, 0x66, 0x74, 0x3a, 0x20, 0x32, 0x35, 0x70, 0x78, 0x3b, 0x74, + 0x6f, 0x70, 0x3a, 0x20, 0x31, 0x32, 0x35, 0x70, 0x78, 0x3b, 0x7d, + 0x2e, 0x6e, 0x61, 0x76, 0x2d, 0x77, 0x73, 0x2d, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x2e, 0x6d, 0x69, 0x6e, 0x69, 0x20, 0x7b, 0x74, + 0x6f, 0x70, 0x3a, 0x20, 0x31, 0x34, 0x70, 0x78, 0x3b, 0x6c, 0x65, + 0x66, 0x74, 0x3a, 0x20, 0x35, 0x30, 0x70, 0x78, 0x3b, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x61, 0x62, 0x73, + 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x3b, 0x7d, 0x2e, 0x6e, 0x61, 0x76, + 0x2d, 0x77, 0x73, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x7b, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x35, 0x44, 0x42, + 0x35, 0x36, 0x41, 0x3b, 0x7d, 0x6e, 0x61, 0x76, 0x20, 0x6c, 0x69, + 0x20, 0x61, 0x20, 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, + 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x20, 0x33, 0x70, 0x78, 0x20, 0x73, + 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x20, 0x72, 0x67, 0x62, 0x61, 0x28, 0x32, 0x30, 0x30, 0x2c, + 0x32, 0x30, 0x30, 0x2c, 0x32, 0x30, 0x30, 0x2c, 0x2e, 0x35, 0x29, + 0x3b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x20, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, + 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x65, + 0x72, 0x3b, 0x6d, 0x61, 0x78, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x3a, 0x20, 0x32, 0x33, 0x35, 0x70, 0x78, 0x3b, 0x6f, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x3a, 0x20, 0x30, 0x3b, 0x6f, 0x76, 0x65, + 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x3a, 0x20, 0x68, 0x69, 0x64, 0x64, + 0x65, 0x6e, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, + 0x20, 0x39, 0x70, 0x78, 0x20, 0x32, 0x30, 0x70, 0x78, 0x3b, 0x74, + 0x65, 0x78, 0x74, 0x2d, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, + 0x77, 0x3a, 0x20, 0x65, 0x6c, 0x6c, 0x69, 0x70, 0x73, 0x69, 0x73, + 0x3b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x3a, 0x20, 0x75, 0x70, 0x70, 0x65, 0x72, + 0x63, 0x61, 0x73, 0x65, 0x3b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x6f, 0x70, 0x61, 0x63, 0x69, + 0x74, 0x79, 0x20, 0x2e, 0x32, 0x73, 0x3b, 0x77, 0x68, 0x69, 0x74, + 0x65, 0x2d, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3a, 0x20, 0x6e, 0x6f, + 0x77, 0x72, 0x61, 0x70, 0x3b, 0x7d, 0x6e, 0x61, 0x76, 0x2e, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x6c, 0x69, 0x20, 0x61, 0x20, + 0x7b, 0x6d, 0x61, 0x78, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, + 0x20, 0x31, 0x30, 0x30, 0x25, 0x3b, 0x6f, 0x70, 0x61, 0x63, 0x69, + 0x74, 0x79, 0x3a, 0x20, 0x31, 0x3b, 0x7d, 0x6e, 0x61, 0x76, 0x20, + 0x6c, 0x69, 0x20, 0x61, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, + 0x6e, 0x61, 0x76, 0x20, 0x6c, 0x69, 0x2e, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x20, 0x61, 0x20, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x20, 0x72, 0x67, 0x62, 0x61, + 0x28, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x2e, 0x31, 0x29, 0x3b, + 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x20, 0x23, 0x35, 0x42, 0x43, 0x30, 0x44, 0x45, 0x3b, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x65, 0x65, 0x65, + 0x3b, 0x7d, 0x6e, 0x61, 0x76, 0x20, 0x75, 0x6c, 0x20, 0x7b, 0x70, + 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x6c, 0x65, 0x66, 0x74, + 0x3a, 0x20, 0x30, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x2d, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x3a, 0x20, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x7d, + 0x2f, 0x2a, 0x20, 0x4e, 0x61, 0x76, 0x69, 0x67, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x49, 0x63, 0x6f, 0x6e, + 0x20, 0x2a, 0x2f, 0x6e, 0x61, 0x76, 0x20, 0x61, 0x2c, 0x6e, 0x61, + 0x76, 0x20, 0x61, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x7b, + 0x74, 0x65, 0x78, 0x74, 0x2d, 0x64, 0x65, 0x63, 0x6f, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, + 0x7d, 0x6e, 0x61, 0x76, 0x20, 0x68, 0x33, 0x20, 0x7b, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x46, 0x46, 0x46, 0x20, 0x21, + 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x3b, 0x66, + 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x6d, + 0x65, 0x64, 0x69, 0x75, 0x6d, 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, + 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x62, 0x6f, 0x6c, + 0x64, 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x20, 0x32, + 0x30, 0x70, 0x78, 0x20, 0x32, 0x35, 0x70, 0x78, 0x20, 0x31, 0x30, + 0x70, 0x78, 0x3b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x3a, 0x20, 0x75, 0x70, 0x70, + 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x3b, 0x7d, 0x2f, 0x2a, 0x20, + 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x20, 0x2a, + 0x2f, 0x40, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x20, 0x73, 0x63, 0x72, + 0x65, 0x65, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6d, 0x61, + 0x78, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x37, 0x36, + 0x37, 0x70, 0x78, 0x29, 0x20, 0x7b, 0x2e, 0x72, 0x6f, 0x77, 0x2d, + 0x6f, 0x66, 0x66, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x20, 0x7b, + 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x61, 0x6c, + 0x6c, 0x20, 0x2e, 0x32, 0x35, 0x73, 0x20, 0x65, 0x61, 0x73, 0x65, + 0x2d, 0x6f, 0x75, 0x74, 0x3b, 0x2d, 0x6f, 0x2d, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x61, 0x6c, + 0x6c, 0x20, 0x2e, 0x32, 0x35, 0x73, 0x20, 0x65, 0x61, 0x73, 0x65, + 0x2d, 0x6f, 0x75, 0x74, 0x3b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x3a, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x3b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x3a, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x2e, 0x32, 0x35, 0x73, + 0x20, 0x65, 0x61, 0x73, 0x65, 0x2d, 0x6f, 0x75, 0x74, 0x3b, 0x7d, + 0x2e, 0x72, 0x6f, 0x77, 0x2d, 0x6f, 0x66, 0x66, 0x63, 0x61, 0x6e, + 0x76, 0x61, 0x73, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x7b, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x30, 0x3b, 0x7d, 0x2e, + 0x72, 0x6f, 0x77, 0x2d, 0x6f, 0x66, 0x66, 0x63, 0x61, 0x6e, 0x76, + 0x61, 0x73, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x7b, 0x6c, 0x65, + 0x66, 0x74, 0x3a, 0x20, 0x30, 0x3b, 0x7d, 0x2e, 0x72, 0x6f, 0x77, + 0x2d, 0x6f, 0x66, 0x66, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2d, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x73, 0x69, 0x64, 0x65, 0x62, + 0x61, 0x72, 0x2d, 0x6f, 0x66, 0x66, 0x63, 0x61, 0x6e, 0x76, 0x61, + 0x73, 0x20, 0x7b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x2d, + 0x35, 0x30, 0x25, 0x3b, 0x7d, 0x2e, 0x72, 0x6f, 0x77, 0x2d, 0x6f, + 0x66, 0x66, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2d, 0x6c, 0x65, + 0x66, 0x74, 0x2e, 0x73, 0x69, 0x64, 0x65, 0x62, 0x61, 0x72, 0x2d, + 0x6f, 0x66, 0x66, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x20, 0x7b, + 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x20, 0x2d, 0x35, 0x30, 0x25, 0x3b, + 0x7d, 0x2e, 0x72, 0x6f, 0x77, 0x2d, 0x6f, 0x66, 0x66, 0x63, 0x61, + 0x6e, 0x76, 0x61, 0x73, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x2e, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x7b, 0x72, 0x69, 0x67, + 0x68, 0x74, 0x3a, 0x20, 0x35, 0x30, 0x25, 0x3b, 0x7d, 0x2e, 0x72, + 0x6f, 0x77, 0x2d, 0x6f, 0x66, 0x66, 0x63, 0x61, 0x6e, 0x76, 0x61, + 0x73, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x2e, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x20, 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x20, 0x35, + 0x30, 0x25, 0x3b, 0x7d, 0x2e, 0x73, 0x69, 0x64, 0x65, 0x62, 0x61, + 0x72, 0x2d, 0x6f, 0x66, 0x66, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, + 0x20, 0x7b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, + 0x20, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x3b, 0x74, + 0x6f, 0x70, 0x3a, 0x20, 0x30, 0x3b, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x3a, 0x20, 0x35, 0x30, 0x25, 0x3b, 0x7d, 0x3b, 0x7d, 0x40, 0x6d, + 0x65, 0x64, 0x69, 0x61, 0x20, 0x28, 0x6d, 0x69, 0x6e, 0x2d, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x37, 0x36, 0x38, 0x70, 0x78, + 0x29, 0x20, 0x7b, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x20, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, + 0x37, 0x35, 0x30, 0x70, 0x78, 0x3b, 0x7d, 0x3b, 0x7d, 0x40, 0x6d, + 0x65, 0x64, 0x69, 0x61, 0x20, 0x28, 0x6d, 0x61, 0x78, 0x2d, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x34, 0x38, 0x30, 0x70, 0x78, + 0x29, 0x20, 0x7b, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x2d, 0x67, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x68, 0x35, 0x2c, 0x2e, 0x77, + 0x72, 0x61, 0x70, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x68, + 0x35, 0x20, 0x7b, 0x77, 0x68, 0x69, 0x74, 0x65, 0x2d, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x3a, 0x20, 0x6e, 0x6f, 0x77, 0x72, 0x61, 0x70, + 0x3b, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x3a, 0x20, + 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x3b, 0x74, 0x65, 0x78, 0x74, + 0x2d, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x3a, 0x20, + 0x65, 0x6c, 0x6c, 0x69, 0x70, 0x73, 0x69, 0x73, 0x3b, 0x7d, 0x2e, + 0x77, 0x72, 0x61, 0x70, 0x2d, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x6c, 0x20, 0x68, 0x35, 0x20, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x3a, 0x20, 0x31, 0x30, 0x30, 0x25, 0x7d, 0x2e, 0x77, 0x72, 0x61, + 0x70, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x68, 0x35, 0x20, + 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x37, 0x30, 0x25, + 0x7d, 0x7d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x2d, 0x66, 0x6c, 0x75, 0x69, 0x64, 0x20, 0x7b, 0x6d, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x20, + 0x37, 0x35, 0x70, 0x78, 0x3b, 0x7d, 0x40, 0x6d, 0x65, 0x64, 0x69, + 0x61, 0x20, 0x28, 0x6d, 0x69, 0x6e, 0x2d, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x3a, 0x20, 0x31, 0x31, 0x32, 0x30, 0x70, 0x78, 0x29, 0x20, + 0x7b, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x20, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x39, 0x37, + 0x30, 0x70, 0x78, 0x3b, 0x7d, 0x3b, 0x7d, 0x40, 0x6d, 0x65, 0x64, + 0x69, 0x61, 0x20, 0x28, 0x6d, 0x69, 0x6e, 0x2d, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x3a, 0x20, 0x31, 0x33, 0x32, 0x30, 0x70, 0x78, 0x29, + 0x20, 0x7b, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x20, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x31, + 0x31, 0x37, 0x30, 0x70, 0x78, 0x3b, 0x7d, 0x3b, 0x7d, 0x40, 0x6d, + 0x65, 0x64, 0x69, 0x61, 0x20, 0x28, 0x6d, 0x61, 0x78, 0x2d, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x39, 0x39, 0x32, 0x70, 0x78, + 0x29, 0x20, 0x7b, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x2d, 0x66, 0x6c, 0x75, 0x69, 0x64, 0x20, 0x7b, 0x6d, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, + 0x20, 0x61, 0x75, 0x74, 0x6f, 0x3b, 0x7d, 0x3b, 0x7d, 0x40, 0x6d, + 0x65, 0x64, 0x69, 0x61, 0x20, 0x28, 0x6d, 0x61, 0x78, 0x2d, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x37, 0x36, 0x38, 0x70, 0x78, + 0x29, 0x20, 0x7b, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x2d, 0x66, 0x6c, 0x75, 0x69, 0x64, 0x20, 0x7b, 0x70, + 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x6c, 0x65, 0x66, 0x74, + 0x3a, 0x20, 0x35, 0x70, 0x78, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, + 0x6e, 0x67, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x35, + 0x70, 0x78, 0x3b, 0x7d, 0x2e, 0x70, 0x61, 0x67, 0x65, 0x2d, 0x68, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x7b, 0x70, 0x61, 0x64, 0x64, + 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x30, 0x20, 0x31, 0x30, 0x70, 0x78, + 0x3b, 0x7d, 0x7d, 0x2f, 0x2a, 0x20, 0x50, 0x41, 0x4e, 0x45, 0x4c, + 0x20, 0x53, 0x54, 0x59, 0x4c, 0x45, 0x53, 0x20, 0x2a, 0x2f, 0x2e, + 0x77, 0x72, 0x61, 0x70, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, + 0x2e, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2d, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x20, 0x7b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x3a, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, + 0x3b, 0x7d, 0x64, 0x69, 0x76, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x2d, + 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x3e, 0x20, 0x64, 0x69, 0x76, + 0x20, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x3a, 0x20, 0x23, 0x46, 0x46, 0x46, 0x3b, 0x6d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x20, 0x31, 0x30, + 0x70, 0x78, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, + 0x20, 0x30, 0x20, 0x31, 0x30, 0x70, 0x78, 0x3b, 0x62, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x20, 0x31, 0x70, + 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x72, 0x67, 0x62, + 0x61, 0x28, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, + 0x30, 0x2e, 0x31, 0x35, 0x29, 0x3b, 0x7d, 0x2f, 0x2a, 0x20, 0x50, + 0x41, 0x4e, 0x45, 0x4c, 0x20, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x53, + 0x20, 0x2a, 0x2f, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x2d, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x20, + 0x74, 0x72, 0x20, 0x74, 0x64, 0x2c, 0x2e, 0x77, 0x72, 0x61, 0x70, + 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x62, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x62, 0x6f, + 0x64, 0x79, 0x20, 0x74, 0x72, 0x20, 0x74, 0x68, 0x2c, 0x2e, 0x77, + 0x72, 0x61, 0x70, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, + 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x6c, 0x65, 0x73, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x61, 0x64, 0x20, 0x74, 0x72, 0x20, 0x74, 0x68, + 0x20, 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x20, 0x6e, + 0x6f, 0x6e, 0x65, 0x3b, 0x7d, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x2d, + 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x74, 0x68, 0x65, 0x61, 0x64, 0x20, 0x74, 0x72, 0x20, 0x74, + 0x68, 0x20, 0x7b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, + 0x67, 0x6e, 0x3a, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x62, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, + 0x6d, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x31, 0x70, + 0x78, 0x3b, 0x7d, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x2d, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x2e, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x2e, 0x77, 0x72, 0x61, + 0x70, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x65, 0x20, 0x7b, 0x74, + 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x20, + 0x6c, 0x65, 0x66, 0x74, 0x3b, 0x7d, 0x2e, 0x77, 0x72, 0x61, 0x70, + 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x2e, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x20, + 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x38, 0x39, + 0x38, 0x39, 0x38, 0x39, 0x3b, 0x7d, 0x2e, 0x77, 0x72, 0x61, 0x70, + 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x74, 0x64, 0x2c, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x2d, + 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x74, 0x68, 0x20, 0x7b, 0x77, 0x68, 0x69, 0x74, 0x65, 0x2d, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x3a, 0x20, 0x6e, 0x6f, 0x77, 0x72, + 0x61, 0x70, 0x3b, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, + 0x3a, 0x20, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x3b, 0x7d, 0x2e, + 0x77, 0x72, 0x61, 0x70, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x2e, 0x73, 0x6f, + 0x72, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x7b, 0x63, 0x75, 0x72, + 0x73, 0x6f, 0x72, 0x3a, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x3b, 0x7d, 0x2f, 0x2a, 0x20, 0x74, 0x68, 0x65, 0x61, 0x64, + 0x20, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x2a, 0x2f, 0x2e, 0x77, 0x72, + 0x61, 0x70, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x2e, 0x74, + 0x62, 0x6f, 0x64, 0x79, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x7b, + 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x74, 0x6f, 0x70, 0x3a, + 0x20, 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x20, + 0x23, 0x43, 0x37, 0x43, 0x37, 0x43, 0x37, 0x3b, 0x62, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, + 0x20, 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x20, + 0x23, 0x43, 0x37, 0x43, 0x37, 0x43, 0x37, 0x3b, 0x7d, 0x2e, 0x77, + 0x72, 0x61, 0x70, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x2e, + 0x74, 0x62, 0x6f, 0x64, 0x79, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x20, + 0x74, 0x72, 0x20, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, + 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, + 0x23, 0x46, 0x31, 0x46, 0x31, 0x46, 0x31, 0x3b, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x32, 0x32, 0x32, 0x3b, 0x7d, 0x2e, + 0x77, 0x72, 0x61, 0x70, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x62, 0x6f, 0x64, 0x79, + 0x2e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x2d, 0x6d, 0x65, 0x74, 0x61, + 0x20, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x20, 0x7b, 0x66, 0x6f, 0x6e, + 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x36, 0x35, 0x25, + 0x3b, 0x7d, 0x2f, 0x2a, 0x20, 0x74, 0x68, 0x65, 0x61, 0x64, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x2a, 0x2f, 0x2e, 0x77, 0x72, 0x61, + 0x70, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x2e, 0x74, 0x62, + 0x6f, 0x64, 0x79, 0x2d, 0x64, 0x61, 0x74, 0x61, 0x20, 0x74, 0x72, + 0x20, 0x74, 0x64, 0x20, 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x31, 0x70, 0x78, + 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x23, 0x46, 0x31, 0x46, + 0x31, 0x46, 0x31, 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, + 0x7a, 0x65, 0x3a, 0x20, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x65, 0x72, + 0x3b, 0x7d, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x2d, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x62, + 0x6f, 0x64, 0x79, 0x2e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x2d, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x74, 0x64, 0x3a, 0x6c, 0x61, 0x73, 0x74, + 0x2d, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x20, 0x7b, 0x62, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, + 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x7d, 0x2e, 0x77, 0x72, 0x61, 0x70, + 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x2e, 0x74, 0x62, 0x6f, + 0x64, 0x79, 0x2d, 0x64, 0x61, 0x74, 0x61, 0x20, 0x74, 0x64, 0x2e, + 0x72, 0x6f, 0x77, 0x2d, 0x69, 0x64, 0x78, 0x20, 0x7b, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x38, 0x39, 0x38, 0x39, 0x38, + 0x39, 0x3b, 0x7d, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x2d, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, + 0x62, 0x6f, 0x64, 0x79, 0x2b, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x20, + 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x74, 0x6f, 0x70, + 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x31, 0x70, 0x78, + 0x3b, 0x7d, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x2d, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x62, + 0x6f, 0x64, 0x79, 0x2e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x2d, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x74, 0x72, 0x2e, 0x73, 0x68, 0x61, 0x64, + 0x65, 0x64, 0x20, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, + 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, + 0x23, 0x46, 0x37, 0x46, 0x37, 0x46, 0x37, 0x3b, 0x7d, 0x2e, 0x77, + 0x72, 0x61, 0x70, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x2e, + 0x74, 0x62, 0x6f, 0x64, 0x79, 0x2d, 0x64, 0x61, 0x74, 0x61, 0x20, + 0x74, 0x72, 0x2e, 0x20, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, + 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, + 0x20, 0x23, 0x46, 0x37, 0x46, 0x37, 0x46, 0x37, 0x3b, 0x7d, 0x2e, + 0x77, 0x72, 0x61, 0x70, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x62, 0x6f, 0x64, 0x79, + 0x2e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x2d, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x74, 0x72, 0x2e, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x20, 0x74, + 0x64, 0x3a, 0x6e, 0x74, 0x68, 0x2d, 0x63, 0x68, 0x69, 0x6c, 0x64, + 0x28, 0x31, 0x29, 0x2c, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x2d, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, + 0x74, 0x62, 0x6f, 0x64, 0x79, 0x2e, 0x74, 0x62, 0x6f, 0x64, 0x79, + 0x2d, 0x64, 0x61, 0x74, 0x61, 0x20, 0x74, 0x72, 0x2e, 0x63, 0x68, + 0x69, 0x6c, 0x64, 0x20, 0x74, 0x64, 0x3a, 0x6e, 0x74, 0x68, 0x2d, + 0x63, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x32, 0x29, 0x20, 0x7b, 0x62, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x3a, 0x20, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x7d, 0x2e, 0x77, 0x72, + 0x61, 0x70, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x68, + 0x6f, 0x76, 0x65, 0x72, 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, + 0x74, 0x72, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x7b, 0x62, + 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x45, 0x45, 0x45, 0x3b, + 0x7d, 0x2f, 0x2a, 0x20, 0x47, 0x45, 0x4e, 0x45, 0x52, 0x41, 0x4c, + 0x20, 0x2a, 0x2f, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x2d, 0x67, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x7b, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, + 0x69, 0x76, 0x65, 0x3b, 0x7d, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2d, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x20, 0x7b, 0x62, 0x61, + 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x20, 0x23, + 0x46, 0x46, 0x46, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, + 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, 0x20, 0x34, 0x70, 0x78, + 0x3b, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x20, 0x2d, 0x31, + 0x30, 0x70, 0x78, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, + 0x23, 0x39, 0x45, 0x39, 0x45, 0x39, 0x45, 0x3b, 0x66, 0x6f, 0x6e, + 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x73, 0x6d, 0x61, + 0x6c, 0x6c, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, + 0x20, 0x30, 0x20, 0x31, 0x30, 0x70, 0x78, 0x3b, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x61, 0x62, 0x73, 0x6f, + 0x6c, 0x75, 0x74, 0x65, 0x3b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, + 0x20, 0x30, 0x3b, 0x7a, 0x2d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3a, + 0x20, 0x31, 0x3b, 0x7d, 0x2e, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2d, + 0x70, 0x6c, 0x6f, 0x74, 0x2d, 0x77, 0x72, 0x61, 0x70, 0x20, 0x7b, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x61, + 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x3b, 0x72, 0x69, 0x67, + 0x68, 0x74, 0x3a, 0x20, 0x30, 0x3b, 0x74, 0x6f, 0x70, 0x3a, 0x20, + 0x31, 0x38, 0x70, 0x78, 0x3b, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x20, 0x7b, 0x66, 0x6f, 0x6e, 0x74, + 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x38, 0x35, 0x25, 0x3b, + 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x3a, 0x20, 0x68, + 0x69, 0x64, 0x64, 0x65, 0x6e, 0x3b, 0x74, 0x65, 0x78, 0x74, 0x2d, + 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x3a, 0x20, 0x65, + 0x6c, 0x6c, 0x69, 0x70, 0x73, 0x69, 0x73, 0x3b, 0x74, 0x65, 0x78, + 0x74, 0x2d, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x3a, 0x20, 0x31, + 0x70, 0x78, 0x20, 0x31, 0x70, 0x78, 0x20, 0x30, 0x20, 0x23, 0x46, + 0x46, 0x46, 0x3b, 0x77, 0x68, 0x69, 0x74, 0x65, 0x2d, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x3a, 0x20, 0x6e, 0x6f, 0x77, 0x72, 0x61, 0x70, + 0x3b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x31, 0x30, 0x30, + 0x25, 0x3b, 0x7d, 0x2e, 0x67, 0x72, 0x69, 0x64, 0x2d, 0x6d, 0x6f, + 0x64, 0x75, 0x6c, 0x65, 0x20, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x20, 0x23, 0x46, 0x46, 0x46, + 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x72, 0x67, 0x62, + 0x28, 0x33, 0x36, 0x2c, 0x20, 0x33, 0x36, 0x2c, 0x20, 0x33, 0x36, + 0x29, 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x3a, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x3b, + 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x74, 0x6f, 0x70, 0x3a, + 0x20, 0x35, 0x70, 0x78, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, + 0x67, 0x3a, 0x20, 0x37, 0x70, 0x78, 0x3b, 0x7d, 0x2e, 0x67, 0x72, + 0x69, 0x64, 0x2d, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x68, + 0x33, 0x20, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, + 0x65, 0x3a, 0x20, 0x32, 0x35, 0x70, 0x78, 0x3b, 0x6d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x3a, 0x20, 0x30, 0x3b, 0x6f, 0x76, 0x65, 0x72, + 0x66, 0x6c, 0x6f, 0x77, 0x3a, 0x20, 0x68, 0x69, 0x64, 0x64, 0x65, + 0x6e, 0x3b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x6f, 0x76, 0x65, 0x72, + 0x66, 0x6c, 0x6f, 0x77, 0x3a, 0x20, 0x65, 0x6c, 0x6c, 0x69, 0x70, + 0x73, 0x69, 0x73, 0x3b, 0x77, 0x68, 0x69, 0x74, 0x65, 0x2d, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x3a, 0x20, 0x6e, 0x6f, 0x77, 0x72, 0x61, + 0x70, 0x3b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x31, 0x30, + 0x30, 0x25, 0x3b, 0x7d, 0x2e, 0x67, 0x72, 0x69, 0x64, 0x2d, 0x6d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2e, 0x62, 0x6c, 0x61, 0x63, 0x6b, + 0x20, 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x74, 0x6f, + 0x70, 0x3a, 0x20, 0x34, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, + 0x64, 0x20, 0x23, 0x30, 0x46, 0x31, 0x32, 0x31, 0x34, 0x3b, 0x7d, + 0x2e, 0x67, 0x72, 0x69, 0x64, 0x2d, 0x6d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x2e, 0x67, 0x72, 0x61, 0x79, 0x20, 0x7b, 0x62, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x20, 0x34, 0x70, + 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x23, 0x39, 0x45, + 0x39, 0x45, 0x39, 0x45, 0x3b, 0x7d, 0x2e, 0x67, 0x72, 0x69, 0x64, + 0x2d, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x64, + 0x20, 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x74, 0x6f, + 0x70, 0x3a, 0x20, 0x34, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, + 0x64, 0x20, 0x23, 0x46, 0x46, 0x33, 0x30, 0x33, 0x45, 0x3b, 0x7d, + 0x2e, 0x67, 0x72, 0x69, 0x64, 0x2d, 0x6d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x2e, 0x62, 0x6c, 0x75, 0x65, 0x7b, 0x62, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x20, 0x34, 0x70, 0x78, + 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x23, 0x30, 0x30, 0x44, + 0x34, 0x45, 0x31, 0x3b, 0x7d, 0x2e, 0x67, 0x72, 0x69, 0x64, 0x2d, + 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2e, 0x67, 0x72, 0x65, 0x65, + 0x6e, 0x20, 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x74, + 0x6f, 0x70, 0x3a, 0x20, 0x34, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, + 0x69, 0x64, 0x20, 0x23, 0x35, 0x44, 0x42, 0x35, 0x36, 0x41, 0x3b, + 0x7d, 0x40, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x20, 0x28, 0x6d, 0x61, + 0x78, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x37, 0x36, + 0x37, 0x70, 0x78, 0x29, 0x20, 0x7b, 0x2e, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x2d, 0x70, 0x6c, 0x6f, 0x74, 0x2d, 0x77, 0x72, 0x61, 0x70, + 0x20, 0x7b, 0x74, 0x6f, 0x70, 0x3a, 0x20, 0x31, 0x30, 0x70, 0x78, + 0x3b, 0x7d, 0x2e, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x65, 0x64, 0x20, + 0x7b, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x20, 0x31, 0x30, + 0x70, 0x78, 0x3b, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x20, 0x32, 0x35, + 0x70, 0x78, 0x3b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, + 0x6d, 0x3a, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x3b, + 0x7d, 0x7d, 0x2f, 0x2a, 0x20, 0x43, 0x48, 0x41, 0x52, 0x54, 0x53, + 0x20, 0x2a, 0x2f, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x74, 0x2d, 0x77, + 0x72, 0x61, 0x70, 0x20, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, + 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x20, 0x31, 0x35, + 0x70, 0x78, 0x3b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x3a, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x3b, + 0x7d, 0x73, 0x76, 0x67, 0x20, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x20, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x3a, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3b, + 0x7d, 0x2e, 0x61, 0x78, 0x69, 0x73, 0x20, 0x70, 0x61, 0x74, 0x68, + 0x20, 0x7b, 0x66, 0x69, 0x6c, 0x6c, 0x3a, 0x20, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3b, 0x73, 0x74, + 0x72, 0x6f, 0x6b, 0x65, 0x3a, 0x20, 0x62, 0x6c, 0x61, 0x63, 0x6b, + 0x3b, 0x73, 0x68, 0x61, 0x70, 0x65, 0x2d, 0x72, 0x65, 0x6e, 0x64, + 0x65, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x63, 0x72, 0x69, 0x73, + 0x70, 0x45, 0x64, 0x67, 0x65, 0x73, 0x3b, 0x73, 0x74, 0x72, 0x6f, + 0x6b, 0x65, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x31, + 0x3b, 0x7d, 0x2e, 0x67, 0x72, 0x69, 0x64, 0x2e, 0x79, 0x20, 0x2e, + 0x74, 0x69, 0x63, 0x6b, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x2e, + 0x67, 0x72, 0x69, 0x64, 0x2e, 0x78, 0x20, 0x2e, 0x74, 0x69, 0x63, + 0x6b, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x7b, 0x73, 0x68, 0x61, + 0x70, 0x65, 0x2d, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x69, 0x6e, + 0x67, 0x3a, 0x20, 0x63, 0x72, 0x69, 0x73, 0x70, 0x45, 0x64, 0x67, + 0x65, 0x73, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x3a, 0x20, + 0x23, 0x39, 0x39, 0x39, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, + 0x2d, 0x64, 0x61, 0x73, 0x68, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3a, + 0x20, 0x33, 0x20, 0x33, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, + 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x31, 0x3b, 0x7d, + 0x2e, 0x61, 0x78, 0x69, 0x73, 0x2e, 0x78, 0x20, 0x2e, 0x74, 0x69, + 0x63, 0x6b, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x2e, 0x61, 0x78, + 0x69, 0x73, 0x2e, 0x79, 0x30, 0x20, 0x2e, 0x74, 0x69, 0x63, 0x6b, + 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x2e, 0x61, 0x78, 0x69, 0x73, + 0x2e, 0x79, 0x31, 0x20, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x20, 0x6c, + 0x69, 0x6e, 0x65, 0x2c, 0x2e, 0x67, 0x72, 0x69, 0x64, 0x2e, 0x79, + 0x20, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x3a, 0x66, 0x69, 0x72, 0x73, + 0x74, 0x2d, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x20, 0x6c, 0x69, 0x6e, + 0x65, 0x20, 0x7b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x3a, 0x20, + 0x62, 0x6c, 0x61, 0x63, 0x6b, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, + 0x65, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x31, 0x3b, + 0x73, 0x68, 0x61, 0x70, 0x65, 0x2d, 0x72, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x63, 0x72, 0x69, 0x73, 0x70, + 0x45, 0x64, 0x67, 0x65, 0x73, 0x3b, 0x7d, 0x2e, 0x62, 0x61, 0x72, + 0x73, 0x20, 0x72, 0x65, 0x63, 0x74, 0x2e, 0x62, 0x61, 0x72, 0x20, + 0x7b, 0x73, 0x68, 0x61, 0x70, 0x65, 0x2d, 0x72, 0x65, 0x6e, 0x64, + 0x65, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x63, 0x72, 0x69, 0x73, + 0x70, 0x45, 0x64, 0x67, 0x65, 0x73, 0x3b, 0x7d, 0x2e, 0x72, 0x65, + 0x63, 0x74, 0x73, 0x20, 0x72, 0x65, 0x63, 0x74, 0x20, 0x7b, 0x66, + 0x69, 0x6c, 0x6c, 0x3a, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3b, 0x7d, 0x2e, 0x61, 0x72, 0x65, + 0x61, 0x20, 0x7b, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, + 0x20, 0x30, 0x2e, 0x32, 0x3b, 0x7d, 0x2e, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x73, 0x20, 0x7b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x3a, + 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x3b, 0x7d, 0x6c, 0x69, 0x6e, 0x65, 0x2e, 0x69, 0x6e, 0x64, + 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x7b, 0x66, 0x69, 0x6c, + 0x6c, 0x3a, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x3b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x2d, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x20, 0x6e, 0x6f, + 0x6e, 0x65, 0x3b, 0x73, 0x68, 0x61, 0x70, 0x65, 0x2d, 0x72, 0x65, + 0x6e, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x63, 0x72, + 0x69, 0x73, 0x70, 0x45, 0x64, 0x67, 0x65, 0x73, 0x3b, 0x73, 0x74, + 0x72, 0x6f, 0x6b, 0x65, 0x3a, 0x20, 0x23, 0x39, 0x39, 0x39, 0x3b, + 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x3a, 0x20, 0x31, 0x3b, 0x7d, 0x2e, 0x61, 0x72, 0x65, 0x61, + 0x30, 0x2c, 0x2e, 0x62, 0x61, 0x72, 0x73, 0x2e, 0x79, 0x30, 0x20, + 0x2e, 0x62, 0x61, 0x72, 0x2c, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x73, 0x2e, 0x79, 0x30, 0x2c, 0x72, 0x65, 0x63, 0x74, 0x2e, 0x6c, + 0x65, 0x67, 0x65, 0x6e, 0x64, 0x2e, 0x79, 0x30, 0x20, 0x7b, 0x66, + 0x69, 0x6c, 0x6c, 0x3a, 0x20, 0x23, 0x34, 0x34, 0x37, 0x46, 0x42, + 0x33, 0x3b, 0x7d, 0x2e, 0x61, 0x72, 0x65, 0x61, 0x31, 0x2c, 0x2e, + 0x62, 0x61, 0x72, 0x73, 0x2e, 0x79, 0x31, 0x20, 0x2e, 0x62, 0x61, + 0x72, 0x2c, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x2e, 0x79, + 0x31, 0x2c, 0x72, 0x65, 0x63, 0x74, 0x2e, 0x6c, 0x65, 0x67, 0x65, + 0x6e, 0x64, 0x2e, 0x79, 0x31, 0x20, 0x7b, 0x66, 0x69, 0x6c, 0x6c, + 0x3a, 0x20, 0x23, 0x46, 0x46, 0x36, 0x38, 0x35, 0x34, 0x3b, 0x7d, + 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x30, 0x2c, 0x2e, 0x6c, 0x69, 0x6e, + 0x65, 0x31, 0x20, 0x7b, 0x66, 0x69, 0x6c, 0x6c, 0x3a, 0x20, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3b, + 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x3a, 0x20, 0x31, 0x3b, 0x7d, 0x2e, 0x6c, 0x69, 0x6e, 0x65, + 0x30, 0x20, 0x7b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x3a, 0x20, + 0x23, 0x30, 0x30, 0x37, 0x42, 0x43, 0x33, 0x3b, 0x7d, 0x2e, 0x6c, + 0x69, 0x6e, 0x65, 0x31, 0x20, 0x7b, 0x73, 0x74, 0x72, 0x6f, 0x6b, + 0x65, 0x3a, 0x20, 0x23, 0x46, 0x46, 0x33, 0x30, 0x33, 0x45, 0x3b, + 0x7d, 0x2e, 0x61, 0x78, 0x69, 0x73, 0x20, 0x74, 0x65, 0x78, 0x74, + 0x2c, 0x2e, 0x61, 0x78, 0x69, 0x73, 0x2d, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x2c, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x6c, 0x65, 0x67, 0x65, + 0x6e, 0x64, 0x20, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x3a, 0x20, 0x31, + 0x30, 0x70, 0x78, 0x20, 0x73, 0x61, 0x6e, 0x73, 0x2d, 0x73, 0x65, + 0x72, 0x69, 0x66, 0x3b, 0x7d, 0x2e, 0x61, 0x78, 0x69, 0x73, 0x2d, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2e, 0x79, 0x30, 0x2c, 0x2e, 0x61, + 0x78, 0x69, 0x73, 0x2d, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2e, 0x79, + 0x31, 0x20, 0x7b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6e, 0x63, + 0x68, 0x6f, 0x72, 0x3a, 0x20, 0x65, 0x6e, 0x64, 0x3b, 0x7d, 0x72, + 0x65, 0x63, 0x74, 0x2e, 0x6c, 0x65, 0x67, 0x65, 0x6e, 0x64, 0x20, + 0x7b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x31, 0x30, + 0x70, 0x78, 0x3b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x31, + 0x30, 0x70, 0x78, 0x3b, 0x7d, 0x2e, 0x6c, 0x65, 0x67, 0x65, 0x6e, + 0x64, 0x20, 0x7b, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x3a, 0x20, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x7d, 0x2e, 0x77, + 0x72, 0x61, 0x70, 0x2d, 0x74, 0x65, 0x78, 0x74, 0x20, 0x74, 0x65, + 0x78, 0x74, 0x20, 0x7b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6e, + 0x63, 0x68, 0x6f, 0x72, 0x3a, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x3b, + 0x7d, 0x2f, 0x2a, 0x20, 0x43, 0x48, 0x41, 0x52, 0x54, 0x20, 0x54, + 0x4f, 0x4f, 0x4c, 0x54, 0x49, 0x50, 0x20, 0x2a, 0x2f, 0x2e, 0x63, + 0x68, 0x61, 0x72, 0x74, 0x2d, 0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69, + 0x70, 0x2d, 0x77, 0x72, 0x61, 0x70, 0x20, 0x7b, 0x6c, 0x65, 0x66, + 0x74, 0x3a, 0x20, 0x30, 0x3b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x2d, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x20, 0x6e, + 0x6f, 0x6e, 0x65, 0x3b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x3a, 0x20, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, + 0x3b, 0x74, 0x6f, 0x70, 0x3a, 0x20, 0x31, 0x30, 0x70, 0x78, 0x3b, + 0x7a, 0x2d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x20, 0x31, 0x30, + 0x3b, 0x7d, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x74, 0x2d, 0x74, 0x6f, + 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x20, 0x7b, 0x2d, 0x6d, 0x6f, 0x7a, + 0x2d, 0x62, 0x6f, 0x78, 0x2d, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, + 0x3a, 0x20, 0x37, 0x70, 0x78, 0x20, 0x37, 0x70, 0x78, 0x20, 0x31, + 0x32, 0x70, 0x78, 0x20, 0x2d, 0x39, 0x70, 0x78, 0x20, 0x23, 0x37, + 0x37, 0x37, 0x37, 0x37, 0x37, 0x3b, 0x2d, 0x77, 0x65, 0x62, 0x6b, + 0x69, 0x74, 0x2d, 0x62, 0x6f, 0x78, 0x2d, 0x73, 0x68, 0x61, 0x64, + 0x6f, 0x77, 0x3a, 0x20, 0x37, 0x70, 0x78, 0x20, 0x37, 0x70, 0x78, + 0x20, 0x31, 0x32, 0x70, 0x78, 0x20, 0x2d, 0x39, 0x70, 0x78, 0x20, + 0x23, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x3b, 0x62, 0x61, 0x63, + 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x62, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x70, + 0x73, 0x65, 0x3a, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x70, 0x73, + 0x65, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x73, 0x70, + 0x61, 0x63, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x30, 0x3b, 0x62, 0x6f, + 0x78, 0x2d, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x3a, 0x20, 0x37, + 0x70, 0x78, 0x20, 0x37, 0x70, 0x78, 0x20, 0x31, 0x32, 0x70, 0x78, + 0x20, 0x2d, 0x39, 0x70, 0x78, 0x20, 0x23, 0x37, 0x37, 0x37, 0x37, + 0x37, 0x37, 0x3b, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2d, 0x63, 0x65, + 0x6c, 0x6c, 0x73, 0x3a, 0x20, 0x73, 0x68, 0x6f, 0x77, 0x3b, 0x6f, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x20, 0x30, 0x2e, 0x39, + 0x3b, 0x7d, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x74, 0x2d, 0x74, 0x6f, + 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x20, 0x74, 0x72, 0x20, 0x7b, 0x62, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x20, 0x31, 0x70, 0x78, 0x20, + 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x23, 0x43, 0x43, 0x43, 0x3b, + 0x7d, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x74, 0x2d, 0x74, 0x6f, 0x6f, + 0x6c, 0x74, 0x69, 0x70, 0x20, 0x74, 0x68, 0x20, 0x7b, 0x62, 0x61, + 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x61, 0x61, 0x61, 0x3b, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x46, 0x46, 0x46, 0x3b, + 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20, + 0x31, 0x34, 0x70, 0x78, 0x3b, 0x6d, 0x61, 0x78, 0x2d, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3a, 0x20, 0x33, 0x38, 0x30, 0x70, 0x78, 0x3b, + 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x3a, 0x20, 0x68, + 0x69, 0x64, 0x64, 0x65, 0x6e, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, + 0x6e, 0x67, 0x3a, 0x20, 0x32, 0x70, 0x78, 0x20, 0x35, 0x70, 0x78, + 0x3b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, + 0x3a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x3b, 0x74, 0x65, 0x78, 0x74, + 0x2d, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x3a, 0x20, + 0x65, 0x6c, 0x6c, 0x69, 0x70, 0x73, 0x69, 0x73, 0x3b, 0x77, 0x68, + 0x69, 0x74, 0x65, 0x2d, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3a, 0x20, + 0x6e, 0x6f, 0x77, 0x72, 0x61, 0x70, 0x3b, 0x7d, 0x2e, 0x63, 0x68, + 0x61, 0x72, 0x74, 0x2d, 0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, + 0x20, 0x74, 0x64, 0x20, 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x20, 0x31, 0x70, 0x78, 0x20, + 0x64, 0x6f, 0x74, 0x74, 0x65, 0x64, 0x20, 0x23, 0x39, 0x39, 0x39, + 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, + 0x20, 0x31, 0x33, 0x70, 0x78, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, + 0x6e, 0x67, 0x3a, 0x20, 0x33, 0x70, 0x78, 0x20, 0x36, 0x70, 0x78, + 0x3b, 0x7d, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x74, 0x2d, 0x74, 0x6f, + 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x20, 0x74, 0x64, 0x20, 0x3e, 0x20, + 0x73, 0x70, 0x61, 0x6e, 0x20, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, + 0x61, 0x79, 0x3a, 0x20, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2d, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3b, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x3a, 0x20, 0x31, 0x30, 0x70, 0x78, 0x3b, 0x6d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, + 0x36, 0x70, 0x78, 0x3b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, + 0x31, 0x30, 0x70, 0x78, 0x3b, 0x7d, 0x2e, 0x63, 0x68, 0x61, 0x72, + 0x74, 0x2d, 0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x20, 0x74, + 0x64, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x7b, 0x74, 0x65, + 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x20, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x3b, 0x7d, 0x2e, 0x63, 0x68, 0x61, 0x72, + 0x74, 0x2d, 0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x20, 0x2e, + 0x62, 0x6c, 0x75, 0x65, 0x20, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x20, 0x23, 0x30, 0x30, 0x37, 0x42, 0x43, 0x33, 0x3b, 0x7d, + 0x2e, 0x63, 0x68, 0x61, 0x72, 0x74, 0x2d, 0x74, 0x6f, 0x6f, 0x6c, + 0x74, 0x69, 0x70, 0x20, 0x2e, 0x72, 0x65, 0x64, 0x20, 0x7b, 0x62, + 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x46, 0x46, 0x33, 0x30, + 0x33, 0x45, 0x3b, 0x7d, 0x2f, 0x2a, 0x20, 0x44, 0x41, 0x52, 0x4b, + 0x20, 0x54, 0x48, 0x45, 0x4d, 0x45, 0x20, 0x2a, 0x2f, 0x2e, 0x64, + 0x61, 0x72, 0x6b, 0x20, 0x68, 0x31, 0x20, 0x7b, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x20, 0x72, 0x67, 0x62, 0x61, 0x28, 0x32, 0x35, + 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, + 0x2c, 0x20, 0x30, 0x2e, 0x36, 0x29, 0x3b, 0x7d, 0x2e, 0x64, 0x61, + 0x72, 0x6b, 0x20, 0x68, 0x33, 0x2c, 0x2e, 0x64, 0x61, 0x72, 0x6b, + 0x20, 0x68, 0x34, 0x2c, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x20, 0x68, + 0x35, 0x20, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x72, + 0x67, 0x62, 0x61, 0x28, 0x32, 0x35, 0x35, 0x2c, 0x32, 0x35, 0x35, + 0x2c, 0x32, 0x35, 0x35, 0x2c, 0x30, 0x2e, 0x34, 0x29, 0x3b, 0x7d, + 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x20, 0x2e, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x76, + 0x65, 0x20, 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x20, + 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, + 0x20, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x2d, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x20, 0x3e, 0x20, 0x64, 0x69, 0x76, 0x20, 0x3e, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x20, 0x23, 0x44, 0x32, 0x44, 0x32, 0x44, 0x32, 0x3b, 0x7d, + 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x20, 0x2e, 0x77, 0x72, 0x61, 0x70, + 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x2e, 0x74, 0x62, 0x6f, + 0x64, 0x79, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x74, 0x72, 0x20, + 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, + 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3b, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x46, 0x37, 0x46, 0x37, 0x46, + 0x37, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x20, 0x2e, 0x77, + 0x72, 0x61, 0x70, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x2e, + 0x74, 0x62, 0x6f, 0x64, 0x79, 0x2d, 0x64, 0x61, 0x74, 0x61, 0x20, + 0x74, 0x72, 0x20, 0x74, 0x64, 0x20, 0x7b, 0x62, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x6e, + 0x6f, 0x6e, 0x65, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x20, + 0x2e, 0x77, 0x72, 0x61, 0x70, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2d, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x3e, 0x74, 0x62, 0x6f, + 0x64, 0x79, 0x2e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x2d, 0x64, 0x61, + 0x74, 0x61, 0x3e, 0x74, 0x72, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, + 0x20, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x72, 0x67, + 0x62, 0x61, 0x28, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, + 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x38, + 0x29, 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, + 0x74, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x20, 0x2e, 0x63, + 0x6f, 0x6c, 0x2d, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x20, 0x7b, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x39, 0x65, 0x39, 0x65, + 0x39, 0x65, 0x3b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x73, 0x68, 0x61, + 0x64, 0x6f, 0x77, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x7d, 0x2e, + 0x64, 0x61, 0x72, 0x6b, 0x20, 0x2e, 0x67, 0x72, 0x69, 0x64, 0x2d, + 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x68, 0x33, 0x20, 0x7b, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x46, 0x46, 0x46, + 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x20, 0x2e, 0x64, 0x72, + 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x6d, 0x65, 0x6e, 0x75, + 0x3e, 0x6c, 0x69, 0x3e, 0x61, 0x20, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x20, 0x23, 0x46, 0x46, 0x46, 0x3b, 0x7d, 0x2e, 0x64, + 0x61, 0x72, 0x6b, 0x20, 0x64, 0x69, 0x76, 0x2e, 0x77, 0x72, 0x61, + 0x70, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x3e, 0x20, 0x64, + 0x69, 0x76, 0x20, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, + 0x23, 0x45, 0x45, 0x45, 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, + 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x20, 0x31, 0x30, 0x70, 0x78, 0x3b, + 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x30, 0x20, + 0x31, 0x30, 0x70, 0x78, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x20, 0x31, 0x70, 0x78, 0x20, 0x73, + 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x72, 0x67, 0x62, 0x61, 0x28, 0x32, + 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, + 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x35, 0x29, 0x3b, 0x7d, 0x2f, + 0x2a, 0x20, 0x44, 0x41, 0x52, 0x4b, 0x20, 0x42, 0x4c, 0x55, 0x45, + 0x20, 0x54, 0x48, 0x45, 0x4d, 0x45, 0x20, 0x2a, 0x2f, 0x68, 0x74, + 0x6d, 0x6c, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x62, 0x6c, 0x75, + 0x65, 0x2c, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x62, 0x6c, 0x75, + 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x7b, 0x62, 0x61, 0x63, + 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x20, 0x23, 0x32, + 0x35, 0x32, 0x42, 0x33, 0x30, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, + 0x6b, 0x2e, 0x62, 0x6c, 0x75, 0x65, 0x20, 0x2e, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x20, 0x7b, 0x62, 0x61, 0x63, + 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x20, 0x23, 0x32, + 0x35, 0x32, 0x42, 0x33, 0x30, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, + 0x6b, 0x2e, 0x62, 0x6c, 0x75, 0x65, 0x20, 0x2e, 0x70, 0x61, 0x67, + 0x65, 0x2d, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x7b, 0x62, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, + 0x6d, 0x3a, 0x20, 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, + 0x64, 0x20, 0x23, 0x33, 0x42, 0x34, 0x34, 0x34, 0x43, 0x3b, 0x7d, + 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x62, 0x6c, 0x75, 0x65, 0x20, + 0x2e, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2d, 0x69, 0x6e, 0x66, 0x6f, + 0x20, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x32, + 0x35, 0x32, 0x42, 0x33, 0x30, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, + 0x6b, 0x2e, 0x62, 0x6c, 0x75, 0x65, 0x20, 0x6e, 0x61, 0x76, 0x20, + 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x72, 0x69, 0x67, + 0x68, 0x74, 0x3a, 0x20, 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, + 0x69, 0x64, 0x20, 0x23, 0x31, 0x38, 0x31, 0x42, 0x31, 0x46, 0x3b, + 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, + 0x20, 0x23, 0x31, 0x46, 0x32, 0x33, 0x32, 0x38, 0x3b, 0x7d, 0x2e, + 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x62, 0x6c, 0x75, 0x65, 0x20, 0x64, + 0x69, 0x76, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x2d, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x20, 0x3e, 0x20, 0x64, 0x69, 0x76, 0x20, 0x7b, 0x62, + 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x20, + 0x23, 0x31, 0x46, 0x32, 0x33, 0x32, 0x38, 0x3b, 0x7d, 0x2e, 0x64, + 0x61, 0x72, 0x6b, 0x2e, 0x62, 0x6c, 0x75, 0x65, 0x20, 0x2e, 0x77, + 0x72, 0x61, 0x70, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x2e, + 0x74, 0x62, 0x6f, 0x64, 0x79, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x20, + 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x74, 0x6f, 0x70, + 0x3a, 0x20, 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, + 0x20, 0x23, 0x33, 0x42, 0x34, 0x34, 0x34, 0x43, 0x3b, 0x62, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, + 0x3a, 0x20, 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, + 0x20, 0x23, 0x33, 0x42, 0x34, 0x34, 0x34, 0x43, 0x3b, 0x7d, 0x2e, + 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x62, 0x6c, 0x75, 0x65, 0x20, 0x2e, + 0x77, 0x72, 0x61, 0x70, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x62, 0x6f, 0x64, 0x79, + 0x2e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x2d, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x74, 0x72, 0x2e, 0x73, 0x68, 0x61, 0x64, 0x65, 0x64, 0x20, + 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, + 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x31, 0x38, + 0x31, 0x42, 0x31, 0x46, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, + 0x2e, 0x62, 0x6c, 0x75, 0x65, 0x20, 0x2e, 0x67, 0x72, 0x61, 0x79, + 0x20, 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x74, 0x6f, + 0x70, 0x3a, 0x20, 0x34, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, + 0x64, 0x20, 0x23, 0x33, 0x42, 0x34, 0x34, 0x34, 0x43, 0x3b, 0x7d, + 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x62, 0x6c, 0x75, 0x65, 0x20, + 0x2e, 0x67, 0x72, 0x69, 0x64, 0x2d, 0x6d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x20, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, + 0x6e, 0x64, 0x3a, 0x20, 0x23, 0x31, 0x46, 0x32, 0x33, 0x32, 0x38, + 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x62, 0x6c, 0x75, + 0x65, 0x20, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x20, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, + 0x20, 0x23, 0x39, 0x45, 0x39, 0x45, 0x39, 0x45, 0x3b, 0x62, 0x61, + 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x31, 0x46, 0x32, 0x33, 0x32, + 0x38, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x33, 0x42, 0x34, 0x34, 0x34, + 0x43, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x62, 0x6c, + 0x75, 0x65, 0x20, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x2c, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x62, 0x6c, 0x75, 0x65, + 0x20, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x64, + 0x61, 0x72, 0x6b, 0x2e, 0x62, 0x6c, 0x75, 0x65, 0x20, 0x2e, 0x62, + 0x74, 0x6e, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2c, 0x2e, 0x64, 0x61, 0x72, + 0x6b, 0x2e, 0x62, 0x6c, 0x75, 0x65, 0x20, 0x2e, 0x6f, 0x70, 0x65, + 0x6e, 0x3e, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, + 0x2d, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x2e, 0x62, 0x74, 0x6e, + 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x7b, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x33, 0x42, 0x34, 0x34, + 0x34, 0x43, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, + 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, + 0x31, 0x46, 0x32, 0x33, 0x32, 0x38, 0x3b, 0x62, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, + 0x30, 0x46, 0x31, 0x32, 0x31, 0x34, 0x3b, 0x7d, 0x2e, 0x64, 0x61, + 0x72, 0x6b, 0x2e, 0x62, 0x6c, 0x75, 0x65, 0x20, 0x2e, 0x70, 0x61, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x2e, 0x64, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x3e, 0x61, 0x2c, 0x2e, + 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x62, 0x6c, 0x75, 0x65, 0x20, 0x2e, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, + 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x3e, 0x61, + 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x64, 0x61, 0x72, + 0x6b, 0x2e, 0x62, 0x6c, 0x75, 0x65, 0x20, 0x2e, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x2e, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x3e, 0x61, 0x3a, 0x66, 0x6f, + 0x63, 0x75, 0x73, 0x20, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, + 0x20, 0x23, 0x37, 0x37, 0x37, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, + 0x6b, 0x2e, 0x62, 0x6c, 0x75, 0x65, 0x20, 0x2e, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x6c, 0x69, 0x3e, + 0x61, 0x20, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, + 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, + 0x31, 0x46, 0x32, 0x33, 0x32, 0x38, 0x3b, 0x62, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x3a, 0x20, 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, + 0x69, 0x64, 0x20, 0x23, 0x33, 0x42, 0x34, 0x34, 0x34, 0x43, 0x3b, + 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x62, 0x6c, 0x75, 0x65, + 0x20, 0x2e, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x3e, 0x6c, 0x69, 0x3e, 0x61, 0x3a, 0x68, 0x6f, 0x76, 0x65, + 0x72, 0x2c, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x62, 0x6c, 0x75, + 0x65, 0x20, 0x2e, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x3e, 0x6c, 0x69, 0x3e, 0x61, 0x3a, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x2c, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x62, + 0x6c, 0x75, 0x65, 0x20, 0x2e, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x6c, 0x69, 0x3e, 0x61, 0x3a, 0x66, + 0x6f, 0x63, 0x75, 0x73, 0x20, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x20, 0x23, 0x30, 0x33, 0x37, 0x30, 0x42, 0x30, 0x3b, 0x62, + 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x31, 0x46, 0x32, 0x33, + 0x32, 0x38, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x33, 0x42, 0x34, 0x34, + 0x34, 0x43, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x62, + 0x6c, 0x75, 0x65, 0x20, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, + 0x77, 0x6e, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x3e, 0x6c, 0x69, 0x3e, + 0x61, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x64, 0x61, + 0x72, 0x6b, 0x2e, 0x62, 0x6c, 0x75, 0x65, 0x20, 0x2e, 0x64, 0x72, + 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x6d, 0x65, 0x6e, 0x75, + 0x3e, 0x6c, 0x69, 0x3e, 0x61, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, + 0x20, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x46, + 0x46, 0x46, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, + 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, + 0x33, 0x42, 0x34, 0x34, 0x34, 0x43, 0x3b, 0x7d, 0x2e, 0x64, 0x61, + 0x72, 0x6b, 0x2e, 0x62, 0x6c, 0x75, 0x65, 0x20, 0x2e, 0x64, 0x72, + 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x6d, 0x65, 0x6e, 0x75, + 0x20, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x32, + 0x35, 0x32, 0x42, 0x33, 0x30, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, + 0x6b, 0x2e, 0x62, 0x6c, 0x75, 0x65, 0x3a, 0x3a, 0x2d, 0x77, 0x65, + 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x73, 0x63, 0x72, 0x6f, 0x6c, 0x6c, + 0x62, 0x61, 0x72, 0x2d, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x2c, 0x2e, + 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x62, 0x6c, 0x75, 0x65, 0x20, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x69, 0x76, 0x65, 0x3a, 0x3a, 0x2d, 0x77, 0x65, 0x62, + 0x6b, 0x69, 0x74, 0x2d, 0x73, 0x63, 0x72, 0x6f, 0x6c, 0x6c, 0x62, + 0x61, 0x72, 0x2d, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x20, 0x7b, 0x2d, + 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x62, 0x6f, 0x78, 0x2d, + 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x3a, 0x20, 0x69, 0x6e, 0x73, + 0x65, 0x74, 0x20, 0x30, 0x20, 0x30, 0x20, 0x36, 0x70, 0x78, 0x20, + 0x72, 0x67, 0x62, 0x61, 0x28, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, + 0x30, 0x2e, 0x33, 0x29, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, + 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, + 0x20, 0x23, 0x39, 0x45, 0x39, 0x45, 0x39, 0x45, 0x3b, 0x7d, 0x2e, + 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x62, 0x6c, 0x75, 0x65, 0x3a, 0x3a, + 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x73, 0x63, 0x72, + 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x72, 0x2c, 0x2e, 0x64, 0x61, 0x72, + 0x6b, 0x2e, 0x62, 0x6c, 0x75, 0x65, 0x20, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, + 0x76, 0x65, 0x3a, 0x3a, 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, + 0x2d, 0x73, 0x63, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x72, 0x20, + 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x31, 0x30, 0x70, + 0x78, 0x3b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x31, + 0x30, 0x70, 0x78, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, + 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, + 0x23, 0x39, 0x45, 0x39, 0x45, 0x39, 0x45, 0x3b, 0x7d, 0x2e, 0x64, + 0x61, 0x72, 0x6b, 0x2e, 0x62, 0x6c, 0x75, 0x65, 0x3a, 0x3a, 0x2d, + 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x73, 0x63, 0x72, 0x6f, + 0x6c, 0x6c, 0x62, 0x61, 0x72, 0x2d, 0x74, 0x68, 0x75, 0x6d, 0x62, + 0x2c, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x62, 0x6c, 0x75, 0x65, + 0x20, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x3a, 0x3a, 0x2d, 0x77, + 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x73, 0x63, 0x72, 0x6f, 0x6c, + 0x6c, 0x62, 0x61, 0x72, 0x2d, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x20, + 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, + 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x33, 0x42, + 0x34, 0x34, 0x34, 0x43, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, + 0x2e, 0x62, 0x6c, 0x75, 0x65, 0x20, 0x2e, 0x63, 0x68, 0x61, 0x72, + 0x74, 0x2d, 0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x20, 0x7b, + 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x32, 0x35, 0x32, + 0x42, 0x33, 0x30, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, + 0x62, 0x6c, 0x75, 0x65, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2d, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x20, 0x7b, 0x62, 0x61, + 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x20, 0x23, + 0x31, 0x46, 0x32, 0x33, 0x32, 0x38, 0x3b, 0x7d, 0x2f, 0x2a, 0x20, + 0x44, 0x41, 0x52, 0x4b, 0x20, 0x47, 0x52, 0x45, 0x59, 0x20, 0x54, + 0x48, 0x45, 0x4d, 0x45, 0x20, 0x2a, 0x2f, 0x68, 0x74, 0x6d, 0x6c, + 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x67, 0x72, 0x61, 0x79, 0x2c, + 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x67, 0x72, 0x61, 0x79, 0x20, + 0x62, 0x6f, 0x64, 0x79, 0x20, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x20, 0x23, 0x32, 0x31, 0x32, + 0x31, 0x32, 0x31, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, + 0x67, 0x72, 0x61, 0x79, 0x20, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x20, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x20, 0x23, 0x32, 0x31, 0x32, + 0x31, 0x32, 0x31, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, + 0x67, 0x72, 0x61, 0x79, 0x20, 0x2e, 0x70, 0x61, 0x67, 0x65, 0x2d, + 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x7b, 0x62, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, + 0x20, 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x20, + 0x23, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x3b, 0x7d, 0x2e, 0x64, + 0x61, 0x72, 0x6b, 0x2e, 0x67, 0x72, 0x61, 0x79, 0x20, 0x2e, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x7b, + 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x33, 0x30, 0x33, + 0x30, 0x33, 0x30, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, + 0x67, 0x72, 0x61, 0x79, 0x20, 0x6e, 0x61, 0x76, 0x20, 0x7b, 0x62, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x3a, 0x20, 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, + 0x20, 0x23, 0x33, 0x36, 0x33, 0x37, 0x33, 0x37, 0x3b, 0x62, 0x61, + 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x20, 0x23, + 0x31, 0x43, 0x31, 0x43, 0x31, 0x43, 0x3b, 0x7d, 0x2e, 0x64, 0x61, + 0x72, 0x6b, 0x2e, 0x67, 0x72, 0x61, 0x79, 0x20, 0x64, 0x69, 0x76, + 0x2e, 0x77, 0x72, 0x61, 0x70, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x20, 0x3e, 0x20, 0x64, 0x69, 0x76, 0x20, 0x7b, 0x62, 0x61, 0x63, + 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x20, 0x23, 0x31, + 0x43, 0x31, 0x43, 0x31, 0x43, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, + 0x6b, 0x2e, 0x67, 0x72, 0x61, 0x79, 0x20, 0x2e, 0x77, 0x72, 0x61, + 0x70, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x2e, 0x74, 0x62, + 0x6f, 0x64, 0x79, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x7b, 0x62, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x20, + 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x23, + 0x33, 0x36, 0x33, 0x37, 0x33, 0x37, 0x3b, 0x62, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x20, + 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x23, + 0x33, 0x36, 0x33, 0x37, 0x33, 0x37, 0x3b, 0x7d, 0x2e, 0x64, 0x61, + 0x72, 0x6b, 0x2e, 0x67, 0x72, 0x61, 0x79, 0x20, 0x2e, 0x77, 0x72, + 0x61, 0x70, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x2e, 0x74, + 0x62, 0x6f, 0x64, 0x79, 0x2d, 0x64, 0x61, 0x74, 0x61, 0x20, 0x74, + 0x72, 0x2e, 0x73, 0x68, 0x61, 0x64, 0x65, 0x64, 0x20, 0x7b, 0x62, + 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x72, 0x67, 0x62, 0x61, 0x28, + 0x34, 0x38, 0x2c, 0x20, 0x34, 0x38, 0x2c, 0x20, 0x34, 0x38, 0x2c, + 0x20, 0x30, 0x2e, 0x34, 0x38, 0x29, 0x3b, 0x7d, 0x2e, 0x64, 0x61, + 0x72, 0x6b, 0x2e, 0x67, 0x72, 0x61, 0x79, 0x20, 0x2e, 0x67, 0x72, + 0x61, 0x79, 0x20, 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, + 0x74, 0x6f, 0x70, 0x3a, 0x20, 0x34, 0x70, 0x78, 0x20, 0x73, 0x6f, + 0x6c, 0x69, 0x64, 0x20, 0x23, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, + 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x67, 0x72, 0x61, + 0x79, 0x20, 0x2e, 0x67, 0x72, 0x69, 0x64, 0x2d, 0x6d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x20, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, + 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x20, 0x23, 0x31, 0x43, 0x31, 0x43, + 0x31, 0x43, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x67, + 0x72, 0x61, 0x79, 0x20, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x20, 0x23, 0x39, 0x45, 0x39, 0x45, 0x39, 0x45, 0x3b, + 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x32, 0x31, 0x32, + 0x31, 0x32, 0x31, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x33, 0x30, 0x33, + 0x30, 0x33, 0x30, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, + 0x67, 0x72, 0x61, 0x79, 0x20, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x2c, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x67, 0x72, + 0x61, 0x79, 0x20, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, + 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x67, 0x72, 0x61, 0x79, 0x20, + 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2c, 0x2e, 0x64, + 0x61, 0x72, 0x6b, 0x2e, 0x67, 0x72, 0x61, 0x79, 0x20, 0x2e, 0x6f, + 0x70, 0x65, 0x6e, 0x3e, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, + 0x77, 0x6e, 0x2d, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x2e, 0x62, + 0x74, 0x6e, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, + 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x33, 0x36, + 0x33, 0x37, 0x33, 0x37, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, + 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, + 0x20, 0x23, 0x31, 0x43, 0x31, 0x43, 0x31, 0x43, 0x3b, 0x62, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, + 0x20, 0x23, 0x30, 0x46, 0x31, 0x32, 0x31, 0x34, 0x3b, 0x7d, 0x2e, + 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x67, 0x72, 0x61, 0x79, 0x20, 0x2e, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, + 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x3e, 0x61, + 0x2c, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x67, 0x72, 0x61, 0x79, + 0x20, 0x2e, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x3e, 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x3e, 0x61, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x64, + 0x61, 0x72, 0x6b, 0x2e, 0x67, 0x72, 0x61, 0x79, 0x20, 0x2e, 0x70, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x2e, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x3e, 0x61, 0x3a, + 0x66, 0x6f, 0x63, 0x75, 0x73, 0x20, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x20, 0x23, 0x37, 0x37, 0x37, 0x3b, 0x7d, 0x2e, 0x64, + 0x61, 0x72, 0x6b, 0x2e, 0x67, 0x72, 0x61, 0x79, 0x20, 0x2e, 0x70, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x6c, + 0x69, 0x3e, 0x61, 0x20, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, + 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, + 0x20, 0x23, 0x32, 0x31, 0x32, 0x31, 0x32, 0x31, 0x3b, 0x62, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x3a, 0x20, 0x31, 0x70, 0x78, 0x20, 0x73, + 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x23, 0x33, 0x30, 0x33, 0x30, 0x33, + 0x30, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x67, 0x72, + 0x61, 0x79, 0x20, 0x2e, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x3e, 0x6c, 0x69, 0x3e, 0x61, 0x3a, 0x68, 0x6f, + 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x67, + 0x72, 0x61, 0x79, 0x20, 0x2e, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x6c, 0x69, 0x3e, 0x61, 0x3a, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x2c, 0x2e, 0x64, 0x61, 0x72, 0x6b, + 0x2e, 0x67, 0x72, 0x61, 0x79, 0x20, 0x2e, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x6c, 0x69, 0x3e, 0x61, + 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x20, 0x7b, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x30, 0x33, 0x37, 0x30, 0x42, 0x30, + 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, + 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x32, 0x31, + 0x32, 0x31, 0x32, 0x31, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x33, 0x30, + 0x33, 0x30, 0x33, 0x30, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, + 0x2e, 0x67, 0x72, 0x61, 0x79, 0x20, 0x2e, 0x64, 0x72, 0x6f, 0x70, + 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x3e, 0x6c, + 0x69, 0x3e, 0x61, 0x20, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, + 0x20, 0x23, 0x46, 0x46, 0x46, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, + 0x6b, 0x2e, 0x67, 0x72, 0x61, 0x79, 0x20, 0x2e, 0x64, 0x72, 0x6f, + 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x3e, + 0x6c, 0x69, 0x3e, 0x61, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, + 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x67, 0x72, 0x61, 0x79, 0x20, + 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x6d, + 0x65, 0x6e, 0x75, 0x3e, 0x6c, 0x69, 0x3e, 0x61, 0x3a, 0x66, 0x6f, + 0x63, 0x75, 0x73, 0x20, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, + 0x20, 0x23, 0x46, 0x46, 0x46, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x20, 0x23, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x3b, 0x7d, + 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x67, 0x72, 0x61, 0x79, 0x20, + 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x6d, + 0x65, 0x6e, 0x75, 0x20, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, + 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, + 0x20, 0x23, 0x32, 0x31, 0x32, 0x31, 0x32, 0x31, 0x3b, 0x7d, 0x2e, + 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x67, 0x72, 0x61, 0x79, 0x3a, 0x3a, + 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x73, 0x63, 0x72, + 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x72, 0x2d, 0x74, 0x72, 0x61, 0x63, + 0x6b, 0x2c, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x67, 0x72, 0x61, + 0x79, 0x20, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x3a, 0x3a, 0x2d, + 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x73, 0x63, 0x72, 0x6f, + 0x6c, 0x6c, 0x62, 0x61, 0x72, 0x2d, 0x74, 0x72, 0x61, 0x63, 0x6b, + 0x20, 0x7b, 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x62, + 0x6f, 0x78, 0x2d, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x3a, 0x20, + 0x69, 0x6e, 0x73, 0x65, 0x74, 0x20, 0x30, 0x20, 0x30, 0x20, 0x36, + 0x70, 0x78, 0x20, 0x72, 0x67, 0x62, 0x61, 0x28, 0x30, 0x2c, 0x30, + 0x2c, 0x30, 0x2c, 0x30, 0x2e, 0x33, 0x29, 0x3b, 0x62, 0x61, 0x63, + 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x39, 0x45, 0x39, 0x45, 0x39, 0x45, + 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x67, 0x72, 0x61, + 0x79, 0x3a, 0x3a, 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, + 0x73, 0x63, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x72, 0x2c, 0x2e, + 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x67, 0x72, 0x61, 0x79, 0x20, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x69, 0x76, 0x65, 0x3a, 0x3a, 0x2d, 0x77, 0x65, 0x62, + 0x6b, 0x69, 0x74, 0x2d, 0x73, 0x63, 0x72, 0x6f, 0x6c, 0x6c, 0x62, + 0x61, 0x72, 0x20, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, + 0x31, 0x30, 0x70, 0x78, 0x3b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x3a, 0x20, 0x31, 0x30, 0x70, 0x78, 0x3b, 0x62, 0x61, 0x63, 0x6b, + 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x20, 0x23, 0x39, 0x45, 0x39, 0x45, 0x39, 0x45, 0x3b, + 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x67, 0x72, 0x61, 0x79, + 0x3a, 0x3a, 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x73, + 0x63, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x72, 0x2d, 0x74, 0x68, + 0x75, 0x6d, 0x62, 0x2c, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x67, + 0x72, 0x61, 0x79, 0x20, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x3a, + 0x3a, 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x73, 0x63, + 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x72, 0x2d, 0x74, 0x68, 0x75, + 0x6d, 0x62, 0x20, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, + 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, + 0x23, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x3b, 0x7d, 0x2e, 0x64, + 0x61, 0x72, 0x6b, 0x2e, 0x67, 0x72, 0x61, 0x79, 0x20, 0x2e, 0x63, + 0x68, 0x61, 0x72, 0x74, 0x2d, 0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69, + 0x70, 0x20, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, + 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, + 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x3b, 0x7d, 0x2e, 0x64, 0x61, + 0x72, 0x6b, 0x2e, 0x67, 0x72, 0x61, 0x79, 0x20, 0x2e, 0x72, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x2d, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x20, + 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, + 0x3a, 0x20, 0x23, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x3b, 0x7d, + 0x2f, 0x2a, 0x20, 0x44, 0x41, 0x52, 0x4b, 0x20, 0x43, 0x48, 0x41, + 0x52, 0x54, 0x53, 0x20, 0x2a, 0x2f, 0x2e, 0x64, 0x61, 0x72, 0x6b, + 0x20, 0x73, 0x76, 0x67, 0x20, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x20, 0x2e, + 0x61, 0x72, 0x65, 0x61, 0x20, 0x7b, 0x6f, 0x70, 0x61, 0x63, 0x69, + 0x74, 0x79, 0x3a, 0x20, 0x30, 0x2e, 0x31, 0x3b, 0x7d, 0x2e, 0x64, + 0x61, 0x72, 0x6b, 0x20, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x30, 0x2c, + 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x20, 0x2e, 0x6c, 0x69, 0x6e, 0x65, + 0x31, 0x20, 0x7b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x32, 0x3b, 0x7d, 0x2e, 0x64, + 0x61, 0x72, 0x6b, 0x20, 0x2e, 0x61, 0x72, 0x65, 0x61, 0x30, 0x2c, + 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x20, 0x2e, 0x62, 0x61, 0x72, 0x73, + 0x2e, 0x79, 0x30, 0x20, 0x2e, 0x62, 0x61, 0x72, 0x2c, 0x2e, 0x64, + 0x61, 0x72, 0x6b, 0x20, 0x72, 0x65, 0x63, 0x74, 0x2e, 0x6c, 0x65, + 0x67, 0x65, 0x6e, 0x64, 0x2e, 0x79, 0x30, 0x20, 0x7b, 0x66, 0x69, + 0x6c, 0x6c, 0x3a, 0x20, 0x23, 0x30, 0x30, 0x37, 0x42, 0x43, 0x33, + 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x20, 0x2e, 0x61, 0x72, + 0x65, 0x61, 0x31, 0x2c, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x20, 0x2e, + 0x62, 0x61, 0x72, 0x73, 0x2e, 0x79, 0x31, 0x20, 0x2e, 0x62, 0x61, + 0x72, 0x2c, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x20, 0x2e, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x73, 0x2e, 0x79, 0x31, 0x2c, 0x2e, 0x64, 0x61, + 0x72, 0x6b, 0x20, 0x72, 0x65, 0x63, 0x74, 0x2e, 0x6c, 0x65, 0x67, + 0x65, 0x6e, 0x64, 0x2e, 0x79, 0x31, 0x20, 0x7b, 0x66, 0x69, 0x6c, + 0x6c, 0x3a, 0x20, 0x23, 0x46, 0x46, 0x33, 0x30, 0x33, 0x45, 0x3b, + 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x20, 0x2e, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x73, 0x2e, 0x79, 0x30, 0x20, 0x7b, 0x66, 0x69, 0x6c, + 0x6c, 0x3a, 0x20, 0x23, 0x30, 0x30, 0x44, 0x34, 0x45, 0x31, 0x3b, + 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x20, 0x2e, 0x6c, 0x69, 0x6e, + 0x65, 0x30, 0x20, 0x7b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x3a, + 0x20, 0x23, 0x30, 0x30, 0x37, 0x42, 0x43, 0x33, 0x3b, 0x7d, 0x2e, + 0x64, 0x61, 0x72, 0x6b, 0x20, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x31, + 0x20, 0x7b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x3a, 0x20, 0x23, + 0x46, 0x46, 0x33, 0x30, 0x33, 0x45, 0x3b, 0x7d, 0x2e, 0x64, 0x61, + 0x72, 0x6b, 0x20, 0x2e, 0x67, 0x72, 0x69, 0x64, 0x2e, 0x79, 0x20, + 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2c, + 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x20, 0x2e, 0x67, 0x72, 0x69, 0x64, + 0x2e, 0x78, 0x20, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x20, 0x6c, 0x69, + 0x6e, 0x65, 0x20, 0x7b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x3a, + 0x20, 0x23, 0x34, 0x34, 0x34, 0x37, 0x34, 0x42, 0x3b, 0x73, 0x74, + 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x64, 0x61, 0x73, 0x68, 0x61, 0x72, + 0x72, 0x61, 0x79, 0x3a, 0x20, 0x31, 0x20, 0x31, 0x3b, 0x7d, 0x2e, + 0x64, 0x61, 0x72, 0x6b, 0x20, 0x2e, 0x61, 0x78, 0x69, 0x73, 0x20, + 0x74, 0x65, 0x78, 0x74, 0x2c, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x20, + 0x2e, 0x61, 0x78, 0x69, 0x73, 0x2d, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x2c, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x20, 0x74, 0x65, 0x78, 0x74, + 0x2e, 0x6c, 0x65, 0x67, 0x65, 0x6e, 0x64, 0x20, 0x7b, 0x66, 0x69, + 0x6c, 0x6c, 0x3a, 0x20, 0x23, 0x39, 0x45, 0x39, 0x45, 0x39, 0x45, + 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x20, 0x2e, 0x61, 0x78, + 0x69, 0x73, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x7b, 0x73, 0x74, + 0x72, 0x6f, 0x6b, 0x65, 0x3a, 0x20, 0x23, 0x39, 0x39, 0x39, 0x39, + 0x39, 0x39, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x20, 0x2e, + 0x61, 0x78, 0x69, 0x73, 0x2e, 0x78, 0x20, 0x2e, 0x74, 0x69, 0x63, + 0x6b, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x2e, 0x64, 0x61, 0x72, + 0x6b, 0x20, 0x2e, 0x61, 0x78, 0x69, 0x73, 0x2e, 0x79, 0x30, 0x20, + 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2c, + 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x20, 0x2e, 0x61, 0x78, 0x69, 0x73, + 0x2e, 0x79, 0x31, 0x20, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x20, 0x6c, + 0x69, 0x6e, 0x65, 0x2c, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x20, 0x2e, + 0x67, 0x72, 0x69, 0x64, 0x2e, 0x79, 0x20, 0x2e, 0x74, 0x69, 0x63, + 0x6b, 0x3a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x2d, 0x63, 0x68, 0x69, + 0x6c, 0x64, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x7b, 0x73, 0x74, + 0x72, 0x6f, 0x6b, 0x65, 0x3a, 0x20, 0x23, 0x33, 0x42, 0x34, 0x34, + 0x34, 0x43, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x20, 0x2e, + 0x63, 0x68, 0x61, 0x72, 0x74, 0x2d, 0x74, 0x6f, 0x6f, 0x6c, 0x74, + 0x69, 0x70, 0x20, 0x74, 0x68, 0x20, 0x7b, 0x62, 0x61, 0x63, 0x6b, + 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x20, 0x23, 0x31, 0x63, 0x31, 0x63, 0x31, 0x63, 0x3b, + 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x20, 0x2e, 0x63, 0x68, 0x61, + 0x72, 0x74, 0x2d, 0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x20, + 0x74, 0x72, 0x20, 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, + 0x20, 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x20, + 0x23, 0x33, 0x36, 0x33, 0x37, 0x33, 0x37, 0x3b, 0x7d, 0x2f, 0x2a, + 0x20, 0x44, 0x41, 0x52, 0x4b, 0x20, 0x50, 0x55, 0x52, 0x50, 0x4c, + 0x45, 0x20, 0x54, 0x48, 0x45, 0x4d, 0x45, 0x20, 0x2a, 0x2f, 0x68, + 0x74, 0x6d, 0x6c, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x70, 0x75, + 0x72, 0x70, 0x6c, 0x65, 0x2c, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, + 0x70, 0x75, 0x72, 0x70, 0x6c, 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, + 0x20, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x3a, 0x20, 0x23, 0x31, 0x65, 0x31, 0x65, 0x32, 0x66, 0x3b, + 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x70, 0x75, 0x72, 0x70, + 0x6c, 0x65, 0x20, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x20, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, + 0x75, 0x6e, 0x64, 0x3a, 0x20, 0x23, 0x31, 0x65, 0x31, 0x65, 0x32, + 0x66, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x70, 0x75, + 0x72, 0x70, 0x6c, 0x65, 0x20, 0x2e, 0x70, 0x61, 0x67, 0x65, 0x2d, + 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x7b, 0x62, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, + 0x20, 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x20, + 0x23, 0x32, 0x62, 0x33, 0x35, 0x35, 0x33, 0x3b, 0x7d, 0x2e, 0x64, + 0x61, 0x72, 0x6b, 0x2e, 0x70, 0x75, 0x72, 0x70, 0x6c, 0x65, 0x20, + 0x2e, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2d, 0x69, 0x6e, 0x66, 0x6f, + 0x20, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x31, + 0x38, 0x31, 0x38, 0x32, 0x33, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, + 0x6b, 0x2e, 0x70, 0x75, 0x72, 0x70, 0x6c, 0x65, 0x20, 0x6e, 0x61, + 0x76, 0x20, 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x31, 0x70, 0x78, 0x20, 0x73, + 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x23, 0x65, 0x31, 0x34, 0x65, 0x63, + 0x61, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x3a, 0x20, 0x23, 0x31, 0x38, 0x31, 0x38, 0x32, 0x33, 0x3b, + 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x70, 0x75, 0x72, 0x70, + 0x6c, 0x65, 0x20, 0x64, 0x69, 0x76, 0x2e, 0x77, 0x72, 0x61, 0x70, + 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x3e, 0x20, 0x64, 0x69, + 0x76, 0x20, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, + 0x6e, 0x64, 0x3a, 0x20, 0x23, 0x32, 0x37, 0x32, 0x39, 0x33, 0x64, + 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x74, 0x6f, 0x70, + 0x3a, 0x20, 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, + 0x20, 0x23, 0x32, 0x62, 0x33, 0x35, 0x35, 0x33, 0x3b, 0x7d, 0x2e, + 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x70, 0x75, 0x72, 0x70, 0x6c, 0x65, + 0x20, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x2d, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x62, 0x6f, + 0x64, 0x79, 0x2e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x2d, 0x6d, 0x65, + 0x74, 0x61, 0x20, 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, + 0x74, 0x6f, 0x70, 0x3a, 0x20, 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, + 0x6c, 0x69, 0x64, 0x20, 0x23, 0x32, 0x62, 0x33, 0x35, 0x35, 0x33, + 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x62, 0x6f, 0x74, + 0x74, 0x6f, 0x6d, 0x3a, 0x20, 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, + 0x6c, 0x69, 0x64, 0x20, 0x23, 0x32, 0x62, 0x33, 0x35, 0x35, 0x33, + 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x70, 0x75, 0x72, + 0x70, 0x6c, 0x65, 0x20, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x2d, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, + 0x74, 0x62, 0x6f, 0x64, 0x79, 0x2e, 0x74, 0x62, 0x6f, 0x64, 0x79, + 0x2d, 0x64, 0x61, 0x74, 0x61, 0x20, 0x74, 0x72, 0x2e, 0x73, 0x68, + 0x61, 0x64, 0x65, 0x64, 0x20, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x20, 0x23, 0x31, 0x65, 0x31, 0x65, 0x32, 0x66, 0x3b, 0x7d, + 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x70, 0x75, 0x72, 0x70, 0x6c, + 0x65, 0x20, 0x2e, 0x67, 0x72, 0x61, 0x79, 0x20, 0x7b, 0x62, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x20, 0x34, + 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x23, 0x32, + 0x62, 0x33, 0x35, 0x35, 0x33, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, + 0x6b, 0x2e, 0x70, 0x75, 0x72, 0x70, 0x6c, 0x65, 0x20, 0x2e, 0x72, + 0x65, 0x64, 0x20, 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, + 0x74, 0x6f, 0x70, 0x3a, 0x20, 0x34, 0x70, 0x78, 0x20, 0x73, 0x6f, + 0x6c, 0x69, 0x64, 0x20, 0x23, 0x66, 0x64, 0x35, 0x64, 0x39, 0x33, + 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x70, 0x75, 0x72, + 0x70, 0x6c, 0x65, 0x20, 0x2e, 0x67, 0x72, 0x65, 0x65, 0x6e, 0x20, + 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x74, 0x6f, 0x70, + 0x3a, 0x20, 0x34, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, + 0x20, 0x23, 0x30, 0x30, 0x66, 0x32, 0x63, 0x33, 0x3b, 0x7d, 0x2e, + 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x70, 0x75, 0x72, 0x70, 0x6c, 0x65, + 0x20, 0x2e, 0x62, 0x6c, 0x75, 0x65, 0x20, 0x7b, 0x62, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x20, 0x34, 0x70, + 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x23, 0x31, 0x66, + 0x38, 0x65, 0x66, 0x31, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, + 0x2e, 0x70, 0x75, 0x72, 0x70, 0x6c, 0x65, 0x20, 0x68, 0x33, 0x2c, + 0x20, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x70, 0x75, 0x72, 0x70, + 0x6c, 0x65, 0x20, 0x68, 0x34, 0x2c, 0x20, 0x2e, 0x64, 0x61, 0x72, + 0x6b, 0x2e, 0x70, 0x75, 0x72, 0x70, 0x6c, 0x65, 0x20, 0x68, 0x35, + 0x20, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x39, + 0x61, 0x39, 0x61, 0x39, 0x61, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, + 0x6b, 0x2e, 0x70, 0x75, 0x72, 0x70, 0x6c, 0x65, 0x20, 0x2e, 0x67, + 0x72, 0x69, 0x64, 0x2d, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, + 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, + 0x3a, 0x20, 0x23, 0x32, 0x37, 0x32, 0x39, 0x33, 0x64, 0x3b, 0x7d, + 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x70, 0x75, 0x72, 0x70, 0x6c, + 0x65, 0x20, 0x2e, 0x67, 0x72, 0x69, 0x64, 0x2d, 0x6d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x20, 0x68, 0x33, 0x20, 0x7b, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x46, 0x46, 0x46, 0x3b, 0x7d, 0x2e, + 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x70, 0x75, 0x72, 0x70, 0x6c, 0x65, + 0x20, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x20, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, + 0x23, 0x39, 0x45, 0x39, 0x45, 0x39, 0x45, 0x3b, 0x62, 0x61, 0x63, + 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x31, 0x65, 0x31, 0x65, 0x32, 0x66, + 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x32, 0x62, 0x33, 0x35, 0x35, 0x33, + 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x70, 0x75, 0x72, + 0x70, 0x6c, 0x65, 0x20, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x2c, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x70, 0x75, 0x72, + 0x70, 0x6c, 0x65, 0x20, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, + 0x2c, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x70, 0x75, 0x72, 0x70, + 0x6c, 0x65, 0x20, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x2c, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x70, 0x75, 0x72, 0x70, + 0x6c, 0x65, 0x20, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x3e, 0x2e, 0x64, + 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x74, 0x6f, 0x67, + 0x67, 0x6c, 0x65, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x20, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x20, 0x23, 0x35, 0x39, 0x35, 0x39, 0x35, 0x66, 0x3b, 0x62, + 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x31, 0x65, 0x31, 0x65, + 0x32, 0x66, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x32, 0x62, 0x33, 0x35, + 0x35, 0x33, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x70, + 0x75, 0x72, 0x70, 0x6c, 0x65, 0x20, 0x2e, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x2e, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x3e, 0x61, 0x2c, 0x2e, 0x64, 0x61, + 0x72, 0x6b, 0x2e, 0x70, 0x75, 0x72, 0x70, 0x6c, 0x65, 0x20, 0x2e, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, + 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x3e, 0x61, + 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x64, 0x61, 0x72, + 0x6b, 0x2e, 0x70, 0x75, 0x72, 0x70, 0x6c, 0x65, 0x20, 0x2e, 0x70, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x2e, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x3e, 0x61, 0x3a, + 0x66, 0x6f, 0x63, 0x75, 0x73, 0x20, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x20, 0x23, 0x37, 0x37, 0x37, 0x3b, 0x7d, 0x2e, 0x64, + 0x61, 0x72, 0x6b, 0x2e, 0x70, 0x75, 0x72, 0x70, 0x6c, 0x65, 0x20, + 0x2e, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x3e, 0x6c, 0x69, 0x3e, 0x61, 0x20, 0x7b, 0x62, 0x61, 0x63, 0x6b, + 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x20, 0x23, 0x31, 0x65, 0x31, 0x65, 0x32, 0x66, 0x3b, + 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x20, 0x31, 0x70, 0x78, + 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x23, 0x33, 0x42, 0x34, + 0x34, 0x34, 0x43, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, + 0x70, 0x75, 0x72, 0x70, 0x6c, 0x65, 0x20, 0x2e, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x6c, 0x69, 0x3e, + 0x61, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x64, 0x61, + 0x72, 0x6b, 0x2e, 0x70, 0x75, 0x72, 0x70, 0x6c, 0x65, 0x20, 0x2e, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, + 0x6c, 0x69, 0x3e, 0x61, 0x3a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x2c, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x70, 0x75, 0x72, 0x70, + 0x6c, 0x65, 0x20, 0x2e, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x3e, 0x6c, 0x69, 0x3e, 0x61, 0x3a, 0x66, 0x6f, + 0x63, 0x75, 0x73, 0x20, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, + 0x20, 0x23, 0x30, 0x33, 0x37, 0x30, 0x42, 0x30, 0x3b, 0x62, 0x61, + 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x31, 0x38, 0x31, 0x38, 0x32, + 0x33, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x70, 0x75, + 0x72, 0x70, 0x6c, 0x65, 0x20, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, + 0x6f, 0x77, 0x6e, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x3e, 0x6c, 0x69, + 0x3e, 0x61, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x64, + 0x61, 0x72, 0x6b, 0x2e, 0x70, 0x75, 0x72, 0x70, 0x6c, 0x65, 0x20, + 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x6d, + 0x65, 0x6e, 0x75, 0x3e, 0x6c, 0x69, 0x3e, 0x61, 0x3a, 0x66, 0x6f, + 0x63, 0x75, 0x73, 0x20, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, + 0x20, 0x23, 0x46, 0x46, 0x46, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x20, 0x23, 0x31, 0x38, 0x31, 0x38, 0x32, 0x33, 0x3b, 0x7d, + 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x70, 0x75, 0x72, 0x70, 0x6c, + 0x65, 0x20, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, + 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x20, 0x7b, 0x62, 0x61, 0x63, 0x6b, + 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x20, 0x23, 0x31, 0x65, 0x31, 0x65, 0x32, 0x66, 0x3b, + 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x70, 0x75, 0x72, 0x70, + 0x6c, 0x65, 0x3a, 0x3a, 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, + 0x2d, 0x73, 0x63, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x72, 0x2d, + 0x74, 0x72, 0x61, 0x63, 0x6b, 0x2c, 0x2e, 0x64, 0x61, 0x72, 0x6b, + 0x2e, 0x70, 0x75, 0x72, 0x70, 0x6c, 0x65, 0x20, 0x2e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x69, 0x76, 0x65, 0x3a, 0x3a, 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, + 0x74, 0x2d, 0x73, 0x63, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x72, + 0x2d, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x20, 0x7b, 0x2d, 0x77, 0x65, + 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x62, 0x6f, 0x78, 0x2d, 0x73, 0x68, + 0x61, 0x64, 0x6f, 0x77, 0x3a, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x74, + 0x20, 0x30, 0x20, 0x30, 0x20, 0x36, 0x70, 0x78, 0x20, 0x72, 0x67, + 0x62, 0x61, 0x28, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2e, + 0x33, 0x29, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, + 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, + 0x39, 0x45, 0x39, 0x45, 0x39, 0x45, 0x3b, 0x7d, 0x2e, 0x64, 0x61, + 0x72, 0x6b, 0x2e, 0x70, 0x75, 0x72, 0x70, 0x6c, 0x65, 0x3a, 0x3a, + 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x73, 0x63, 0x72, + 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x72, 0x2c, 0x2e, 0x64, 0x61, 0x72, + 0x6b, 0x2e, 0x70, 0x75, 0x72, 0x70, 0x6c, 0x65, 0x20, 0x2e, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x69, 0x76, 0x65, 0x3a, 0x3a, 0x2d, 0x77, 0x65, 0x62, 0x6b, + 0x69, 0x74, 0x2d, 0x73, 0x63, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, + 0x72, 0x20, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x31, + 0x30, 0x70, 0x78, 0x3b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, + 0x20, 0x31, 0x30, 0x70, 0x78, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x20, 0x23, 0x39, 0x45, 0x39, 0x45, 0x39, 0x45, 0x3b, 0x7d, + 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x70, 0x75, 0x72, 0x70, 0x6c, + 0x65, 0x3a, 0x3a, 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, + 0x73, 0x63, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x72, 0x2d, 0x74, + 0x68, 0x75, 0x6d, 0x62, 0x2c, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, + 0x70, 0x75, 0x72, 0x70, 0x6c, 0x65, 0x20, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, + 0x76, 0x65, 0x3a, 0x3a, 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, + 0x2d, 0x73, 0x63, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x72, 0x2d, + 0x74, 0x68, 0x75, 0x6d, 0x62, 0x20, 0x7b, 0x62, 0x61, 0x63, 0x6b, + 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x20, 0x23, 0x31, 0x65, 0x31, 0x65, 0x32, 0x66, 0x3b, + 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x70, 0x75, 0x72, 0x70, + 0x6c, 0x65, 0x20, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x74, 0x2d, 0x74, + 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x20, 0x7b, 0x62, 0x61, 0x63, + 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x31, 0x38, 0x31, 0x38, 0x32, 0x33, + 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x70, 0x75, 0x72, + 0x70, 0x6c, 0x65, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x2d, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x20, 0x7b, 0x62, 0x61, 0x63, + 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x20, 0x23, 0x31, + 0x38, 0x31, 0x38, 0x32, 0x33, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, + 0x6b, 0x2e, 0x70, 0x75, 0x72, 0x70, 0x6c, 0x65, 0x20, 0x2e, 0x61, + 0x72, 0x65, 0x61, 0x30, 0x2c, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, + 0x70, 0x75, 0x72, 0x70, 0x6c, 0x65, 0x20, 0x2e, 0x62, 0x61, 0x72, + 0x73, 0x2e, 0x79, 0x30, 0x20, 0x2e, 0x62, 0x61, 0x72, 0x2c, 0x2e, + 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x70, 0x75, 0x72, 0x70, 0x6c, 0x65, + 0x20, 0x72, 0x65, 0x63, 0x74, 0x2e, 0x6c, 0x65, 0x67, 0x65, 0x6e, + 0x64, 0x2e, 0x79, 0x30, 0x20, 0x7b, 0x66, 0x69, 0x6c, 0x6c, 0x3a, + 0x20, 0x23, 0x30, 0x30, 0x37, 0x42, 0x43, 0x33, 0x3b, 0x7d, 0x2e, + 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x70, 0x75, 0x72, 0x70, 0x6c, 0x65, + 0x20, 0x2e, 0x61, 0x72, 0x65, 0x61, 0x31, 0x2c, 0x2e, 0x64, 0x61, + 0x72, 0x6b, 0x2e, 0x70, 0x75, 0x72, 0x70, 0x6c, 0x65, 0x20, 0x2e, + 0x62, 0x61, 0x72, 0x73, 0x2e, 0x79, 0x31, 0x20, 0x2e, 0x62, 0x61, + 0x72, 0x2c, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x70, 0x75, 0x72, + 0x70, 0x6c, 0x65, 0x20, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, + 0x2e, 0x79, 0x31, 0x2c, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x70, + 0x75, 0x72, 0x70, 0x6c, 0x65, 0x20, 0x72, 0x65, 0x63, 0x74, 0x2e, + 0x6c, 0x65, 0x67, 0x65, 0x6e, 0x64, 0x2e, 0x79, 0x31, 0x20, 0x7b, + 0x66, 0x69, 0x6c, 0x6c, 0x3a, 0x20, 0x23, 0x64, 0x30, 0x34, 0x38, + 0x62, 0x36, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x70, + 0x75, 0x72, 0x70, 0x6c, 0x65, 0x20, 0x2e, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x73, 0x2e, 0x79, 0x30, 0x20, 0x7b, 0x66, 0x69, 0x6c, 0x6c, + 0x3a, 0x20, 0x23, 0x30, 0x30, 0x44, 0x34, 0x45, 0x31, 0x3b, 0x7d, + 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, 0x70, 0x75, 0x72, 0x70, 0x6c, + 0x65, 0x20, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x30, 0x20, 0x7b, 0x73, + 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x3a, 0x20, 0x23, 0x30, 0x30, 0x37, + 0x42, 0x43, 0x33, 0x3b, 0x7d, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x2e, + 0x70, 0x75, 0x72, 0x70, 0x6c, 0x65, 0x20, 0x2e, 0x6c, 0x69, 0x6e, + 0x65, 0x31, 0x20, 0x7b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x3a, + 0x20, 0x23, 0x64, 0x30, 0x34, 0x38, 0x62, 0x36, 0x3b, 0x7d, 0x00 +}; + +const int app_css_length = 16588; diff --git a/goaccess++/src/appjs.h b/goaccess++/src/appjs.h new file mode 100644 index 0000000..6b90833 --- /dev/null +++ b/goaccess++/src/appjs.h @@ -0,0 +1,3613 @@ +const char app_js[39696] = { + 0x2f, 0x2a, 0x6a, 0x73, 0x68, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x75, + 0x62, 0x3a, 0x74, 0x72, 0x75, 0x65, 0x2a, 0x2f, 0x28, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, + 0x27, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, + 0x27, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x24, 0x28, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x29, + 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x29, 0x3b, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x24, 0x24, 0x28, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2c, 0x20, 0x63, + 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x29, 0x20, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x73, 0x20, 0x3d, 0x20, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x41, 0x6c, 0x6c, 0x28, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x76, 0x61, 0x72, + 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, + 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3b, 0x20, 0x2b, 0x2b, 0x69, 0x29, 0x20, 0x7b, 0x69, + 0x66, 0x20, 0x28, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, + 0x20, 0x26, 0x26, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, + 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x3d, + 0x20, 0x27, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x27, + 0x29, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x2e, 0x63, + 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x20, 0x65, + 0x6c, 0x65, 0x6d, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0x3b, 0x7d, 0x7d, + 0x76, 0x61, 0x72, 0x20, 0x64, 0x65, 0x62, 0x6f, 0x75, 0x6e, 0x63, + 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x2c, 0x20, 0x77, 0x61, + 0x69, 0x74, 0x2c, 0x20, 0x6e, 0x6f, 0x77, 0x29, 0x20, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x62, 0x6f, 0x75, 0x6e, + 0x63, 0x65, 0x64, 0x20, 0x28, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3b, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x6c, 0x61, + 0x79, 0x65, 0x64, 0x28, 0x29, 0x20, 0x7b, 0x69, 0x66, 0x20, 0x28, + 0x21, 0x6e, 0x6f, 0x77, 0x29, 0x66, 0x75, 0x6e, 0x63, 0x2e, 0x61, + 0x70, 0x70, 0x6c, 0x79, 0x28, 0x74, 0x68, 0x61, 0x74, 0x2c, 0x20, + 0x61, 0x72, 0x67, 0x73, 0x29, 0x3b, 0x74, 0x69, 0x6d, 0x65, 0x6f, + 0x75, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x3b, 0x7d, + 0x69, 0x66, 0x20, 0x28, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x29, 0x20, 0x7b, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x54, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x28, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x29, 0x3b, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x77, 0x29, 0x20, 0x7b, 0x66, 0x75, + 0x6e, 0x63, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x6f, 0x62, + 0x6a, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x29, 0x3b, 0x7d, 0x74, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x65, + 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x64, 0x65, + 0x6c, 0x61, 0x79, 0x65, 0x64, 0x2c, 0x20, 0x77, 0x61, 0x69, 0x74, + 0x20, 0x7c, 0x7c, 0x20, 0x32, 0x35, 0x30, 0x29, 0x3b, 0x7d, 0x3b, + 0x7d, 0x3b, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x47, 0x6f, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x77, 0x69, + 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x20, 0x7c, 0x7c, 0x20, 0x7b, 0x69, 0x6e, 0x69, 0x74, + 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x29, 0x20, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x41, 0x70, + 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x20, 0x3d, 0x20, 0x7b, + 0x7d, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x54, + 0x70, 0x6c, 0x73, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x43, 0x68, 0x61, + 0x72, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x55, 0x49, 0x44, 0x61, 0x74, + 0x61, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, + 0x70, 0x74, 0x73, 0x20, 0x7c, 0x7c, 0x20, 0x7b, 0x7d, 0x29, 0x2e, + 0x75, 0x69, 0x44, 0x61, 0x74, 0x61, 0x20, 0x7c, 0x7c, 0x20, 0x7b, + 0x7d, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x44, + 0x61, 0x74, 0x61, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x7c, 0x7c, 0x20, + 0x7b, 0x7d, 0x29, 0x2e, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x44, 0x61, + 0x74, 0x61, 0x20, 0x7c, 0x7c, 0x20, 0x7b, 0x7d, 0x3b, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x57, 0x53, 0x43, 0x6f, 0x6e, + 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, + 0x70, 0x74, 0x73, 0x20, 0x7c, 0x7c, 0x20, 0x7b, 0x7d, 0x29, 0x2e, + 0x77, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x7c, 0x7c, 0x20, 0x7b, 0x7d, 0x3b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x69, 0x31, 0x38, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x7c, 0x7c, + 0x20, 0x7b, 0x7d, 0x29, 0x2e, 0x69, 0x31, 0x38, 0x6e, 0x20, 0x7c, + 0x7c, 0x20, 0x7b, 0x7d, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x41, + 0x70, 0x70, 0x50, 0x72, 0x65, 0x66, 0x73, 0x20, 0x20, 0x3d, 0x20, + 0x7b, 0x27, 0x61, 0x75, 0x74, 0x6f, 0x48, 0x69, 0x64, 0x65, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x73, 0x27, 0x3a, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x2c, 0x27, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x27, 0x3a, + 0x20, 0x27, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, + 0x6c, 0x27, 0x2c, 0x27, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, + 0x27, 0x3a, 0x20, 0x37, 0x2c, 0x27, 0x74, 0x68, 0x65, 0x6d, 0x65, + 0x27, 0x3a, 0x20, 0x27, 0x64, 0x61, 0x72, 0x6b, 0x50, 0x75, 0x72, + 0x70, 0x6c, 0x65, 0x27, 0x2c, 0x7d, 0x3b, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x41, 0x70, 0x70, 0x50, 0x72, 0x65, 0x66, 0x73, 0x20, 0x3d, + 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x55, + 0x74, 0x69, 0x6c, 0x2e, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x50, 0x72, 0x65, 0x66, + 0x73, 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, + 0x73, 0x2e, 0x70, 0x72, 0x65, 0x66, 0x73, 0x29, 0x3b, 0x69, 0x66, + 0x20, 0x28, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x55, 0x74, 0x69, 0x6c, 0x2e, 0x68, 0x61, 0x73, 0x4c, 0x6f, 0x63, + 0x61, 0x6c, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x28, 0x29, + 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6c, 0x73, 0x20, 0x3d, + 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, + 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x28, + 0x27, 0x41, 0x70, 0x70, 0x50, 0x72, 0x65, 0x66, 0x73, 0x27, 0x29, + 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x50, + 0x72, 0x65, 0x66, 0x73, 0x20, 0x3d, 0x20, 0x47, 0x6f, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x55, 0x74, 0x69, 0x6c, 0x2e, 0x6d, + 0x65, 0x72, 0x67, 0x65, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x41, + 0x70, 0x70, 0x50, 0x72, 0x65, 0x66, 0x73, 0x2c, 0x20, 0x6c, 0x73, + 0x29, 0x3b, 0x7d, 0x69, 0x66, 0x20, 0x28, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x41, 0x70, 0x70, 0x57, 0x53, 0x43, 0x6f, 0x6e, 0x6e, + 0x29, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x57, 0x65, 0x62, 0x53, 0x6f, + 0x63, 0x6b, 0x65, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x41, + 0x70, 0x70, 0x57, 0x53, 0x43, 0x6f, 0x6e, 0x6e, 0x29, 0x3b, 0x7d, + 0x2c, 0x67, 0x65, 0x74, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x55, 0x49, + 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x20, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, + 0x3f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x55, + 0x49, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x5d, 0x20, 0x3a, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x41, 0x70, + 0x70, 0x55, 0x49, 0x44, 0x61, 0x74, 0x61, 0x3b, 0x7d, 0x2c, 0x67, + 0x65, 0x74, 0x50, 0x72, 0x65, 0x66, 0x73, 0x3a, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x29, 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x3f, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x50, 0x72, 0x65, 0x66, 0x73, + 0x5b, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x5d, 0x20, 0x3a, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x50, 0x72, 0x65, 0x66, + 0x73, 0x3b, 0x7d, 0x2c, 0x73, 0x65, 0x74, 0x50, 0x72, 0x65, 0x66, + 0x73, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x28, 0x29, 0x20, 0x7b, 0x69, 0x66, 0x20, 0x28, 0x47, 0x6f, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x55, 0x74, 0x69, 0x6c, + 0x2e, 0x68, 0x61, 0x73, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x74, + 0x6f, 0x72, 0x61, 0x67, 0x65, 0x28, 0x29, 0x29, 0x20, 0x7b, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x2e, 0x73, 0x65, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x28, 0x27, 0x41, + 0x70, 0x70, 0x50, 0x72, 0x65, 0x66, 0x73, 0x27, 0x2c, 0x20, 0x4a, + 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, + 0x66, 0x79, 0x28, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x67, 0x65, 0x74, 0x50, 0x72, 0x65, 0x66, 0x73, 0x28, 0x29, + 0x29, 0x29, 0x3b, 0x7d, 0x7d, 0x2c, 0x67, 0x65, 0x74, 0x50, 0x61, + 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x3a, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x29, 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x3f, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x44, 0x61, 0x74, 0x61, 0x5b, + 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x5d, 0x20, 0x3a, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x44, 0x61, 0x74, 0x61, 0x3b, + 0x7d, 0x2c, 0x73, 0x65, 0x74, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, + 0x6b, 0x65, 0x74, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x77, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x29, + 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x68, 0x6f, 0x73, 0x74, 0x20, + 0x3d, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x3b, 0x68, 0x6f, 0x73, 0x74, + 0x20, 0x3d, 0x20, 0x77, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x2e, 0x75, + 0x72, 0x6c, 0x20, 0x3f, 0x20, 0x77, 0x73, 0x43, 0x6f, 0x6e, 0x6e, + 0x2e, 0x75, 0x72, 0x6c, 0x20, 0x3a, 0x20, 0x77, 0x69, 0x6e, 0x64, + 0x6f, 0x77, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3f, + 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x6c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x3a, 0x20, 0x22, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x68, 0x6f, 0x73, 0x74, 0x22, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x2f, 0x5e, 0x28, 0x77, 0x73, + 0x73, 0x3f, 0x3a, 0x5c, 0x2f, 0x5c, 0x2f, 0x29, 0x3f, 0x5b, 0x5e, + 0x5c, 0x2f, 0x5d, 0x2b, 0x3a, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b, + 0x31, 0x2c, 0x35, 0x7d, 0x5c, 0x2f, 0x2f, 0x2e, 0x74, 0x65, 0x73, + 0x74, 0x28, 0x68, 0x6f, 0x73, 0x74, 0x20, 0x2b, 0x20, 0x22, 0x2f, + 0x22, 0x29, 0x20, 0x3f, 0x20, 0x68, 0x6f, 0x73, 0x74, 0x20, 0x3a, + 0x20, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x68, 0x6f, 0x73, + 0x74, 0x20, 0x2b, 0x20, 0x27, 0x3a, 0x27, 0x20, 0x2b, 0x20, 0x77, + 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x29, + 0x3b, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x21, 0x2f, 0x5e, 0x77, + 0x73, 0x73, 0x3f, 0x3a, 0x5c, 0x2f, 0x5c, 0x2f, 0x2f, 0x69, 0x2e, + 0x74, 0x65, 0x73, 0x74, 0x28, 0x73, 0x74, 0x72, 0x29, 0x20, 0x3f, + 0x20, 0x28, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x6c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x73, 0x3a, 0x22, 0x20, 0x3f, 0x20, 0x27, 0x77, + 0x73, 0x73, 0x3a, 0x2f, 0x2f, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x77, + 0x73, 0x3a, 0x2f, 0x2f, 0x27, 0x29, 0x20, 0x2b, 0x20, 0x73, 0x74, + 0x72, 0x20, 0x3a, 0x20, 0x73, 0x74, 0x72, 0x3b, 0x76, 0x61, 0x72, + 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x6e, + 0x65, 0x77, 0x20, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, + 0x74, 0x28, 0x73, 0x74, 0x72, 0x29, 0x3b, 0x73, 0x6f, 0x63, 0x6b, + 0x65, 0x74, 0x2e, 0x6f, 0x6e, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x29, 0x20, 0x7b, 0x47, 0x6f, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x4e, 0x61, 0x76, 0x2e, 0x57, + 0x53, 0x4f, 0x70, 0x65, 0x6e, 0x28, 0x29, 0x3b, 0x7d, 0x2e, 0x62, + 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x3b, 0x73, + 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x6f, 0x6e, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x29, 0x20, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x41, 0x70, 0x70, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x5b, 0x27, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x44, + 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, + 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x41, 0x70, 0x70, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, + 0x44, 0x61, 0x74, 0x61, 0x28, 0x29, 0x3b, 0x7d, 0x2e, 0x62, 0x69, + 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x3b, 0x73, 0x6f, + 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x6f, 0x6e, 0x63, 0x6c, 0x6f, 0x73, + 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x29, 0x20, 0x7b, + 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x4e, 0x61, + 0x76, 0x2e, 0x57, 0x53, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, + 0x3b, 0x7d, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x29, 0x3b, 0x7d, 0x2c, 0x7d, 0x3b, 0x47, 0x6f, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x55, 0x74, 0x69, 0x6c, 0x20, 0x3d, + 0x20, 0x7b, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x73, 0x3a, 0x20, 0x5b, + 0x22, 0x4a, 0x61, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x46, 0x65, 0x62, + 0x22, 0x2c, 0x20, 0x22, 0x4d, 0x61, 0x72, 0x22, 0x2c, 0x20, 0x22, + 0x41, 0x70, 0x72, 0x22, 0x2c, 0x20, 0x22, 0x4d, 0x61, 0x79, 0x22, + 0x2c, 0x20, 0x22, 0x4a, 0x75, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x4a, + 0x75, 0x6c, 0x22, 0x2c, 0x22, 0x41, 0x75, 0x67, 0x22, 0x2c, 0x20, + 0x22, 0x53, 0x65, 0x70, 0x22, 0x2c, 0x20, 0x22, 0x4f, 0x63, 0x74, + 0x22, 0x2c, 0x20, 0x22, 0x4e, 0x6f, 0x76, 0x22, 0x2c, 0x20, 0x22, + 0x44, 0x65, 0x63, 0x22, 0x5d, 0x2c, 0x6d, 0x65, 0x72, 0x67, 0x65, + 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x28, 0x6f, 0x2c, 0x20, 0x6e, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x6f, 0x62, 0x6a, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x2c, 0x20, + 0x69, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x69, 0x6c, 0x20, 0x3d, + 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x20, 0x6b, 0x65, 0x79, + 0x3b, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x3b, 0x20, 0x69, 0x20, 0x3c, + 0x20, 0x69, 0x6c, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, + 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6b, 0x65, 0x79, 0x20, 0x69, 0x6e, + 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5b, + 0x69, 0x5d, 0x29, 0x20, 0x7b, 0x69, 0x66, 0x20, 0x28, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5b, 0x69, 0x5d, 0x2e, + 0x68, 0x61, 0x73, 0x4f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x28, 0x6b, 0x65, 0x79, 0x29, 0x29, 0x20, 0x7b, + 0x6f, 0x62, 0x6a, 0x5b, 0x6b, 0x65, 0x79, 0x5d, 0x20, 0x3d, 0x20, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5b, 0x69, + 0x5d, 0x5b, 0x6b, 0x65, 0x79, 0x5d, 0x3b, 0x7d, 0x7d, 0x7d, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x62, 0x6a, 0x3b, 0x7d, + 0x2c, 0x68, 0x61, 0x73, 0x68, 0x43, 0x6f, 0x64, 0x65, 0x3a, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x73, + 0x29, 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, + 0x73, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x27, 0x29, + 0x2e, 0x72, 0x65, 0x64, 0x75, 0x63, 0x65, 0x28, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x61, 0x2c, 0x20, 0x62, + 0x29, 0x20, 0x7b, 0x61, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x61, 0x20, + 0x3c, 0x3c, 0x20, 0x35, 0x29, 0x20, 0x2d, 0x20, 0x61, 0x29, 0x20, + 0x2b, 0x20, 0x62, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x43, 0x6f, 0x64, + 0x65, 0x41, 0x74, 0x28, 0x30, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x61, 0x26, 0x61, 0x3b, 0x7d, 0x2c, 0x20, 0x30, + 0x29, 0x20, 0x3e, 0x3e, 0x3e, 0x20, 0x30, 0x29, 0x2e, 0x74, 0x6f, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x31, 0x36, 0x29, 0x3b, + 0x7d, 0x2c, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x42, 0x79, 0x74, + 0x65, 0x73, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x28, 0x62, 0x79, 0x74, 0x65, 0x73, 0x2c, 0x20, 0x64, + 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x2c, 0x20, 0x6e, 0x75, + 0x6d, 0x4f, 0x6e, 0x6c, 0x79, 0x29, 0x20, 0x7b, 0x69, 0x66, 0x20, + 0x28, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x30, + 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x75, 0x6d, + 0x4f, 0x6e, 0x6c, 0x79, 0x20, 0x3f, 0x20, 0x30, 0x20, 0x3a, 0x20, + 0x27, 0x30, 0x20, 0x42, 0x79, 0x74, 0x65, 0x27, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x6b, 0x20, 0x3d, 0x20, 0x31, 0x30, 0x32, 0x34, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x64, 0x6d, 0x20, 0x3d, 0x20, 0x64, 0x65, + 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x20, 0x2b, 0x20, 0x31, 0x20, + 0x7c, 0x7c, 0x20, 0x32, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x73, 0x69, + 0x7a, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x5b, 0x27, 0x42, 0x27, 0x2c, + 0x20, 0x27, 0x4b, 0x69, 0x42, 0x27, 0x2c, 0x20, 0x27, 0x4d, 0x69, + 0x42, 0x27, 0x2c, 0x20, 0x27, 0x47, 0x69, 0x42, 0x27, 0x2c, 0x20, + 0x27, 0x54, 0x69, 0x42, 0x27, 0x2c, 0x20, 0x27, 0x50, 0x69, 0x42, + 0x27, 0x5d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x62, 0x79, + 0x74, 0x65, 0x73, 0x29, 0x20, 0x2f, 0x20, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x6b, 0x29, 0x29, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x46, + 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x28, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x20, 0x2f, 0x20, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x70, 0x6f, 0x77, + 0x28, 0x6b, 0x2c, 0x20, 0x69, 0x29, 0x29, 0x2e, 0x74, 0x6f, 0x46, + 0x69, 0x78, 0x65, 0x64, 0x28, 0x64, 0x6d, 0x29, 0x29, 0x20, 0x2b, + 0x20, 0x28, 0x6e, 0x75, 0x6d, 0x4f, 0x6e, 0x6c, 0x79, 0x20, 0x3f, + 0x20, 0x27, 0x27, 0x20, 0x3a, 0x20, 0x28, 0x27, 0x20, 0x27, 0x20, + 0x2b, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5b, 0x69, 0x5d, 0x29, + 0x29, 0x3b, 0x7d, 0x2c, 0x69, 0x73, 0x4e, 0x75, 0x6d, 0x65, 0x72, + 0x69, 0x63, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x28, 0x6e, 0x29, 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x21, 0x69, 0x73, 0x4e, 0x61, 0x4e, 0x28, 0x70, + 0x61, 0x72, 0x73, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x6e, + 0x29, 0x29, 0x20, 0x26, 0x26, 0x20, 0x69, 0x73, 0x46, 0x69, 0x6e, + 0x69, 0x74, 0x65, 0x28, 0x6e, 0x29, 0x3b, 0x7d, 0x2c, 0x75, 0x74, + 0x69, 0x6d, 0x65, 0x32, 0x73, 0x74, 0x72, 0x3a, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x75, 0x73, 0x65, + 0x63, 0x29, 0x20, 0x7b, 0x69, 0x66, 0x20, 0x28, 0x75, 0x73, 0x65, + 0x63, 0x20, 0x3e, 0x3d, 0x20, 0x38, 0x36, 0x34, 0x45, 0x38, 0x29, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x75, 0x73, + 0x65, 0x63, 0x29, 0x20, 0x2f, 0x20, 0x38, 0x36, 0x34, 0x45, 0x38, + 0x29, 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x32, + 0x29, 0x20, 0x2b, 0x20, 0x27, 0x20, 0x64, 0x27, 0x3b, 0x65, 0x6c, + 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x73, 0x65, 0x63, + 0x20, 0x3e, 0x3d, 0x20, 0x33, 0x36, 0x45, 0x38, 0x29, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x75, 0x73, 0x65, 0x63, + 0x29, 0x20, 0x2f, 0x20, 0x33, 0x36, 0x45, 0x38, 0x29, 0x2e, 0x74, + 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x32, 0x29, 0x20, 0x2b, + 0x20, 0x27, 0x20, 0x68, 0x27, 0x3b, 0x65, 0x6c, 0x73, 0x65, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x75, 0x73, 0x65, 0x63, 0x20, 0x3e, 0x3d, + 0x20, 0x36, 0x45, 0x37, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x28, 0x28, 0x75, 0x73, 0x65, 0x63, 0x29, 0x20, 0x2f, 0x20, + 0x36, 0x45, 0x37, 0x29, 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, + 0x64, 0x28, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x27, 0x20, 0x6d, 0x27, + 0x3b, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, + 0x73, 0x65, 0x63, 0x20, 0x3e, 0x3d, 0x20, 0x31, 0x45, 0x36, 0x29, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x75, 0x73, + 0x65, 0x63, 0x29, 0x20, 0x2f, 0x20, 0x31, 0x45, 0x36, 0x29, 0x2e, + 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x32, 0x29, 0x20, + 0x2b, 0x20, 0x27, 0x20, 0x73, 0x27, 0x3b, 0x65, 0x6c, 0x73, 0x65, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x73, 0x65, 0x63, 0x20, 0x3e, + 0x3d, 0x20, 0x31, 0x45, 0x33, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x28, 0x28, 0x75, 0x73, 0x65, 0x63, 0x29, 0x20, 0x2f, + 0x20, 0x31, 0x45, 0x33, 0x29, 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, + 0x65, 0x64, 0x28, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x27, 0x20, 0x6d, + 0x73, 0x27, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, + 0x75, 0x73, 0x65, 0x63, 0x29, 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, + 0x65, 0x64, 0x28, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x27, 0x20, 0x75, + 0x73, 0x27, 0x3b, 0x7d, 0x2c, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x44, 0x61, 0x74, 0x65, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x73, 0x74, 0x72, 0x29, 0x20, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, + 0x2e, 0x73, 0x75, 0x62, 0x73, 0x74, 0x72, 0x28, 0x30, 0x2c, 0x34, + 0x29, 0x2c, 0x20, 0x6d, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x2e, + 0x73, 0x75, 0x62, 0x73, 0x74, 0x72, 0x28, 0x34, 0x2c, 0x32, 0x29, + 0x20, 0x2d, 0x20, 0x31, 0x2c, 0x20, 0x64, 0x20, 0x3d, 0x20, 0x73, + 0x74, 0x72, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x74, 0x72, 0x28, 0x36, + 0x2c, 0x32, 0x29, 0x2c, 0x68, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, + 0x2e, 0x73, 0x75, 0x62, 0x73, 0x74, 0x72, 0x28, 0x38, 0x2c, 0x32, + 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x30, 0x2c, 0x20, 0x69, 0x20, 0x3d, + 0x20, 0x73, 0x74, 0x72, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x74, 0x72, + 0x28, 0x31, 0x30, 0x2c, 0x20, 0x32, 0x29, 0x20, 0x20, 0x7c, 0x7c, + 0x20, 0x30, 0x2c, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, + 0x2e, 0x73, 0x75, 0x62, 0x73, 0x74, 0x72, 0x28, 0x31, 0x32, 0x2c, + 0x20, 0x32, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x30, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x64, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x65, + 0x77, 0x20, 0x44, 0x61, 0x74, 0x65, 0x28, 0x79, 0x2c, 0x6d, 0x2c, + 0x64, 0x2c, 0x68, 0x2c, 0x69, 0x2c, 0x73, 0x29, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x27, 0x30, + 0x27, 0x20, 0x2b, 0x20, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x67, 0x65, + 0x74, 0x44, 0x61, 0x74, 0x65, 0x28, 0x29, 0x29, 0x2e, 0x73, 0x6c, + 0x69, 0x63, 0x65, 0x28, 0x2d, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x27, + 0x2f, 0x27, 0x20, 0x2b, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, + 0x6f, 0x6e, 0x74, 0x68, 0x73, 0x5b, 0x64, 0x61, 0x74, 0x65, 0x2e, + 0x67, 0x65, 0x74, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x28, 0x29, 0x5d, + 0x20, 0x2b, 0x20, 0x27, 0x2f, 0x27, 0x20, 0x2b, 0x20, 0x64, 0x61, + 0x74, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x59, + 0x65, 0x61, 0x72, 0x28, 0x29, 0x3b, 0x31, 0x30, 0x20, 0x3c, 0x3d, + 0x20, 0x73, 0x74, 0x72, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x20, 0x26, 0x26, 0x20, 0x28, 0x6f, 0x75, 0x74, 0x20, 0x2b, 0x3d, + 0x20, 0x22, 0x3a, 0x22, 0x20, 0x2b, 0x20, 0x68, 0x29, 0x3b, 0x31, + 0x32, 0x20, 0x3c, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x20, 0x26, 0x26, 0x20, 0x28, 0x6f, 0x75, + 0x74, 0x20, 0x2b, 0x3d, 0x20, 0x22, 0x3a, 0x22, 0x20, 0x2b, 0x20, + 0x69, 0x29, 0x3b, 0x31, 0x34, 0x20, 0x3c, 0x3d, 0x20, 0x73, 0x74, + 0x72, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x26, 0x26, + 0x20, 0x28, 0x6f, 0x75, 0x74, 0x20, 0x2b, 0x3d, 0x20, 0x22, 0x3a, + 0x22, 0x20, 0x2b, 0x20, 0x73, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x3b, 0x7d, 0x2c, 0x66, 0x6d, + 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, + 0x2c, 0x20, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x29, + 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x3d, + 0x20, 0x30, 0x3b, 0x69, 0x66, 0x20, 0x28, 0x21, 0x64, 0x61, 0x74, + 0x61, 0x54, 0x79, 0x70, 0x65, 0x29, 0x76, 0x61, 0x6c, 0x20, 0x3d, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3b, 0x73, 0x77, 0x69, 0x74, + 0x63, 0x68, 0x20, 0x28, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, + 0x65, 0x29, 0x20, 0x7b, 0x63, 0x61, 0x73, 0x65, 0x20, 0x27, 0x75, + 0x74, 0x69, 0x6d, 0x65, 0x27, 0x3a, 0x76, 0x61, 0x6c, 0x20, 0x3d, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x75, 0x74, 0x69, 0x6d, 0x65, + 0x32, 0x73, 0x74, 0x72, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, + 0x3b, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x63, 0x61, 0x73, 0x65, + 0x20, 0x27, 0x64, 0x61, 0x74, 0x65, 0x27, 0x3a, 0x76, 0x61, 0x6c, + 0x20, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x44, 0x61, 0x74, 0x65, 0x28, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x29, 0x3b, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x63, + 0x61, 0x73, 0x65, 0x20, 0x27, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, + 0x63, 0x27, 0x3a, 0x69, 0x66, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x69, 0x73, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x28, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x29, 0x76, 0x61, 0x6c, 0x20, + 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x74, 0x6f, 0x4c, + 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x29, 0x3b, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x63, 0x61, + 0x73, 0x65, 0x20, 0x27, 0x62, 0x79, 0x74, 0x65, 0x73, 0x27, 0x3a, + 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, + 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x64, 0x65, 0x63, + 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x29, 0x3b, 0x62, 0x72, 0x65, 0x61, + 0x6b, 0x3b, 0x63, 0x61, 0x73, 0x65, 0x20, 0x27, 0x70, 0x65, 0x72, + 0x63, 0x65, 0x6e, 0x74, 0x27, 0x3a, 0x76, 0x61, 0x6c, 0x20, 0x3d, + 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, + 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x72, 0x65, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x28, 0x27, 0x2c, 0x27, 0x2c, 0x20, 0x27, 0x2e, + 0x27, 0x29, 0x29, 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, + 0x28, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x27, 0x25, 0x27, 0x3b, 0x62, + 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x63, 0x61, 0x73, 0x65, 0x20, 0x27, + 0x74, 0x69, 0x6d, 0x65, 0x27, 0x3a, 0x69, 0x66, 0x20, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x4e, 0x75, 0x6d, 0x65, 0x72, + 0x69, 0x63, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x29, 0x76, + 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, + 0x74, 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x29, 0x3b, 0x62, 0x72, 0x65, 0x61, 0x6b, + 0x3b, 0x63, 0x61, 0x73, 0x65, 0x20, 0x27, 0x73, 0x65, 0x63, 0x73, + 0x27, 0x3a, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x20, 0x2b, 0x20, 0x27, 0x20, 0x73, 0x65, 0x63, 0x73, + 0x27, 0x3b, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3b, 0x7d, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x3d, + 0x20, 0x30, 0x20, 0x3f, 0x20, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x76, 0x61, 0x6c, 0x29, 0x20, 0x3a, 0x20, 0x76, 0x61, 0x6c, + 0x3b, 0x7d, 0x2c, 0x69, 0x73, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, + 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, + 0x3d, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x67, 0x65, 0x74, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, + 0x61, 0x28, 0x29, 0x2c, 0x20, 0x75, 0x69, 0x20, 0x3d, 0x20, 0x47, + 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x67, 0x65, 0x74, + 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x55, 0x49, 0x28, 0x29, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x21, 0x75, 0x69, 0x2e, + 0x68, 0x61, 0x73, 0x4f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x20, + 0x7c, 0x7c, 0x20, 0x21, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x68, 0x61, + 0x73, 0x4f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x79, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x20, 0x7c, 0x7c, + 0x20, 0x21, 0x75, 0x69, 0x5b, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x5d, + 0x2e, 0x69, 0x64, 0x29, 0x3b, 0x7d, 0x2c, 0x67, 0x65, 0x74, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x29, 0x20, + 0x7b, 0x69, 0x66, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, + 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x28, 0x69, 0x74, 0x65, + 0x6d, 0x29, 0x20, 0x26, 0x26, 0x20, 0x27, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x27, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x29, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x74, 0x65, 0x6d, + 0x2e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x3b, 0x7d, 0x2c, 0x67, + 0x65, 0x74, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x3a, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x69, + 0x74, 0x65, 0x6d, 0x29, 0x20, 0x7b, 0x69, 0x66, 0x20, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x29, 0x20, 0x26, 0x26, 0x20, + 0x27, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x27, 0x20, 0x69, + 0x6e, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x29, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x66, 0x6d, 0x74, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x2e, + 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x27, 0x70, + 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x27, 0x29, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x3b, 0x7d, + 0x2c, 0x69, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3a, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x6f, + 0x29, 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, + 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x28, 0x6f, 0x29, 0x3b, 0x7d, 0x2c, 0x73, 0x65, 0x74, 0x50, 0x72, + 0x6f, 0x70, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x28, 0x6f, 0x2c, 0x20, 0x73, 0x2c, 0x20, 0x76, 0x29, + 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x20, 0x3d, 0x20, 0x6f, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x61, + 0x20, 0x3d, 0x20, 0x73, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, + 0x27, 0x2e, 0x27, 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x76, + 0x61, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x6e, + 0x20, 0x3d, 0x20, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x6e, 0x2d, 0x31, 0x3b, 0x20, + 0x2b, 0x2b, 0x69, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6b, + 0x20, 0x3d, 0x20, 0x61, 0x5b, 0x69, 0x5d, 0x3b, 0x69, 0x66, 0x20, + 0x28, 0x21, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5b, 0x6b, 0x5d, + 0x29, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5b, 0x6b, 0x5d, 0x20, + 0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x20, 0x3d, 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5b, 0x6b, + 0x5d, 0x3b, 0x7d, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5b, 0x61, + 0x5b, 0x6e, 0x2d, 0x31, 0x5d, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x3b, + 0x7d, 0x2c, 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x3a, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x6f, + 0x2c, 0x20, 0x73, 0x29, 0x20, 0x7b, 0x73, 0x20, 0x3d, 0x20, 0x73, + 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5c, + 0x5b, 0x28, 0x5c, 0x77, 0x2b, 0x29, 0x5c, 0x5d, 0x2f, 0x67, 0x2c, + 0x20, 0x27, 0x2e, 0x24, 0x31, 0x27, 0x29, 0x3b, 0x73, 0x20, 0x3d, + 0x20, 0x73, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, + 0x2f, 0x5e, 0x5c, 0x2e, 0x2f, 0x2c, 0x20, 0x27, 0x27, 0x29, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x73, 0x2e, 0x73, + 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x2e, 0x27, 0x29, 0x3b, 0x66, + 0x6f, 0x72, 0x20, 0x28, 0x76, 0x61, 0x72, 0x20, 0x69, 0x20, 0x3d, + 0x20, 0x30, 0x2c, 0x20, 0x6e, 0x20, 0x3d, 0x20, 0x61, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, + 0x6e, 0x3b, 0x20, 0x2b, 0x2b, 0x69, 0x29, 0x20, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x6b, 0x20, 0x3d, 0x20, 0x61, 0x5b, 0x69, 0x5d, 0x3b, + 0x69, 0x66, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x28, 0x6f, 0x29, 0x20, 0x26, + 0x26, 0x20, 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x29, 0x20, 0x7b, + 0x6f, 0x20, 0x3d, 0x20, 0x6f, 0x5b, 0x6b, 0x5d, 0x3b, 0x7d, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x3b, 0x7d, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6f, 0x3b, 0x7d, 0x2c, 0x68, 0x61, 0x73, 0x4c, 0x6f, 0x63, 0x61, + 0x6c, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, + 0x7b, 0x74, 0x72, 0x79, 0x20, 0x7b, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x73, 0x65, 0x74, + 0x49, 0x74, 0x65, 0x6d, 0x28, 0x27, 0x74, 0x65, 0x73, 0x74, 0x27, + 0x2c, 0x20, 0x27, 0x74, 0x65, 0x73, 0x74, 0x27, 0x29, 0x3b, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x74, 0x65, 0x6d, + 0x28, 0x27, 0x74, 0x65, 0x73, 0x74, 0x27, 0x29, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x7d, + 0x20, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x29, 0x20, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, + 0x65, 0x3b, 0x7d, 0x7d, 0x2c, 0x69, 0x73, 0x57, 0x69, 0x74, 0x68, + 0x69, 0x6e, 0x56, 0x69, 0x65, 0x77, 0x50, 0x6f, 0x72, 0x74, 0x3a, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, + 0x65, 0x6c, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x6c, + 0x65, 0x6d, 0x54, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x65, 0x6c, 0x2e, + 0x67, 0x65, 0x74, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x74, 0x28, + 0x29, 0x2e, 0x74, 0x6f, 0x70, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x65, + 0x6c, 0x65, 0x6d, 0x42, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x20, 0x3d, + 0x20, 0x65, 0x6c, 0x2e, 0x67, 0x65, 0x74, 0x42, 0x6f, 0x75, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x63, 0x74, 0x28, 0x29, 0x2e, 0x62, 0x6f, 0x74, 0x74, 0x6f, + 0x6d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x6c, + 0x65, 0x6d, 0x54, 0x6f, 0x70, 0x20, 0x3c, 0x20, 0x77, 0x69, 0x6e, + 0x64, 0x6f, 0x77, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x20, 0x26, 0x26, 0x20, 0x65, 0x6c, 0x65, + 0x6d, 0x42, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x20, 0x3e, 0x3d, 0x20, + 0x30, 0x3b, 0x7d, 0x2c, 0x7d, 0x3b, 0x47, 0x6f, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x4f, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x6c, + 0x53, 0x74, 0x61, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x72, 0x65, + 0x6e, 0x64, 0x65, 0x72, 0x42, 0x6f, 0x78, 0x3a, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x61, 0x74, + 0x61, 0x2c, 0x20, 0x75, 0x69, 0x2c, 0x20, 0x72, 0x6f, 0x77, 0x2c, + 0x20, 0x78, 0x2c, 0x20, 0x69, 0x64, 0x78, 0x29, 0x20, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x77, 0x72, 0x61, 0x70, 0x20, 0x3d, 0x20, 0x24, + 0x28, 0x27, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x2d, 0x67, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x6c, 0x2d, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x27, + 0x29, 0x3b, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x78, 0x20, 0x25, + 0x20, 0x36, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0x72, + 0x6f, 0x77, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x27, 0x64, 0x69, 0x76, 0x27, + 0x29, 0x3b, 0x72, 0x6f, 0x77, 0x2e, 0x73, 0x65, 0x74, 0x41, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x27, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x27, 0x2c, 0x20, 0x27, 0x72, 0x6f, 0x77, 0x27, + 0x29, 0x3b, 0x77, 0x72, 0x61, 0x70, 0x2e, 0x61, 0x70, 0x70, 0x65, + 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x72, 0x6f, 0x77, + 0x29, 0x3b, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x62, 0x6f, 0x78, 0x20, + 0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x28, 0x27, 0x64, 0x69, 0x76, 0x27, 0x29, 0x3b, 0x62, + 0x6f, 0x78, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, + 0x4c, 0x20, 0x3d, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x41, 0x70, 0x70, 0x54, 0x70, 0x6c, 0x73, 0x2e, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x2e, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x28, 0x7b, 0x27, + 0x69, 0x64, 0x27, 0x3a, 0x20, 0x78, 0x2c, 0x27, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x27, 0x3a, 0x20, 0x75, 0x69, + 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x5b, 0x78, 0x5d, 0x2e, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x2c, 0x27, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x27, 0x3a, 0x20, 0x75, 0x69, 0x2e, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x5b, 0x78, 0x5d, 0x2e, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x2c, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x27, 0x3a, + 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x55, + 0x74, 0x69, 0x6c, 0x2e, 0x66, 0x6d, 0x74, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x28, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x78, 0x5d, 0x2c, 0x20, + 0x75, 0x69, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x5b, 0x78, 0x5d, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x29, 0x2c, + 0x7d, 0x29, 0x3b, 0x72, 0x6f, 0x77, 0x2e, 0x61, 0x70, 0x70, 0x65, + 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x62, 0x6f, 0x78, + 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x6f, + 0x77, 0x3b, 0x7d, 0x2c, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x44, + 0x61, 0x74, 0x61, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2c, 0x20, 0x75, + 0x69, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x64, 0x78, + 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x72, 0x6f, 0x77, 0x20, 0x3d, + 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x3b, 0x24, 0x28, 0x27, 0x2e, 0x77, + 0x72, 0x61, 0x70, 0x2d, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, + 0x27, 0x29, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, + 0x4c, 0x20, 0x3d, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x41, 0x70, 0x70, 0x54, 0x70, 0x6c, 0x73, 0x2e, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x2e, 0x77, 0x72, 0x61, 0x70, + 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x28, 0x47, 0x6f, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x55, 0x74, 0x69, 0x6c, 0x2e, + 0x6d, 0x65, 0x72, 0x67, 0x65, 0x28, 0x75, 0x69, 0x2c, 0x20, 0x7b, + 0x27, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x27, 0x3a, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x64, 0x61, + 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x2c, 0x27, 0x66, 0x72, + 0x6f, 0x6d, 0x27, 0x3a, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x2c, 0x27, + 0x74, 0x6f, 0x27, 0x3a, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x65, + 0x6e, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x2c, 0x7d, 0x29, 0x29, + 0x3b, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x76, 0x61, 0x72, 0x20, 0x78, + 0x20, 0x69, 0x6e, 0x20, 0x64, 0x61, 0x74, 0x61, 0x29, 0x20, 0x7b, + 0x69, 0x66, 0x20, 0x28, 0x21, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x68, + 0x61, 0x73, 0x4f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x79, 0x28, 0x78, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x21, 0x75, + 0x69, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x68, 0x61, 0x73, + 0x4f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x28, 0x78, 0x29, 0x29, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, + 0x65, 0x3b, 0x72, 0x6f, 0x77, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x42, 0x6f, 0x78, + 0x28, 0x64, 0x61, 0x74, 0x61, 0x2c, 0x20, 0x75, 0x69, 0x2c, 0x20, + 0x72, 0x6f, 0x77, 0x2c, 0x20, 0x78, 0x2c, 0x20, 0x69, 0x64, 0x78, + 0x29, 0x3b, 0x69, 0x64, 0x78, 0x2b, 0x2b, 0x3b, 0x7d, 0x7d, 0x2c, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x3a, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, + 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x75, 0x69, 0x20, 0x3d, + 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x67, + 0x65, 0x74, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x55, 0x49, 0x28, 0x27, + 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x27, 0x29, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x47, + 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x67, 0x65, 0x74, + 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x28, 0x27, + 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x27, 0x29, 0x2c, 0x20, + 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x28, + 0x64, 0x61, 0x74, 0x61, 0x2c, 0x20, 0x75, 0x69, 0x29, 0x3b, 0x7d, + 0x7d, 0x3b, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x4e, 0x61, 0x76, 0x20, 0x3d, 0x20, 0x7b, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0x24, 0x28, 0x27, 0x2e, 0x6e, + 0x61, 0x76, 0x2d, 0x62, 0x61, 0x72, 0x73, 0x27, 0x29, 0x2e, 0x6f, + 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x29, 0x20, + 0x7b, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x70, 0x50, 0x72, 0x6f, 0x70, + 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x3b, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4d, + 0x65, 0x6e, 0x75, 0x28, 0x65, 0x29, 0x3b, 0x7d, 0x2e, 0x62, 0x69, + 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x3b, 0x24, 0x28, + 0x27, 0x2e, 0x6e, 0x61, 0x76, 0x2d, 0x67, 0x65, 0x61, 0x72, 0x73, + 0x27, 0x29, 0x2e, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x28, 0x65, 0x29, 0x20, 0x7b, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x70, + 0x50, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x6e, + 0x64, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x73, 0x28, 0x65, 0x29, 0x3b, + 0x7d, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x29, 0x3b, 0x24, 0x28, 0x27, 0x2e, 0x6e, 0x61, 0x76, 0x2d, 0x6d, + 0x69, 0x6e, 0x69, 0x62, 0x61, 0x72, 0x73, 0x27, 0x29, 0x2e, 0x6f, + 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x29, 0x20, + 0x7b, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x70, 0x50, 0x72, 0x6f, 0x70, + 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x3b, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4f, + 0x70, 0x74, 0x73, 0x28, 0x65, 0x29, 0x3b, 0x7d, 0x2e, 0x62, 0x69, + 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x3b, 0x24, 0x28, + 0x27, 0x62, 0x6f, 0x64, 0x79, 0x27, 0x29, 0x2e, 0x6f, 0x6e, 0x63, + 0x6c, 0x69, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x29, 0x20, 0x7b, 0x24, + 0x28, 0x27, 0x6e, 0x61, 0x76, 0x27, 0x29, 0x2e, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x72, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x28, 0x27, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x27, + 0x29, 0x3b, 0x7d, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x29, 0x3b, 0x24, 0x24, 0x28, 0x27, 0x2e, 0x65, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x2d, 0x6a, 0x73, 0x6f, 0x6e, 0x27, 0x2c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, + 0x69, 0x74, 0x65, 0x6d, 0x29, 0x20, 0x7b, 0x69, 0x74, 0x65, 0x6d, + 0x2e, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, + 0x29, 0x20, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x6f, 0x77, + 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4a, 0x53, 0x4f, 0x4e, 0x28, 0x65, + 0x29, 0x3b, 0x7d, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x29, 0x3b, 0x7d, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x29, 0x29, 0x3b, 0x24, 0x24, 0x28, 0x27, + 0x2e, 0x74, 0x68, 0x65, 0x6d, 0x65, 0x2d, 0x62, 0x72, 0x69, 0x67, + 0x68, 0x74, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x29, 0x20, 0x7b, + 0x69, 0x74, 0x65, 0x6d, 0x2e, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, + 0x6b, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x28, 0x65, 0x29, 0x20, 0x7b, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x73, 0x65, 0x74, 0x54, 0x68, 0x65, 0x6d, 0x65, 0x28, 0x27, + 0x62, 0x72, 0x69, 0x67, 0x68, 0x74, 0x27, 0x29, 0x3b, 0x7d, 0x2e, + 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x3b, + 0x7d, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x29, 0x29, 0x3b, 0x24, 0x24, 0x28, 0x27, 0x2e, 0x74, 0x68, 0x65, + 0x6d, 0x65, 0x2d, 0x64, 0x61, 0x72, 0x6b, 0x2d, 0x62, 0x6c, 0x75, + 0x65, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x29, 0x20, 0x7b, 0x69, + 0x74, 0x65, 0x6d, 0x2e, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x28, 0x65, 0x29, 0x20, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x73, 0x65, 0x74, 0x54, 0x68, 0x65, 0x6d, 0x65, 0x28, 0x27, 0x64, + 0x61, 0x72, 0x6b, 0x42, 0x6c, 0x75, 0x65, 0x27, 0x29, 0x3b, 0x7d, + 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, + 0x3b, 0x7d, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x29, 0x29, 0x3b, 0x24, 0x24, 0x28, 0x27, 0x2e, 0x74, 0x68, + 0x65, 0x6d, 0x65, 0x2d, 0x64, 0x61, 0x72, 0x6b, 0x2d, 0x67, 0x72, + 0x61, 0x79, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x29, 0x20, 0x7b, + 0x69, 0x74, 0x65, 0x6d, 0x2e, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, + 0x6b, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x28, 0x65, 0x29, 0x20, 0x7b, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x73, 0x65, 0x74, 0x54, 0x68, 0x65, 0x6d, 0x65, 0x28, 0x27, + 0x64, 0x61, 0x72, 0x6b, 0x47, 0x72, 0x61, 0x79, 0x27, 0x29, 0x3b, + 0x7d, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x29, 0x3b, 0x7d, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x29, 0x29, 0x3b, 0x24, 0x24, 0x28, 0x27, 0x2e, 0x74, + 0x68, 0x65, 0x6d, 0x65, 0x2d, 0x64, 0x61, 0x72, 0x6b, 0x2d, 0x70, + 0x75, 0x72, 0x70, 0x6c, 0x65, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x69, 0x74, 0x65, 0x6d, + 0x29, 0x20, 0x7b, 0x69, 0x74, 0x65, 0x6d, 0x2e, 0x6f, 0x6e, 0x63, + 0x6c, 0x69, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x29, 0x20, 0x7b, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x54, 0x68, 0x65, 0x6d, + 0x65, 0x28, 0x27, 0x64, 0x61, 0x72, 0x6b, 0x50, 0x75, 0x72, 0x70, + 0x6c, 0x65, 0x27, 0x29, 0x3b, 0x7d, 0x2e, 0x62, 0x69, 0x6e, 0x64, + 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x3b, 0x7d, 0x2e, 0x62, 0x69, + 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x29, 0x3b, 0x24, + 0x24, 0x28, 0x27, 0x2e, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x2d, + 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x27, + 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x28, 0x69, 0x74, 0x65, 0x6d, 0x29, 0x20, 0x7b, 0x69, 0x74, 0x65, + 0x6d, 0x2e, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, + 0x65, 0x29, 0x20, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, + 0x74, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x27, 0x68, 0x6f, + 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x27, 0x29, 0x3b, + 0x7d, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x29, 0x3b, 0x7d, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x29, 0x29, 0x3b, 0x24, 0x24, 0x28, 0x27, 0x2e, 0x6c, + 0x61, 0x79, 0x6f, 0x75, 0x74, 0x2d, 0x76, 0x65, 0x72, 0x74, 0x69, + 0x63, 0x61, 0x6c, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x29, 0x20, + 0x7b, 0x69, 0x74, 0x65, 0x6d, 0x2e, 0x6f, 0x6e, 0x63, 0x6c, 0x69, + 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x29, 0x20, 0x7b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x73, 0x65, 0x74, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, + 0x28, 0x27, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x27, + 0x29, 0x3b, 0x7d, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x29, 0x3b, 0x7d, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x29, 0x29, 0x3b, 0x24, 0x24, 0x28, 0x27, + 0x5b, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x70, 0x65, 0x72, 0x70, 0x61, + 0x67, 0x65, 0x5d, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x29, 0x20, + 0x7b, 0x69, 0x74, 0x65, 0x6d, 0x2e, 0x6f, 0x6e, 0x63, 0x6c, 0x69, + 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x29, 0x20, 0x7b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x73, 0x65, 0x74, 0x50, 0x65, 0x72, 0x50, 0x61, 0x67, + 0x65, 0x28, 0x65, 0x29, 0x3b, 0x7d, 0x2e, 0x62, 0x69, 0x6e, 0x64, + 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x3b, 0x7d, 0x2e, 0x62, 0x69, + 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x29, 0x3b, 0x24, + 0x24, 0x28, 0x27, 0x5b, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x68, + 0x6f, 0x77, 0x2d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x5d, 0x27, + 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x28, 0x69, 0x74, 0x65, 0x6d, 0x29, 0x20, 0x7b, 0x69, 0x74, 0x65, + 0x6d, 0x2e, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, + 0x65, 0x29, 0x20, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x74, 0x6f, + 0x67, 0x67, 0x6c, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x28, + 0x29, 0x3b, 0x7d, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x29, 0x3b, 0x7d, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x29, 0x29, 0x3b, 0x24, 0x24, 0x28, 0x27, + 0x5b, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x61, 0x75, 0x74, 0x6f, 0x68, + 0x69, 0x64, 0x65, 0x2d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x5d, + 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x29, 0x20, 0x7b, 0x69, 0x74, + 0x65, 0x6d, 0x2e, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x28, 0x65, 0x29, 0x20, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x74, + 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x48, 0x69, + 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x28, 0x29, 0x3b, + 0x7d, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x29, 0x3b, 0x7d, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x29, 0x29, 0x3b, 0x7d, 0x2c, 0x64, 0x6f, 0x77, 0x6e, + 0x6c, 0x6f, 0x61, 0x64, 0x4a, 0x53, 0x4f, 0x4e, 0x3a, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x29, + 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x61, 0x72, 0x67, 0x20, + 0x3d, 0x20, 0x65, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x22, 0x74, 0x65, 0x78, + 0x74, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x3b, 0x63, 0x68, 0x61, 0x72, + 0x73, 0x65, 0x74, 0x3d, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x2c, 0x22, + 0x20, 0x2b, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x55, 0x52, + 0x49, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x28, + 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x69, 0x66, 0x79, 0x28, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x44, + 0x61, 0x74, 0x61, 0x28, 0x29, 0x29, 0x29, 0x3b, 0x74, 0x61, 0x72, + 0x67, 0x2e, 0x68, 0x72, 0x65, 0x66, 0x20, 0x3d, 0x20, 0x27, 0x64, + 0x61, 0x74, 0x61, 0x3a, 0x27, 0x20, 0x2b, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x3b, 0x74, 0x61, 0x72, 0x67, 0x2e, 0x64, 0x6f, 0x77, 0x6e, + 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x3d, 0x20, 0x27, 0x67, 0x6f, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2d, 0x27, 0x20, 0x2b, 0x20, 0x28, + 0x2b, 0x6e, 0x65, 0x77, 0x20, 0x44, 0x61, 0x74, 0x65, 0x28, 0x29, + 0x29, 0x20, 0x2b, 0x20, 0x27, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x27, + 0x3b, 0x7d, 0x2c, 0x73, 0x65, 0x74, 0x4c, 0x61, 0x79, 0x6f, 0x75, + 0x74, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x28, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x29, 0x20, 0x7b, + 0x69, 0x66, 0x20, 0x28, 0x27, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, + 0x6e, 0x74, 0x61, 0x6c, 0x27, 0x20, 0x3d, 0x3d, 0x20, 0x6c, 0x61, + 0x79, 0x6f, 0x75, 0x74, 0x29, 0x20, 0x7b, 0x24, 0x28, 0x27, 0x2e, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x27, 0x29, + 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x2e, + 0x61, 0x64, 0x64, 0x28, 0x27, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x2d, 0x66, 0x6c, 0x75, 0x69, 0x64, 0x27, 0x29, + 0x3b, 0x24, 0x28, 0x27, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x27, 0x29, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x28, 0x27, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x27, 0x29, 0x3b, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x27, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, + 0x6c, 0x27, 0x20, 0x3d, 0x3d, 0x20, 0x6c, 0x61, 0x79, 0x6f, 0x75, + 0x74, 0x29, 0x20, 0x7b, 0x24, 0x28, 0x27, 0x2e, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2d, 0x66, 0x6c, 0x75, 0x69, + 0x64, 0x27, 0x29, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4c, 0x69, + 0x73, 0x74, 0x2e, 0x61, 0x64, 0x64, 0x28, 0x27, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x27, 0x29, 0x3b, 0x24, 0x28, + 0x27, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x27, 0x29, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4c, 0x69, 0x73, + 0x74, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x27, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2d, 0x66, 0x6c, + 0x75, 0x69, 0x64, 0x27, 0x29, 0x3b, 0x7d, 0x47, 0x6f, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x50, 0x72, 0x65, + 0x66, 0x73, 0x5b, 0x27, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x27, + 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x3b, + 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x73, 0x65, + 0x74, 0x50, 0x72, 0x65, 0x66, 0x73, 0x28, 0x29, 0x3b, 0x47, 0x6f, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x50, 0x61, 0x6e, 0x65, + 0x6c, 0x73, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, + 0x7a, 0x65, 0x28, 0x29, 0x3b, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x2e, 0x43, 0x68, 0x61, 0x72, 0x74, 0x73, 0x2e, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x29, + 0x3b, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x69, + 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x29, 0x3b, 0x7d, 0x2c, 0x74, + 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x48, 0x69, + 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x3a, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x29, + 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x48, + 0x69, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x20, 0x3d, + 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x48, + 0x69, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x28, 0x29, + 0x3b, 0x24, 0x24, 0x28, 0x27, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2d, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x27, 0x2c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x69, + 0x74, 0x65, 0x6d, 0x29, 0x20, 0x7b, 0x69, 0x66, 0x20, 0x28, 0x61, + 0x75, 0x74, 0x6f, 0x48, 0x69, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x29, 0x20, 0x7b, 0x69, 0x74, 0x65, 0x6d, 0x2e, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x72, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x27, 0x68, 0x69, 0x64, 0x64, 0x65, + 0x6e, 0x2d, 0x78, 0x73, 0x27, 0x29, 0x3b, 0x7d, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x20, 0x7b, 0x69, 0x74, 0x65, 0x6d, 0x2e, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x61, 0x64, 0x64, + 0x28, 0x27, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x2d, 0x78, 0x73, + 0x27, 0x29, 0x3b, 0x7d, 0x7d, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x29, 0x29, 0x3b, 0x47, 0x6f, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x50, 0x72, 0x65, + 0x66, 0x73, 0x5b, 0x27, 0x61, 0x75, 0x74, 0x6f, 0x48, 0x69, 0x64, + 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x27, 0x5d, 0x20, 0x3d, + 0x20, 0x21, 0x61, 0x75, 0x74, 0x6f, 0x48, 0x69, 0x64, 0x65, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x73, 0x3b, 0x47, 0x6f, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x50, 0x72, 0x65, 0x66, + 0x73, 0x28, 0x29, 0x3b, 0x7d, 0x2c, 0x74, 0x6f, 0x67, 0x67, 0x6c, + 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x3a, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x75, 0x69, 0x20, 0x3d, 0x20, 0x47, 0x6f, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x50, + 0x61, 0x6e, 0x65, 0x6c, 0x55, 0x49, 0x28, 0x29, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x73, 0x20, 0x3d, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2e, 0x73, 0x68, + 0x6f, 0x77, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x28, 0x29, 0x3b, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x73, + 0x28, 0x75, 0x69, 0x29, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, + 0x68, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x69, 0x64, 0x78, + 0x29, 0x20, 0x7b, 0x69, 0x66, 0x20, 0x28, 0x21, 0x47, 0x6f, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x55, 0x74, 0x69, 0x6c, 0x2e, + 0x69, 0x73, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x29, 0x75, 0x69, + 0x5b, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x5d, 0x5b, 0x27, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x21, 0x73, 0x68, + 0x6f, 0x77, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x3b, 0x7d, 0x2e, + 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x29, + 0x3b, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x41, + 0x70, 0x70, 0x50, 0x72, 0x65, 0x66, 0x73, 0x5b, 0x27, 0x73, 0x68, + 0x6f, 0x77, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x27, 0x5d, 0x20, + 0x3d, 0x20, 0x21, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x3b, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x73, 0x65, 0x74, 0x50, 0x72, 0x65, 0x66, 0x73, 0x28, 0x29, + 0x3b, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x50, + 0x61, 0x6e, 0x65, 0x6c, 0x73, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x69, + 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x29, 0x3b, 0x47, 0x6f, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x43, 0x68, 0x61, 0x72, 0x74, + 0x73, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x28, 0x29, 0x3b, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2e, 0x69, 0x6e, + 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x29, 0x3b, + 0x7d, 0x2c, 0x73, 0x65, 0x74, 0x54, 0x68, 0x65, 0x6d, 0x65, 0x3a, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, + 0x74, 0x68, 0x65, 0x6d, 0x65, 0x29, 0x20, 0x7b, 0x69, 0x66, 0x20, + 0x28, 0x21, 0x74, 0x68, 0x65, 0x6d, 0x65, 0x29, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x3b, 0x24, 0x28, 0x27, 0x68, 0x74, 0x6d, 0x6c, + 0x27, 0x29, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, + 0x65, 0x20, 0x3d, 0x20, 0x27, 0x27, 0x3b, 0x73, 0x77, 0x69, 0x74, + 0x63, 0x68, 0x28, 0x74, 0x68, 0x65, 0x6d, 0x65, 0x29, 0x20, 0x7b, + 0x63, 0x61, 0x73, 0x65, 0x20, 0x27, 0x64, 0x61, 0x72, 0x6b, 0x47, + 0x72, 0x61, 0x79, 0x27, 0x3a, 0x24, 0x28, 0x27, 0x68, 0x74, 0x6d, + 0x6c, 0x27, 0x29, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4c, 0x69, + 0x73, 0x74, 0x2e, 0x61, 0x64, 0x64, 0x28, 0x27, 0x64, 0x61, 0x72, + 0x6b, 0x27, 0x29, 0x3b, 0x24, 0x28, 0x27, 0x68, 0x74, 0x6d, 0x6c, + 0x27, 0x29, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4c, 0x69, 0x73, + 0x74, 0x2e, 0x61, 0x64, 0x64, 0x28, 0x27, 0x67, 0x72, 0x61, 0x79, + 0x27, 0x29, 0x3b, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x63, 0x61, + 0x73, 0x65, 0x20, 0x27, 0x64, 0x61, 0x72, 0x6b, 0x42, 0x6c, 0x75, + 0x65, 0x27, 0x3a, 0x24, 0x28, 0x27, 0x68, 0x74, 0x6d, 0x6c, 0x27, + 0x29, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, + 0x2e, 0x61, 0x64, 0x64, 0x28, 0x27, 0x64, 0x61, 0x72, 0x6b, 0x27, + 0x29, 0x3b, 0x24, 0x28, 0x27, 0x68, 0x74, 0x6d, 0x6c, 0x27, 0x29, + 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x2e, + 0x61, 0x64, 0x64, 0x28, 0x27, 0x62, 0x6c, 0x75, 0x65, 0x27, 0x29, + 0x3b, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x63, 0x61, 0x73, 0x65, + 0x20, 0x27, 0x64, 0x61, 0x72, 0x6b, 0x50, 0x75, 0x72, 0x70, 0x6c, + 0x65, 0x27, 0x3a, 0x24, 0x28, 0x27, 0x68, 0x74, 0x6d, 0x6c, 0x27, + 0x29, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, + 0x2e, 0x61, 0x64, 0x64, 0x28, 0x27, 0x64, 0x61, 0x72, 0x6b, 0x27, + 0x29, 0x3b, 0x24, 0x28, 0x27, 0x68, 0x74, 0x6d, 0x6c, 0x27, 0x29, + 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x2e, + 0x61, 0x64, 0x64, 0x28, 0x27, 0x70, 0x75, 0x72, 0x70, 0x6c, 0x65, + 0x27, 0x29, 0x3b, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x7d, 0x47, + 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x41, 0x70, 0x70, + 0x50, 0x72, 0x65, 0x66, 0x73, 0x5b, 0x27, 0x74, 0x68, 0x65, 0x6d, + 0x65, 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x65, + 0x3b, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x73, + 0x65, 0x74, 0x50, 0x72, 0x65, 0x66, 0x73, 0x28, 0x29, 0x3b, 0x7d, + 0x2c, 0x67, 0x65, 0x74, 0x49, 0x63, 0x6f, 0x6e, 0x3a, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x6b, 0x65, + 0x79, 0x29, 0x20, 0x7b, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x28, + 0x6b, 0x65, 0x79, 0x29, 0x20, 0x7b, 0x63, 0x61, 0x73, 0x65, 0x20, + 0x27, 0x76, 0x69, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x73, 0x27, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3a, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x75, 0x73, 0x65, 0x72, 0x73, + 0x27, 0x3b, 0x63, 0x61, 0x73, 0x65, 0x20, 0x27, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x73, 0x27, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3a, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x27, 0x66, 0x69, 0x6c, 0x65, 0x27, 0x3b, 0x63, 0x61, 0x73, + 0x65, 0x20, 0x27, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x27, 0x20, 0x3a, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x66, 0x69, 0x6c, + 0x65, 0x2d, 0x74, 0x65, 0x78, 0x74, 0x27, 0x3b, 0x63, 0x61, 0x73, + 0x65, 0x20, 0x27, 0x6e, 0x6f, 0x74, 0x5f, 0x66, 0x6f, 0x75, 0x6e, + 0x64, 0x27, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3a, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x66, 0x69, 0x6c, + 0x65, 0x2d, 0x6f, 0x27, 0x3b, 0x63, 0x61, 0x73, 0x65, 0x20, 0x27, + 0x68, 0x6f, 0x73, 0x74, 0x73, 0x27, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3a, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x27, 0x75, 0x73, 0x65, 0x72, 0x27, 0x3b, + 0x63, 0x61, 0x73, 0x65, 0x20, 0x27, 0x6f, 0x73, 0x27, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3a, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, + 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x27, 0x3b, 0x63, 0x61, + 0x73, 0x65, 0x20, 0x27, 0x62, 0x72, 0x6f, 0x77, 0x73, 0x65, 0x72, + 0x73, 0x27, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3a, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x63, 0x68, + 0x72, 0x6f, 0x6d, 0x65, 0x27, 0x3b, 0x63, 0x61, 0x73, 0x65, 0x20, + 0x27, 0x76, 0x69, 0x73, 0x69, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x27, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3a, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x63, 0x6c, 0x6f, 0x63, 0x6b, + 0x2d, 0x6f, 0x27, 0x3b, 0x63, 0x61, 0x73, 0x65, 0x20, 0x27, 0x76, + 0x68, 0x6f, 0x73, 0x74, 0x73, 0x27, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3a, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x27, 0x74, 0x68, 0x2d, 0x6c, 0x69, 0x73, 0x74, + 0x27, 0x3b, 0x63, 0x61, 0x73, 0x65, 0x20, 0x27, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x72, 0x65, 0x72, 0x73, 0x27, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3a, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x27, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2d, + 0x6c, 0x69, 0x6e, 0x6b, 0x27, 0x3b, 0x63, 0x61, 0x73, 0x65, 0x20, + 0x27, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x5f, + 0x73, 0x69, 0x74, 0x65, 0x73, 0x27, 0x20, 0x3a, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x65, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, 0x27, 0x3b, 0x63, + 0x61, 0x73, 0x65, 0x20, 0x27, 0x6b, 0x65, 0x79, 0x70, 0x68, 0x72, + 0x61, 0x73, 0x65, 0x73, 0x27, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3a, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x27, 0x3b, 0x63, 0x61, 0x73, 0x65, + 0x20, 0x27, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, + 0x64, 0x65, 0x73, 0x27, 0x20, 0x20, 0x20, 0x20, 0x3a, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x77, 0x61, 0x72, 0x6e, + 0x69, 0x6e, 0x67, 0x27, 0x3b, 0x63, 0x61, 0x73, 0x65, 0x20, 0x27, + 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x75, 0x73, 0x65, 0x72, + 0x27, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3a, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x27, 0x75, 0x73, 0x65, 0x72, 0x73, 0x27, + 0x3b, 0x63, 0x61, 0x73, 0x65, 0x20, 0x27, 0x67, 0x65, 0x6f, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3a, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x27, 0x6d, 0x61, 0x70, 0x2d, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, + 0x27, 0x3b, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3a, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x27, 0x70, 0x69, 0x65, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x74, + 0x27, 0x3b, 0x7d, 0x7d, 0x2c, 0x67, 0x65, 0x74, 0x49, 0x74, 0x65, + 0x6d, 0x73, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x75, + 0x69, 0x20, 0x3d, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x55, + 0x49, 0x28, 0x29, 0x2c, 0x20, 0x6d, 0x65, 0x6e, 0x75, 0x20, 0x3d, + 0x20, 0x5b, 0x5d, 0x3b, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x76, 0x61, + 0x72, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x69, 0x6e, 0x20, + 0x75, 0x69, 0x29, 0x20, 0x7b, 0x69, 0x66, 0x20, 0x28, 0x47, 0x6f, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x55, 0x74, 0x69, 0x6c, + 0x2e, 0x69, 0x73, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x29, 0x63, + 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x3b, 0x6d, 0x65, 0x6e, + 0x75, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x7b, 0x27, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x27, 0x3a, 0x20, 0x77, 0x69, 0x6e, + 0x64, 0x6f, 0x77, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x2e, 0x73, 0x75, 0x62, 0x73, + 0x74, 0x72, 0x28, 0x31, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x2c, 0x27, 0x68, 0x65, 0x61, 0x64, 0x27, 0x3a, + 0x20, 0x75, 0x69, 0x5b, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x5d, 0x2e, + 0x68, 0x65, 0x61, 0x64, 0x2c, 0x27, 0x6b, 0x65, 0x79, 0x27, 0x3a, + 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x27, 0x69, 0x63, 0x6f, + 0x6e, 0x27, 0x3a, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x67, 0x65, + 0x74, 0x49, 0x63, 0x6f, 0x6e, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x29, 0x2c, 0x7d, 0x29, 0x3b, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6d, 0x65, 0x6e, 0x75, 0x3b, 0x7d, 0x2c, 0x73, 0x65, + 0x74, 0x50, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x29, + 0x20, 0x7b, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x41, 0x70, 0x70, 0x50, 0x72, 0x65, 0x66, 0x73, 0x5b, 0x27, 0x70, + 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x27, 0x5d, 0x20, 0x3d, 0x20, + 0x2b, 0x65, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x27, 0x64, 0x61, + 0x74, 0x61, 0x2d, 0x70, 0x65, 0x72, 0x70, 0x61, 0x67, 0x65, 0x27, + 0x29, 0x3b, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x41, 0x70, 0x70, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x44, + 0x61, 0x74, 0x61, 0x28, 0x29, 0x3b, 0x47, 0x6f, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x50, 0x72, 0x65, 0x66, + 0x73, 0x28, 0x29, 0x3b, 0x7d, 0x2c, 0x67, 0x65, 0x74, 0x54, 0x68, + 0x65, 0x6d, 0x65, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x41, 0x70, 0x70, 0x50, 0x72, 0x65, 0x66, 0x73, 0x2e, 0x74, + 0x68, 0x65, 0x6d, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x27, 0x64, 0x61, + 0x72, 0x6b, 0x47, 0x72, 0x61, 0x79, 0x27, 0x3b, 0x7d, 0x2c, 0x67, + 0x65, 0x74, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x3a, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x47, 0x6f, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x50, 0x72, + 0x65, 0x66, 0x73, 0x2e, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x20, + 0x7c, 0x7c, 0x20, 0x27, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, + 0x74, 0x61, 0x6c, 0x27, 0x3b, 0x7d, 0x2c, 0x67, 0x65, 0x74, 0x50, + 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x50, 0x72, 0x65, 0x66, + 0x73, 0x2e, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x20, 0x7c, + 0x7c, 0x20, 0x37, 0x3b, 0x7d, 0x2c, 0x72, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x4f, 0x70, 0x74, 0x73, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x6f, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x6f, 0x5b, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x4c, 0x61, 0x79, + 0x6f, 0x75, 0x74, 0x28, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x3b, 0x6f, 0x5b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x67, + 0x65, 0x74, 0x54, 0x68, 0x65, 0x6d, 0x65, 0x28, 0x29, 0x5d, 0x20, + 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x6f, 0x5b, 0x27, 0x70, + 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x27, 0x20, 0x2b, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x65, 0x72, 0x50, + 0x61, 0x67, 0x65, 0x28, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x3b, 0x6f, 0x5b, 0x27, 0x61, 0x75, 0x74, 0x6f, 0x48, + 0x69, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x27, 0x5d, + 0x20, 0x3d, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2e, 0x61, 0x75, 0x74, + 0x6f, 0x48, 0x69, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x28, 0x29, 0x3b, 0x6f, 0x5b, 0x27, 0x73, 0x68, 0x6f, 0x77, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x73, 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x47, + 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x2e, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x28, 0x29, 0x3b, 0x6f, 0x5b, 0x27, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x47, 0x6f, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x31, 0x38, 0x6e, + 0x3b, 0x24, 0x28, 0x27, 0x2e, 0x6e, 0x61, 0x76, 0x2d, 0x6c, 0x69, + 0x73, 0x74, 0x27, 0x29, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, + 0x54, 0x4d, 0x4c, 0x20, 0x3d, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x54, 0x70, 0x6c, 0x73, + 0x2e, 0x4e, 0x61, 0x76, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x72, + 0x65, 0x6e, 0x64, 0x65, 0x72, 0x28, 0x6f, 0x29, 0x3b, 0x24, 0x28, + 0x27, 0x6e, 0x61, 0x76, 0x27, 0x29, 0x2e, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x74, 0x6f, 0x67, 0x67, 0x6c, + 0x65, 0x28, 0x27, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x27, 0x29, + 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x28, 0x29, 0x3b, 0x7d, 0x2c, 0x72, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x4d, 0x65, 0x6e, 0x75, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x29, 0x20, 0x7b, 0x24, + 0x28, 0x27, 0x2e, 0x6e, 0x61, 0x76, 0x2d, 0x6c, 0x69, 0x73, 0x74, + 0x27, 0x29, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, + 0x4c, 0x20, 0x3d, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x41, 0x70, 0x70, 0x54, 0x70, 0x6c, 0x73, 0x2e, 0x4e, + 0x61, 0x76, 0x2e, 0x6d, 0x65, 0x6e, 0x75, 0x2e, 0x72, 0x65, 0x6e, + 0x64, 0x65, 0x72, 0x28, 0x7b, 0x27, 0x6e, 0x61, 0x76, 0x27, 0x3a, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x49, 0x74, + 0x65, 0x6d, 0x73, 0x28, 0x29, 0x2c, 0x27, 0x6f, 0x76, 0x65, 0x72, + 0x61, 0x6c, 0x6c, 0x27, 0x3a, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x68, 0x61, 0x73, 0x68, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x74, 0x72, + 0x28, 0x31, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x27, 0x2c, 0x27, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x27, 0x3a, 0x20, 0x47, 0x6f, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x31, 0x38, 0x6e, + 0x2c, 0x7d, 0x29, 0x3b, 0x24, 0x28, 0x27, 0x6e, 0x61, 0x76, 0x27, + 0x29, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, + 0x2e, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x28, 0x27, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x27, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x28, 0x29, 0x3b, 0x7d, + 0x2c, 0x57, 0x53, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, + 0x20, 0x7b, 0x69, 0x66, 0x20, 0x28, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x28, 0x47, 0x6f, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x57, 0x53, 0x43, + 0x6f, 0x6e, 0x6e, 0x29, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x29, 0x24, 0x24, 0x28, 0x27, 0x2e, 0x6e, 0x61, 0x76, 0x2d, 0x77, + 0x73, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x27, 0x2c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x69, + 0x74, 0x65, 0x6d, 0x29, 0x20, 0x7b, 0x20, 0x69, 0x74, 0x65, 0x6d, + 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x2e, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x20, 0x3d, 0x20, 0x27, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x27, 0x3b, 0x20, 0x7d, 0x29, 0x3b, 0x7d, 0x2c, 0x57, 0x53, + 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0x24, 0x24, + 0x28, 0x27, 0x2e, 0x6e, 0x61, 0x76, 0x2d, 0x77, 0x73, 0x2d, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x69, 0x74, 0x65, 0x6d, + 0x29, 0x20, 0x7b, 0x69, 0x74, 0x65, 0x6d, 0x2e, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x72, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x28, 0x27, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x27, 0x29, 0x3b, 0x69, 0x74, 0x65, 0x6d, 0x2e, 0x73, + 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, + 0x28, 0x27, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x27, 0x2c, 0x20, 0x27, + 0x44, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x27, 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x7d, 0x2c, 0x57, 0x53, + 0x4f, 0x70, 0x65, 0x6e, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0x24, 0x24, 0x28, + 0x27, 0x2e, 0x6e, 0x61, 0x76, 0x2d, 0x77, 0x73, 0x2d, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x29, + 0x20, 0x7b, 0x69, 0x74, 0x65, 0x6d, 0x2e, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x61, 0x64, 0x64, 0x28, 0x27, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x27, 0x29, + 0x3b, 0x69, 0x74, 0x65, 0x6d, 0x2e, 0x73, 0x65, 0x74, 0x41, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x27, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x27, 0x2c, 0x20, 0x27, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x27, 0x20, + 0x2b, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x41, 0x70, 0x70, 0x57, 0x53, 0x43, 0x6f, 0x6e, 0x6e, 0x2e, 0x75, + 0x72, 0x6c, 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x7d, 0x2c, 0x72, 0x65, + 0x6e, 0x64, 0x65, 0x72, 0x57, 0x72, 0x61, 0x70, 0x3a, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x6e, 0x61, + 0x76, 0x29, 0x20, 0x7b, 0x24, 0x28, 0x27, 0x6e, 0x61, 0x76, 0x27, + 0x29, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, + 0x20, 0x3d, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x41, 0x70, 0x70, 0x54, 0x70, 0x6c, 0x73, 0x2e, 0x4e, 0x61, + 0x76, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x2e, 0x72, 0x65, 0x6e, 0x64, + 0x65, 0x72, 0x28, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x69, 0x31, 0x38, 0x6e, 0x29, 0x3b, 0x7d, 0x2c, 0x69, 0x6e, + 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, + 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x54, 0x68, + 0x65, 0x6d, 0x65, 0x28, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x41, 0x70, 0x70, 0x50, 0x72, 0x65, 0x66, 0x73, 0x2e, + 0x74, 0x68, 0x65, 0x6d, 0x65, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x57, 0x72, 0x61, 0x70, + 0x28, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x57, 0x53, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x28, 0x29, 0x3b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x28, 0x29, 0x3b, + 0x7d, 0x7d, 0x3b, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x7b, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0x24, + 0x24, 0x28, 0x27, 0x5b, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x74, 0x6f, + 0x67, 0x67, 0x6c, 0x65, 0x3d, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, + 0x77, 0x6e, 0x5d, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x29, 0x20, + 0x7b, 0x69, 0x74, 0x65, 0x6d, 0x2e, 0x6f, 0x6e, 0x63, 0x6c, 0x69, + 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x29, 0x20, 0x7b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x4f, 0x70, 0x74, 0x73, 0x28, + 0x65, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x29, 0x3b, 0x7d, 0x2e, 0x62, 0x69, 0x6e, + 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x3b, 0x69, 0x74, 0x65, + 0x6d, 0x2e, 0x6f, 0x6e, 0x62, 0x6c, 0x75, 0x72, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, + 0x29, 0x20, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6c, 0x6f, + 0x73, 0x65, 0x4f, 0x70, 0x74, 0x73, 0x28, 0x65, 0x29, 0x3b, 0x7d, + 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, + 0x3b, 0x7d, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x29, 0x29, 0x3b, 0x24, 0x24, 0x28, 0x27, 0x5b, 0x64, 0x61, + 0x74, 0x61, 0x2d, 0x70, 0x6c, 0x6f, 0x74, 0x5d, 0x27, 0x2c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x69, + 0x74, 0x65, 0x6d, 0x29, 0x20, 0x7b, 0x69, 0x74, 0x65, 0x6d, 0x2e, + 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x29, + 0x20, 0x7b, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x43, 0x68, 0x61, 0x72, 0x74, 0x73, 0x2e, 0x72, 0x65, 0x64, 0x72, + 0x61, 0x77, 0x43, 0x68, 0x61, 0x72, 0x74, 0x28, 0x65, 0x2e, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x29, 0x3b, 0x7d, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x29, 0x3b, 0x7d, 0x2e, 0x62, 0x69, 0x6e, 0x64, + 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x29, 0x3b, 0x24, 0x24, 0x28, + 0x27, 0x5b, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x63, 0x68, 0x61, 0x72, + 0x74, 0x5d, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x29, 0x20, 0x7b, + 0x69, 0x74, 0x65, 0x6d, 0x2e, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, + 0x6b, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x28, 0x65, 0x29, 0x20, 0x7b, 0x47, 0x6f, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x43, 0x68, 0x61, 0x72, 0x74, 0x73, + 0x2e, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x43, 0x68, 0x61, 0x72, + 0x74, 0x28, 0x65, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, 0x3b, 0x7d, 0x2e, 0x62, + 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x3b, 0x7d, + 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, + 0x29, 0x3b, 0x24, 0x24, 0x28, 0x27, 0x5b, 0x64, 0x61, 0x74, 0x61, + 0x2d, 0x63, 0x68, 0x61, 0x72, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, + 0x5d, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x29, 0x20, 0x7b, 0x69, + 0x74, 0x65, 0x6d, 0x2e, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x28, 0x65, 0x29, 0x20, 0x7b, 0x47, 0x6f, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x43, 0x68, 0x61, 0x72, 0x74, 0x73, 0x2e, + 0x73, 0x65, 0x74, 0x43, 0x68, 0x61, 0x72, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x28, 0x65, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, 0x3b, 0x7d, 0x2e, 0x62, + 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x3b, 0x7d, + 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, + 0x29, 0x3b, 0x24, 0x24, 0x28, 0x27, 0x5b, 0x64, 0x61, 0x74, 0x61, + 0x2d, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5d, 0x27, 0x2c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x69, + 0x74, 0x65, 0x6d, 0x29, 0x20, 0x7b, 0x69, 0x74, 0x65, 0x6d, 0x2e, + 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x29, + 0x20, 0x7b, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2e, 0x74, 0x6f, 0x67, 0x67, + 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x28, 0x65, 0x2e, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x29, 0x3b, 0x7d, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x29, 0x3b, 0x7d, 0x2e, 0x62, 0x69, 0x6e, + 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x29, 0x3b, 0x7d, 0x2c, + 0x6f, 0x70, 0x65, 0x6e, 0x4f, 0x70, 0x74, 0x73, 0x3a, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x74, 0x61, + 0x72, 0x67, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x72, 0x67, 0x2e, + 0x67, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x65, 0x28, 0x27, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x27, 0x29, 0x3b, 0x74, 0x61, 0x72, 0x67, 0x2e, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, + 0x2e, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x28, 0x27, 0x6f, 0x70, + 0x65, 0x6e, 0x27, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, + 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x73, 0x28, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x3b, 0x7d, 0x2c, 0x63, 0x6c, 0x6f, + 0x73, 0x65, 0x4f, 0x70, 0x74, 0x73, 0x3a, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x29, 0x20, 0x7b, + 0x65, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x72, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x28, 0x27, 0x6f, 0x70, 0x65, 0x6e, 0x27, 0x29, 0x3b, + 0x69, 0x66, 0x20, 0x28, 0x65, 0x2e, 0x72, 0x65, 0x6c, 0x61, 0x74, + 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x26, 0x26, + 0x20, 0x65, 0x2e, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x27, 0x64, 0x61, + 0x74, 0x61, 0x2d, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x27, 0x29, + 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x27, 0x64, 0x72, 0x6f, 0x70, 0x64, + 0x6f, 0x77, 0x6e, 0x27, 0x29, 0x65, 0x2e, 0x72, 0x65, 0x6c, 0x61, + 0x74, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2e, 0x63, + 0x6c, 0x69, 0x63, 0x6b, 0x28, 0x29, 0x3b, 0x7d, 0x2c, 0x73, 0x65, + 0x74, 0x50, 0x6c, 0x6f, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x75, 0x69, 0x2c, 0x20, 0x70, 0x72, 0x65, + 0x66, 0x73, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x63, 0x68, + 0x61, 0x72, 0x74, 0x54, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x28, + 0x28, 0x70, 0x72, 0x65, 0x66, 0x73, 0x20, 0x7c, 0x7c, 0x20, 0x7b, + 0x7d, 0x29, 0x2e, 0x70, 0x6c, 0x6f, 0x74, 0x20, 0x7c, 0x7c, 0x20, + 0x7b, 0x7d, 0x29, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x75, 0x69, 0x2e, 0x70, 0x6c, + 0x6f, 0x74, 0x5b, 0x30, 0x5d, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x6d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x70, 0x72, + 0x65, 0x66, 0x73, 0x20, 0x7c, 0x7c, 0x20, 0x7b, 0x7d, 0x29, 0x2e, + 0x70, 0x6c, 0x6f, 0x74, 0x20, 0x7c, 0x7c, 0x20, 0x7b, 0x7d, 0x29, + 0x2e, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x20, 0x7c, 0x7c, 0x20, + 0x75, 0x69, 0x2e, 0x70, 0x6c, 0x6f, 0x74, 0x5b, 0x30, 0x5d, 0x2e, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x3b, 0x75, + 0x69, 0x5b, 0x63, 0x68, 0x61, 0x72, 0x74, 0x54, 0x79, 0x70, 0x65, + 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x66, 0x6f, + 0x72, 0x20, 0x28, 0x76, 0x61, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, + 0x30, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x75, 0x69, + 0x2e, 0x70, 0x6c, 0x6f, 0x74, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x6c, 0x65, 0x6e, 0x3b, + 0x20, 0x2b, 0x2b, 0x69, 0x29, 0x69, 0x66, 0x20, 0x28, 0x75, 0x69, + 0x2e, 0x70, 0x6c, 0x6f, 0x74, 0x5b, 0x69, 0x5d, 0x2e, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x20, + 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x29, 0x75, 0x69, 0x2e, 0x70, + 0x6c, 0x6f, 0x74, 0x5b, 0x69, 0x5d, 0x5b, 0x27, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x3b, 0x7d, 0x2c, 0x73, 0x65, 0x74, 0x43, 0x6f, + 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, + 0x73, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x63, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x72, 0x65, + 0x66, 0x73, 0x20, 0x7c, 0x7c, 0x20, 0x7b, 0x7d, 0x29, 0x2e, 0x63, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x20, 0x7c, 0x7c, 0x20, 0x7b, + 0x7d, 0x3b, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x76, 0x61, 0x72, 0x20, + 0x69, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x20, + 0x3d, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x6c, 0x65, + 0x6e, 0x3b, 0x20, 0x2b, 0x2b, 0x69, 0x29, 0x69, 0x66, 0x20, 0x28, + 0x28, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x5b, 0x69, 0x5d, 0x2e, 0x6b, + 0x65, 0x79, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x73, 0x29, 0x20, 0x26, 0x26, 0x20, 0x63, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x73, 0x5b, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x5b, 0x69, + 0x5d, 0x2e, 0x6b, 0x65, 0x79, 0x5d, 0x5b, 0x27, 0x68, 0x69, 0x64, + 0x65, 0x27, 0x5d, 0x29, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x5b, 0x69, + 0x5d, 0x5b, 0x27, 0x68, 0x69, 0x64, 0x65, 0x27, 0x5d, 0x20, 0x3d, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x7d, 0x2c, 0x73, 0x65, 0x74, + 0x43, 0x68, 0x61, 0x72, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x75, 0x69, 0x2c, 0x20, 0x70, 0x72, 0x65, + 0x66, 0x73, 0x29, 0x20, 0x7b, 0x75, 0x69, 0x5b, 0x27, 0x73, 0x68, + 0x6f, 0x77, 0x43, 0x68, 0x61, 0x72, 0x74, 0x27, 0x5d, 0x20, 0x3d, + 0x20, 0x70, 0x72, 0x65, 0x66, 0x73, 0x20, 0x26, 0x26, 0x20, 0x28, + 0x27, 0x63, 0x68, 0x61, 0x72, 0x74, 0x27, 0x20, 0x69, 0x6e, 0x20, + 0x70, 0x72, 0x65, 0x66, 0x73, 0x29, 0x20, 0x3f, 0x20, 0x70, 0x72, + 0x65, 0x66, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x74, 0x20, 0x3a, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x7d, 0x2c, 0x73, 0x65, 0x74, + 0x4f, 0x70, 0x74, 0x73, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, + 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x75, 0x69, 0x20, 0x3d, 0x20, + 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, + 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x69, 0x66, 0x79, 0x28, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x55, + 0x49, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x29, 0x29, 0x2c, + 0x20, 0x70, 0x72, 0x65, 0x66, 0x73, 0x20, 0x3d, 0x20, 0x47, 0x6f, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x50, + 0x72, 0x65, 0x66, 0x73, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, + 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x43, 0x68, + 0x61, 0x72, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x75, 0x69, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x73, + 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x50, + 0x6c, 0x6f, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x75, 0x69, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x73, + 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x43, + 0x6f, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x75, 0x69, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2c, 0x20, + 0x70, 0x72, 0x65, 0x66, 0x73, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x55, 0x74, 0x69, 0x6c, 0x2e, 0x6d, 0x65, 0x72, 0x67, 0x65, + 0x28, 0x75, 0x69, 0x2c, 0x20, 0x7b, 0x27, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x27, 0x3a, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x2e, 0x69, 0x31, 0x38, 0x6e, 0x7d, 0x29, 0x3b, 0x7d, + 0x2c, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x73, + 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x20, 0x7b, 0x24, 0x28, + 0x27, 0x2e, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2d, 0x6f, 0x70, 0x74, + 0x73, 0x2d, 0x27, 0x20, 0x2b, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x29, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, + 0x20, 0x3d, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x41, 0x70, 0x70, 0x54, 0x70, 0x6c, 0x73, 0x2e, 0x50, 0x61, + 0x6e, 0x65, 0x6c, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x72, + 0x65, 0x6e, 0x64, 0x65, 0x72, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x73, 0x65, 0x74, 0x4f, 0x70, 0x74, 0x73, 0x28, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x29, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x28, 0x29, 0x3b, 0x7d, 0x2c, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x65, 0x76, 0x3a, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x24, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x3d, 0x20, 0x24, 0x28, 0x27, 0x23, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x2d, 0x27, 0x20, 0x2b, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x20, 0x2b, 0x20, 0x27, 0x20, 0x2e, 0x70, 0x61, 0x67, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x2e, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x2d, 0x70, 0x72, 0x65, 0x76, 0x27, 0x29, 0x3b, 0x69, + 0x66, 0x20, 0x28, 0x24, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x29, 0x24, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x4e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4c, + 0x69, 0x73, 0x74, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, + 0x27, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x27, 0x29, + 0x3b, 0x7d, 0x2c, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x50, + 0x72, 0x65, 0x76, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x20, + 0x7b, 0x76, 0x61, 0x72, 0x20, 0x24, 0x70, 0x61, 0x67, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x24, 0x28, 0x27, + 0x23, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2d, 0x27, 0x20, 0x2b, 0x20, + 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x2b, 0x20, 0x27, 0x20, 0x2e, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x61, 0x2e, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2d, 0x70, 0x72, 0x65, + 0x76, 0x27, 0x29, 0x3b, 0x69, 0x66, 0x20, 0x28, 0x24, 0x70, 0x61, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x24, 0x70, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x2e, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x61, 0x64, + 0x64, 0x28, 0x27, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x27, 0x29, 0x3b, 0x7d, 0x2c, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x4e, 0x65, 0x78, 0x74, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, + 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x24, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x24, 0x28, + 0x27, 0x23, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2d, 0x27, 0x20, 0x2b, + 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x2b, 0x20, 0x27, 0x20, + 0x2e, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x61, 0x2e, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2d, 0x6e, 0x65, + 0x78, 0x74, 0x27, 0x29, 0x3b, 0x69, 0x66, 0x20, 0x28, 0x24, 0x70, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x24, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x2e, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x72, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x27, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x27, 0x29, 0x3b, 0x7d, 0x2c, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x65, 0x78, 0x74, 0x3a, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x24, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x3d, 0x20, 0x24, 0x28, 0x27, 0x23, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x2d, 0x27, 0x20, 0x2b, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x20, 0x2b, 0x20, 0x27, 0x20, 0x2e, 0x70, 0x61, 0x67, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x2e, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x2d, 0x6e, 0x65, 0x78, 0x74, 0x27, 0x29, 0x3b, 0x69, + 0x66, 0x20, 0x28, 0x24, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x29, 0x24, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x4e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4c, + 0x69, 0x73, 0x74, 0x2e, 0x61, 0x64, 0x64, 0x28, 0x27, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x27, 0x29, 0x3b, 0x7d, 0x2c, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x69, 0x72, 0x73, 0x74, + 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x20, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x24, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x24, 0x28, 0x27, 0x23, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x2d, 0x27, 0x20, 0x2b, 0x20, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x20, 0x2b, 0x20, 0x27, 0x20, 0x2e, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x2e, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x2d, 0x66, 0x69, 0x72, 0x73, 0x74, 0x27, + 0x29, 0x3b, 0x69, 0x66, 0x20, 0x28, 0x24, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x24, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x72, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x28, 0x27, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x27, 0x29, 0x3b, 0x7d, 0x2c, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x46, 0x69, 0x72, 0x73, 0x74, 0x3a, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x24, 0x70, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, + 0x20, 0x24, 0x28, 0x27, 0x23, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2d, + 0x27, 0x20, 0x2b, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x2b, + 0x20, 0x27, 0x20, 0x2e, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x2e, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x2d, 0x66, 0x69, 0x72, 0x73, 0x74, 0x27, 0x29, 0x3b, 0x69, 0x66, + 0x20, 0x28, 0x24, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x29, 0x24, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4c, 0x69, + 0x73, 0x74, 0x2e, 0x61, 0x64, 0x64, 0x28, 0x27, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x27, 0x29, 0x3b, 0x7d, 0x2c, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x3a, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x24, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x3d, 0x20, 0x24, 0x28, 0x27, 0x23, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x2d, 0x27, 0x20, 0x2b, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x20, 0x2b, 0x20, 0x27, 0x20, 0x2e, 0x70, 0x61, 0x67, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x2e, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x2d, 0x6c, 0x61, 0x73, 0x74, 0x27, 0x29, 0x3b, 0x69, + 0x66, 0x20, 0x28, 0x24, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x29, 0x24, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x4e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4c, + 0x69, 0x73, 0x74, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, + 0x27, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x27, 0x29, + 0x3b, 0x7d, 0x2c, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4c, + 0x61, 0x73, 0x74, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x20, + 0x7b, 0x76, 0x61, 0x72, 0x20, 0x24, 0x70, 0x61, 0x67, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x24, 0x28, 0x27, + 0x23, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2d, 0x27, 0x20, 0x2b, 0x20, + 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x2b, 0x20, 0x27, 0x20, 0x2e, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x61, 0x2e, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2d, 0x6c, 0x61, 0x73, + 0x74, 0x27, 0x29, 0x3b, 0x69, 0x66, 0x20, 0x28, 0x24, 0x70, 0x61, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x24, 0x70, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x2e, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x61, 0x64, + 0x64, 0x28, 0x27, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x27, 0x29, 0x3b, 0x7d, 0x2c, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, + 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x20, 0x7b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x65, + 0x76, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x3b, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x65, + 0x78, 0x74, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x3b, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x46, + 0x69, 0x72, 0x73, 0x74, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, + 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x4c, 0x61, 0x73, 0x74, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x29, 0x3b, 0x7d, 0x2c, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, + 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x20, 0x7b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, + 0x65, 0x76, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x3b, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x4e, 0x65, 0x78, 0x74, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, + 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x46, 0x69, 0x72, 0x73, 0x74, 0x28, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x28, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x3b, 0x7d, 0x2c, 0x68, 0x61, 0x73, + 0x53, 0x75, 0x62, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x75, 0x69, + 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x29, 0x20, 0x7b, 0x66, 0x6f, + 0x72, 0x20, 0x28, 0x76, 0x61, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, + 0x30, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x20, + 0x69, 0x20, 0x3c, 0x20, 0x6c, 0x65, 0x6e, 0x3b, 0x20, 0x2b, 0x2b, + 0x69, 0x29, 0x20, 0x7b, 0x69, 0x66, 0x20, 0x28, 0x21, 0x64, 0x61, + 0x74, 0x61, 0x5b, 0x69, 0x5d, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x75, 0x69, + 0x5b, 0x27, 0x68, 0x61, 0x73, 0x53, 0x75, 0x62, 0x49, 0x74, 0x65, + 0x6d, 0x73, 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, + 0x65, 0x29, 0x3b, 0x69, 0x66, 0x20, 0x28, 0x64, 0x61, 0x74, 0x61, + 0x5b, 0x69, 0x5d, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x20, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x28, 0x75, 0x69, 0x5b, 0x27, 0x68, 0x61, + 0x73, 0x53, 0x75, 0x62, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x27, 0x5d, + 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x3b, 0x7d, 0x7d, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, + 0x65, 0x3b, 0x7d, 0x2c, 0x73, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, + 0x75, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x3a, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x75, 0x69, 0x2c, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x29, 0x20, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x68, + 0x61, 0x73, 0x53, 0x75, 0x62, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x28, + 0x75, 0x69, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x29, 0x3b, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x43, 0x68, 0x61, 0x72, 0x74, 0x73, 0x2e, 0x68, 0x61, + 0x73, 0x43, 0x68, 0x61, 0x72, 0x74, 0x28, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x2c, 0x20, 0x75, 0x69, 0x29, 0x3b, 0x47, 0x6f, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x2e, 0x68, 0x61, 0x73, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x75, + 0x69, 0x29, 0x3b, 0x7d, 0x2c, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, + 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x2c, 0x20, 0x75, 0x69, 0x2c, 0x20, 0x63, 0x6f, 0x6c, 0x29, 0x20, + 0x7b, 0x76, 0x61, 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, + 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x67, + 0x65, 0x74, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, + 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x3b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x73, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, + 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x28, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x2c, 0x20, 0x75, 0x69, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x62, 0x6f, 0x78, 0x20, 0x3d, + 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x28, 0x27, 0x64, 0x69, 0x76, 0x27, 0x29, 0x3b, 0x62, 0x6f, + 0x78, 0x2e, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x27, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x2d, 0x27, 0x20, 0x2b, 0x20, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x3b, 0x62, 0x6f, 0x78, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, + 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x3d, 0x20, 0x47, 0x6f, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x54, 0x70, 0x6c, + 0x73, 0x2e, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x73, 0x2e, 0x77, 0x72, + 0x61, 0x70, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x28, 0x47, + 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x55, 0x74, 0x69, + 0x6c, 0x2e, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x28, 0x75, 0x69, 0x2c, + 0x20, 0x7b, 0x27, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x27, 0x3a, + 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x69, + 0x31, 0x38, 0x6e, 0x7d, 0x29, 0x29, 0x3b, 0x63, 0x6f, 0x6c, 0x2e, + 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, + 0x28, 0x62, 0x6f, 0x78, 0x29, 0x3b, 0x69, 0x66, 0x20, 0x28, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3c, 0x3d, 0x20, 0x47, 0x6f, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x72, + 0x65, 0x66, 0x73, 0x28, 0x29, 0x2e, 0x70, 0x65, 0x72, 0x50, 0x61, + 0x67, 0x65, 0x29, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x3b, + 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x73, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, + 0x54, 0x68, 0x65, 0x61, 0x64, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x2c, 0x20, 0x75, 0x69, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x63, 0x6f, 0x6c, 0x3b, 0x7d, 0x2c, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x3a, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x72, 0x6f, 0x77, 0x29, + 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x70, 0x65, 0x72, 0x52, 0x6f, + 0x77, 0x20, 0x3d, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x41, 0x70, 0x70, 0x50, 0x72, 0x65, 0x66, 0x73, 0x5b, + 0x27, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x27, 0x5d, 0x20, 0x3d, + 0x3d, 0x20, 0x27, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, + 0x61, 0x6c, 0x27, 0x20, 0x3f, 0x20, 0x36, 0x20, 0x3a, 0x20, 0x31, + 0x32, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x63, 0x6f, 0x6c, 0x20, 0x3d, + 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x28, 0x27, 0x64, 0x69, 0x76, 0x27, 0x29, 0x3b, 0x63, 0x6f, + 0x6c, 0x2e, 0x73, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x65, 0x28, 0x27, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x27, + 0x2c, 0x20, 0x27, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x27, + 0x20, 0x2b, 0x20, 0x70, 0x65, 0x72, 0x52, 0x6f, 0x77, 0x20, 0x2b, + 0x20, 0x27, 0x20, 0x77, 0x72, 0x61, 0x70, 0x2d, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x27, 0x29, 0x3b, 0x72, 0x6f, 0x77, 0x2e, 0x61, 0x70, + 0x70, 0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x63, + 0x6f, 0x6c, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x63, 0x6f, 0x6c, 0x3b, 0x7d, 0x2c, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x52, 0x6f, 0x77, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x72, 0x6f, 0x77, 0x2c, 0x20, 0x69, + 0x64, 0x78, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x77, 0x72, + 0x61, 0x70, 0x20, 0x3d, 0x20, 0x24, 0x28, 0x27, 0x2e, 0x77, 0x72, + 0x61, 0x70, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x73, 0x27, 0x29, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x76, 0x65, 0x72, 0x79, 0x20, + 0x3d, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x41, 0x70, 0x70, 0x50, 0x72, 0x65, 0x66, 0x73, 0x5b, 0x27, 0x6c, + 0x61, 0x79, 0x6f, 0x75, 0x74, 0x27, 0x5d, 0x20, 0x3d, 0x3d, 0x20, + 0x27, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, + 0x27, 0x20, 0x3f, 0x20, 0x32, 0x20, 0x3a, 0x20, 0x31, 0x3b, 0x69, + 0x66, 0x20, 0x28, 0x69, 0x64, 0x78, 0x20, 0x25, 0x20, 0x65, 0x76, + 0x65, 0x72, 0x79, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, + 0x72, 0x6f, 0x77, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x27, 0x64, 0x69, 0x76, + 0x27, 0x29, 0x3b, 0x72, 0x6f, 0x77, 0x2e, 0x73, 0x65, 0x74, 0x41, + 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x27, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x27, 0x2c, 0x20, 0x27, 0x72, 0x6f, 0x77, + 0x27, 0x20, 0x2b, 0x20, 0x28, 0x65, 0x76, 0x65, 0x72, 0x79, 0x20, + 0x3d, 0x3d, 0x20, 0x32, 0x20, 0x3f, 0x20, 0x27, 0x20, 0x65, 0x71, + 0x75, 0x61, 0x6c, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x29, 0x29, + 0x3b, 0x77, 0x72, 0x61, 0x70, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, + 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x72, 0x6f, 0x77, 0x29, + 0x3b, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x6f, + 0x77, 0x3b, 0x7d, 0x2c, 0x72, 0x65, 0x73, 0x65, 0x74, 0x50, 0x61, + 0x6e, 0x65, 0x6c, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x20, + 0x7b, 0x76, 0x61, 0x72, 0x20, 0x75, 0x69, 0x20, 0x3d, 0x20, 0x47, + 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x67, 0x65, 0x74, + 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x55, 0x49, 0x28, 0x29, 0x2c, 0x20, + 0x69, 0x64, 0x78, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x72, 0x6f, + 0x77, 0x20, 0x3d, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x65, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x24, 0x28, 0x27, + 0x23, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2d, 0x27, 0x20, 0x2b, 0x20, + 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x3b, 0x69, 0x66, 0x20, 0x28, + 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x55, 0x74, + 0x69, 0x6c, 0x2e, 0x69, 0x73, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, + 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, + 0x73, 0x65, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x63, 0x6f, 0x6c, 0x20, + 0x3d, 0x20, 0x65, 0x6c, 0x65, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x3b, 0x63, 0x6f, 0x6c, 0x2e, 0x72, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, + 0x65, 0x6c, 0x65, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, + 0x65, 0x6e, 0x64, 0x65, 0x72, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x28, + 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x75, 0x69, 0x5b, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6c, 0x29, + 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x28, 0x29, 0x3b, 0x7d, 0x2c, 0x72, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x73, 0x3a, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x75, 0x69, 0x20, 0x3d, 0x20, 0x47, 0x6f, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x50, + 0x61, 0x6e, 0x65, 0x6c, 0x55, 0x49, 0x28, 0x29, 0x2c, 0x20, 0x69, + 0x64, 0x78, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x72, 0x6f, 0x77, + 0x20, 0x3d, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x20, 0x63, 0x6f, + 0x6c, 0x20, 0x3d, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x3b, 0x24, 0x28, + 0x27, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x2d, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x73, 0x27, 0x29, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, + 0x54, 0x4d, 0x4c, 0x20, 0x3d, 0x20, 0x27, 0x27, 0x3b, 0x66, 0x6f, + 0x72, 0x20, 0x28, 0x76, 0x61, 0x72, 0x20, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x20, 0x69, 0x6e, 0x20, 0x75, 0x69, 0x29, 0x20, 0x7b, 0x69, + 0x66, 0x20, 0x28, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x55, 0x74, 0x69, 0x6c, 0x2e, 0x69, 0x73, 0x50, 0x61, 0x6e, + 0x65, 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x28, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x29, 0x29, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, + 0x65, 0x3b, 0x72, 0x6f, 0x77, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x77, + 0x28, 0x72, 0x6f, 0x77, 0x2c, 0x20, 0x69, 0x64, 0x78, 0x2b, 0x2b, + 0x29, 0x3b, 0x63, 0x6f, 0x6c, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, + 0x28, 0x72, 0x6f, 0x77, 0x29, 0x3b, 0x63, 0x6f, 0x6c, 0x20, 0x3d, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x28, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x2c, 0x20, 0x75, 0x69, 0x5b, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6c, 0x29, 0x3b, 0x7d, 0x7d, 0x2c, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x3a, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, + 0x29, 0x20, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x6e, + 0x64, 0x65, 0x72, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x73, 0x28, 0x29, + 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x28, 0x29, 0x3b, 0x7d, 0x7d, 0x3b, 0x47, 0x6f, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x43, 0x68, 0x61, 0x72, 0x74, 0x73, + 0x20, 0x3d, 0x20, 0x7b, 0x69, 0x74, 0x65, 0x72, 0x3a, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x63, 0x61, + 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x29, 0x20, 0x7b, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x28, 0x47, + 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x41, 0x70, 0x70, + 0x43, 0x68, 0x61, 0x72, 0x74, 0x73, 0x29, 0x2e, 0x66, 0x6f, 0x72, + 0x45, 0x61, 0x63, 0x68, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x20, + 0x7b, 0x69, 0x66, 0x20, 0x28, 0x21, 0x47, 0x6f, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x55, 0x74, 0x69, 0x6c, 0x2e, 0x69, 0x73, + 0x57, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x56, 0x69, 0x65, 0x77, 0x50, + 0x6f, 0x72, 0x74, 0x28, 0x24, 0x28, 0x27, 0x23, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x2d, 0x27, 0x20, 0x2b, 0x20, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x29, 0x29, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, + 0x69, 0x66, 0x20, 0x28, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, + 0x6b, 0x20, 0x26, 0x26, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, + 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x3d, + 0x3d, 0x3d, 0x20, 0x27, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x27, 0x29, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, + 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, + 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x41, + 0x70, 0x70, 0x43, 0x68, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x5d, 0x2c, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x7d, 0x2c, 0x67, 0x65, 0x74, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x73, 0x3a, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x29, 0x20, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x47, 0x6f, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x61, + 0x6e, 0x65, 0x6c, 0x55, 0x49, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x29, 0x5b, 0x27, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x27, 0x5d, 0x2e, + 0x6d, 0x61, 0x70, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x28, 0x61, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x61, 0x5b, 0x6b, 0x65, 0x79, 0x5d, 0x3b, + 0x20, 0x7d, 0x29, 0x3b, 0x7d, 0x2c, 0x67, 0x65, 0x74, 0x50, 0x61, + 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x3a, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x29, 0x20, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x70, 0x6c, 0x6f, 0x74, 0x20, 0x3d, 0x20, + 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x55, 0x74, + 0x69, 0x6c, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x28, + 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x41, 0x70, + 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x20, 0x2b, 0x20, 0x27, 0x2e, 0x70, 0x6c, 0x6f, 0x74, + 0x27, 0x29, 0x3b, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x43, 0x68, 0x61, + 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x28, 0x47, 0x6f, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x61, 0x6e, + 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x28, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x6c, 0x6f, 0x74, 0x2e, 0x63, + 0x68, 0x61, 0x72, 0x74, 0x52, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, + 0x20, 0x3f, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x72, 0x65, 0x76, + 0x65, 0x72, 0x73, 0x65, 0x28, 0x29, 0x20, 0x3a, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x3b, 0x7d, 0x2c, 0x64, 0x72, 0x61, 0x77, 0x50, 0x6c, + 0x6f, 0x74, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x70, + 0x6c, 0x6f, 0x74, 0x55, 0x49, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x63, 0x68, 0x61, 0x72, + 0x74, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x67, 0x65, + 0x74, 0x43, 0x68, 0x61, 0x72, 0x74, 0x28, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x2c, 0x20, 0x70, 0x6c, 0x6f, 0x74, 0x55, 0x49, 0x2c, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x69, 0x66, 0x20, 0x28, 0x21, + 0x63, 0x68, 0x61, 0x72, 0x74, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x6e, 0x64, + 0x65, 0x72, 0x43, 0x68, 0x61, 0x72, 0x74, 0x28, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x2c, 0x20, 0x63, 0x68, 0x61, 0x72, 0x74, 0x2c, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x47, 0x6f, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x43, 0x68, 0x61, 0x72, + 0x74, 0x73, 0x5b, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x5d, 0x20, 0x3d, + 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x3b, 0x47, 0x6f, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x43, 0x68, 0x61, 0x72, + 0x74, 0x73, 0x5b, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x5d, 0x20, 0x3d, + 0x20, 0x63, 0x68, 0x61, 0x72, 0x74, 0x3b, 0x7d, 0x2c, 0x73, 0x65, + 0x74, 0x43, 0x68, 0x61, 0x72, 0x74, 0x54, 0x79, 0x70, 0x65, 0x3a, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, + 0x74, 0x61, 0x72, 0x67, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x72, + 0x67, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x65, 0x28, 0x27, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x27, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x72, 0x67, + 0x2e, 0x67, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x65, 0x28, 0x27, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x63, 0x68, + 0x61, 0x72, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x27, 0x29, 0x3b, + 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x55, 0x74, + 0x69, 0x6c, 0x2e, 0x73, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x28, + 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x41, 0x70, + 0x70, 0x50, 0x72, 0x65, 0x66, 0x73, 0x2c, 0x20, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x20, 0x2b, 0x20, 0x27, 0x2e, 0x70, 0x6c, 0x6f, 0x74, + 0x2e, 0x63, 0x68, 0x61, 0x72, 0x74, 0x54, 0x79, 0x70, 0x65, 0x27, + 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x29, 0x3b, 0x47, 0x6f, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x50, 0x72, + 0x65, 0x66, 0x73, 0x28, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x70, + 0x6c, 0x6f, 0x74, 0x55, 0x49, 0x20, 0x3d, 0x20, 0x47, 0x6f, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x55, 0x74, 0x69, 0x6c, 0x2e, + 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x28, 0x47, 0x6f, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, + 0x2b, 0x20, 0x27, 0x2e, 0x70, 0x6c, 0x6f, 0x74, 0x27, 0x29, 0x3b, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x50, 0x6c, + 0x6f, 0x74, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x70, + 0x6c, 0x6f, 0x74, 0x55, 0x49, 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x67, 0x65, 0x74, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x44, 0x61, + 0x74, 0x61, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x29, 0x3b, + 0x7d, 0x2c, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x43, 0x68, 0x61, + 0x72, 0x74, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x28, 0x74, 0x61, 0x72, 0x67, 0x29, 0x20, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x3d, 0x20, + 0x74, 0x61, 0x72, 0x67, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x74, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x27, 0x64, 0x61, 0x74, + 0x61, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x27, 0x29, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x70, 0x72, 0x65, 0x66, 0x73, 0x20, 0x3d, 0x20, + 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x67, 0x65, + 0x74, 0x50, 0x72, 0x65, 0x66, 0x73, 0x28, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x29, 0x2c, 0x63, 0x68, 0x61, 0x72, 0x74, 0x20, 0x3d, 0x20, + 0x70, 0x72, 0x65, 0x66, 0x73, 0x20, 0x26, 0x26, 0x20, 0x28, 0x27, + 0x63, 0x68, 0x61, 0x72, 0x74, 0x27, 0x20, 0x69, 0x6e, 0x20, 0x70, + 0x72, 0x65, 0x66, 0x73, 0x29, 0x20, 0x3f, 0x20, 0x70, 0x72, 0x65, + 0x66, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x74, 0x20, 0x3a, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x3b, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x2e, 0x55, 0x74, 0x69, 0x6c, 0x2e, 0x73, 0x65, 0x74, + 0x50, 0x72, 0x6f, 0x70, 0x28, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x50, 0x72, 0x65, 0x66, 0x73, + 0x2c, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x2b, 0x20, 0x27, + 0x2e, 0x63, 0x68, 0x61, 0x72, 0x74, 0x27, 0x2c, 0x20, 0x21, 0x63, + 0x68, 0x61, 0x72, 0x74, 0x29, 0x3b, 0x47, 0x6f, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x50, 0x72, 0x65, 0x66, + 0x73, 0x28, 0x29, 0x3b, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x73, 0x2e, 0x72, 0x65, + 0x73, 0x65, 0x74, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x28, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x29, 0x3b, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x2e, 0x43, 0x68, 0x61, 0x72, 0x74, 0x73, 0x2e, 0x72, + 0x65, 0x73, 0x65, 0x74, 0x43, 0x68, 0x61, 0x72, 0x74, 0x28, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x3b, 0x47, 0x6f, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2e, + 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x75, 0x6c, 0x6c, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, + 0x3b, 0x7d, 0x2c, 0x68, 0x61, 0x73, 0x43, 0x68, 0x61, 0x72, 0x74, + 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x75, 0x69, 0x29, + 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x70, 0x72, 0x65, 0x66, 0x73, + 0x20, 0x3d, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x67, 0x65, 0x74, 0x50, 0x72, 0x65, 0x66, 0x73, 0x28, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x2c, 0x63, 0x68, 0x61, 0x72, 0x74, + 0x20, 0x3d, 0x20, 0x70, 0x72, 0x65, 0x66, 0x73, 0x20, 0x26, 0x26, + 0x20, 0x28, 0x27, 0x63, 0x68, 0x61, 0x72, 0x74, 0x27, 0x20, 0x69, + 0x6e, 0x20, 0x70, 0x72, 0x65, 0x66, 0x73, 0x29, 0x20, 0x3f, 0x20, + 0x70, 0x72, 0x65, 0x66, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x74, + 0x20, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x75, 0x69, 0x5b, + 0x27, 0x63, 0x68, 0x61, 0x72, 0x74, 0x27, 0x5d, 0x20, 0x3d, 0x20, + 0x75, 0x69, 0x2e, 0x70, 0x6c, 0x6f, 0x74, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x20, 0x26, 0x26, 0x20, 0x63, 0x68, 0x61, 0x72, + 0x74, 0x20, 0x26, 0x26, 0x20, 0x63, 0x68, 0x61, 0x72, 0x74, 0x3b, + 0x7d, 0x2c, 0x72, 0x65, 0x64, 0x72, 0x61, 0x77, 0x43, 0x68, 0x61, + 0x72, 0x74, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x28, 0x74, 0x61, 0x72, 0x67, 0x29, 0x20, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x70, 0x6c, 0x6f, 0x74, 0x20, 0x3d, 0x20, 0x74, + 0x61, 0x72, 0x67, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x27, 0x64, 0x61, 0x74, 0x61, + 0x2d, 0x70, 0x6c, 0x6f, 0x74, 0x27, 0x29, 0x3b, 0x76, 0x61, 0x72, + 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x74, 0x61, + 0x72, 0x67, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x28, 0x27, 0x64, 0x61, 0x74, 0x61, 0x2d, + 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x27, 0x29, 0x3b, 0x76, 0x61, 0x72, + 0x20, 0x75, 0x69, 0x20, 0x3d, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x61, 0x6e, 0x65, + 0x6c, 0x55, 0x49, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x70, 0x6c, 0x6f, 0x74, 0x55, 0x49, 0x20, + 0x3d, 0x20, 0x75, 0x69, 0x2e, 0x70, 0x6c, 0x6f, 0x74, 0x3b, 0x47, + 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x55, 0x74, 0x69, + 0x6c, 0x2e, 0x73, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x28, 0x47, + 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x41, 0x70, 0x70, + 0x50, 0x72, 0x65, 0x66, 0x73, 0x2c, 0x20, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x20, 0x2b, 0x20, 0x27, 0x2e, 0x70, 0x6c, 0x6f, 0x74, 0x2e, + 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x27, 0x2c, 0x20, 0x70, 0x6c, + 0x6f, 0x74, 0x29, 0x3b, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x73, 0x65, 0x74, 0x50, 0x72, 0x65, 0x66, 0x73, 0x28, + 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x76, 0x61, 0x72, 0x20, + 0x78, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x6c, 0x6f, 0x74, 0x55, 0x49, + 0x29, 0x20, 0x7b, 0x69, 0x66, 0x20, 0x28, 0x21, 0x70, 0x6c, 0x6f, + 0x74, 0x55, 0x49, 0x2e, 0x68, 0x61, 0x73, 0x4f, 0x77, 0x6e, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x78, 0x29, 0x20, + 0x7c, 0x7c, 0x20, 0x70, 0x6c, 0x6f, 0x74, 0x55, 0x49, 0x5b, 0x78, + 0x5d, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, + 0x20, 0x21, 0x3d, 0x20, 0x70, 0x6c, 0x6f, 0x74, 0x29, 0x63, 0x6f, + 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x3b, 0x47, 0x6f, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x55, 0x74, 0x69, 0x6c, 0x2e, 0x73, + 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x28, 0x47, 0x6f, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x2b, + 0x20, 0x27, 0x2e, 0x70, 0x6c, 0x6f, 0x74, 0x27, 0x2c, 0x20, 0x70, + 0x6c, 0x6f, 0x74, 0x55, 0x49, 0x5b, 0x78, 0x5d, 0x29, 0x3b, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x50, 0x6c, 0x6f, + 0x74, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x70, 0x6c, + 0x6f, 0x74, 0x55, 0x49, 0x5b, 0x78, 0x5d, 0x2c, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x61, 0x6e, 0x65, 0x6c, + 0x44, 0x61, 0x74, 0x61, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, + 0x29, 0x3b, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x7d, 0x7d, 0x2c, + 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x29, 0x20, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x6f, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x66, 0x6f, + 0x72, 0x20, 0x28, 0x76, 0x61, 0x72, 0x20, 0x70, 0x72, 0x6f, 0x70, + 0x20, 0x69, 0x6e, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x29, 0x6f, 0x5b, + 0x70, 0x72, 0x6f, 0x70, 0x5d, 0x20, 0x3d, 0x20, 0x47, 0x6f, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x55, 0x74, 0x69, 0x6c, 0x2e, + 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x28, 0x69, 0x74, + 0x65, 0x6d, 0x5b, 0x70, 0x72, 0x6f, 0x70, 0x5d, 0x29, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x3b, 0x7d, 0x2c, 0x70, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x43, 0x68, 0x61, 0x72, 0x74, + 0x44, 0x61, 0x74, 0x61, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x20, + 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, + 0x5b, 0x5d, 0x3b, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x76, 0x61, 0x72, + 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3b, 0x20, 0x2b, 0x2b, 0x69, 0x29, 0x6f, 0x75, 0x74, 0x2e, + 0x70, 0x75, 0x73, 0x68, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, + 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x28, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x69, 0x5d, 0x29, 0x29, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x3b, + 0x7d, 0x2c, 0x66, 0x69, 0x6e, 0x64, 0x55, 0x49, 0x49, 0x74, 0x65, + 0x6d, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x6b, 0x65, + 0x79, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x61, 0x6e, 0x65, 0x6c, + 0x55, 0x49, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x2e, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x2c, 0x20, 0x6f, 0x20, 0x3d, 0x20, 0x7b, + 0x7d, 0x3b, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x76, 0x61, 0x72, 0x20, + 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3b, 0x20, 0x2b, 0x2b, 0x69, 0x29, 0x20, 0x7b, 0x69, 0x66, + 0x20, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x5b, 0x69, 0x5d, 0x2e, + 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x3d, 0x20, 0x6b, 0x65, 0x79, 0x29, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x5b, 0x69, 0x5d, 0x3b, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x3b, 0x7d, 0x2c, 0x67, 0x65, + 0x74, 0x58, 0x4b, 0x65, 0x79, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x61, 0x74, 0x75, 0x6d, + 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x61, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x5b, 0x5d, 0x3b, 0x69, + 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x6b, + 0x65, 0x79, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x27, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x64, 0x61, 0x74, 0x75, 0x6d, 0x5b, 0x6b, 0x65, 0x79, 0x5d, + 0x3b, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x76, 0x61, 0x72, 0x20, 0x70, + 0x72, 0x6f, 0x70, 0x20, 0x69, 0x6e, 0x20, 0x6b, 0x65, 0x79, 0x29, + 0x61, 0x72, 0x72, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x64, 0x61, + 0x74, 0x75, 0x6d, 0x5b, 0x6b, 0x65, 0x79, 0x5b, 0x70, 0x72, 0x6f, + 0x70, 0x5d, 0x5d, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x61, 0x72, 0x72, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, + 0x20, 0x27, 0x29, 0x3b, 0x7d, 0x2c, 0x67, 0x65, 0x74, 0x41, 0x72, + 0x65, 0x61, 0x53, 0x70, 0x6c, 0x69, 0x6e, 0x65, 0x3a, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x70, 0x6c, 0x6f, 0x74, 0x55, 0x49, + 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x29, 0x20, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x64, 0x75, 0x61, 0x6c, 0x59, 0x61, 0x78, 0x69, 0x73, + 0x20, 0x3d, 0x20, 0x70, 0x6c, 0x6f, 0x74, 0x55, 0x49, 0x5b, 0x27, + 0x64, 0x33, 0x27, 0x5d, 0x5b, 0x27, 0x79, 0x31, 0x27, 0x5d, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x63, 0x68, 0x61, 0x72, 0x74, 0x20, 0x3d, + 0x20, 0x41, 0x72, 0x65, 0x61, 0x43, 0x68, 0x61, 0x72, 0x74, 0x28, + 0x64, 0x75, 0x61, 0x6c, 0x59, 0x61, 0x78, 0x69, 0x73, 0x29, 0x2e, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x28, 0x7b, 0x79, 0x30, 0x3a, + 0x20, 0x70, 0x6c, 0x6f, 0x74, 0x55, 0x49, 0x5b, 0x27, 0x64, 0x33, + 0x27, 0x5d, 0x5b, 0x27, 0x79, 0x30, 0x27, 0x5d, 0x2e, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x2c, 0x79, 0x31, 0x3a, 0x20, 0x64, 0x75, 0x61, + 0x6c, 0x59, 0x61, 0x78, 0x69, 0x73, 0x20, 0x3f, 0x20, 0x70, 0x6c, + 0x6f, 0x74, 0x55, 0x49, 0x5b, 0x27, 0x64, 0x33, 0x27, 0x5d, 0x5b, + 0x27, 0x79, 0x31, 0x27, 0x5d, 0x2e, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x29, 0x2e, 0x78, 0x28, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x29, + 0x20, 0x7b, 0x69, 0x66, 0x20, 0x28, 0x28, 0x28, 0x28, 0x70, 0x6c, + 0x6f, 0x74, 0x55, 0x49, 0x20, 0x7c, 0x7c, 0x20, 0x7b, 0x7d, 0x29, + 0x2e, 0x64, 0x33, 0x20, 0x7c, 0x7c, 0x20, 0x7b, 0x7d, 0x29, 0x2e, + 0x78, 0x20, 0x7c, 0x7c, 0x20, 0x7b, 0x7d, 0x29, 0x2e, 0x6b, 0x65, + 0x79, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x58, 0x4b, 0x65, 0x79, 0x28, + 0x64, 0x2c, 0x20, 0x70, 0x6c, 0x6f, 0x74, 0x55, 0x49, 0x5b, 0x27, + 0x64, 0x33, 0x27, 0x5d, 0x5b, 0x27, 0x78, 0x27, 0x5d, 0x5b, 0x27, + 0x6b, 0x65, 0x79, 0x27, 0x5d, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x64, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x3b, 0x7d, + 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, + 0x29, 0x2e, 0x79, 0x30, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x29, 0x20, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x2b, 0x64, 0x5b, 0x70, 0x6c, 0x6f, 0x74, + 0x55, 0x49, 0x5b, 0x27, 0x64, 0x33, 0x27, 0x5d, 0x5b, 0x27, 0x79, + 0x30, 0x27, 0x5d, 0x5b, 0x27, 0x6b, 0x65, 0x79, 0x27, 0x5d, 0x5d, + 0x3b, 0x7d, 0x29, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x28, 0x24, + 0x28, 0x22, 0x23, 0x63, 0x68, 0x61, 0x72, 0x74, 0x2d, 0x22, 0x20, + 0x2b, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x2e, 0x67, 0x65, + 0x74, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x74, 0x28, 0x29, 0x2e, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x29, 0x2e, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x28, 0x31, 0x37, 0x35, 0x29, 0x2e, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x28, 0x7b, 0x78, 0x3a, 0x20, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x55, 0x49, 0x49, 0x74, + 0x65, 0x6d, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x27, + 0x64, 0x61, 0x74, 0x61, 0x27, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x7b, + 0x7d, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, + 0x20, 0x7c, 0x7c, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x79, 0x30, + 0x3a, 0x20, 0x28, 0x28, 0x70, 0x6c, 0x6f, 0x74, 0x55, 0x49, 0x2e, + 0x64, 0x33, 0x20, 0x7c, 0x7c, 0x20, 0x7b, 0x7d, 0x29, 0x2e, 0x79, + 0x30, 0x20, 0x7c, 0x7c, 0x20, 0x7b, 0x7d, 0x29, 0x2e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x2c, 0x79, 0x31, 0x3a, 0x20, 0x28, 0x28, + 0x70, 0x6c, 0x6f, 0x74, 0x55, 0x49, 0x2e, 0x64, 0x33, 0x20, 0x7c, + 0x7c, 0x20, 0x7b, 0x7d, 0x29, 0x2e, 0x79, 0x31, 0x20, 0x7c, 0x7c, + 0x20, 0x7b, 0x7d, 0x29, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x2c, 0x7d, 0x29, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x28, 0x70, 0x6c, + 0x6f, 0x74, 0x55, 0x49, 0x29, 0x3b, 0x64, 0x75, 0x61, 0x6c, 0x59, + 0x61, 0x78, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x63, 0x68, 0x61, + 0x72, 0x74, 0x2e, 0x79, 0x31, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x29, 0x20, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x2b, 0x64, 0x5b, 0x70, 0x6c, 0x6f, + 0x74, 0x55, 0x49, 0x5b, 0x27, 0x64, 0x33, 0x27, 0x5d, 0x5b, 0x27, + 0x79, 0x31, 0x27, 0x5d, 0x5b, 0x27, 0x6b, 0x65, 0x79, 0x27, 0x5d, + 0x5d, 0x3b, 0x7d, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x63, 0x68, 0x61, 0x72, 0x74, 0x3b, 0x7d, 0x2c, 0x67, 0x65, + 0x74, 0x56, 0x42, 0x61, 0x72, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x2c, 0x20, 0x70, 0x6c, 0x6f, 0x74, 0x55, 0x49, 0x2c, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x64, + 0x75, 0x61, 0x6c, 0x59, 0x61, 0x78, 0x69, 0x73, 0x20, 0x3d, 0x20, + 0x70, 0x6c, 0x6f, 0x74, 0x55, 0x49, 0x5b, 0x27, 0x64, 0x33, 0x27, + 0x5d, 0x5b, 0x27, 0x79, 0x31, 0x27, 0x5d, 0x3b, 0x76, 0x61, 0x72, + 0x20, 0x63, 0x68, 0x61, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x42, 0x61, + 0x72, 0x43, 0x68, 0x61, 0x72, 0x74, 0x28, 0x64, 0x75, 0x61, 0x6c, + 0x59, 0x61, 0x78, 0x69, 0x73, 0x29, 0x2e, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x28, 0x7b, 0x79, 0x30, 0x3a, 0x20, 0x70, 0x6c, 0x6f, + 0x74, 0x55, 0x49, 0x5b, 0x27, 0x64, 0x33, 0x27, 0x5d, 0x5b, 0x27, + 0x79, 0x30, 0x27, 0x5d, 0x2e, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2c, + 0x79, 0x31, 0x3a, 0x20, 0x64, 0x75, 0x61, 0x6c, 0x59, 0x61, 0x78, + 0x69, 0x73, 0x20, 0x3f, 0x20, 0x70, 0x6c, 0x6f, 0x74, 0x55, 0x49, + 0x5b, 0x27, 0x64, 0x33, 0x27, 0x5d, 0x5b, 0x27, 0x79, 0x31, 0x27, + 0x5d, 0x2e, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x20, 0x3a, 0x20, 0x27, + 0x27, 0x7d, 0x29, 0x2e, 0x78, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x29, 0x20, 0x7b, 0x69, 0x66, + 0x20, 0x28, 0x28, 0x28, 0x28, 0x70, 0x6c, 0x6f, 0x74, 0x55, 0x49, + 0x20, 0x7c, 0x7c, 0x20, 0x7b, 0x7d, 0x29, 0x2e, 0x64, 0x33, 0x20, + 0x7c, 0x7c, 0x20, 0x7b, 0x7d, 0x29, 0x2e, 0x78, 0x20, 0x7c, 0x7c, + 0x20, 0x7b, 0x7d, 0x29, 0x2e, 0x6b, 0x65, 0x79, 0x29, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x67, + 0x65, 0x74, 0x58, 0x4b, 0x65, 0x79, 0x28, 0x64, 0x2c, 0x20, 0x70, + 0x6c, 0x6f, 0x74, 0x55, 0x49, 0x5b, 0x27, 0x64, 0x33, 0x27, 0x5d, + 0x5b, 0x27, 0x78, 0x27, 0x5d, 0x5b, 0x27, 0x6b, 0x65, 0x79, 0x27, + 0x5d, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x3b, 0x7d, 0x2e, 0x62, 0x69, 0x6e, + 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x29, 0x2e, 0x79, 0x30, + 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, + 0x64, 0x29, 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x2b, 0x64, 0x5b, 0x70, 0x6c, 0x6f, 0x74, 0x55, 0x49, 0x5b, 0x27, + 0x64, 0x33, 0x27, 0x5d, 0x5b, 0x27, 0x79, 0x30, 0x27, 0x5d, 0x5b, + 0x27, 0x6b, 0x65, 0x79, 0x27, 0x5d, 0x5d, 0x3b, 0x7d, 0x29, 0x2e, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x28, 0x24, 0x28, 0x22, 0x23, 0x63, + 0x68, 0x61, 0x72, 0x74, 0x2d, 0x22, 0x20, 0x2b, 0x20, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x29, 0x2e, 0x67, 0x65, 0x74, 0x42, 0x6f, 0x75, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x63, 0x74, 0x28, 0x29, 0x2e, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x29, 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x28, 0x31, + 0x37, 0x35, 0x29, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, + 0x7b, 0x78, 0x3a, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x66, + 0x69, 0x6e, 0x64, 0x55, 0x49, 0x49, 0x74, 0x65, 0x6d, 0x28, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x27, 0x64, 0x61, 0x74, 0x61, + 0x27, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x7b, 0x7d, 0x29, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x20, 0x7c, 0x7c, 0x20, + 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x79, 0x30, 0x3a, 0x20, 0x28, 0x28, + 0x70, 0x6c, 0x6f, 0x74, 0x55, 0x49, 0x2e, 0x64, 0x33, 0x20, 0x7c, + 0x7c, 0x20, 0x7b, 0x7d, 0x29, 0x2e, 0x79, 0x30, 0x20, 0x7c, 0x7c, + 0x20, 0x7b, 0x7d, 0x29, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x2c, 0x79, 0x31, 0x3a, 0x20, 0x28, 0x28, 0x70, 0x6c, 0x6f, 0x74, + 0x55, 0x49, 0x2e, 0x64, 0x33, 0x20, 0x7c, 0x7c, 0x20, 0x7b, 0x7d, + 0x29, 0x2e, 0x79, 0x31, 0x20, 0x7c, 0x7c, 0x20, 0x7b, 0x7d, 0x29, + 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2c, 0x7d, 0x29, 0x2e, + 0x6f, 0x70, 0x74, 0x73, 0x28, 0x70, 0x6c, 0x6f, 0x74, 0x55, 0x49, + 0x29, 0x3b, 0x64, 0x75, 0x61, 0x6c, 0x59, 0x61, 0x78, 0x69, 0x73, + 0x20, 0x26, 0x26, 0x20, 0x63, 0x68, 0x61, 0x72, 0x74, 0x2e, 0x79, + 0x31, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x28, 0x64, 0x29, 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x2b, 0x64, 0x5b, 0x70, 0x6c, 0x6f, 0x74, 0x55, 0x49, 0x5b, + 0x27, 0x64, 0x33, 0x27, 0x5d, 0x5b, 0x27, 0x79, 0x31, 0x27, 0x5d, + 0x5b, 0x27, 0x6b, 0x65, 0x79, 0x27, 0x5d, 0x5d, 0x3b, 0x7d, 0x29, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x61, + 0x72, 0x74, 0x3b, 0x7d, 0x2c, 0x67, 0x65, 0x74, 0x43, 0x68, 0x61, + 0x72, 0x74, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x75, 0x69, 0x20, + 0x3d, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x67, 0x65, 0x74, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x55, 0x49, 0x28, + 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x3b, 0x69, 0x66, 0x20, 0x28, + 0x21, 0x75, 0x69, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x74, 0x29, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x27, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x2e, 0x55, 0x74, 0x69, 0x6c, 0x2e, 0x67, 0x65, 0x74, + 0x50, 0x72, 0x6f, 0x70, 0x28, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x72, 0x65, 0x66, 0x73, + 0x28, 0x29, 0x2c, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x2b, + 0x20, 0x27, 0x2e, 0x70, 0x6c, 0x6f, 0x74, 0x2e, 0x63, 0x68, 0x61, + 0x72, 0x74, 0x54, 0x79, 0x70, 0x65, 0x27, 0x29, 0x20, 0x7c, 0x7c, + 0x20, 0x75, 0x69, 0x2e, 0x70, 0x6c, 0x6f, 0x74, 0x5b, 0x30, 0x5d, + 0x2e, 0x63, 0x68, 0x61, 0x72, 0x74, 0x54, 0x79, 0x70, 0x65, 0x3b, + 0x7d, 0x2c, 0x67, 0x65, 0x74, 0x50, 0x6c, 0x6f, 0x74, 0x55, 0x49, + 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x75, 0x69, 0x29, + 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x20, 0x3d, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x55, 0x74, 0x69, 0x6c, 0x2e, 0x67, 0x65, 0x74, 0x50, + 0x72, 0x6f, 0x70, 0x28, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x72, 0x65, 0x66, 0x73, 0x28, + 0x29, 0x2c, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x2b, 0x20, + 0x27, 0x2e, 0x70, 0x6c, 0x6f, 0x74, 0x2e, 0x6d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x27, 0x29, 0x3b, 0x69, 0x66, 0x20, 0x28, 0x21, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x75, 0x69, 0x2e, 0x70, 0x6c, 0x6f, 0x74, 0x5b, 0x30, + 0x5d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x69, + 0x2e, 0x70, 0x6c, 0x6f, 0x74, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x28, 0x76, 0x29, 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x76, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, + 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x3b, 0x7d, 0x29, 0x5b, 0x30, 0x5d, 0x3b, 0x7d, 0x2c, 0x67, 0x65, + 0x74, 0x43, 0x68, 0x61, 0x72, 0x74, 0x3a, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x2c, 0x20, 0x70, 0x6c, 0x6f, 0x74, 0x55, 0x49, 0x2c, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x63, 0x68, 0x61, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x75, 0x6c, + 0x6c, 0x3b, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x20, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x43, 0x68, 0x61, 0x72, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x29, 0x29, 0x20, 0x7b, 0x63, 0x61, 0x73, 0x65, 0x20, 0x27, 0x61, + 0x72, 0x65, 0x61, 0x2d, 0x73, 0x70, 0x6c, 0x69, 0x6e, 0x65, 0x27, + 0x3a, 0x63, 0x68, 0x61, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x72, 0x65, 0x61, 0x53, + 0x70, 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x2c, 0x20, 0x70, 0x6c, 0x6f, 0x74, 0x55, 0x49, 0x2c, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x29, 0x3b, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, + 0x63, 0x61, 0x73, 0x65, 0x20, 0x27, 0x62, 0x61, 0x72, 0x27, 0x3a, + 0x63, 0x68, 0x61, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x67, 0x65, 0x74, 0x56, 0x42, 0x61, 0x72, 0x28, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x70, 0x6c, 0x6f, 0x74, 0x55, + 0x49, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x62, 0x72, + 0x65, 0x61, 0x6b, 0x3b, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x63, 0x68, 0x61, 0x72, 0x74, 0x3b, 0x7d, 0x2c, 0x72, 0x65, + 0x6e, 0x64, 0x65, 0x72, 0x43, 0x68, 0x61, 0x72, 0x74, 0x3a, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x63, 0x68, 0x61, 0x72, 0x74, + 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x29, 0x20, 0x7b, 0x64, 0x33, + 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x27, 0x23, 0x63, + 0x68, 0x61, 0x72, 0x74, 0x2d, 0x27, 0x20, 0x2b, 0x20, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x20, 0x2b, 0x20, 0x27, 0x3e, 0x2e, 0x63, 0x68, + 0x61, 0x72, 0x74, 0x2d, 0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, + 0x2d, 0x77, 0x72, 0x61, 0x70, 0x27, 0x29, 0x2e, 0x72, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x28, 0x29, 0x3b, 0x64, 0x33, 0x2e, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x28, 0x27, 0x23, 0x63, 0x68, 0x61, 0x72, + 0x74, 0x2d, 0x27, 0x20, 0x2b, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x29, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x27, 0x73, + 0x76, 0x67, 0x27, 0x29, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x28, 0x29, 0x3b, 0x64, 0x33, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x28, 0x22, 0x23, 0x63, 0x68, 0x61, 0x72, 0x74, 0x2d, 0x22, + 0x20, 0x2b, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x2e, 0x64, + 0x61, 0x74, 0x75, 0x6d, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x2e, + 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x63, 0x68, 0x61, 0x72, 0x74, 0x29, + 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x22, 0x64, 0x69, + 0x76, 0x22, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x22, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x22, 0x2c, 0x20, 0x22, 0x63, 0x68, 0x61, + 0x72, 0x74, 0x2d, 0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x2d, + 0x77, 0x72, 0x61, 0x70, 0x22, 0x29, 0x3b, 0x7d, 0x2c, 0x61, 0x64, + 0x64, 0x43, 0x68, 0x61, 0x72, 0x74, 0x3a, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x2c, 0x20, 0x75, 0x69, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x70, 0x6c, 0x6f, 0x74, 0x55, 0x49, 0x20, 0x3d, 0x20, 0x6e, + 0x75, 0x6c, 0x6c, 0x2c, 0x20, 0x63, 0x68, 0x61, 0x72, 0x74, 0x20, + 0x3d, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x3b, 0x69, 0x66, 0x20, 0x28, + 0x21, 0x75, 0x69, 0x2e, 0x70, 0x6c, 0x6f, 0x74, 0x20, 0x7c, 0x7c, + 0x20, 0x21, 0x75, 0x69, 0x2e, 0x70, 0x6c, 0x6f, 0x74, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x3b, 0x70, 0x6c, 0x6f, 0x74, 0x55, 0x49, 0x20, 0x3d, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x6c, 0x6f, + 0x74, 0x55, 0x49, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, + 0x75, 0x69, 0x29, 0x3b, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x55, 0x74, 0x69, 0x6c, 0x2e, 0x73, 0x65, 0x74, 0x50, + 0x72, 0x6f, 0x70, 0x28, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x41, 0x70, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2c, + 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x2b, 0x20, 0x27, 0x2e, + 0x70, 0x6c, 0x6f, 0x74, 0x27, 0x2c, 0x20, 0x70, 0x6c, 0x6f, 0x74, + 0x55, 0x49, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x67, 0x65, + 0x74, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x28, + 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x3b, 0x69, 0x66, 0x20, 0x28, + 0x21, 0x28, 0x63, 0x68, 0x61, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x43, 0x68, 0x61, 0x72, + 0x74, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x70, 0x6c, + 0x6f, 0x74, 0x55, 0x49, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x29, + 0x29, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x43, 0x68, + 0x61, 0x72, 0x74, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, + 0x63, 0x68, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x29, 0x3b, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x41, 0x70, 0x70, 0x43, 0x68, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x68, 0x61, + 0x72, 0x74, 0x3b, 0x7d, 0x2c, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, + 0x43, 0x68, 0x61, 0x72, 0x74, 0x73, 0x3a, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x75, 0x69, 0x29, 0x20, + 0x7b, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x76, 0x61, 0x72, 0x20, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x69, 0x6e, 0x20, 0x75, 0x69, 0x29, + 0x20, 0x7b, 0x69, 0x66, 0x20, 0x28, 0x21, 0x75, 0x69, 0x2e, 0x68, + 0x61, 0x73, 0x4f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x79, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x29, 0x63, + 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x3b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x61, 0x64, 0x64, 0x43, 0x68, 0x61, 0x72, 0x74, 0x28, + 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x75, 0x69, 0x5b, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x5d, 0x29, 0x3b, 0x7d, 0x7d, 0x2c, 0x72, + 0x65, 0x73, 0x65, 0x74, 0x43, 0x68, 0x61, 0x72, 0x74, 0x3a, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x75, 0x69, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x69, 0x66, 0x20, + 0x28, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x55, + 0x74, 0x69, 0x6c, 0x2e, 0x69, 0x73, 0x50, 0x61, 0x6e, 0x65, 0x6c, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x29, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, + 0x6c, 0x73, 0x65, 0x3b, 0x75, 0x69, 0x20, 0x3d, 0x20, 0x47, 0x6f, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x50, + 0x61, 0x6e, 0x65, 0x6c, 0x55, 0x49, 0x28, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x64, 0x64, + 0x43, 0x68, 0x61, 0x72, 0x74, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x2c, 0x20, 0x75, 0x69, 0x29, 0x3b, 0x7d, 0x2c, 0x72, 0x65, 0x6c, + 0x6f, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x74, 0x3a, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x63, 0x68, + 0x61, 0x72, 0x74, 0x2c, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, + 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x73, 0x75, 0x62, 0x49, 0x74, + 0x65, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2e, + 0x67, 0x65, 0x74, 0x53, 0x75, 0x62, 0x49, 0x74, 0x65, 0x6d, 0x73, + 0x44, 0x61, 0x74, 0x61, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, + 0x20, 0x28, 0x73, 0x75, 0x62, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3f, 0x20, 0x73, 0x75, + 0x62, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x3a, 0x20, 0x47, 0x6f, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x50, + 0x61, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x28, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x29, 0x2e, + 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x30, 0x29, 0x3b, 0x64, 0x33, + 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x22, 0x23, 0x63, + 0x68, 0x61, 0x72, 0x74, 0x2d, 0x22, 0x20, 0x2b, 0x20, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x75, 0x6d, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x43, 0x68, 0x61, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x61, 0x6e, + 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x28, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x29, 0x29, 0x29, 0x2e, + 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x63, 0x68, 0x61, 0x72, 0x74, 0x2e, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x28, 0x24, 0x28, 0x22, 0x23, 0x63, + 0x68, 0x61, 0x72, 0x74, 0x2d, 0x22, 0x20, 0x2b, 0x20, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x29, 0x2e, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x57, 0x69, 0x64, 0x74, 0x68, 0x29, 0x29, 0x3b, 0x7d, 0x2c, 0x72, + 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x74, 0x73, + 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x28, 0x29, 0x20, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x74, + 0x65, 0x72, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x28, 0x63, 0x68, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x29, 0x20, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x74, + 0x28, 0x63, 0x68, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x29, 0x3b, 0x7d, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x29, 0x29, 0x3b, 0x47, 0x6f, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x2e, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x20, + 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x7d, 0x2c, 0x72, + 0x65, 0x64, 0x72, 0x61, 0x77, 0x43, 0x68, 0x61, 0x72, 0x74, 0x73, + 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x28, 0x29, 0x20, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x74, + 0x65, 0x72, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x28, 0x63, 0x68, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x29, 0x20, 0x7b, 0x64, 0x33, 0x2e, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x28, 0x22, 0x23, 0x63, 0x68, 0x61, 0x72, + 0x74, 0x2d, 0x22, 0x20, 0x2b, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x29, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x63, 0x68, 0x61, 0x72, + 0x74, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x28, 0x24, 0x28, 0x22, + 0x23, 0x63, 0x68, 0x61, 0x72, 0x74, 0x2d, 0x22, 0x20, 0x2b, 0x20, + 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x2e, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x57, 0x69, 0x64, 0x74, 0x68, 0x29, 0x29, 0x3b, 0x7d, + 0x29, 0x3b, 0x7d, 0x2c, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, + 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x43, 0x68, 0x61, 0x72, + 0x74, 0x73, 0x28, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x67, 0x65, 0x74, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x55, 0x49, + 0x28, 0x29, 0x29, 0x3b, 0x64, 0x33, 0x2e, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x28, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x29, 0x2e, + 0x6f, 0x6e, 0x28, 0x27, 0x73, 0x63, 0x72, 0x6f, 0x6c, 0x6c, 0x2e, + 0x63, 0x68, 0x61, 0x72, 0x74, 0x73, 0x27, 0x2c, 0x20, 0x64, 0x65, + 0x62, 0x6f, 0x75, 0x6e, 0x63, 0x65, 0x28, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x68, + 0x61, 0x72, 0x74, 0x73, 0x28, 0x29, 0x3b, 0x7d, 0x2c, 0x20, 0x32, + 0x35, 0x30, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x2e, + 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x29, + 0x2e, 0x6f, 0x6e, 0x28, 0x27, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, + 0x2e, 0x63, 0x68, 0x61, 0x72, 0x74, 0x73, 0x27, 0x2c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, + 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x64, 0x72, 0x61, + 0x77, 0x43, 0x68, 0x61, 0x72, 0x74, 0x73, 0x28, 0x29, 0x3b, 0x7d, + 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, + 0x29, 0x3b, 0x7d, 0x7d, 0x3b, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x20, 0x3d, + 0x20, 0x7b, 0x63, 0x68, 0x61, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, + 0x3a, 0x20, 0x7b, 0x7d, 0x2c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x28, 0x29, 0x20, 0x7b, 0x24, 0x24, 0x28, 0x27, 0x2e, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x2d, 0x6e, 0x65, 0x78, 0x74, 0x27, 0x2c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x69, + 0x74, 0x65, 0x6d, 0x29, 0x20, 0x7b, 0x69, 0x74, 0x65, 0x6d, 0x2e, + 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x29, + 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x20, 0x3d, 0x20, 0x65, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2e, 0x67, 0x65, 0x74, + 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x27, + 0x64, 0x61, 0x74, 0x61, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x27, + 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x6e, 0x64, + 0x65, 0x72, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6e, 0x65, + 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x28, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x29, 0x29, 0x3b, 0x7d, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x29, 0x3b, 0x7d, 0x2e, 0x62, 0x69, 0x6e, + 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x29, 0x3b, 0x24, 0x24, + 0x28, 0x27, 0x2e, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2d, 0x70, 0x72, + 0x65, 0x76, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x29, 0x20, 0x7b, + 0x69, 0x74, 0x65, 0x6d, 0x2e, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, + 0x6b, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x28, 0x65, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x65, 0x2e, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x65, 0x28, 0x27, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x27, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x70, 0x72, 0x65, 0x76, 0x50, 0x61, 0x67, 0x65, + 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x29, 0x3b, 0x7d, 0x2e, + 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x3b, + 0x7d, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x29, 0x29, 0x3b, 0x24, 0x24, 0x28, 0x27, 0x2e, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x2d, 0x66, 0x69, 0x72, 0x73, 0x74, 0x27, 0x2c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x69, + 0x74, 0x65, 0x6d, 0x29, 0x20, 0x7b, 0x69, 0x74, 0x65, 0x6d, 0x2e, + 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x29, + 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x20, 0x3d, 0x20, 0x65, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2e, 0x67, 0x65, 0x74, + 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x27, + 0x64, 0x61, 0x74, 0x61, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x27, + 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x6e, 0x64, + 0x65, 0x72, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x2c, 0x20, 0x22, 0x46, 0x49, 0x52, 0x53, 0x54, 0x5f, + 0x50, 0x41, 0x47, 0x45, 0x22, 0x29, 0x3b, 0x7d, 0x2e, 0x62, 0x69, + 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x3b, 0x7d, 0x2e, + 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x29, + 0x3b, 0x24, 0x24, 0x28, 0x27, 0x2e, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x2d, 0x6c, 0x61, 0x73, 0x74, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x69, 0x74, 0x65, 0x6d, + 0x29, 0x20, 0x7b, 0x69, 0x74, 0x65, 0x6d, 0x2e, 0x6f, 0x6e, 0x63, + 0x6c, 0x69, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x29, 0x20, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x3d, 0x20, + 0x65, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x74, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x27, 0x64, 0x61, 0x74, + 0x61, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x27, 0x29, 0x3b, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, + 0x20, 0x22, 0x4c, 0x41, 0x53, 0x54, 0x5f, 0x50, 0x41, 0x47, 0x45, + 0x22, 0x29, 0x3b, 0x7d, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x29, 0x3b, 0x7d, 0x2e, 0x62, 0x69, 0x6e, 0x64, + 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x29, 0x3b, 0x24, 0x24, 0x28, + 0x27, 0x2e, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x62, 0x6c, + 0x65, 0x3e, 0x74, 0x64, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x29, + 0x20, 0x7b, 0x69, 0x74, 0x65, 0x6d, 0x2e, 0x6f, 0x6e, 0x63, 0x6c, + 0x69, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x29, 0x20, 0x7b, 0x69, 0x66, + 0x20, 0x28, 0x21, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x67, + 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x29, 0x29, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x74, 0x6f, 0x67, + 0x67, 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x28, 0x65, 0x2e, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x29, 0x3b, 0x7d, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x29, 0x3b, 0x7d, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x29, 0x29, 0x3b, 0x24, 0x24, 0x28, 0x27, + 0x2e, 0x72, 0x6f, 0x77, 0x2d, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x61, + 0x62, 0x6c, 0x65, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x29, 0x20, + 0x7b, 0x69, 0x74, 0x65, 0x6d, 0x2e, 0x6f, 0x6e, 0x63, 0x6c, 0x69, + 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x29, 0x20, 0x7b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x52, 0x6f, 0x77, + 0x28, 0x65, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, 0x3b, 0x7d, 0x2e, 0x62, 0x69, + 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x3b, 0x7d, 0x2e, + 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x29, + 0x3b, 0x24, 0x24, 0x28, 0x27, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x29, 0x20, + 0x7b, 0x69, 0x74, 0x65, 0x6d, 0x2e, 0x6f, 0x6e, 0x63, 0x6c, 0x69, + 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x29, 0x20, 0x7b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x28, 0x65, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, 0x3b, 0x7d, 0x2e, 0x62, + 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x3b, 0x7d, + 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, + 0x29, 0x3b, 0x7d, 0x2c, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x43, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x74, 0x61, 0x72, 0x67, 0x29, + 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x20, 0x3d, 0x20, 0x74, 0x61, 0x72, 0x67, 0x2e, 0x67, 0x65, 0x74, + 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x27, + 0x64, 0x61, 0x74, 0x61, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x27, + 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x72, 0x67, 0x2e, 0x67, 0x65, + 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, + 0x27, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x27, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x63, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x47, 0x6f, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x72, + 0x65, 0x66, 0x73, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x20, + 0x7c, 0x7c, 0x20, 0x7b, 0x7d, 0x29, 0x2e, 0x63, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x73, 0x20, 0x7c, 0x7c, 0x20, 0x7b, 0x7d, 0x3b, 0x69, + 0x66, 0x20, 0x28, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x20, 0x69, + 0x6e, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x29, 0x20, + 0x7b, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x63, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x73, 0x5b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x5d, 0x3b, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x47, + 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x55, 0x74, 0x69, + 0x6c, 0x2e, 0x73, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x28, 0x63, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x2c, 0x20, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x20, 0x2b, 0x20, 0x27, 0x2e, 0x68, 0x69, 0x64, + 0x65, 0x27, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x3b, 0x7d, + 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x55, 0x74, + 0x69, 0x6c, 0x2e, 0x73, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x28, + 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x41, 0x70, + 0x70, 0x50, 0x72, 0x65, 0x66, 0x73, 0x2c, 0x20, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x20, 0x2b, 0x20, 0x27, 0x2e, 0x63, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x73, 0x27, 0x2c, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x73, 0x29, 0x3b, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x73, 0x65, 0x74, 0x50, 0x72, 0x65, 0x66, 0x73, 0x28, + 0x29, 0x3b, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2e, 0x72, 0x65, 0x6e, 0x64, + 0x65, 0x72, 0x54, 0x68, 0x65, 0x61, 0x64, 0x28, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x2c, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x55, + 0x49, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x29, 0x3b, 0x47, + 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, + 0x75, 0x6c, 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x29, 0x3b, 0x7d, 0x2c, 0x73, 0x6f, 0x72, 0x74, + 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x3a, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x6c, 0x65, 0x29, + 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x20, 0x3d, 0x20, 0x65, 0x6c, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x41, + 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x27, 0x64, + 0x61, 0x74, 0x61, 0x2d, 0x6b, 0x65, 0x79, 0x27, 0x29, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, + 0x65, 0x6c, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x27, 0x64, 0x61, 0x74, 0x61, + 0x2d, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x27, 0x29, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x65, + 0x6c, 0x65, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x67, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x65, 0x28, 0x27, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x27, 0x29, 0x3b, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x20, 0x3d, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x3f, 0x20, + 0x27, 0x61, 0x73, 0x63, 0x27, 0x20, 0x3d, 0x3d, 0x20, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x20, 0x3f, 0x20, 0x27, 0x64, 0x65, 0x73, 0x63, + 0x27, 0x20, 0x3a, 0x20, 0x27, 0x61, 0x73, 0x63, 0x27, 0x20, 0x3a, + 0x20, 0x27, 0x61, 0x73, 0x63, 0x27, 0x3b, 0x47, 0x6f, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x2e, 0x73, 0x6f, + 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x28, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x2c, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x2c, 0x20, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x29, 0x3b, 0x47, 0x6f, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x55, 0x74, 0x69, 0x6c, 0x2e, 0x73, 0x65, + 0x74, 0x50, 0x72, 0x6f, 0x70, 0x28, 0x47, 0x6f, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x2c, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x2b, 0x20, + 0x27, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x27, 0x2c, 0x20, 0x7b, 0x27, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x27, 0x3a, 0x20, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x2c, 0x27, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x27, 0x3a, + 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2c, 0x7d, 0x29, 0x3b, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x54, + 0x68, 0x65, 0x61, 0x64, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, + 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x67, + 0x65, 0x74, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x55, 0x49, 0x28, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x43, 0x75, 0x72, 0x50, 0x61, + 0x67, 0x65, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x29, 0x3b, + 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x43, 0x68, + 0x61, 0x72, 0x74, 0x73, 0x2e, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, + 0x43, 0x68, 0x61, 0x72, 0x74, 0x28, 0x47, 0x6f, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x43, 0x68, 0x61, 0x72, + 0x74, 0x73, 0x5b, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x5d, 0x2c, 0x20, + 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x3b, 0x7d, 0x2c, 0x67, 0x65, + 0x74, 0x44, 0x61, 0x74, 0x61, 0x42, 0x79, 0x4b, 0x65, 0x79, 0x3a, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, + 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x29, + 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, + 0x3d, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x67, 0x65, 0x74, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, + 0x61, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x3b, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x76, 0x61, 0x72, + 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x6e, 0x20, 0x3d, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x6e, 0x3b, 0x20, 0x2b, + 0x2b, 0x69, 0x29, 0x20, 0x7b, 0x69, 0x66, 0x20, 0x28, 0x47, 0x6f, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x55, 0x74, 0x69, 0x6c, + 0x2e, 0x68, 0x61, 0x73, 0x68, 0x43, 0x6f, 0x64, 0x65, 0x28, 0x64, + 0x61, 0x74, 0x61, 0x5b, 0x69, 0x5d, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x6b, 0x65, 0x79, 0x29, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x69, + 0x5d, 0x3b, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x75, 0x6c, 0x6c, 0x3b, 0x7d, 0x2c, 0x67, 0x65, 0x74, 0x53, 0x75, + 0x62, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x44, 0x61, 0x74, 0x61, 0x3a, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, + 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x5b, 0x5d, 0x2c, 0x20, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, + 0x5b, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x5d, 0x3b, 0x66, 0x6f, 0x72, + 0x20, 0x28, 0x76, 0x61, 0x72, 0x20, 0x78, 0x20, 0x69, 0x6e, 0x20, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x29, 0x20, 0x7b, 0x69, 0x66, 0x20, + 0x28, 0x21, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x68, 0x61, 0x73, + 0x4f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x28, 0x78, 0x29, 0x29, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, + 0x65, 0x3b, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, + 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x5b, 0x78, 0x5d, 0x29, 0x3b, 0x7d, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x3b, 0x7d, 0x2c, 0x61, + 0x64, 0x64, 0x43, 0x68, 0x61, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, + 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x6b, 0x65, 0x79, + 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x67, 0x65, 0x74, + 0x44, 0x61, 0x74, 0x61, 0x42, 0x79, 0x4b, 0x65, 0x79, 0x28, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x29, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, + 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x2b, 0x20, 0x27, 0x2e, 0x27, + 0x20, 0x2b, 0x20, 0x6b, 0x65, 0x79, 0x3b, 0x69, 0x66, 0x20, 0x28, + 0x21, 0x64, 0x61, 0x74, 0x61, 0x20, 0x7c, 0x7c, 0x20, 0x21, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x29, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5b, 0x5d, 0x3b, 0x47, 0x6f, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x55, 0x74, 0x69, 0x6c, + 0x2e, 0x73, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x74, 0x44, 0x61, 0x74, + 0x61, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x29, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x67, 0x65, 0x74, 0x53, 0x75, 0x62, 0x49, 0x74, 0x65, 0x6d, 0x73, + 0x44, 0x61, 0x74, 0x61, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, + 0x3b, 0x7d, 0x2c, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x68, + 0x61, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x3a, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x29, 0x20, 0x7b, 0x69, + 0x66, 0x20, 0x28, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x55, 0x74, 0x69, 0x6c, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x72, + 0x6f, 0x70, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x68, 0x61, + 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x2c, 0x20, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x20, 0x2b, 0x20, 0x27, 0x2e, 0x27, 0x20, 0x2b, 0x20, + 0x6b, 0x65, 0x79, 0x29, 0x29, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x74, + 0x44, 0x61, 0x74, 0x61, 0x5b, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x5d, + 0x5b, 0x6b, 0x65, 0x79, 0x5d, 0x3b, 0x69, 0x66, 0x20, 0x28, 0x21, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x74, 0x44, + 0x61, 0x74, 0x61, 0x5b, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x5d, 0x20, + 0x7c, 0x7c, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6b, + 0x65, 0x79, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x68, + 0x61, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x5b, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x5d, 0x29, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x67, 0x65, 0x74, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, + 0x61, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x53, 0x75, 0x62, 0x49, + 0x74, 0x65, 0x6d, 0x73, 0x44, 0x61, 0x74, 0x61, 0x28, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x29, 0x3b, 0x7d, 0x2c, 0x69, 0x73, 0x45, 0x78, + 0x70, 0x61, 0x6e, 0x64, 0x65, 0x64, 0x3a, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x29, 0x20, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x20, 0x2b, 0x20, 0x27, 0x2e, 0x65, 0x78, 0x70, + 0x61, 0x6e, 0x64, 0x65, 0x64, 0x2e, 0x27, 0x20, 0x2b, 0x20, 0x6b, + 0x65, 0x79, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x47, + 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x55, 0x74, 0x69, + 0x6c, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x28, 0x47, + 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x41, 0x70, 0x70, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, + 0x29, 0x3b, 0x7d, 0x2c, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x45, + 0x78, 0x70, 0x61, 0x6e, 0x64, 0x65, 0x64, 0x3a, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x29, 0x20, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x2b, 0x20, 0x27, 0x2e, 0x65, 0x78, + 0x70, 0x61, 0x6e, 0x64, 0x65, 0x64, 0x2e, 0x27, 0x20, 0x2b, 0x20, + 0x6b, 0x65, 0x79, 0x2c, 0x20, 0x72, 0x65, 0x74, 0x20, 0x3d, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x3b, 0x69, 0x66, 0x20, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x69, 0x73, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, + 0x65, 0x64, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x6b, + 0x65, 0x79, 0x29, 0x29, 0x20, 0x7b, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x41, 0x70, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x5b, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x5d, 0x5b, 0x27, 0x65, 0x78, 0x70, 0x61, 0x6e, + 0x64, 0x65, 0x64, 0x27, 0x5d, 0x5b, 0x6b, 0x65, 0x79, 0x5d, 0x3b, + 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x47, 0x6f, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x55, 0x74, 0x69, 0x6c, 0x2e, + 0x73, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x28, 0x47, 0x6f, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x29, 0x2c, 0x20, 0x72, 0x65, 0x74, 0x20, + 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x7d, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x3b, 0x7d, 0x2c, + 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x3a, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, + 0x6c, 0x65, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x68, 0x69, + 0x64, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x5b, 0x5d, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x72, 0x6f, 0x77, 0x20, 0x3d, 0x20, 0x65, + 0x6c, 0x65, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x6f, + 0x64, 0x65, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x77, 0x2e, 0x67, 0x65, 0x74, + 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x27, + 0x64, 0x61, 0x74, 0x61, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x27, + 0x29, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x20, 0x72, 0x6f, + 0x77, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x65, 0x28, 0x27, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x6b, + 0x65, 0x79, 0x27, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x70, 0x6c, + 0x6f, 0x74, 0x55, 0x49, 0x20, 0x3d, 0x20, 0x47, 0x6f, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x43, 0x68, 0x61, + 0x72, 0x74, 0x73, 0x5b, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x5d, 0x2e, + 0x6f, 0x70, 0x74, 0x73, 0x28, 0x29, 0x3b, 0x68, 0x69, 0x64, 0x65, + 0x20, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x74, 0x6f, 0x67, + 0x67, 0x6c, 0x65, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x65, 0x64, + 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x6b, 0x65, 0x79, + 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x6e, 0x64, + 0x65, 0x72, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x67, 0x65, + 0x74, 0x43, 0x75, 0x72, 0x50, 0x61, 0x67, 0x65, 0x28, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x29, 0x29, 0x3b, 0x69, 0x66, 0x20, 0x28, 0x21, + 0x70, 0x6c, 0x6f, 0x74, 0x55, 0x49, 0x2e, 0x72, 0x65, 0x64, 0x72, + 0x61, 0x77, 0x4f, 0x6e, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x29, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x69, 0x66, 0x20, 0x28, + 0x21, 0x68, 0x69, 0x64, 0x65, 0x29, 0x20, 0x7b, 0x64, 0x61, 0x74, + 0x61, 0x20, 0x3d, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x43, 0x68, 0x61, 0x72, 0x74, 0x73, 0x2e, 0x70, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x43, 0x68, 0x61, 0x72, 0x74, 0x44, + 0x61, 0x74, 0x61, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x64, + 0x64, 0x43, 0x68, 0x61, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x28, + 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x29, + 0x29, 0x3b, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x43, 0x68, 0x61, 0x72, 0x74, 0x73, 0x2e, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x43, 0x68, 0x61, 0x72, + 0x74, 0x44, 0x61, 0x74, 0x61, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x68, 0x61, 0x72, 0x74, + 0x44, 0x61, 0x74, 0x61, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, + 0x20, 0x6b, 0x65, 0x79, 0x29, 0x29, 0x3b, 0x7d, 0x47, 0x6f, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x43, 0x68, 0x61, 0x72, 0x74, + 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x50, 0x6c, 0x6f, 0x74, 0x28, + 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x70, 0x6c, 0x6f, 0x74, + 0x55, 0x49, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x7d, + 0x2c, 0x67, 0x65, 0x74, 0x43, 0x75, 0x72, 0x50, 0x61, 0x67, 0x65, + 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x20, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x2e, 0x55, 0x74, 0x69, 0x6c, 0x2e, 0x67, 0x65, 0x74, + 0x50, 0x72, 0x6f, 0x70, 0x28, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x2c, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x2b, 0x20, 0x27, + 0x2e, 0x63, 0x75, 0x72, 0x50, 0x61, 0x67, 0x65, 0x27, 0x29, 0x20, + 0x7c, 0x7c, 0x20, 0x30, 0x3b, 0x7d, 0x2c, 0x70, 0x61, 0x67, 0x65, + 0x4f, 0x66, 0x66, 0x53, 0x65, 0x74, 0x3a, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x29, 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x28, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x43, + 0x75, 0x72, 0x50, 0x61, 0x67, 0x65, 0x28, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x29, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x47, + 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x67, 0x65, 0x74, + 0x50, 0x72, 0x65, 0x66, 0x73, 0x28, 0x29, 0x2e, 0x70, 0x65, 0x72, + 0x50, 0x61, 0x67, 0x65, 0x29, 0x3b, 0x7d, 0x2c, 0x67, 0x65, 0x74, + 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x50, 0x61, 0x67, 0x65, 0x73, 0x3a, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, + 0x64, 0x61, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x29, 0x20, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x63, 0x65, 0x69, 0x6c, 0x28, 0x64, 0x61, 0x74, 0x61, + 0x49, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x20, 0x2f, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x72, 0x65, 0x66, 0x73, 0x28, + 0x29, 0x2e, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x29, 0x3b, + 0x7d, 0x2c, 0x67, 0x65, 0x74, 0x50, 0x61, 0x67, 0x65, 0x3a, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x49, + 0x74, 0x65, 0x6d, 0x73, 0x2c, 0x20, 0x70, 0x61, 0x67, 0x65, 0x29, + 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x50, 0x61, 0x67, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x67, 0x65, 0x74, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x50, + 0x61, 0x67, 0x65, 0x73, 0x28, 0x64, 0x61, 0x74, 0x61, 0x49, 0x74, + 0x65, 0x6d, 0x73, 0x29, 0x3b, 0x69, 0x66, 0x20, 0x28, 0x70, 0x61, + 0x67, 0x65, 0x20, 0x3c, 0x20, 0x31, 0x29, 0x70, 0x61, 0x67, 0x65, + 0x20, 0x3d, 0x20, 0x31, 0x3b, 0x69, 0x66, 0x20, 0x28, 0x70, 0x61, + 0x67, 0x65, 0x20, 0x3e, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x50, + 0x61, 0x67, 0x65, 0x73, 0x29, 0x70, 0x61, 0x67, 0x65, 0x20, 0x3d, + 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x50, 0x61, 0x67, 0x65, 0x73, + 0x3b, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x55, + 0x74, 0x69, 0x6c, 0x2e, 0x73, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, + 0x28, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x41, + 0x70, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x20, 0x2b, 0x20, 0x27, 0x2e, 0x63, 0x75, 0x72, + 0x50, 0x61, 0x67, 0x65, 0x27, 0x2c, 0x20, 0x70, 0x61, 0x67, 0x65, + 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x20, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x70, 0x61, 0x67, + 0x65, 0x4f, 0x66, 0x66, 0x53, 0x65, 0x74, 0x28, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x6e, 0x64, + 0x20, 0x3d, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x2b, 0x20, + 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x67, 0x65, + 0x74, 0x50, 0x72, 0x65, 0x66, 0x73, 0x28, 0x29, 0x2e, 0x70, 0x65, + 0x72, 0x50, 0x61, 0x67, 0x65, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x64, 0x61, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6d, 0x73, + 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x2c, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x3b, 0x7d, 0x2c, 0x70, + 0x72, 0x65, 0x76, 0x50, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x29, 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x43, 0x75, + 0x72, 0x50, 0x61, 0x67, 0x65, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x29, 0x20, 0x2d, 0x20, 0x31, 0x3b, 0x7d, 0x2c, 0x6e, 0x65, 0x78, + 0x74, 0x50, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x29, 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x43, 0x75, 0x72, 0x50, + 0x61, 0x67, 0x65, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x20, + 0x2b, 0x20, 0x31, 0x3b, 0x7d, 0x2c, 0x67, 0x65, 0x74, 0x4d, 0x65, + 0x74, 0x61, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x75, 0x69, 0x2c, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x20, 0x7b, 0x69, 0x66, + 0x20, 0x28, 0x27, 0x6d, 0x65, 0x74, 0x61, 0x27, 0x20, 0x69, 0x6e, + 0x20, 0x75, 0x69, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5b, 0x75, 0x69, 0x2e, 0x6d, 0x65, + 0x74, 0x61, 0x5d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x75, 0x6c, 0x6c, 0x3b, 0x7d, 0x2c, 0x67, 0x65, 0x74, 0x4d, + 0x65, 0x74, 0x61, 0x43, 0x65, 0x6c, 0x6c, 0x3a, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x75, 0x69, 0x2c, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x20, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x67, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x28, 0x75, 0x69, 0x2c, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x6d, 0x61, 0x78, + 0x20, 0x3d, 0x20, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x7c, + 0x7c, 0x20, 0x7b, 0x7d, 0x29, 0x2e, 0x6d, 0x61, 0x78, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x6d, 0x69, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x7b, 0x7d, 0x29, + 0x2e, 0x6d, 0x69, 0x6e, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x76, 0x74, + 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x2e, 0x6d, 0x65, + 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x75, + 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, + 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x2e, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x27, + 0x27, 0x3b, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, + 0x20, 0x2b, 0x3d, 0x20, 0x75, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x54, 0x79, 0x70, 0x65, 0x20, 0x21, 0x3d, 0x20, 0x27, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x27, 0x20, 0x3f, 0x20, 0x27, 0x74, 0x65, + 0x78, 0x74, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x27, 0x20, 0x3a, + 0x20, 0x27, 0x27, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x7b, 0x27, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, + 0x27, 0x3a, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, + 0x65, 0x2c, 0x27, 0x6d, 0x61, 0x78, 0x27, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3a, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x21, 0x3d, 0x20, + 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x3f, + 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x55, + 0x74, 0x69, 0x6c, 0x2e, 0x66, 0x6d, 0x74, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x28, 0x6d, 0x61, 0x78, 0x2c, 0x20, 0x76, 0x74, 0x79, 0x70, + 0x65, 0x29, 0x20, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x27, + 0x6d, 0x69, 0x6e, 0x27, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3a, + 0x20, 0x6d, 0x69, 0x6e, 0x20, 0x21, 0x3d, 0x20, 0x75, 0x6e, 0x64, + 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x3f, 0x20, 0x47, 0x6f, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x55, 0x74, 0x69, 0x6c, + 0x2e, 0x66, 0x6d, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x6d, + 0x69, 0x6e, 0x2c, 0x20, 0x76, 0x74, 0x79, 0x70, 0x65, 0x29, 0x20, + 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x27, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x27, 0x20, 0x20, 0x20, 0x20, 0x3a, 0x20, 0x76, 0x61, + 0x6c, 0x20, 0x21, 0x3d, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x65, 0x64, 0x20, 0x3f, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x55, 0x74, 0x69, 0x6c, 0x2e, 0x66, 0x6d, + 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x76, 0x61, 0x6c, 0x2c, + 0x20, 0x76, 0x74, 0x79, 0x70, 0x65, 0x29, 0x20, 0x3a, 0x20, 0x6e, + 0x75, 0x6c, 0x6c, 0x2c, 0x27, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x27, + 0x20, 0x20, 0x20, 0x20, 0x3a, 0x20, 0x75, 0x69, 0x2e, 0x6d, 0x65, + 0x74, 0x61, 0x2c, 0x27, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x27, 0x20, + 0x20, 0x20, 0x20, 0x3a, 0x20, 0x75, 0x69, 0x2e, 0x6d, 0x65, 0x74, + 0x61, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x20, 0x7c, 0x7c, 0x20, 0x6e, + 0x75, 0x6c, 0x6c, 0x2c, 0x7d, 0x3b, 0x7d, 0x2c, 0x68, 0x69, 0x64, + 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x3a, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x2c, 0x20, 0x63, 0x6f, 0x6c, 0x29, 0x20, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x20, + 0x3d, 0x20, 0x28, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x67, 0x65, 0x74, 0x50, 0x72, 0x65, 0x66, 0x73, 0x28, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x7b, 0x7d, + 0x29, 0x2e, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x20, 0x7c, + 0x7c, 0x20, 0x7b, 0x7d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x28, 0x28, 0x63, 0x6f, 0x6c, 0x20, 0x69, 0x6e, 0x20, 0x63, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x29, 0x20, 0x26, 0x26, 0x20, + 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x5b, 0x63, 0x6f, 0x6c, + 0x5d, 0x5b, 0x27, 0x68, 0x69, 0x64, 0x65, 0x27, 0x5d, 0x29, 0x3b, + 0x7d, 0x2c, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x73, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x28, 0x29, 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x28, 0x27, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x27, 0x20, 0x69, 0x6e, 0x20, 0x47, 0x6f, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x72, 0x65, + 0x66, 0x73, 0x28, 0x29, 0x29, 0x20, 0x3f, 0x20, 0x47, 0x6f, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x72, + 0x65, 0x66, 0x73, 0x28, 0x29, 0x2e, 0x73, 0x68, 0x6f, 0x77, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x73, 0x20, 0x3a, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x3b, 0x7d, 0x2c, 0x61, 0x75, 0x74, 0x6f, 0x48, 0x69, 0x64, + 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x3a, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x27, 0x61, 0x75, + 0x74, 0x6f, 0x48, 0x69, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x73, 0x27, 0x20, 0x69, 0x6e, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x72, 0x65, 0x66, + 0x73, 0x28, 0x29, 0x29, 0x20, 0x3f, 0x20, 0x47, 0x6f, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x72, 0x65, + 0x66, 0x73, 0x28, 0x29, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x48, 0x69, + 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x20, 0x3a, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x3b, 0x7d, 0x2c, 0x68, 0x61, 0x73, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x75, 0x69, 0x29, 0x20, 0x7b, 0x75, + 0x69, 0x5b, 0x27, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x27, 0x5d, 0x20, + 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x68, 0x6f, 0x77, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x28, 0x29, 0x3b, 0x75, 0x69, + 0x5b, 0x27, 0x61, 0x75, 0x74, 0x6f, 0x48, 0x69, 0x64, 0x65, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x73, 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x48, 0x69, 0x64, + 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x28, 0x29, 0x3b, 0x7d, + 0x2c, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, + 0x52, 0x6f, 0x77, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, + 0x75, 0x69, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x24, 0x28, 0x27, 0x2e, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x27, 0x20, 0x2b, 0x20, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x20, 0x2b, 0x20, 0x27, 0x20, 0x74, 0x62, 0x6f, + 0x64, 0x79, 0x2e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x2d, 0x6d, 0x65, + 0x74, 0x61, 0x27, 0x29, 0x3b, 0x69, 0x66, 0x20, 0x28, 0x21, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x20, + 0x3d, 0x20, 0x5b, 0x5d, 0x2c, 0x20, 0x75, 0x69, 0x49, 0x74, 0x65, + 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x2e, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x3d, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x67, 0x65, 0x74, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x44, 0x61, + 0x74, 0x61, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x2e, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x3b, 0x66, 0x6f, 0x72, + 0x20, 0x28, 0x76, 0x61, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, + 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x75, 0x69, 0x49, 0x74, 0x65, + 0x6d, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x20, + 0x2b, 0x2b, 0x69, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x69, + 0x74, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x49, 0x74, 0x65, + 0x6d, 0x73, 0x5b, 0x69, 0x5d, 0x3b, 0x69, 0x66, 0x20, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x68, 0x69, 0x64, 0x65, 0x43, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, + 0x69, 0x74, 0x65, 0x6d, 0x2e, 0x6b, 0x65, 0x79, 0x29, 0x29, 0x63, + 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x3b, 0x76, 0x61, 0x72, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x5b, 0x69, 0x74, 0x65, 0x6d, 0x2e, 0x6b, 0x65, 0x79, + 0x5d, 0x3b, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x2e, 0x70, 0x75, 0x73, + 0x68, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x4d, + 0x65, 0x74, 0x61, 0x43, 0x65, 0x6c, 0x6c, 0x28, 0x69, 0x74, 0x65, + 0x6d, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x29, 0x3b, + 0x7d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x6e, 0x65, + 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x3d, 0x20, 0x47, 0x6f, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x54, 0x70, + 0x6c, 0x73, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2e, 0x6d, + 0x65, 0x74, 0x61, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x28, + 0x7b, 0x72, 0x6f, 0x77, 0x3a, 0x20, 0x5b, 0x7b, 0x27, 0x68, 0x61, + 0x73, 0x53, 0x75, 0x62, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x27, 0x3a, + 0x20, 0x75, 0x69, 0x2e, 0x68, 0x61, 0x73, 0x53, 0x75, 0x62, 0x49, + 0x74, 0x65, 0x6d, 0x73, 0x2c, 0x27, 0x63, 0x65, 0x6c, 0x6c, 0x73, + 0x27, 0x3a, 0x20, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x7d, 0x5d, 0x7d, + 0x29, 0x3b, 0x7d, 0x2c, 0x69, 0x74, 0x65, 0x72, 0x55, 0x49, 0x49, + 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, + 0x20, 0x75, 0x69, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x2c, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x2c, 0x20, 0x63, + 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x29, 0x20, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x5b, 0x5d, + 0x3b, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x76, 0x61, 0x72, 0x20, 0x69, + 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x75, + 0x69, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3b, 0x20, 0x2b, 0x2b, 0x69, 0x29, 0x20, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x75, 0x69, 0x49, 0x74, 0x65, 0x6d, 0x20, 0x3d, + 0x20, 0x75, 0x69, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x5b, 0x69, 0x5d, + 0x3b, 0x69, 0x66, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x68, + 0x69, 0x64, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x28, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x75, 0x69, 0x49, 0x74, 0x65, + 0x6d, 0x2e, 0x6b, 0x65, 0x79, 0x29, 0x29, 0x63, 0x6f, 0x6e, 0x74, + 0x69, 0x6e, 0x75, 0x65, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x49, 0x74, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x5b, 0x75, 0x69, 0x49, + 0x74, 0x65, 0x6d, 0x2e, 0x6b, 0x65, 0x79, 0x5d, 0x3b, 0x69, 0x66, + 0x20, 0x28, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x20, + 0x26, 0x26, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x63, + 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x3d, 0x20, + 0x27, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x29, + 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x65, 0x74, 0x20, 0x3d, + 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x2e, 0x63, + 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x20, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x75, 0x69, 0x49, 0x74, 0x65, + 0x6d, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6d, + 0x29, 0x3b, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x74, 0x29, 0x20, + 0x6f, 0x75, 0x74, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x72, 0x65, + 0x74, 0x29, 0x3b, 0x7d, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6f, 0x75, 0x74, 0x3b, 0x7d, 0x2c, 0x67, 0x65, 0x74, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x3a, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x75, 0x69, 0x2c, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x3d, + 0x20, 0x75, 0x69, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, + 0x6d, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x27, 0x27, 0x3b, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x2b, 0x3d, 0x20, + 0x75, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, + 0x20, 0x21, 0x3d, 0x20, 0x27, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x27, 0x20, 0x3f, 0x20, 0x27, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x27, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x27, 0x3a, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x2c, 0x27, 0x70, + 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x27, 0x3a, 0x20, 0x47, 0x6f, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x55, 0x74, 0x69, 0x6c, + 0x2e, 0x67, 0x65, 0x74, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x2c, 0x27, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x27, 0x3a, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x55, 0x74, 0x69, 0x6c, 0x2e, 0x66, 0x6d, + 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x47, 0x6f, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x55, 0x74, 0x69, 0x6c, 0x2e, 0x67, + 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x28, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x29, 0x2c, 0x20, 0x75, 0x69, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x54, 0x79, 0x70, 0x65, 0x29, 0x7d, 0x3b, 0x7d, 0x2c, 0x72, + 0x65, 0x6e, 0x64, 0x65, 0x72, 0x52, 0x6f, 0x77, 0x3a, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, + 0x63, 0x6b, 0x2c, 0x20, 0x75, 0x69, 0x2c, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x49, 0x74, 0x65, 0x6d, 0x2c, 0x20, 0x69, 0x64, 0x78, 0x2c, + 0x20, 0x73, 0x75, 0x62, 0x49, 0x74, 0x65, 0x6d, 0x2c, 0x20, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x2c, 0x20, 0x65, 0x78, + 0x70, 0x61, 0x6e, 0x64, 0x65, 0x64, 0x29, 0x20, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x73, 0x68, 0x61, 0x64, 0x65, 0x50, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x21, 0x73, 0x75, 0x62, + 0x49, 0x74, 0x65, 0x6d, 0x20, 0x26, 0x26, 0x20, 0x69, 0x64, 0x78, + 0x20, 0x25, 0x20, 0x32, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x29, 0x20, + 0x3f, 0x20, 0x27, 0x73, 0x68, 0x61, 0x64, 0x65, 0x64, 0x27, 0x20, + 0x3a, 0x20, 0x27, 0x27, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x73, + 0x68, 0x61, 0x64, 0x65, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x20, 0x3d, + 0x20, 0x28, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x20, 0x25, 0x20, 0x32, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x29, 0x20, + 0x3f, 0x20, 0x27, 0x73, 0x68, 0x61, 0x64, 0x65, 0x64, 0x27, 0x20, + 0x3a, 0x20, 0x27, 0x27, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x7b, 0x27, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x27, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3a, 0x20, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x2c, 0x27, 0x69, 0x64, 0x78, 0x27, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3a, 0x20, 0x21, 0x73, 0x75, + 0x62, 0x49, 0x74, 0x65, 0x6d, 0x20, 0x26, 0x26, 0x20, 0x28, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x28, 0x69, 0x64, 0x78, 0x20, + 0x2b, 0x20, 0x31, 0x29, 0x20, 0x2b, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x70, 0x61, 0x67, 0x65, 0x4f, 0x66, 0x66, 0x53, 0x65, 0x74, + 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x29, 0x29, 0x2c, 0x27, + 0x6b, 0x65, 0x79, 0x27, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3a, 0x20, 0x21, 0x73, 0x75, 0x62, 0x49, 0x74, 0x65, + 0x6d, 0x20, 0x3f, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x55, 0x74, 0x69, 0x6c, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x43, 0x6f, 0x64, 0x65, 0x28, 0x64, 0x61, 0x74, 0x61, 0x49, 0x74, + 0x65, 0x6d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x29, 0x20, 0x3a, 0x20, + 0x27, 0x27, 0x2c, 0x27, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x65, + 0x64, 0x27, 0x20, 0x20, 0x20, 0x20, 0x3a, 0x20, 0x21, 0x73, 0x75, + 0x62, 0x49, 0x74, 0x65, 0x6d, 0x20, 0x26, 0x26, 0x20, 0x65, 0x78, + 0x70, 0x61, 0x6e, 0x64, 0x65, 0x64, 0x2c, 0x27, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x27, 0x20, 0x20, 0x20, 0x20, 0x3a, + 0x20, 0x73, 0x75, 0x62, 0x49, 0x74, 0x65, 0x6d, 0x20, 0x3f, 0x20, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x2c, + 0x27, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x27, + 0x20, 0x20, 0x20, 0x3a, 0x20, 0x73, 0x75, 0x62, 0x49, 0x74, 0x65, + 0x6d, 0x20, 0x3f, 0x20, 0x27, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x20, + 0x27, 0x20, 0x2b, 0x20, 0x73, 0x68, 0x61, 0x64, 0x65, 0x43, 0x68, + 0x69, 0x6c, 0x64, 0x20, 0x3a, 0x20, 0x27, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x20, 0x27, 0x20, 0x2b, 0x20, 0x73, 0x68, 0x61, 0x64, + 0x65, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x27, 0x68, 0x61, + 0x73, 0x53, 0x75, 0x62, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x27, 0x20, + 0x3a, 0x20, 0x75, 0x69, 0x2e, 0x68, 0x61, 0x73, 0x53, 0x75, 0x62, + 0x49, 0x74, 0x65, 0x6d, 0x73, 0x2c, 0x27, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x27, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3a, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x20, 0x3f, 0x20, 0x64, 0x61, 0x74, 0x61, 0x49, + 0x74, 0x65, 0x6d, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3a, 0x20, 0x30, 0x2c, 0x27, + 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x27, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3a, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, + 0x6b, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x29, 0x2c, 0x7d, 0x3b, 0x7d, 0x2c, 0x72, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x52, 0x6f, 0x77, 0x73, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x72, 0x6f, 0x77, 0x73, 0x2c, + 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x75, 0x69, 0x2c, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x2c, + 0x20, 0x73, 0x75, 0x62, 0x49, 0x74, 0x65, 0x6d, 0x2c, 0x20, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x29, 0x20, 0x7b, 0x73, + 0x75, 0x62, 0x49, 0x74, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x73, 0x75, + 0x62, 0x49, 0x74, 0x65, 0x6d, 0x20, 0x7c, 0x7c, 0x20, 0x66, 0x61, + 0x6c, 0x73, 0x65, 0x3b, 0x69, 0x66, 0x20, 0x28, 0x64, 0x61, 0x74, + 0x61, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x20, 0x26, 0x26, 0x20, + 0x75, 0x69, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x29, 0x20, 0x7b, 0x72, 0x6f, 0x77, 0x73, + 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x7b, 0x63, 0x65, 0x6c, 0x6c, + 0x73, 0x3a, 0x20, 0x5b, 0x7b, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, + 0x61, 0x6d, 0x65, 0x3a, 0x20, 0x27, 0x74, 0x65, 0x78, 0x74, 0x2d, + 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x27, 0x2c, 0x63, 0x6f, 0x6c, + 0x73, 0x70, 0x61, 0x6e, 0x3a, 0x20, 0x75, 0x69, 0x2e, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, + 0x2b, 0x20, 0x31, 0x2c, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x20, + 0x27, 0x4e, 0x6f, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x6f, 0x6e, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x2e, 0x27, 0x7d, 0x5d, 0x7d, 0x29, 0x3b, 0x7d, 0x76, 0x61, 0x72, + 0x20, 0x63, 0x65, 0x6c, 0x6c, 0x63, 0x62, 0x20, 0x3d, 0x20, 0x6e, + 0x75, 0x6c, 0x6c, 0x3b, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x76, 0x61, + 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, + 0x3c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6d, 0x73, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x20, 0x2b, 0x2b, + 0x69, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x49, 0x74, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x5b, 0x69, 0x5d, 0x2c, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x6e, 0x75, 0x6c, 0x6c, + 0x2c, 0x20, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x65, 0x64, 0x20, + 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x73, 0x77, 0x69, + 0x74, 0x63, 0x68, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6d, 0x29, 0x20, 0x7b, + 0x63, 0x61, 0x73, 0x65, 0x20, 0x27, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x27, 0x3a, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6d, 0x3b, 0x63, 0x65, 0x6c, + 0x6c, 0x63, 0x62, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x27, 0x63, 0x6f, 0x6c, 0x73, 0x70, + 0x61, 0x6e, 0x27, 0x3a, 0x20, 0x75, 0x69, 0x2e, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x27, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x27, 0x3a, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x7d, 0x3b, 0x7d, 0x3b, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x64, 0x61, 0x74, + 0x61, 0x20, 0x3d, 0x20, 0x64, 0x61, 0x74, 0x61, 0x49, 0x74, 0x65, + 0x6d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x3b, 0x63, 0x65, 0x6c, 0x6c, + 0x63, 0x62, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, + 0x74, 0x65, 0x72, 0x55, 0x49, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x2e, + 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x20, + 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x75, 0x69, 0x2e, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x49, + 0x74, 0x65, 0x6d, 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x67, + 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x65, 0x6c, + 0x6c, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x29, 0x29, 0x3b, 0x7d, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x65, + 0x64, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, + 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x65, 0x64, 0x28, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x2e, 0x55, 0x74, 0x69, 0x6c, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x43, 0x6f, 0x64, 0x65, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, + 0x29, 0x3b, 0x72, 0x6f, 0x77, 0x73, 0x2e, 0x70, 0x75, 0x73, 0x68, + 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x52, 0x6f, 0x77, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, + 0x20, 0x63, 0x65, 0x6c, 0x6c, 0x63, 0x62, 0x2c, 0x20, 0x75, 0x69, + 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6d, 0x2c, + 0x20, 0x69, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x49, 0x74, 0x65, 0x6d, + 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x2c, + 0x20, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x65, 0x64, 0x29, 0x29, + 0x3b, 0x69, 0x66, 0x20, 0x28, 0x64, 0x61, 0x74, 0x61, 0x49, 0x74, + 0x65, 0x6d, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x26, 0x26, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x20, 0x26, 0x26, 0x20, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x65, + 0x64, 0x29, 0x20, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, + 0x6e, 0x64, 0x65, 0x72, 0x52, 0x6f, 0x77, 0x73, 0x28, 0x72, 0x6f, + 0x77, 0x73, 0x2c, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, + 0x75, 0x69, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x49, 0x74, 0x65, + 0x6d, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2c, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x2c, 0x20, 0x69, 0x2c, 0x20, 0x65, 0x78, 0x70, 0x61, + 0x6e, 0x64, 0x65, 0x64, 0x29, 0x3b, 0x7d, 0x7d, 0x7d, 0x2c, 0x72, + 0x65, 0x6e, 0x64, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x52, 0x6f, + 0x77, 0x73, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x75, + 0x69, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6d, + 0x73, 0x2c, 0x20, 0x70, 0x61, 0x67, 0x65, 0x29, 0x20, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, + 0x24, 0x28, 0x27, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x27, + 0x20, 0x2b, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x2b, 0x20, + 0x27, 0x20, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x2e, 0x74, 0x62, 0x6f, + 0x64, 0x79, 0x2d, 0x64, 0x61, 0x74, 0x61, 0x27, 0x29, 0x3b, 0x69, + 0x66, 0x20, 0x28, 0x21, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x29, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x64, 0x61, 0x74, 0x61, 0x49, + 0x74, 0x65, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x67, 0x65, 0x74, 0x50, 0x61, 0x67, 0x65, 0x28, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x49, 0x74, + 0x65, 0x6d, 0x73, 0x2c, 0x20, 0x70, 0x61, 0x67, 0x65, 0x29, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x20, 0x3d, 0x20, + 0x5b, 0x5d, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x6e, + 0x64, 0x65, 0x72, 0x52, 0x6f, 0x77, 0x73, 0x28, 0x72, 0x6f, 0x77, + 0x73, 0x2c, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x75, + 0x69, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6d, + 0x73, 0x29, 0x3b, 0x69, 0x66, 0x20, 0x28, 0x72, 0x6f, 0x77, 0x73, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x3d, 0x20, + 0x30, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, + 0x4d, 0x4c, 0x20, 0x3d, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x54, 0x70, 0x6c, 0x73, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x28, 0x7b, 0x72, 0x6f, + 0x77, 0x73, 0x3a, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x7d, 0x29, 0x3b, + 0x7d, 0x2c, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x50, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x2c, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x29, 0x20, 0x7b, + 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x50, 0x61, + 0x6e, 0x65, 0x6c, 0x73, 0x2e, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x3b, 0x69, 0x66, 0x20, 0x28, + 0x70, 0x61, 0x67, 0x65, 0x20, 0x3e, 0x3d, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x67, 0x65, 0x74, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x50, + 0x61, 0x67, 0x65, 0x73, 0x28, 0x64, 0x61, 0x74, 0x61, 0x49, 0x74, + 0x65, 0x6d, 0x73, 0x29, 0x29, 0x20, 0x7b, 0x47, 0x6f, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x73, + 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x65, 0x78, + 0x74, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x3b, 0x47, 0x6f, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x50, 0x61, 0x6e, 0x65, + 0x6c, 0x73, 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4c, + 0x61, 0x73, 0x74, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x3b, + 0x7d, 0x69, 0x66, 0x20, 0x28, 0x70, 0x61, 0x67, 0x65, 0x20, 0x3c, + 0x3d, 0x20, 0x31, 0x29, 0x20, 0x7b, 0x47, 0x6f, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x73, 0x2e, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x65, 0x76, + 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x3b, 0x47, 0x6f, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x50, 0x61, 0x6e, 0x65, 0x6c, + 0x73, 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x69, + 0x72, 0x73, 0x74, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x3b, + 0x7d, 0x7d, 0x2c, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, + 0x70, 0x61, 0x67, 0x65, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x3d, + 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x67, + 0x65, 0x74, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, + 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x75, 0x69, 0x20, 0x3d, 0x20, + 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x67, 0x65, + 0x74, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x55, 0x49, 0x28, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x29, 0x3b, 0x69, 0x66, 0x20, 0x28, 0x70, 0x61, + 0x67, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x22, 0x4c, 0x41, 0x53, + 0x54, 0x5f, 0x50, 0x41, 0x47, 0x45, 0x22, 0x29, 0x20, 0x7b, 0x70, + 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x67, 0x65, 0x74, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x50, 0x61, 0x67, + 0x65, 0x73, 0x28, 0x64, 0x61, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6d, + 0x73, 0x29, 0x3b, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x70, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x3d, 0x3d, + 0x20, 0x22, 0x46, 0x49, 0x52, 0x53, 0x54, 0x5f, 0x50, 0x41, 0x47, + 0x45, 0x22, 0x29, 0x20, 0x7b, 0x70, 0x61, 0x67, 0x65, 0x20, 0x3d, + 0x20, 0x31, 0x3b, 0x7d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x74, 0x6f, + 0x67, 0x67, 0x6c, 0x65, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, + 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x49, + 0x74, 0x65, 0x6d, 0x73, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x52, + 0x6f, 0x77, 0x73, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, + 0x75, 0x69, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x49, 0x74, 0x65, + 0x6d, 0x73, 0x2c, 0x20, 0x70, 0x61, 0x67, 0x65, 0x29, 0x3b, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x28, + 0x29, 0x3b, 0x7d, 0x2c, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, + 0x75, 0x6c, 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x75, + 0x69, 0x20, 0x3d, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x55, + 0x49, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x2c, 0x20, 0x70, + 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x76, 0x61, 0x72, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x47, 0x6f, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x61, + 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x28, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x29, 0x3b, 0x69, 0x66, 0x20, 0x28, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x68, 0x61, 0x73, 0x4f, 0x77, 0x6e, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x27, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x27, 0x29, 0x29, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, + 0x52, 0x6f, 0x77, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, + 0x75, 0x69, 0x29, 0x3b, 0x69, 0x66, 0x20, 0x28, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x68, 0x61, 0x73, 0x4f, 0x77, 0x6e, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x27, 0x64, 0x61, 0x74, 0x61, + 0x27, 0x29, 0x29, 0x20, 0x7b, 0x70, 0x61, 0x67, 0x65, 0x20, 0x3d, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x43, 0x75, + 0x72, 0x50, 0x61, 0x67, 0x65, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x74, 0x6f, 0x67, 0x67, + 0x6c, 0x65, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x70, 0x61, + 0x67, 0x65, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, + 0x6e, 0x64, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x52, 0x6f, 0x77, + 0x73, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x75, 0x69, + 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x2c, 0x20, 0x70, 0x61, 0x67, 0x65, 0x29, 0x3b, 0x7d, 0x7d, 0x2c, + 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x73, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x28, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x29, 0x20, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x75, 0x69, 0x20, 0x3d, 0x20, 0x47, 0x6f, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x61, + 0x6e, 0x65, 0x6c, 0x55, 0x49, 0x28, 0x29, 0x3b, 0x66, 0x6f, 0x72, + 0x20, 0x28, 0x76, 0x61, 0x72, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x20, 0x69, 0x6e, 0x20, 0x75, 0x69, 0x29, 0x20, 0x7b, 0x69, 0x66, + 0x20, 0x28, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x55, 0x74, 0x69, 0x6c, 0x2e, 0x69, 0x73, 0x50, 0x61, 0x6e, 0x65, + 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x28, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x21, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x28, 0x29, 0x29, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, + 0x3b, 0x69, 0x66, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x20, + 0x7c, 0x7c, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x55, 0x74, 0x69, 0x6c, 0x2e, 0x69, 0x73, 0x57, 0x69, 0x74, + 0x68, 0x69, 0x6e, 0x56, 0x69, 0x65, 0x77, 0x50, 0x6f, 0x72, 0x74, + 0x28, 0x24, 0x28, 0x27, 0x23, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2d, + 0x27, 0x20, 0x2b, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x29, + 0x29, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x46, 0x75, 0x6c, 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x28, + 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x3b, 0x7d, 0x7d, 0x2c, 0x73, + 0x6f, 0x72, 0x74, 0x32, 0x54, 0x70, 0x6c, 0x3a, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x2c, 0x20, 0x75, 0x69, 0x29, 0x20, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x75, 0x69, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x20, 0x3d, + 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, + 0x28, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x69, 0x66, 0x79, 0x28, 0x75, 0x69, 0x29, 0x29, 0x2c, 0x20, + 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x5b, 0x5d, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x47, 0x6f, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x55, 0x74, 0x69, 0x6c, + 0x2e, 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x28, 0x47, 0x6f, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x20, 0x2b, 0x20, 0x27, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x27, 0x29, + 0x3b, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x76, 0x61, 0x72, 0x20, 0x69, + 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, + 0x20, 0x75, 0x69, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x2e, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, + 0x20, 0x69, 0x20, 0x3c, 0x20, 0x6c, 0x65, 0x6e, 0x3b, 0x20, 0x2b, + 0x2b, 0x69, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x74, + 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x75, 0x69, 0x43, 0x6c, 0x6f, 0x6e, + 0x65, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x5b, 0x69, 0x5d, 0x3b, + 0x69, 0x66, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x68, 0x69, + 0x64, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x28, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x2e, 0x6b, + 0x65, 0x79, 0x29, 0x29, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, + 0x65, 0x3b, 0x69, 0x74, 0x65, 0x6d, 0x5b, 0x27, 0x73, 0x6f, 0x72, + 0x74, 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, + 0x3b, 0x69, 0x66, 0x20, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x2e, 0x6b, + 0x65, 0x79, 0x20, 0x3d, 0x3d, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x2e, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x26, 0x26, 0x20, 0x73, 0x6f, + 0x72, 0x74, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x29, 0x20, 0x7b, + 0x69, 0x74, 0x65, 0x6d, 0x5b, 0x27, 0x73, 0x6f, 0x72, 0x74, 0x27, + 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x69, 0x74, + 0x65, 0x6d, 0x5b, 0x73, 0x6f, 0x72, 0x74, 0x2e, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x2e, 0x74, 0x6f, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x43, + 0x61, 0x73, 0x65, 0x28, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x3b, 0x7d, 0x6f, 0x75, 0x74, 0x2e, 0x70, 0x75, 0x73, + 0x68, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x29, 0x3b, 0x7d, 0x75, 0x69, + 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x75, 0x69, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x3b, + 0x7d, 0x2c, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x54, 0x68, 0x65, + 0x61, 0x64, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x75, + 0x69, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x24, 0x74, 0x68, + 0x65, 0x61, 0x64, 0x20, 0x3d, 0x20, 0x24, 0x28, 0x27, 0x2e, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x27, 0x20, 0x2b, 0x20, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x20, 0x2b, 0x20, 0x27, 0x3e, 0x74, 0x68, 0x65, + 0x61, 0x64, 0x27, 0x29, 0x2c, 0x20, 0x24, 0x63, 0x6f, 0x6c, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x20, 0x3d, 0x20, 0x24, 0x28, 0x27, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x27, 0x20, 0x2b, 0x20, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x2b, 0x20, 0x27, 0x3e, 0x63, 0x6f, + 0x6c, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x27, 0x29, 0x3b, 0x69, 0x66, + 0x20, 0x28, 0x24, 0x74, 0x68, 0x65, 0x61, 0x64, 0x20, 0x26, 0x26, + 0x20, 0x24, 0x63, 0x6f, 0x6c, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, + 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x68, 0x6f, + 0x77, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x28, 0x29, 0x29, 0x20, + 0x7b, 0x75, 0x69, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x73, 0x6f, 0x72, 0x74, 0x32, 0x54, 0x70, 0x6c, 0x28, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x75, 0x69, 0x29, 0x3b, 0x24, 0x74, + 0x68, 0x65, 0x61, 0x64, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, + 0x54, 0x4d, 0x4c, 0x20, 0x3d, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x54, 0x70, 0x6c, 0x73, + 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2e, 0x68, 0x65, 0x61, + 0x64, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x28, 0x75, 0x69, + 0x29, 0x3b, 0x24, 0x63, 0x6f, 0x6c, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x20, + 0x3d, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x41, 0x70, 0x70, 0x54, 0x70, 0x6c, 0x73, 0x2e, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6c, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x28, 0x75, 0x69, + 0x29, 0x3b, 0x7d, 0x7d, 0x2c, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x3a, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x73, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, + 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x28, 0x29, 0x3b, 0x7d, 0x2c, 0x69, 0x6e, 0x69, 0x74, + 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x73, 0x28, 0x74, 0x72, 0x75, 0x65, 0x29, + 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x28, 0x29, 0x3b, 0x64, 0x33, 0x2e, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x28, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x29, 0x2e, + 0x6f, 0x6e, 0x28, 0x27, 0x73, 0x63, 0x72, 0x6f, 0x6c, 0x6c, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x27, 0x2c, 0x20, 0x64, 0x65, + 0x62, 0x6f, 0x75, 0x6e, 0x63, 0x65, 0x28, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x73, 0x28, 0x29, 0x3b, 0x7d, 0x2c, 0x20, 0x32, + 0x35, 0x30, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x2e, + 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x29, + 0x3b, 0x7d, 0x2c, 0x7d, 0x3b, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x20, 0x3d, 0x20, 0x7b, 0x68, + 0x61, 0x73, 0x46, 0x6f, 0x63, 0x75, 0x73, 0x3a, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x2c, 0x74, 0x70, 0x6c, 0x3a, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x74, 0x70, 0x6c, 0x29, + 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x48, 0x6f, + 0x67, 0x61, 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x28, 0x74, 0x70, 0x6c, 0x29, 0x3b, 0x7d, 0x2c, 0x73, 0x65, 0x74, + 0x54, 0x70, 0x6c, 0x73, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0x47, 0x6f, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x54, 0x70, + 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x27, 0x4e, 0x61, 0x76, 0x27, + 0x3a, 0x20, 0x7b, 0x27, 0x77, 0x72, 0x61, 0x70, 0x27, 0x3a, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x74, 0x70, 0x6c, 0x28, 0x24, 0x28, + 0x27, 0x23, 0x74, 0x70, 0x6c, 0x2d, 0x6e, 0x61, 0x76, 0x2d, 0x77, + 0x72, 0x61, 0x70, 0x27, 0x29, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, + 0x48, 0x54, 0x4d, 0x4c, 0x29, 0x2c, 0x27, 0x6d, 0x65, 0x6e, 0x75, + 0x27, 0x3a, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x74, 0x70, 0x6c, + 0x28, 0x24, 0x28, 0x27, 0x23, 0x74, 0x70, 0x6c, 0x2d, 0x6e, 0x61, + 0x76, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x27, 0x29, 0x2e, 0x69, 0x6e, + 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x29, 0x2c, 0x27, 0x6f, + 0x70, 0x74, 0x73, 0x27, 0x3a, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x74, 0x70, 0x6c, 0x28, 0x24, 0x28, 0x27, 0x23, 0x74, 0x70, 0x6c, + 0x2d, 0x6e, 0x61, 0x76, 0x2d, 0x6f, 0x70, 0x74, 0x73, 0x27, 0x29, + 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x29, + 0x2c, 0x7d, 0x2c, 0x27, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x73, 0x27, + 0x3a, 0x20, 0x7b, 0x27, 0x77, 0x72, 0x61, 0x70, 0x27, 0x3a, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x74, 0x70, 0x6c, 0x28, 0x24, 0x28, + 0x27, 0x23, 0x74, 0x70, 0x6c, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x27, 0x29, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, + 0x4c, 0x29, 0x2c, 0x27, 0x6f, 0x70, 0x74, 0x73, 0x27, 0x3a, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x74, 0x70, 0x6c, 0x28, 0x24, 0x28, + 0x27, 0x23, 0x74, 0x70, 0x6c, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x2d, 0x6f, 0x70, 0x74, 0x73, 0x27, 0x29, 0x2e, 0x69, 0x6e, 0x6e, + 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x29, 0x2c, 0x7d, 0x2c, 0x27, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x27, 0x3a, 0x20, 0x7b, + 0x27, 0x77, 0x72, 0x61, 0x70, 0x27, 0x3a, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x74, 0x70, 0x6c, 0x28, 0x24, 0x28, 0x27, 0x23, 0x74, + 0x70, 0x6c, 0x2d, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x27, + 0x29, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, + 0x29, 0x2c, 0x27, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x27, 0x3a, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x74, 0x70, 0x6c, 0x28, 0x24, 0x28, + 0x27, 0x23, 0x74, 0x70, 0x6c, 0x2d, 0x67, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x6c, 0x2d, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x27, 0x29, 0x2e, + 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x29, 0x2c, + 0x7d, 0x2c, 0x27, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x27, 0x3a, + 0x20, 0x7b, 0x27, 0x63, 0x6f, 0x6c, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x27, 0x3a, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x74, 0x70, 0x6c, + 0x28, 0x24, 0x28, 0x27, 0x23, 0x74, 0x70, 0x6c, 0x2d, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2d, 0x63, 0x6f, 0x6c, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x27, 0x29, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, + 0x4d, 0x4c, 0x29, 0x2c, 0x27, 0x68, 0x65, 0x61, 0x64, 0x27, 0x3a, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x74, 0x70, 0x6c, 0x28, 0x24, + 0x28, 0x27, 0x23, 0x74, 0x70, 0x6c, 0x2d, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2d, 0x74, 0x68, 0x65, 0x61, 0x64, 0x27, 0x29, 0x2e, 0x69, + 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x29, 0x2c, 0x27, + 0x6d, 0x65, 0x74, 0x61, 0x27, 0x3a, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x74, 0x70, 0x6c, 0x28, 0x24, 0x28, 0x27, 0x23, 0x74, 0x70, + 0x6c, 0x2d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x72, 0x6f, 0x77, + 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x27, 0x29, 0x2e, 0x69, 0x6e, 0x6e, + 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x29, 0x2c, 0x27, 0x64, 0x61, + 0x74, 0x61, 0x27, 0x3a, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x74, + 0x70, 0x6c, 0x28, 0x24, 0x28, 0x27, 0x23, 0x74, 0x70, 0x6c, 0x2d, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x72, 0x6f, 0x77, 0x27, 0x29, + 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x29, + 0x2c, 0x7d, 0x2c, 0x7d, 0x3b, 0x7d, 0x2c, 0x73, 0x6f, 0x72, 0x74, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x6f, 0x2c, 0x20, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x66, + 0x20, 0x3d, 0x20, 0x6f, 0x5b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5d, + 0x3b, 0x69, 0x66, 0x20, 0x28, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x2e, 0x55, 0x74, 0x69, 0x6c, 0x2e, 0x69, 0x73, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x28, 0x66, 0x29, 0x20, 0x26, 0x26, + 0x20, 0x28, 0x66, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x6e, 0x75, 0x6c, + 0x6c, 0x29, 0x29, 0x66, 0x20, 0x3d, 0x20, 0x6f, 0x5b, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x5d, 0x2e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x3b, 0x7d, 0x2c, + 0x73, 0x6f, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x3a, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x2c, + 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x29, 0x20, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, + 0x20, 0x3d, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x67, 0x65, 0x74, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x44, 0x61, + 0x74, 0x61, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x3b, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x44, 0x61, + 0x74, 0x61, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x28, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x61, 0x2c, 0x20, 0x62, + 0x29, 0x20, 0x7b, 0x61, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x28, + 0x61, 0x2c, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x29, 0x3b, 0x62, + 0x20, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x6f, 0x72, + 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x28, 0x62, 0x2c, 0x20, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x29, 0x3b, 0x69, 0x66, 0x20, 0x28, 0x74, + 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x3d, 0x3d, 0x3d, + 0x20, 0x27, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0x20, 0x26, + 0x26, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x62, 0x20, + 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x27, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x61, + 0x73, 0x63, 0x27, 0x20, 0x3d, 0x3d, 0x20, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x20, 0x3f, 0x20, 0x61, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x28, 0x62, 0x29, + 0x20, 0x3a, 0x20, 0x62, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, + 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x28, 0x61, 0x29, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x20, 0x27, 0x61, 0x73, + 0x63, 0x27, 0x20, 0x3d, 0x3d, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x20, 0x3f, 0x20, 0x61, 0x20, 0x2d, 0x20, 0x62, 0x20, 0x3a, 0x20, + 0x62, 0x20, 0x2d, 0x20, 0x61, 0x3b, 0x7d, 0x2e, 0x62, 0x69, 0x6e, + 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x29, 0x3b, 0x7d, 0x2c, + 0x73, 0x65, 0x74, 0x49, 0x6e, 0x69, 0x74, 0x53, 0x6f, 0x72, 0x74, + 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x28, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x75, 0x69, 0x20, + 0x3d, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x67, 0x65, 0x74, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x55, 0x49, 0x28, + 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x76, 0x61, 0x72, 0x20, + 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x69, 0x6e, 0x20, 0x75, 0x69, + 0x29, 0x20, 0x7b, 0x69, 0x66, 0x20, 0x28, 0x47, 0x6f, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x55, 0x74, 0x69, 0x6c, 0x2e, 0x69, + 0x73, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x29, 0x29, 0x63, 0x6f, 0x6e, + 0x74, 0x69, 0x6e, 0x75, 0x65, 0x3b, 0x47, 0x6f, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x55, 0x74, 0x69, 0x6c, 0x2e, 0x73, 0x65, + 0x74, 0x50, 0x72, 0x6f, 0x70, 0x28, 0x47, 0x6f, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x2c, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x2b, 0x20, + 0x27, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x27, 0x2c, 0x20, 0x75, 0x69, + 0x5b, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x5d, 0x2e, 0x73, 0x6f, 0x72, + 0x74, 0x29, 0x3b, 0x7d, 0x7d, 0x2c, 0x76, 0x65, 0x72, 0x69, 0x66, + 0x79, 0x53, 0x6f, 0x72, 0x74, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x75, 0x69, 0x20, 0x3d, 0x20, 0x47, 0x6f, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x61, 0x6e, + 0x65, 0x6c, 0x55, 0x49, 0x28, 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x20, + 0x28, 0x76, 0x61, 0x72, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, + 0x69, 0x6e, 0x20, 0x75, 0x69, 0x29, 0x20, 0x7b, 0x69, 0x66, 0x20, + 0x28, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x55, + 0x74, 0x69, 0x6c, 0x2e, 0x69, 0x73, 0x50, 0x61, 0x6e, 0x65, 0x6c, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x28, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x29, 0x29, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x20, 0x3d, 0x20, + 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x55, 0x74, + 0x69, 0x6c, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x28, + 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x41, 0x70, + 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x20, 0x2b, 0x20, 0x27, 0x2e, 0x73, 0x6f, 0x72, 0x74, + 0x27, 0x29, 0x3b, 0x69, 0x66, 0x20, 0x28, 0x4a, 0x53, 0x4f, 0x4e, + 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x28, + 0x73, 0x6f, 0x72, 0x74, 0x29, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x4a, + 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, + 0x66, 0x79, 0x28, 0x75, 0x69, 0x5b, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x5d, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x29, 0x29, 0x63, 0x6f, 0x6e, + 0x74, 0x69, 0x6e, 0x75, 0x65, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x73, 0x6f, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x28, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x2e, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x2c, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x2e, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x29, 0x3b, 0x7d, 0x7d, 0x2c, 0x69, + 0x6e, 0x69, 0x74, 0x44, 0x6f, 0x6d, 0x3a, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0x24, + 0x28, 0x27, 0x6e, 0x61, 0x76, 0x27, 0x29, 0x2e, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x72, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x28, 0x27, 0x68, 0x69, 0x64, 0x65, 0x27, 0x29, 0x3b, + 0x24, 0x28, 0x27, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x27, 0x29, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4c, + 0x69, 0x73, 0x74, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, + 0x27, 0x68, 0x69, 0x64, 0x65, 0x27, 0x29, 0x3b, 0x24, 0x28, 0x27, + 0x2e, 0x73, 0x70, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x27, 0x29, 0x2e, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x61, + 0x64, 0x64, 0x28, 0x27, 0x68, 0x69, 0x64, 0x65, 0x27, 0x29, 0x3b, + 0x69, 0x66, 0x20, 0x28, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x41, 0x70, 0x70, 0x50, 0x72, 0x65, 0x66, 0x73, 0x5b, + 0x27, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x27, 0x5d, 0x20, 0x3d, + 0x3d, 0x20, 0x27, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, + 0x61, 0x6c, 0x27, 0x29, 0x20, 0x7b, 0x24, 0x28, 0x27, 0x2e, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x27, 0x29, 0x2e, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x61, + 0x64, 0x64, 0x28, 0x27, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x2d, 0x66, 0x6c, 0x75, 0x69, 0x64, 0x27, 0x29, 0x3b, + 0x24, 0x28, 0x27, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x2d, 0x66, 0x6c, 0x75, 0x69, 0x64, 0x27, 0x29, 0x2e, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x72, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x27, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x27, 0x29, 0x3b, 0x7d, 0x7d, 0x2c, + 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x3a, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, + 0x29, 0x20, 0x7b, 0x69, 0x66, 0x20, 0x28, 0x21, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x68, 0x61, 0x73, 0x46, 0x6f, 0x63, 0x75, 0x73, 0x29, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x53, 0x6f, 0x72, 0x74, + 0x28, 0x29, 0x3b, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x4f, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, + 0x7a, 0x65, 0x28, 0x29, 0x3b, 0x69, 0x66, 0x20, 0x28, 0x21, 0x47, + 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x41, 0x70, 0x70, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x47, + 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x43, 0x68, 0x61, + 0x72, 0x74, 0x73, 0x2e, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x43, + 0x68, 0x61, 0x72, 0x74, 0x73, 0x28, 0x29, 0x3b, 0x47, 0x6f, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x73, 0x2e, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x28, 0x29, 0x3b, 0x7d, 0x2c, 0x69, 0x6e, 0x69, + 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x69, + 0x74, 0x53, 0x6f, 0x72, 0x74, 0x28, 0x29, 0x3b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x73, 0x65, 0x74, 0x54, 0x70, 0x6c, 0x73, 0x28, 0x29, + 0x3b, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x4e, + 0x61, 0x76, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, + 0x7a, 0x65, 0x28, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, + 0x6e, 0x69, 0x74, 0x44, 0x6f, 0x6d, 0x28, 0x29, 0x3b, 0x47, 0x6f, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x4f, 0x76, 0x65, 0x72, + 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x69, 0x6e, + 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x29, 0x3b, + 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x50, 0x61, + 0x6e, 0x65, 0x6c, 0x73, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x29, 0x3b, 0x47, 0x6f, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x43, 0x68, 0x61, 0x72, 0x74, 0x73, + 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, + 0x28, 0x29, 0x3b, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2e, 0x69, 0x6e, 0x69, + 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x29, 0x3b, 0x7d, + 0x2c, 0x7d, 0x3b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x27, 0x76, 0x69, 0x73, + 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0x69, 0x66, 0x20, 0x28, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x69, + 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x68, 0x69, 0x64, + 0x64, 0x65, 0x6e, 0x27, 0x29, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x2e, 0x68, 0x61, 0x73, 0x46, + 0x6f, 0x63, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, + 0x65, 0x3b, 0x69, 0x66, 0x20, 0x28, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x3d, + 0x3d, 0x20, 0x27, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x27, + 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x68, 0x61, 0x73, 0x46, + 0x6f, 0x63, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x47, 0x6f, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x2e, 0x68, 0x61, + 0x73, 0x46, 0x6f, 0x63, 0x75, 0x73, 0x3b, 0x47, 0x6f, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x2e, 0x68, 0x61, + 0x73, 0x46, 0x6f, 0x63, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x3b, 0x68, 0x61, 0x73, 0x46, 0x6f, 0x63, 0x75, 0x73, + 0x20, 0x7c, 0x7c, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x41, 0x70, 0x70, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x44, 0x61, 0x74, 0x61, 0x28, 0x29, 0x3b, 0x7d, 0x7d, 0x29, + 0x3b, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x6f, 0x6e, 0x6c, + 0x6f, 0x61, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0x47, 0x6f, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x69, + 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x7b, 0x27, 0x69, 0x31, 0x38, + 0x6e, 0x27, 0x3a, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, + 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x69, 0x31, 0x38, 0x6e, 0x2c, 0x27, + 0x75, 0x69, 0x44, 0x61, 0x74, 0x61, 0x27, 0x3a, 0x20, 0x77, 0x69, + 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2c, 0x27, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x27, 0x3a, 0x20, + 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, + 0x5f, 0x64, 0x61, 0x74, 0x61, 0x2c, 0x27, 0x77, 0x73, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x3a, 0x20, + 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x7c, 0x7c, 0x20, 0x6e, + 0x75, 0x6c, 0x6c, 0x2c, 0x27, 0x70, 0x72, 0x65, 0x66, 0x73, 0x27, + 0x3a, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x68, 0x74, + 0x6d, 0x6c, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x73, 0x20, 0x7c, 0x7c, + 0x20, 0x7b, 0x7d, 0x2c, 0x7d, 0x29, 0x3b, 0x47, 0x6f, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x2e, 0x69, 0x6e, + 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x29, 0x3b, + 0x7d, 0x3b, 0x7d, 0x28, 0x29, 0x29, 0x3b, 0x00 +}; + +const int app_js_length = 39696; diff --git a/goaccess++/src/base64.c b/goaccess++/src/base64.c new file mode 100644 index 0000000..698235e --- /dev/null +++ b/goaccess++/src/base64.c @@ -0,0 +1,80 @@ +/** + * base64.c -- A basic base64 encode implementation + * _______ _______ __ __ + * / ____/ | / / ___/____ _____/ /_____ / /_ + * / / __ | | /| / /\__ \/ __ \/ ___/ //_/ _ \/ __/ + * / /_/ / | |/ |/ /___/ / /_/ / /__/ ,< / __/ /_ + * \____/ |__/|__//____/\____/\___/_/|_|\___/\__/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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 <stdlib.h> +#include <string.h> + +#include "base64.h" + +/* Encodes the given data with base64.. + * + * On success, the encoded nul-terminated data, as a string is returned. */ +char * +base64_encode (const void *buf, size_t size) +{ + static const char base64[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + + char *str = (char *) malloc ((size + 3) * 4 / 3 + 1); + + char *p = str; + const unsigned char *q = (const unsigned char *) buf; + size_t i = 0; + + while (i < size) { + int c = q[i++]; + c *= 256; + if (i < size) + c += q[i]; + i++; + + c *= 256; + if (i < size) + c += q[i]; + i++; + + *p++ = base64[(c & 0x00fc0000) >> 18]; + *p++ = base64[(c & 0x0003f000) >> 12]; + + if (i > size + 1) + *p++ = '='; + else + *p++ = base64[(c & 0x00000fc0) >> 6]; + + if (i > size) + *p++ = '='; + else + *p++ = base64[c & 0x0000003f]; + } + + *p = 0; + + return str; +} diff --git a/goaccess++/src/base64.h b/goaccess++/src/base64.h new file mode 100644 index 0000000..7f36936 --- /dev/null +++ b/goaccess++/src/base64.h @@ -0,0 +1,37 @@ +/** + * _______ _______ __ __ + * / ____/ | / / ___/____ _____/ /_____ / /_ + * / / __ | | /| / /\__ \/ __ \/ ___/ //_/ _ \/ __/ + * / /_/ / | |/ |/ /___/ / /_/ / /__/ ,< / __/ /_ + * \____/ |__/|__//____/\____/\___/_/|_|\___/\__/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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 BASE64_H_INCLUDED +#define BASE64_H_INCLUDED + +#include <stddef.h> + +char *base64_encode (const void *buf, size_t size); + +#endif // for #ifndef BASE64_H diff --git a/goaccess++/src/base64.o b/goaccess++/src/base64.o new file mode 100644 index 0000000000000000000000000000000000000000..0088ffaa101c57619971b5d1279eae10bc379e68 GIT binary patch literal 2040 zcmbtVOHUI~6u#3zsYo9hVn{UFg)tgsY_S40Q9B^?iscPHW149hK&35Cr}9{6Oi}5g ziN8Z*Vqzq2d=QPqxWNq@cPx|`H$tL`5$ieAd&@A+N>6fgzw@2*-Pbvt-fE4uIRt@l z6UYg&?s1loiHda`Hei^ziHodycK@V>ny1yk4bc1=efjV~$!LC|kLFkDkIyvs)k!~m zp@k`78Kv~jN6+*V0MWu3f#&C<g-u8Y-g)*A&uqVo(86_LZpleQt2Zh=v${(VR)BJt zDTlC<U!=J?aqjnan)ohzW`q9lOk;j=?ss+W(@Ex!3onl2KB0HxE(~opg&Z_DUtxr4 z=)LC5Eg2$jcxJo^gy)`CEEeBZ5}JGCyma}sXU{aAk-%}+N$}<7mQ$^55qi4)Otho3 ztGlPSuYcg|x$_q;D)GdiIy5|T<?6N3WGX#&UCZd%8{-p`Q~p5xk>JsW#-`B0!-Pay zT8{bl55%)6J?jfeLCIei$QoYYX1!nX2c`N0B_8+3GI(L&i$yvIh=Y(<$cZq}YDyCk zrh17m;T3jPS32)QL4&~WVzD)xJKWy8jvjYyPHcDk9M7xVwX)kQyPc=EwsXkRZ71xJ z3i7RJ7Zhzf2+zn*xltt=x7x^6fh!odEb+1_ESh)|4Xan0-7*%5vy9C^BwNgG8H;3d z8FR1$z;@HUj5h>sFAS`Q)s6vS$CJ2{Q5%9%f`j^|h9JW+HI+yYsw5VPb~Ve<SXWzH zUu%D?Uv7@J#z;~b9Ze_rK7IzU_AVH|pj*)*jEBB3Zozq<iN{#kq|9VeSK>s<=vrwW z;Yd?Q6-ieobRrEZx<aIQCPO4GU2+oXWKvB*ES1((33{<EqbrGP%pXo=r7<l%rfT{m zXmBNUBsQceNwvK7{{SC|u?MY{3Im76>r?XnuEkCW;M;|H0-K+)7Ul1|6?oi-cTg?M z+sAloM<2&z8?(}fAP3j{SA77qxaNjhf*)oZ$$-t~GdqAoFff(hlZS6JJ)X~Oj5ajL zH^bnZIq#7jX_MOv9R6CZ=YP!fK8Tr(zdz@$0>D(Oeu3$`c_N#wdh9~G`Y*GB@H%7t z@hidgoVVK>xAL(Ab+dEe|01qo)#IAh+5<(#7%8J;GPYcq*#^i?&p)MlIkN<;`adN) B?QQ@7 literal 0 HcmV?d00001 diff --git a/goaccess++/src/bin2c.c b/goaccess++/src/bin2c.c new file mode 100644 index 0000000..bc635f8 --- /dev/null +++ b/goaccess++/src/bin2c.c @@ -0,0 +1,117 @@ +/* + * This is bin2c program, which allows you to convert binary file to + * C language array, for use as embedded resource, for instance you can + * embed graphics or audio file directly into your program. + * This is public domain software, use it on your own risk. + * Contact Serge Fukanchik at fuxx@mail.ru if you have any questions. + * + * Some modifications were made by Gwilym Kuiper (kuiper.gwilym@gmail.com) + * I have decided not to change the licence. + */ + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <assert.h> + +#ifdef USE_BZ2 +#include <bzlib.h> +#endif + +int +main (int argc, char *argv[]) +{ + char *buf; + char *ident; + unsigned int i, file_size, need_comma; + FILE *f_input, *f_output; + +#ifdef USE_BZ2 + int status; + char *bz2_buf; + unsigned int uncompressed_size, bz2_size; +#endif + + if (argc < 4) { + fprintf (stderr, "Usage: %s binary_file output_file array_name\n", argv[0]); + return -1; + } + + f_input = fopen (argv[1], "rb"); + if (f_input == NULL) { + fprintf (stderr, "%s: can't open %s for reading\n", argv[0], argv[1]); + return -1; + } + // Get the file length + fseek (f_input, 0, SEEK_END); + file_size = ftell (f_input); + fseek (f_input, 0, SEEK_SET); + file_size++; + + if ((buf = malloc (file_size)) == NULL) { + fprintf (stderr, "Unable to malloc bin2c.c buffer\n"); + fclose (f_input); + return -1; + } + + fread (buf, file_size, 1, f_input); + fclose (f_input); + +#ifdef USE_BZ2 + // allocate for bz2. + bz2_size = ((file_size) * 1.01) + 600; // as per the documentation + + if ((bz2_buf = malloc (bz2_size)) == NULL) { + fprintf (stderr, "Unable to malloc bin2c.c buffer\n"); + free (buf); + return -1; + } + // compress the data + status = + BZ2_bzBuffToBuffCompress (bz2_buf, &bz2_size, buf, file_size, 9, 1, 0); + if (status != BZ_OK) { + fprintf (stderr, "Failed to compress data: error %i\n", status); + free (buf); + free (bz2_buf); + return -1; + } + // and be very lazy + free (buf); + uncompressed_size = file_size; + file_size = bz2_size; + buf = bz2_buf; +#endif + + f_output = fopen (argv[2], "w"); + if (f_output == NULL) { + fprintf (stderr, "%s: can't open %s for writing\n", argv[0], argv[1]); + free (buf); + return -1; + } + + ident = argv[3]; + need_comma = 0; + + fprintf (f_output, "const char %s[%u] = {", ident, file_size); + for (i = 0; i < file_size; ++i) { + if (need_comma) + fprintf (f_output, ", "); + else + need_comma = 1; + if ((i % 11) == 0) + fprintf (f_output, "\n\t"); + fprintf (f_output, "0x%.2x", buf[i] & 0xff); + } + fprintf (f_output, "\n};\n\n"); + fprintf (f_output, "const int %s_length = %u;\n", ident, file_size); + +#ifdef USE_BZ2 + fprintf (f_output, "const int %s_length_uncompressed = %u;\n", ident, + uncompressed_size); +#endif + + fclose (f_output); + free (buf); + + return 0; +} diff --git a/goaccess++/src/bin2c.o b/goaccess++/src/bin2c.o new file mode 100644 index 0000000000000000000000000000000000000000..506493a3a9f4701c4c01840686fe87035854f1a1 GIT binary patch literal 4224 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 DOUT|* literal 0 HcmV?d00001 diff --git a/goaccess++/src/bootstrapcss.h b/goaccess++/src/bootstrapcss.h new file mode 100644 index 0000000..53092fa --- /dev/null +++ b/goaccess++/src/bootstrapcss.h @@ -0,0 +1,4696 @@ +const char bootstrap_css[51609] = { + 0x2f, 0x2a, 0x21, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, + 0x67, 0x65, 0x74, 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, + 0x70, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x69, 0x7a, 0x65, 0x2f, 0x3f, 0x69, 0x64, 0x3d, 0x66, 0x38, + 0x61, 0x62, 0x63, 0x30, 0x38, 0x63, 0x38, 0x38, 0x38, 0x61, 0x66, + 0x38, 0x39, 0x62, 0x32, 0x65, 0x64, 0x38, 0x63, 0x64, 0x36, 0x34, + 0x66, 0x34, 0x38, 0x61, 0x31, 0x66, 0x65, 0x33, 0x20, 0x2a, 0x2f, + 0x68, 0x74, 0x6d, 0x6c, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x66, + 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x3a, 0x73, 0x61, 0x6e, 0x73, 0x2d, + 0x73, 0x65, 0x72, 0x69, 0x66, 0x3b, 0x2d, 0x6d, 0x73, 0x2d, 0x74, + 0x65, 0x78, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x2d, 0x61, 0x64, + 0x6a, 0x75, 0x73, 0x74, 0x3a, 0x31, 0x30, 0x30, 0x25, 0x3b, 0x2d, + 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x74, 0x65, 0x78, 0x74, + 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x2d, 0x61, 0x64, 0x6a, 0x75, 0x73, + 0x74, 0x3a, 0x31, 0x30, 0x30, 0x25, 0x7d, 0x62, 0x6f, 0x64, 0x79, + 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x30, 0x7d, 0x61, + 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x2c, 0x61, 0x73, 0x69, 0x64, + 0x65, 0x2c, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2c, 0x66, + 0x69, 0x67, 0x63, 0x61, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x65, 0x2c, 0x66, 0x6f, 0x6f, 0x74, 0x65, + 0x72, 0x2c, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2c, 0x68, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x2c, 0x6d, 0x61, 0x69, 0x6e, 0x2c, 0x6d, + 0x65, 0x6e, 0x75, 0x2c, 0x6e, 0x61, 0x76, 0x2c, 0x73, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, + 0x79, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x7d, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x2c, + 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2c, 0x70, 0x72, 0x6f, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x2c, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x7b, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x69, 0x6e, 0x6c, + 0x69, 0x6e, 0x65, 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3b, 0x76, + 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x2d, 0x61, 0x6c, 0x69, + 0x67, 0x6e, 0x3a, 0x62, 0x61, 0x73, 0x65, 0x6c, 0x69, 0x6e, 0x65, + 0x7d, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x3a, 0x6e, 0x6f, 0x74, 0x28, + 0x5b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x73, 0x5d, 0x29, + 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x6e, 0x6f, + 0x6e, 0x65, 0x3b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x30, + 0x7d, 0x5b, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x5d, 0x2c, 0x74, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x7b, 0x64, 0x69, 0x73, + 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x7d, 0x61, + 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, + 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x7d, 0x61, 0x3a, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x2c, 0x61, 0x3a, 0x68, 0x6f, 0x76, + 0x65, 0x72, 0x7b, 0x6f, 0x75, 0x74, 0x6c, 0x69, 0x6e, 0x65, 0x3a, + 0x30, 0x7d, 0x61, 0x62, 0x62, 0x72, 0x5b, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x5d, 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x62, + 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x31, 0x70, 0x78, 0x20, 0x64, + 0x6f, 0x74, 0x74, 0x65, 0x64, 0x7d, 0x62, 0x2c, 0x73, 0x74, 0x72, + 0x6f, 0x6e, 0x67, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x3a, 0x62, 0x6f, 0x6c, 0x64, 0x7d, 0x64, + 0x66, 0x6e, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x74, 0x79, + 0x6c, 0x65, 0x3a, 0x69, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x7d, 0x68, + 0x31, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, + 0x3a, 0x32, 0x65, 0x6d, 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, + 0x3a, 0x30, 0x2e, 0x36, 0x37, 0x65, 0x6d, 0x20, 0x30, 0x7d, 0x6d, + 0x61, 0x72, 0x6b, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, + 0x75, 0x6e, 0x64, 0x3a, 0x23, 0x66, 0x66, 0x30, 0x3b, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30, 0x30, 0x7d, 0x73, 0x6d, + 0x61, 0x6c, 0x6c, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, + 0x7a, 0x65, 0x3a, 0x38, 0x30, 0x25, 0x7d, 0x73, 0x75, 0x62, 0x2c, + 0x73, 0x75, 0x70, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, + 0x7a, 0x65, 0x3a, 0x37, 0x35, 0x25, 0x3b, 0x6c, 0x69, 0x6e, 0x65, + 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x30, 0x3b, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x72, 0x65, 0x6c, + 0x61, 0x74, 0x69, 0x76, 0x65, 0x3b, 0x76, 0x65, 0x72, 0x74, 0x69, + 0x63, 0x61, 0x6c, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x62, + 0x61, 0x73, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x7d, 0x73, 0x75, 0x70, + 0x7b, 0x74, 0x6f, 0x70, 0x3a, 0x2d, 0x30, 0x2e, 0x35, 0x65, 0x6d, + 0x7d, 0x73, 0x75, 0x62, 0x7b, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, + 0x3a, 0x2d, 0x30, 0x2e, 0x32, 0x35, 0x65, 0x6d, 0x7d, 0x69, 0x6d, + 0x67, 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x30, 0x7d, + 0x73, 0x76, 0x67, 0x3a, 0x6e, 0x6f, 0x74, 0x28, 0x3a, 0x72, 0x6f, + 0x6f, 0x74, 0x29, 0x7b, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, + 0x77, 0x3a, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x7d, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x65, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, + 0x3a, 0x31, 0x65, 0x6d, 0x20, 0x34, 0x30, 0x70, 0x78, 0x7d, 0x68, + 0x72, 0x7b, 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x62, + 0x6f, 0x78, 0x2d, 0x73, 0x69, 0x7a, 0x69, 0x6e, 0x67, 0x3a, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x62, 0x6f, 0x78, 0x3b, + 0x2d, 0x6d, 0x6f, 0x7a, 0x2d, 0x62, 0x6f, 0x78, 0x2d, 0x73, 0x69, + 0x7a, 0x69, 0x6e, 0x67, 0x3a, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x2d, 0x62, 0x6f, 0x78, 0x3b, 0x62, 0x6f, 0x78, 0x2d, 0x73, + 0x69, 0x7a, 0x69, 0x6e, 0x67, 0x3a, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x2d, 0x62, 0x6f, 0x78, 0x3b, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x3a, 0x30, 0x7d, 0x70, 0x72, 0x65, 0x7b, 0x6f, 0x76, + 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x3a, 0x61, 0x75, 0x74, 0x6f, + 0x7d, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x6b, 0x62, 0x64, 0x2c, 0x70, + 0x72, 0x65, 0x2c, 0x73, 0x61, 0x6d, 0x70, 0x7b, 0x66, 0x6f, 0x6e, + 0x74, 0x2d, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x3a, 0x6d, 0x6f, + 0x6e, 0x6f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2c, 0x20, 0x6d, 0x6f, + 0x6e, 0x6f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3b, 0x66, 0x6f, 0x6e, + 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x31, 0x65, 0x6d, 0x7d, + 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x2c, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x2c, 0x6f, 0x70, 0x74, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2c, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x2c, 0x74, 0x65, 0x78, 0x74, + 0x61, 0x72, 0x65, 0x61, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, + 0x69, 0x6e, 0x68, 0x65, 0x72, 0x69, 0x74, 0x3b, 0x66, 0x6f, 0x6e, + 0x74, 0x3a, 0x69, 0x6e, 0x68, 0x65, 0x72, 0x69, 0x74, 0x3b, 0x6d, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x30, 0x7d, 0x62, 0x75, 0x74, + 0x74, 0x6f, 0x6e, 0x7b, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, + 0x77, 0x3a, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x7d, 0x62, + 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x2c, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x7b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x7d, + 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x2c, 0x68, 0x74, 0x6d, 0x6c, + 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, + 0x3d, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x5d, 0x2c, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, + 0x22, 0x72, 0x65, 0x73, 0x65, 0x74, 0x22, 0x5d, 0x2c, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x73, + 0x75, 0x62, 0x6d, 0x69, 0x74, 0x22, 0x5d, 0x7b, 0x2d, 0x77, 0x65, + 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, + 0x61, 0x6e, 0x63, 0x65, 0x3a, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, + 0x3b, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x3a, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x7d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, + 0x5b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x2c, + 0x68, 0x74, 0x6d, 0x6c, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x7b, 0x63, + 0x75, 0x72, 0x73, 0x6f, 0x72, 0x3a, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x7d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x3a, 0x3a, + 0x2d, 0x6d, 0x6f, 0x7a, 0x2d, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2d, + 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x2c, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x3a, 0x3a, 0x2d, 0x6d, 0x6f, 0x7a, 0x2d, 0x66, 0x6f, 0x63, 0x75, + 0x73, 0x2d, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x7b, 0x62, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x3a, 0x30, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, + 0x6e, 0x67, 0x3a, 0x30, 0x7d, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x7b, + 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x3a, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x7d, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x62, 0x6f, 0x78, 0x22, 0x5d, 0x2c, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x72, + 0x61, 0x64, 0x69, 0x6f, 0x22, 0x5d, 0x7b, 0x2d, 0x77, 0x65, 0x62, + 0x6b, 0x69, 0x74, 0x2d, 0x62, 0x6f, 0x78, 0x2d, 0x73, 0x69, 0x7a, + 0x69, 0x6e, 0x67, 0x3a, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, + 0x62, 0x6f, 0x78, 0x3b, 0x2d, 0x6d, 0x6f, 0x7a, 0x2d, 0x62, 0x6f, + 0x78, 0x2d, 0x73, 0x69, 0x7a, 0x69, 0x6e, 0x67, 0x3a, 0x62, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x2d, 0x62, 0x6f, 0x78, 0x3b, 0x62, 0x6f, + 0x78, 0x2d, 0x73, 0x69, 0x7a, 0x69, 0x6e, 0x67, 0x3a, 0x62, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x2d, 0x62, 0x6f, 0x78, 0x3b, 0x70, 0x61, + 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x30, 0x7d, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x22, 0x5d, 0x3a, 0x3a, 0x2d, 0x77, 0x65, + 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x2d, + 0x73, 0x70, 0x69, 0x6e, 0x2d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, + 0x2c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, + 0x3d, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x5d, 0x3a, + 0x3a, 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x6f, 0x75, + 0x74, 0x65, 0x72, 0x2d, 0x73, 0x70, 0x69, 0x6e, 0x2d, 0x62, 0x75, + 0x74, 0x74, 0x6f, 0x6e, 0x7b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x3a, 0x61, 0x75, 0x74, 0x6f, 0x7d, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x73, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x22, 0x5d, 0x7b, 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, + 0x74, 0x2d, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, + 0x65, 0x3a, 0x74, 0x65, 0x78, 0x74, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x3b, 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x62, 0x6f, + 0x78, 0x2d, 0x73, 0x69, 0x7a, 0x69, 0x6e, 0x67, 0x3a, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x62, 0x6f, 0x78, 0x3b, 0x2d, + 0x6d, 0x6f, 0x7a, 0x2d, 0x62, 0x6f, 0x78, 0x2d, 0x73, 0x69, 0x7a, + 0x69, 0x6e, 0x67, 0x3a, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x2d, 0x62, 0x6f, 0x78, 0x3b, 0x62, 0x6f, 0x78, 0x2d, 0x73, 0x69, + 0x7a, 0x69, 0x6e, 0x67, 0x3a, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x2d, 0x62, 0x6f, 0x78, 0x7d, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x73, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x22, 0x5d, 0x3a, 0x3a, 0x2d, 0x77, 0x65, 0x62, 0x6b, + 0x69, 0x74, 0x2d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2d, 0x63, + 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x2d, 0x62, 0x75, 0x74, 0x74, 0x6f, + 0x6e, 0x2c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, + 0x65, 0x3d, 0x22, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x22, 0x5d, + 0x3a, 0x3a, 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x2d, 0x64, 0x65, 0x63, 0x6f, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7b, 0x2d, 0x77, 0x65, 0x62, 0x6b, + 0x69, 0x74, 0x2d, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, + 0x63, 0x65, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x7d, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x73, 0x65, 0x74, 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x3a, 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, + 0x20, 0x23, 0x63, 0x30, 0x63, 0x30, 0x63, 0x30, 0x3b, 0x6d, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x30, 0x20, 0x32, 0x70, 0x78, 0x3b, + 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x30, 0x2e, 0x33, + 0x35, 0x65, 0x6d, 0x20, 0x30, 0x2e, 0x36, 0x32, 0x35, 0x65, 0x6d, + 0x20, 0x30, 0x2e, 0x37, 0x35, 0x65, 0x6d, 0x7d, 0x6c, 0x65, 0x67, + 0x65, 0x6e, 0x64, 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, + 0x30, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x30, + 0x7d, 0x74, 0x65, 0x78, 0x74, 0x61, 0x72, 0x65, 0x61, 0x7b, 0x6f, + 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x3a, 0x61, 0x75, 0x74, + 0x6f, 0x7d, 0x6f, 0x70, 0x74, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x7b, + 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x3a, 0x62, 0x6f, 0x6c, 0x64, 0x7d, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, + 0x6c, 0x61, 0x70, 0x73, 0x65, 0x3a, 0x63, 0x6f, 0x6c, 0x6c, 0x61, + 0x70, 0x73, 0x65, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, + 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x3a, 0x30, 0x7d, 0x74, + 0x64, 0x2c, 0x74, 0x68, 0x7b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, + 0x67, 0x3a, 0x30, 0x7d, 0x2f, 0x2a, 0x21, 0x20, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x3a, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, + 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x68, 0x35, 0x62, 0x70, 0x2f, 0x68, 0x74, 0x6d, 0x6c, + 0x35, 0x2d, 0x62, 0x6f, 0x69, 0x6c, 0x65, 0x72, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x2f, 0x62, 0x6c, 0x6f, 0x62, 0x2f, 0x6d, 0x61, 0x73, + 0x74, 0x65, 0x72, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x63, 0x73, 0x73, + 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x63, 0x73, 0x73, 0x20, 0x2a, + 0x2f, 0x40, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x20, 0x70, 0x72, 0x69, + 0x6e, 0x74, 0x7b, 0x2a, 0x2c, 0x2a, 0x3a, 0x62, 0x65, 0x66, 0x6f, + 0x72, 0x65, 0x2c, 0x2a, 0x3a, 0x61, 0x66, 0x74, 0x65, 0x72, 0x7b, + 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, + 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30, 0x30, + 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, + 0x3b, 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x62, 0x6f, + 0x78, 0x2d, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x3a, 0x6e, 0x6f, + 0x6e, 0x65, 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, + 0x6e, 0x74, 0x3b, 0x62, 0x6f, 0x78, 0x2d, 0x73, 0x68, 0x61, 0x64, + 0x6f, 0x77, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x20, 0x21, 0x69, 0x6d, + 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x3b, 0x74, 0x65, 0x78, + 0x74, 0x2d, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x3a, 0x6e, 0x6f, + 0x6e, 0x65, 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, + 0x6e, 0x74, 0x7d, 0x61, 0x2c, 0x61, 0x3a, 0x76, 0x69, 0x73, 0x69, + 0x74, 0x65, 0x64, 0x7b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x64, 0x65, + 0x63, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x75, 0x6e, + 0x64, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x65, 0x7d, 0x61, 0x5b, 0x68, + 0x72, 0x65, 0x66, 0x5d, 0x3a, 0x61, 0x66, 0x74, 0x65, 0x72, 0x7b, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, 0x20, 0x28, + 0x22, 0x20, 0x61, 0x74, 0x74, 0x72, 0x28, 0x68, 0x72, 0x65, 0x66, + 0x29, 0x20, 0x22, 0x29, 0x22, 0x7d, 0x61, 0x62, 0x62, 0x72, 0x5b, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x5d, 0x3a, 0x61, 0x66, 0x74, 0x65, + 0x72, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, + 0x20, 0x28, 0x22, 0x20, 0x61, 0x74, 0x74, 0x72, 0x28, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x29, 0x20, 0x22, 0x29, 0x22, 0x7d, 0x61, 0x5b, + 0x68, 0x72, 0x65, 0x66, 0x5e, 0x3d, 0x22, 0x23, 0x22, 0x5d, 0x3a, + 0x61, 0x66, 0x74, 0x65, 0x72, 0x2c, 0x61, 0x5b, 0x68, 0x72, 0x65, + 0x66, 0x5e, 0x3d, 0x22, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x3a, 0x22, 0x5d, 0x3a, 0x61, 0x66, 0x74, 0x65, + 0x72, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, + 0x22, 0x7d, 0x70, 0x72, 0x65, 0x2c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x71, 0x75, 0x6f, 0x74, 0x65, 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x3a, 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, + 0x20, 0x23, 0x39, 0x39, 0x39, 0x3b, 0x70, 0x61, 0x67, 0x65, 0x2d, + 0x62, 0x72, 0x65, 0x61, 0x6b, 0x2d, 0x69, 0x6e, 0x73, 0x69, 0x64, + 0x65, 0x3a, 0x61, 0x76, 0x6f, 0x69, 0x64, 0x7d, 0x74, 0x68, 0x65, + 0x61, 0x64, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x68, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x2d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x7d, 0x74, 0x72, 0x2c, + 0x69, 0x6d, 0x67, 0x7b, 0x70, 0x61, 0x67, 0x65, 0x2d, 0x62, 0x72, + 0x65, 0x61, 0x6b, 0x2d, 0x69, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x3a, + 0x61, 0x76, 0x6f, 0x69, 0x64, 0x7d, 0x69, 0x6d, 0x67, 0x7b, 0x6d, + 0x61, 0x78, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, 0x30, + 0x30, 0x25, 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, + 0x6e, 0x74, 0x7d, 0x70, 0x2c, 0x68, 0x32, 0x2c, 0x68, 0x33, 0x7b, + 0x6f, 0x72, 0x70, 0x68, 0x61, 0x6e, 0x73, 0x3a, 0x33, 0x3b, 0x77, + 0x69, 0x64, 0x6f, 0x77, 0x73, 0x3a, 0x33, 0x7d, 0x68, 0x32, 0x2c, + 0x68, 0x33, 0x7b, 0x70, 0x61, 0x67, 0x65, 0x2d, 0x62, 0x72, 0x65, + 0x61, 0x6b, 0x2d, 0x61, 0x66, 0x74, 0x65, 0x72, 0x3a, 0x61, 0x76, + 0x6f, 0x69, 0x64, 0x7d, 0x2e, 0x6e, 0x61, 0x76, 0x62, 0x61, 0x72, + 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x6e, 0x6f, + 0x6e, 0x65, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x3e, 0x2e, 0x63, 0x61, + 0x72, 0x65, 0x74, 0x2c, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x75, 0x70, + 0x3e, 0x2e, 0x62, 0x74, 0x6e, 0x3e, 0x2e, 0x63, 0x61, 0x72, 0x65, + 0x74, 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x74, 0x6f, + 0x70, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30, + 0x30, 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, + 0x74, 0x7d, 0x2e, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x7b, 0x62, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x3a, 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, + 0x6c, 0x69, 0x64, 0x20, 0x23, 0x30, 0x30, 0x30, 0x7d, 0x2e, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x2d, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x70, 0x73, 0x65, 0x3a, 0x63, + 0x6f, 0x6c, 0x6c, 0x61, 0x70, 0x73, 0x65, 0x20, 0x21, 0x69, 0x6d, + 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x7d, 0x2e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x74, 0x64, 0x2c, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x74, 0x68, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x23, 0x66, 0x66, 0x66, 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, + 0x72, 0x74, 0x61, 0x6e, 0x74, 0x7d, 0x2e, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2d, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20, + 0x74, 0x68, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x62, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20, 0x74, 0x64, 0x7b, + 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x31, 0x70, 0x78, 0x20, + 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x23, 0x64, 0x64, 0x64, 0x20, + 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x7d, + 0x7d, 0x2a, 0x7b, 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, + 0x62, 0x6f, 0x78, 0x2d, 0x73, 0x69, 0x7a, 0x69, 0x6e, 0x67, 0x3a, + 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x62, 0x6f, 0x78, 0x3b, + 0x2d, 0x6d, 0x6f, 0x7a, 0x2d, 0x62, 0x6f, 0x78, 0x2d, 0x73, 0x69, + 0x7a, 0x69, 0x6e, 0x67, 0x3a, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x2d, 0x62, 0x6f, 0x78, 0x3b, 0x62, 0x6f, 0x78, 0x2d, 0x73, 0x69, + 0x7a, 0x69, 0x6e, 0x67, 0x3a, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x2d, 0x62, 0x6f, 0x78, 0x7d, 0x2a, 0x3a, 0x62, 0x65, 0x66, 0x6f, + 0x72, 0x65, 0x2c, 0x2a, 0x3a, 0x61, 0x66, 0x74, 0x65, 0x72, 0x7b, + 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x62, 0x6f, 0x78, + 0x2d, 0x73, 0x69, 0x7a, 0x69, 0x6e, 0x67, 0x3a, 0x62, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x2d, 0x62, 0x6f, 0x78, 0x3b, 0x2d, 0x6d, 0x6f, + 0x7a, 0x2d, 0x62, 0x6f, 0x78, 0x2d, 0x73, 0x69, 0x7a, 0x69, 0x6e, + 0x67, 0x3a, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x62, 0x6f, + 0x78, 0x3b, 0x62, 0x6f, 0x78, 0x2d, 0x73, 0x69, 0x7a, 0x69, 0x6e, + 0x67, 0x3a, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x62, 0x6f, + 0x78, 0x7d, 0x68, 0x74, 0x6d, 0x6c, 0x7b, 0x66, 0x6f, 0x6e, 0x74, + 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x31, 0x30, 0x70, 0x78, 0x3b, + 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x74, 0x61, 0x70, + 0x2d, 0x68, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x2d, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x72, 0x67, 0x62, 0x61, 0x28, + 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x29, 0x7d, 0x62, 0x6f, + 0x64, 0x79, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x66, 0x61, 0x6d, + 0x69, 0x6c, 0x79, 0x3a, 0x22, 0x48, 0x65, 0x6c, 0x76, 0x65, 0x74, + 0x69, 0x63, 0x61, 0x20, 0x4e, 0x65, 0x75, 0x65, 0x22, 0x2c, 0x48, + 0x65, 0x6c, 0x76, 0x65, 0x74, 0x69, 0x63, 0x61, 0x2c, 0x41, 0x72, + 0x69, 0x61, 0x6c, 0x2c, 0x73, 0x61, 0x6e, 0x73, 0x2d, 0x73, 0x65, + 0x72, 0x69, 0x66, 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, + 0x7a, 0x65, 0x3a, 0x31, 0x34, 0x70, 0x78, 0x3b, 0x6c, 0x69, 0x6e, + 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x31, 0x2e, + 0x34, 0x32, 0x38, 0x35, 0x37, 0x31, 0x34, 0x33, 0x3b, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x33, 0x33, 0x33, 0x3b, 0x62, 0x61, + 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x7d, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x2c, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x2c, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x2c, 0x74, 0x65, 0x78, 0x74, + 0x61, 0x72, 0x65, 0x61, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x66, + 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x3a, 0x69, 0x6e, 0x68, 0x65, 0x72, + 0x69, 0x74, 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, + 0x65, 0x3a, 0x69, 0x6e, 0x68, 0x65, 0x72, 0x69, 0x74, 0x3b, 0x6c, + 0x69, 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, + 0x69, 0x6e, 0x68, 0x65, 0x72, 0x69, 0x74, 0x7d, 0x61, 0x7b, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x33, 0x33, 0x37, 0x61, 0x62, + 0x37, 0x3b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x64, 0x65, 0x63, 0x6f, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, + 0x7d, 0x61, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x61, 0x3a, + 0x66, 0x6f, 0x63, 0x75, 0x73, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x23, 0x32, 0x33, 0x35, 0x32, 0x37, 0x63, 0x3b, 0x74, 0x65, + 0x78, 0x74, 0x2d, 0x64, 0x65, 0x63, 0x6f, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x3a, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x69, 0x6e, + 0x65, 0x7d, 0x61, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x7b, 0x6f, + 0x75, 0x74, 0x6c, 0x69, 0x6e, 0x65, 0x3a, 0x35, 0x70, 0x78, 0x20, + 0x61, 0x75, 0x74, 0x6f, 0x20, 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, + 0x74, 0x2d, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2d, 0x72, 0x69, 0x6e, + 0x67, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x6f, 0x75, 0x74, + 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x3a, 0x2d, 0x32, 0x70, 0x78, 0x7d, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x65, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x30, 0x7d, + 0x69, 0x6d, 0x67, 0x7b, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, + 0x6c, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x6d, 0x69, 0x64, + 0x64, 0x6c, 0x65, 0x7d, 0x2e, 0x69, 0x6d, 0x67, 0x2d, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x7b, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x3b, 0x6d, 0x61, 0x78, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, + 0x31, 0x30, 0x30, 0x25, 0x3b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x3a, 0x61, 0x75, 0x74, 0x6f, 0x7d, 0x2e, 0x69, 0x6d, 0x67, 0x2d, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x64, 0x7b, 0x62, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, + 0x36, 0x70, 0x78, 0x7d, 0x2e, 0x69, 0x6d, 0x67, 0x2d, 0x74, 0x68, + 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x7b, 0x70, 0x61, 0x64, + 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x34, 0x70, 0x78, 0x3b, 0x6c, 0x69, + 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x31, + 0x2e, 0x34, 0x32, 0x38, 0x35, 0x37, 0x31, 0x34, 0x33, 0x3b, 0x62, + 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x62, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x31, 0x70, 0x78, 0x20, 0x73, + 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x23, 0x64, 0x64, 0x64, 0x3b, 0x62, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, + 0x73, 0x3a, 0x34, 0x70, 0x78, 0x3b, 0x2d, 0x77, 0x65, 0x62, 0x6b, + 0x69, 0x74, 0x2d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x3a, 0x61, 0x6c, 0x6c, 0x20, 0x2e, 0x32, 0x73, 0x20, + 0x65, 0x61, 0x73, 0x65, 0x2d, 0x69, 0x6e, 0x2d, 0x6f, 0x75, 0x74, + 0x3b, 0x2d, 0x6f, 0x2d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x3a, 0x61, 0x6c, 0x6c, 0x20, 0x2e, 0x32, 0x73, + 0x20, 0x65, 0x61, 0x73, 0x65, 0x2d, 0x69, 0x6e, 0x2d, 0x6f, 0x75, + 0x74, 0x3b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x3a, 0x61, 0x6c, 0x6c, 0x20, 0x2e, 0x32, 0x73, 0x20, 0x65, + 0x61, 0x73, 0x65, 0x2d, 0x69, 0x6e, 0x2d, 0x6f, 0x75, 0x74, 0x3b, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x69, 0x6e, 0x6c, + 0x69, 0x6e, 0x65, 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3b, 0x6d, + 0x61, 0x78, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, 0x30, + 0x30, 0x25, 0x3b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x61, + 0x75, 0x74, 0x6f, 0x7d, 0x2e, 0x69, 0x6d, 0x67, 0x2d, 0x63, 0x69, + 0x72, 0x63, 0x6c, 0x65, 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, 0x35, 0x30, 0x25, + 0x7d, 0x68, 0x72, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, + 0x74, 0x6f, 0x70, 0x3a, 0x32, 0x30, 0x70, 0x78, 0x3b, 0x6d, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, + 0x3a, 0x32, 0x30, 0x70, 0x78, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x3a, 0x30, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, + 0x74, 0x6f, 0x70, 0x3a, 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, + 0x69, 0x64, 0x20, 0x23, 0x65, 0x65, 0x65, 0x7d, 0x2e, 0x73, 0x72, + 0x2d, 0x6f, 0x6e, 0x6c, 0x79, 0x7b, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x3a, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, + 0x65, 0x3b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, 0x70, 0x78, + 0x3b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x31, 0x70, 0x78, + 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x2d, 0x31, 0x70, + 0x78, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x30, + 0x3b, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x3a, 0x68, + 0x69, 0x64, 0x64, 0x65, 0x6e, 0x3b, 0x63, 0x6c, 0x69, 0x70, 0x3a, + 0x72, 0x65, 0x63, 0x74, 0x28, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, + 0x30, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x3a, 0x30, 0x7d, 0x2e, 0x73, 0x72, 0x2d, 0x6f, 0x6e, 0x6c, + 0x79, 0x2d, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x3a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2c, 0x2e, 0x73, 0x72, + 0x2d, 0x6f, 0x6e, 0x6c, 0x79, 0x2d, 0x66, 0x6f, 0x63, 0x75, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x7b, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x73, 0x74, + 0x61, 0x74, 0x69, 0x63, 0x3b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, + 0x61, 0x75, 0x74, 0x6f, 0x3b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x3a, 0x61, 0x75, 0x74, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, + 0x6e, 0x3a, 0x30, 0x3b, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, + 0x77, 0x3a, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x3b, 0x63, + 0x6c, 0x69, 0x70, 0x3a, 0x61, 0x75, 0x74, 0x6f, 0x7d, 0x5b, 0x72, + 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, + 0x22, 0x5d, 0x7b, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x3a, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x7d, 0x68, 0x31, 0x2c, 0x68, + 0x32, 0x2c, 0x68, 0x33, 0x2c, 0x68, 0x34, 0x2c, 0x68, 0x35, 0x2c, + 0x68, 0x36, 0x2c, 0x2e, 0x68, 0x31, 0x2c, 0x2e, 0x68, 0x32, 0x2c, + 0x2e, 0x68, 0x33, 0x2c, 0x2e, 0x68, 0x34, 0x2c, 0x2e, 0x68, 0x35, + 0x2c, 0x2e, 0x68, 0x36, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x66, + 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x3a, 0x69, 0x6e, 0x68, 0x65, 0x72, + 0x69, 0x74, 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x3a, 0x35, 0x30, 0x30, 0x3b, 0x6c, 0x69, 0x6e, + 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x31, 0x2e, + 0x31, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x69, 0x6e, 0x68, + 0x65, 0x72, 0x69, 0x74, 0x7d, 0x68, 0x31, 0x20, 0x73, 0x6d, 0x61, + 0x6c, 0x6c, 0x2c, 0x68, 0x32, 0x20, 0x73, 0x6d, 0x61, 0x6c, 0x6c, + 0x2c, 0x68, 0x33, 0x20, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x2c, 0x68, + 0x34, 0x20, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x2c, 0x68, 0x35, 0x20, + 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x2c, 0x68, 0x36, 0x20, 0x73, 0x6d, + 0x61, 0x6c, 0x6c, 0x2c, 0x2e, 0x68, 0x31, 0x20, 0x73, 0x6d, 0x61, + 0x6c, 0x6c, 0x2c, 0x2e, 0x68, 0x32, 0x20, 0x73, 0x6d, 0x61, 0x6c, + 0x6c, 0x2c, 0x2e, 0x68, 0x33, 0x20, 0x73, 0x6d, 0x61, 0x6c, 0x6c, + 0x2c, 0x2e, 0x68, 0x34, 0x20, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x2c, + 0x2e, 0x68, 0x35, 0x20, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x2c, 0x2e, + 0x68, 0x36, 0x20, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x2c, 0x68, 0x31, + 0x20, 0x2e, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x2c, 0x68, 0x32, 0x20, + 0x2e, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x2c, 0x68, 0x33, 0x20, 0x2e, + 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x2c, 0x68, 0x34, 0x20, 0x2e, 0x73, + 0x6d, 0x61, 0x6c, 0x6c, 0x2c, 0x68, 0x35, 0x20, 0x2e, 0x73, 0x6d, + 0x61, 0x6c, 0x6c, 0x2c, 0x68, 0x36, 0x20, 0x2e, 0x73, 0x6d, 0x61, + 0x6c, 0x6c, 0x2c, 0x2e, 0x68, 0x31, 0x20, 0x2e, 0x73, 0x6d, 0x61, + 0x6c, 0x6c, 0x2c, 0x2e, 0x68, 0x32, 0x20, 0x2e, 0x73, 0x6d, 0x61, + 0x6c, 0x6c, 0x2c, 0x2e, 0x68, 0x33, 0x20, 0x2e, 0x73, 0x6d, 0x61, + 0x6c, 0x6c, 0x2c, 0x2e, 0x68, 0x34, 0x20, 0x2e, 0x73, 0x6d, 0x61, + 0x6c, 0x6c, 0x2c, 0x2e, 0x68, 0x35, 0x20, 0x2e, 0x73, 0x6d, 0x61, + 0x6c, 0x6c, 0x2c, 0x2e, 0x68, 0x36, 0x20, 0x2e, 0x73, 0x6d, 0x61, + 0x6c, 0x6c, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x3a, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x3b, + 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x3a, 0x31, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x37, + 0x37, 0x37, 0x7d, 0x68, 0x31, 0x2c, 0x2e, 0x68, 0x31, 0x2c, 0x68, + 0x32, 0x2c, 0x2e, 0x68, 0x32, 0x2c, 0x68, 0x33, 0x2c, 0x2e, 0x68, + 0x33, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x74, 0x6f, + 0x70, 0x3a, 0x32, 0x30, 0x70, 0x78, 0x3b, 0x6d, 0x61, 0x72, 0x67, + 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x31, + 0x30, 0x70, 0x78, 0x7d, 0x68, 0x31, 0x20, 0x73, 0x6d, 0x61, 0x6c, + 0x6c, 0x2c, 0x2e, 0x68, 0x31, 0x20, 0x73, 0x6d, 0x61, 0x6c, 0x6c, + 0x2c, 0x68, 0x32, 0x20, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x2c, 0x2e, + 0x68, 0x32, 0x20, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x2c, 0x68, 0x33, + 0x20, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x2c, 0x2e, 0x68, 0x33, 0x20, + 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x2c, 0x68, 0x31, 0x20, 0x2e, 0x73, + 0x6d, 0x61, 0x6c, 0x6c, 0x2c, 0x2e, 0x68, 0x31, 0x20, 0x2e, 0x73, + 0x6d, 0x61, 0x6c, 0x6c, 0x2c, 0x68, 0x32, 0x20, 0x2e, 0x73, 0x6d, + 0x61, 0x6c, 0x6c, 0x2c, 0x2e, 0x68, 0x32, 0x20, 0x2e, 0x73, 0x6d, + 0x61, 0x6c, 0x6c, 0x2c, 0x68, 0x33, 0x20, 0x2e, 0x73, 0x6d, 0x61, + 0x6c, 0x6c, 0x2c, 0x2e, 0x68, 0x33, 0x20, 0x2e, 0x73, 0x6d, 0x61, + 0x6c, 0x6c, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, + 0x65, 0x3a, 0x36, 0x35, 0x25, 0x7d, 0x68, 0x34, 0x2c, 0x2e, 0x68, + 0x34, 0x2c, 0x68, 0x35, 0x2c, 0x2e, 0x68, 0x35, 0x2c, 0x68, 0x36, + 0x2c, 0x2e, 0x68, 0x36, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, + 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x31, 0x30, 0x70, 0x78, 0x3b, 0x6d, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, + 0x6d, 0x3a, 0x31, 0x30, 0x70, 0x78, 0x7d, 0x68, 0x34, 0x20, 0x73, + 0x6d, 0x61, 0x6c, 0x6c, 0x2c, 0x2e, 0x68, 0x34, 0x20, 0x73, 0x6d, + 0x61, 0x6c, 0x6c, 0x2c, 0x68, 0x35, 0x20, 0x73, 0x6d, 0x61, 0x6c, + 0x6c, 0x2c, 0x2e, 0x68, 0x35, 0x20, 0x73, 0x6d, 0x61, 0x6c, 0x6c, + 0x2c, 0x68, 0x36, 0x20, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x2c, 0x2e, + 0x68, 0x36, 0x20, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x2c, 0x68, 0x34, + 0x20, 0x2e, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x2c, 0x2e, 0x68, 0x34, + 0x20, 0x2e, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x2c, 0x68, 0x35, 0x20, + 0x2e, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x2c, 0x2e, 0x68, 0x35, 0x20, + 0x2e, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x2c, 0x68, 0x36, 0x20, 0x2e, + 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x2c, 0x2e, 0x68, 0x36, 0x20, 0x2e, + 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, + 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x37, 0x35, 0x25, 0x7d, 0x68, 0x31, + 0x2c, 0x2e, 0x68, 0x31, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, + 0x69, 0x7a, 0x65, 0x3a, 0x33, 0x36, 0x70, 0x78, 0x7d, 0x68, 0x32, + 0x2c, 0x2e, 0x68, 0x32, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, + 0x69, 0x7a, 0x65, 0x3a, 0x33, 0x30, 0x70, 0x78, 0x7d, 0x68, 0x33, + 0x2c, 0x2e, 0x68, 0x33, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, + 0x69, 0x7a, 0x65, 0x3a, 0x32, 0x34, 0x70, 0x78, 0x7d, 0x68, 0x34, + 0x2c, 0x2e, 0x68, 0x34, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, + 0x69, 0x7a, 0x65, 0x3a, 0x31, 0x38, 0x70, 0x78, 0x7d, 0x68, 0x35, + 0x2c, 0x2e, 0x68, 0x35, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, + 0x69, 0x7a, 0x65, 0x3a, 0x31, 0x34, 0x70, 0x78, 0x7d, 0x68, 0x36, + 0x2c, 0x2e, 0x68, 0x36, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, + 0x69, 0x7a, 0x65, 0x3a, 0x31, 0x32, 0x70, 0x78, 0x7d, 0x70, 0x7b, + 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x30, 0x20, 0x30, 0x20, + 0x31, 0x30, 0x70, 0x78, 0x7d, 0x2e, 0x6c, 0x65, 0x61, 0x64, 0x7b, + 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, + 0x6f, 0x6d, 0x3a, 0x32, 0x30, 0x70, 0x78, 0x3b, 0x66, 0x6f, 0x6e, + 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x31, 0x36, 0x70, 0x78, + 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x3a, 0x33, 0x30, 0x30, 0x3b, 0x6c, 0x69, 0x6e, 0x65, 0x2d, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x31, 0x2e, 0x34, 0x7d, + 0x40, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x20, 0x28, 0x6d, 0x69, 0x6e, + 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x37, 0x36, 0x38, 0x70, + 0x78, 0x29, 0x7b, 0x2e, 0x6c, 0x65, 0x61, 0x64, 0x7b, 0x66, 0x6f, + 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x32, 0x31, 0x70, + 0x78, 0x7d, 0x7d, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x2c, 0x2e, 0x73, + 0x6d, 0x61, 0x6c, 0x6c, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, + 0x69, 0x7a, 0x65, 0x3a, 0x38, 0x35, 0x25, 0x7d, 0x6d, 0x61, 0x72, + 0x6b, 0x2c, 0x2e, 0x6d, 0x61, 0x72, 0x6b, 0x7b, 0x62, 0x61, 0x63, + 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x63, 0x66, 0x38, 0x65, 0x33, 0x3b, + 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x2e, 0x32, 0x65, + 0x6d, 0x7d, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x6c, 0x65, 0x66, + 0x74, 0x7b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, + 0x6e, 0x3a, 0x6c, 0x65, 0x66, 0x74, 0x7d, 0x2e, 0x74, 0x65, 0x78, + 0x74, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x7b, 0x74, 0x65, 0x78, + 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x72, 0x69, 0x67, + 0x68, 0x74, 0x7d, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x63, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x7b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, + 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x7d, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x6a, 0x75, 0x73, 0x74, + 0x69, 0x66, 0x79, 0x7b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x3a, 0x6a, 0x75, 0x73, 0x74, 0x69, 0x66, 0x79, + 0x7d, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x6e, 0x6f, 0x77, 0x72, + 0x61, 0x70, 0x7b, 0x77, 0x68, 0x69, 0x74, 0x65, 0x2d, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x3a, 0x6e, 0x6f, 0x77, 0x72, 0x61, 0x70, 0x7d, + 0x2e, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x6c, 0x6f, 0x77, 0x65, 0x72, + 0x63, 0x61, 0x73, 0x65, 0x7b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x3a, 0x6c, 0x6f, + 0x77, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x7d, 0x2e, 0x74, 0x65, + 0x78, 0x74, 0x2d, 0x75, 0x70, 0x70, 0x65, 0x72, 0x63, 0x61, 0x73, + 0x65, 0x7b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x3a, 0x75, 0x70, 0x70, 0x65, 0x72, + 0x63, 0x61, 0x73, 0x65, 0x7d, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x2d, + 0x63, 0x61, 0x70, 0x69, 0x74, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x7b, + 0x74, 0x65, 0x78, 0x74, 0x2d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x6f, 0x72, 0x6d, 0x3a, 0x63, 0x61, 0x70, 0x69, 0x74, 0x61, 0x6c, + 0x69, 0x7a, 0x65, 0x7d, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x6d, + 0x75, 0x74, 0x65, 0x64, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, + 0x23, 0x37, 0x37, 0x37, 0x7d, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x2d, + 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x33, 0x33, 0x37, 0x61, 0x62, 0x37, 0x7d, + 0x61, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x70, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x61, + 0x2e, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x70, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x7b, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x32, 0x38, 0x36, 0x30, 0x39, 0x30, + 0x7d, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x73, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, + 0x33, 0x63, 0x37, 0x36, 0x33, 0x64, 0x7d, 0x61, 0x2e, 0x74, 0x65, + 0x78, 0x74, 0x2d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x3a, + 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x61, 0x2e, 0x74, 0x65, 0x78, + 0x74, 0x2d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x3a, 0x66, + 0x6f, 0x63, 0x75, 0x73, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, + 0x23, 0x32, 0x62, 0x35, 0x34, 0x32, 0x63, 0x7d, 0x2e, 0x74, 0x65, + 0x78, 0x74, 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x7b, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x33, 0x31, 0x37, 0x30, 0x38, 0x66, 0x7d, + 0x61, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x69, 0x6e, 0x66, 0x6f, + 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x61, 0x2e, 0x74, 0x65, + 0x78, 0x74, 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x3a, 0x66, 0x6f, 0x63, + 0x75, 0x73, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x32, + 0x34, 0x35, 0x32, 0x36, 0x39, 0x7d, 0x2e, 0x74, 0x65, 0x78, 0x74, + 0x2d, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x7b, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x38, 0x61, 0x36, 0x64, 0x33, 0x62, + 0x7d, 0x61, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x77, 0x61, 0x72, + 0x6e, 0x69, 0x6e, 0x67, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, + 0x61, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x77, 0x61, 0x72, 0x6e, + 0x69, 0x6e, 0x67, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x7b, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x36, 0x36, 0x35, 0x31, 0x32, + 0x63, 0x7d, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x64, 0x61, 0x6e, + 0x67, 0x65, 0x72, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, + 0x61, 0x39, 0x34, 0x34, 0x34, 0x32, 0x7d, 0x61, 0x2e, 0x74, 0x65, + 0x78, 0x74, 0x2d, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x3a, 0x68, + 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x61, 0x2e, 0x74, 0x65, 0x78, 0x74, + 0x2d, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x3a, 0x66, 0x6f, 0x63, + 0x75, 0x73, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x38, + 0x34, 0x33, 0x35, 0x33, 0x34, 0x7d, 0x2e, 0x62, 0x67, 0x2d, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x62, 0x61, 0x63, 0x6b, + 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x23, 0x33, 0x33, 0x37, 0x61, 0x62, 0x37, 0x7d, 0x61, + 0x2e, 0x62, 0x67, 0x2d, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x61, 0x2e, 0x62, 0x67, + 0x2d, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x3a, 0x66, 0x6f, + 0x63, 0x75, 0x73, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, + 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, + 0x32, 0x38, 0x36, 0x30, 0x39, 0x30, 0x7d, 0x2e, 0x62, 0x67, 0x2d, + 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x7b, 0x62, 0x61, 0x63, + 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x64, 0x66, 0x66, 0x30, 0x64, 0x38, 0x7d, + 0x61, 0x2e, 0x62, 0x67, 0x2d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x61, 0x2e, 0x62, + 0x67, 0x2d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x3a, 0x66, + 0x6f, 0x63, 0x75, 0x73, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, + 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, + 0x23, 0x63, 0x31, 0x65, 0x32, 0x62, 0x33, 0x7d, 0x2e, 0x62, 0x67, + 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x23, 0x64, 0x39, 0x65, 0x64, 0x66, 0x37, 0x7d, 0x61, 0x2e, + 0x62, 0x67, 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x3a, 0x68, 0x6f, 0x76, + 0x65, 0x72, 0x2c, 0x61, 0x2e, 0x62, 0x67, 0x2d, 0x69, 0x6e, 0x66, + 0x6f, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x7b, 0x62, 0x61, 0x63, + 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x61, 0x66, 0x64, 0x39, 0x65, 0x65, 0x7d, + 0x2e, 0x62, 0x67, 0x2d, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, + 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, + 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x63, 0x66, + 0x38, 0x65, 0x33, 0x7d, 0x61, 0x2e, 0x62, 0x67, 0x2d, 0x77, 0x61, + 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, + 0x2c, 0x61, 0x2e, 0x62, 0x67, 0x2d, 0x77, 0x61, 0x72, 0x6e, 0x69, + 0x6e, 0x67, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x7b, 0x62, 0x61, + 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x37, 0x65, 0x63, 0x62, 0x35, + 0x7d, 0x2e, 0x62, 0x67, 0x2d, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, + 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, + 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x32, 0x64, + 0x65, 0x64, 0x65, 0x7d, 0x61, 0x2e, 0x62, 0x67, 0x2d, 0x64, 0x61, + 0x6e, 0x67, 0x65, 0x72, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, + 0x61, 0x2e, 0x62, 0x67, 0x2d, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, + 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x7b, 0x62, 0x61, 0x63, 0x6b, + 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x23, 0x65, 0x34, 0x62, 0x39, 0x62, 0x39, 0x7d, 0x2e, + 0x70, 0x61, 0x67, 0x65, 0x2d, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x7b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x62, 0x6f, + 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x39, 0x70, 0x78, 0x3b, 0x6d, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x34, 0x30, 0x70, 0x78, 0x20, 0x30, + 0x20, 0x32, 0x30, 0x70, 0x78, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x31, 0x70, + 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x23, 0x65, 0x65, + 0x65, 0x7d, 0x75, 0x6c, 0x2c, 0x6f, 0x6c, 0x7b, 0x6d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x30, 0x3b, 0x6d, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, + 0x6d, 0x3a, 0x31, 0x30, 0x70, 0x78, 0x7d, 0x75, 0x6c, 0x20, 0x75, + 0x6c, 0x2c, 0x6f, 0x6c, 0x20, 0x75, 0x6c, 0x2c, 0x75, 0x6c, 0x20, + 0x6f, 0x6c, 0x2c, 0x6f, 0x6c, 0x20, 0x6f, 0x6c, 0x7b, 0x6d, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, + 0x3a, 0x30, 0x7d, 0x2e, 0x6c, 0x69, 0x73, 0x74, 0x2d, 0x75, 0x6e, + 0x73, 0x74, 0x79, 0x6c, 0x65, 0x64, 0x7b, 0x70, 0x61, 0x64, 0x64, + 0x69, 0x6e, 0x67, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x30, 0x3b, + 0x6c, 0x69, 0x73, 0x74, 0x2d, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3a, + 0x6e, 0x6f, 0x6e, 0x65, 0x7d, 0x2e, 0x6c, 0x69, 0x73, 0x74, 0x2d, + 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x7b, 0x70, 0x61, 0x64, 0x64, + 0x69, 0x6e, 0x67, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x30, 0x3b, + 0x6c, 0x69, 0x73, 0x74, 0x2d, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3a, + 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, + 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x2d, 0x35, 0x70, 0x78, 0x7d, + 0x2e, 0x6c, 0x69, 0x73, 0x74, 0x2d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, + 0x65, 0x3e, 0x6c, 0x69, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x3a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, + 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x35, 0x70, 0x78, 0x3b, 0x70, + 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x72, 0x69, 0x67, 0x68, + 0x74, 0x3a, 0x35, 0x70, 0x78, 0x7d, 0x64, 0x6c, 0x7b, 0x6d, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x30, 0x3b, + 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, + 0x6f, 0x6d, 0x3a, 0x32, 0x30, 0x70, 0x78, 0x7d, 0x64, 0x74, 0x2c, + 0x64, 0x64, 0x7b, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x3a, 0x31, 0x2e, 0x34, 0x32, 0x38, 0x35, 0x37, + 0x31, 0x34, 0x33, 0x7d, 0x64, 0x74, 0x7b, 0x66, 0x6f, 0x6e, 0x74, + 0x2d, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x62, 0x6f, 0x6c, + 0x64, 0x7d, 0x64, 0x64, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, + 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x30, 0x7d, 0x40, 0x6d, 0x65, + 0x64, 0x69, 0x61, 0x20, 0x28, 0x6d, 0x69, 0x6e, 0x2d, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3a, 0x37, 0x36, 0x38, 0x70, 0x78, 0x29, 0x7b, + 0x2e, 0x64, 0x6c, 0x2d, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, + 0x74, 0x61, 0x6c, 0x20, 0x64, 0x74, 0x7b, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x3a, 0x6c, 0x65, 0x66, 0x74, 0x3b, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x3a, 0x31, 0x36, 0x30, 0x70, 0x78, 0x3b, 0x63, 0x6c, 0x65, + 0x61, 0x72, 0x3a, 0x6c, 0x65, 0x66, 0x74, 0x3b, 0x74, 0x65, 0x78, + 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x72, 0x69, 0x67, + 0x68, 0x74, 0x3b, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, + 0x3a, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x3b, 0x74, 0x65, 0x78, + 0x74, 0x2d, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x3a, + 0x65, 0x6c, 0x6c, 0x69, 0x70, 0x73, 0x69, 0x73, 0x3b, 0x77, 0x68, + 0x69, 0x74, 0x65, 0x2d, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3a, 0x6e, + 0x6f, 0x77, 0x72, 0x61, 0x70, 0x7d, 0x2e, 0x64, 0x6c, 0x2d, 0x68, + 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x20, 0x64, + 0x64, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, + 0x66, 0x74, 0x3a, 0x31, 0x38, 0x30, 0x70, 0x78, 0x7d, 0x7d, 0x61, + 0x62, 0x62, 0x72, 0x5b, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x5d, 0x2c, + 0x61, 0x62, 0x62, 0x72, 0x5b, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x6f, + 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x2d, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x5d, 0x7b, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x3a, + 0x68, 0x65, 0x6c, 0x70, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x31, 0x70, 0x78, + 0x20, 0x64, 0x6f, 0x74, 0x74, 0x65, 0x64, 0x20, 0x23, 0x37, 0x37, + 0x37, 0x7d, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, + 0x73, 0x6d, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, + 0x65, 0x3a, 0x39, 0x30, 0x25, 0x3b, 0x74, 0x65, 0x78, 0x74, 0x2d, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x3a, 0x75, + 0x70, 0x70, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x7d, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x7b, 0x70, 0x61, + 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x31, 0x30, 0x70, 0x78, 0x20, + 0x32, 0x30, 0x70, 0x78, 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, + 0x3a, 0x30, 0x20, 0x30, 0x20, 0x32, 0x30, 0x70, 0x78, 0x3b, 0x66, + 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x31, 0x37, + 0x2e, 0x35, 0x70, 0x78, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x35, 0x70, 0x78, 0x20, 0x73, + 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x23, 0x65, 0x65, 0x65, 0x7d, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x20, 0x70, + 0x3a, 0x6c, 0x61, 0x73, 0x74, 0x2d, 0x63, 0x68, 0x69, 0x6c, 0x64, + 0x2c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x71, 0x75, 0x6f, 0x74, 0x65, + 0x20, 0x75, 0x6c, 0x3a, 0x6c, 0x61, 0x73, 0x74, 0x2d, 0x63, 0x68, + 0x69, 0x6c, 0x64, 0x2c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x71, 0x75, + 0x6f, 0x74, 0x65, 0x20, 0x6f, 0x6c, 0x3a, 0x6c, 0x61, 0x73, 0x74, + 0x2d, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x7b, 0x6d, 0x61, 0x72, 0x67, + 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x30, + 0x7d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x71, 0x75, 0x6f, 0x74, 0x65, + 0x20, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x2c, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x20, 0x73, 0x6d, 0x61, + 0x6c, 0x6c, 0x2c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x71, 0x75, 0x6f, + 0x74, 0x65, 0x20, 0x2e, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x7b, 0x64, + 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, + 0x3a, 0x38, 0x30, 0x25, 0x3b, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x68, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x31, 0x2e, 0x34, 0x32, 0x38, + 0x35, 0x37, 0x31, 0x34, 0x33, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x23, 0x37, 0x37, 0x37, 0x7d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x71, 0x75, 0x6f, 0x74, 0x65, 0x20, 0x66, 0x6f, 0x6f, 0x74, 0x65, + 0x72, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x2c, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x20, 0x73, 0x6d, + 0x61, 0x6c, 0x6c, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x2c, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x20, + 0x2e, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x3a, 0x62, 0x65, 0x66, 0x6f, + 0x72, 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, + 0x27, 0x5c, 0x32, 0x30, 0x31, 0x34, 0x20, 0x5c, 0x30, 0x30, 0x41, + 0x30, 0x27, 0x7d, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x71, 0x75, + 0x6f, 0x74, 0x65, 0x2d, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, + 0x2c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x71, 0x75, 0x6f, 0x74, 0x65, + 0x2e, 0x70, 0x75, 0x6c, 0x6c, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x7b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x72, 0x69, + 0x67, 0x68, 0x74, 0x3a, 0x31, 0x35, 0x70, 0x78, 0x3b, 0x70, 0x61, + 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, + 0x30, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x72, 0x69, + 0x67, 0x68, 0x74, 0x3a, 0x35, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, + 0x69, 0x64, 0x20, 0x23, 0x65, 0x65, 0x65, 0x3b, 0x62, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x30, 0x3b, + 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x7d, 0x2e, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x2d, 0x72, 0x65, 0x76, 0x65, + 0x72, 0x73, 0x65, 0x20, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x3a, + 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x2c, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x2e, 0x70, 0x75, 0x6c, 0x6c, + 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x66, 0x6f, 0x6f, 0x74, + 0x65, 0x72, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x2c, 0x2e, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x2d, + 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x20, 0x73, 0x6d, 0x61, + 0x6c, 0x6c, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x2c, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x2e, 0x70, + 0x75, 0x6c, 0x6c, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x73, + 0x6d, 0x61, 0x6c, 0x6c, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, + 0x2c, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x71, 0x75, 0x6f, 0x74, + 0x65, 0x2d, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x20, 0x2e, + 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, + 0x65, 0x2c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x71, 0x75, 0x6f, 0x74, + 0x65, 0x2e, 0x70, 0x75, 0x6c, 0x6c, 0x2d, 0x72, 0x69, 0x67, 0x68, + 0x74, 0x20, 0x2e, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x3a, 0x62, 0x65, + 0x66, 0x6f, 0x72, 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x3a, 0x27, 0x27, 0x7d, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x71, 0x75, 0x6f, 0x74, 0x65, 0x2d, 0x72, 0x65, 0x76, 0x65, 0x72, + 0x73, 0x65, 0x20, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x3a, 0x61, + 0x66, 0x74, 0x65, 0x72, 0x2c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x71, + 0x75, 0x6f, 0x74, 0x65, 0x2e, 0x70, 0x75, 0x6c, 0x6c, 0x2d, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x20, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, + 0x3a, 0x61, 0x66, 0x74, 0x65, 0x72, 0x2c, 0x2e, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x2d, 0x72, 0x65, 0x76, + 0x65, 0x72, 0x73, 0x65, 0x20, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x3a, + 0x61, 0x66, 0x74, 0x65, 0x72, 0x2c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x71, 0x75, 0x6f, 0x74, 0x65, 0x2e, 0x70, 0x75, 0x6c, 0x6c, 0x2d, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x73, 0x6d, 0x61, 0x6c, 0x6c, + 0x3a, 0x61, 0x66, 0x74, 0x65, 0x72, 0x2c, 0x2e, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x2d, 0x72, 0x65, 0x76, + 0x65, 0x72, 0x73, 0x65, 0x20, 0x2e, 0x73, 0x6d, 0x61, 0x6c, 0x6c, + 0x3a, 0x61, 0x66, 0x74, 0x65, 0x72, 0x2c, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x2e, 0x70, 0x75, 0x6c, 0x6c, + 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x2e, 0x73, 0x6d, 0x61, + 0x6c, 0x6c, 0x3a, 0x61, 0x66, 0x74, 0x65, 0x72, 0x7b, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x27, 0x5c, 0x30, 0x30, 0x41, + 0x30, 0x20, 0x5c, 0x32, 0x30, 0x31, 0x34, 0x27, 0x7d, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, + 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x32, 0x30, + 0x70, 0x78, 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x74, 0x79, + 0x6c, 0x65, 0x3a, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x3b, 0x6c, + 0x69, 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, + 0x31, 0x2e, 0x34, 0x32, 0x38, 0x35, 0x37, 0x31, 0x34, 0x33, 0x7d, + 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x7b, + 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x72, 0x69, 0x67, 0x68, + 0x74, 0x3a, 0x61, 0x75, 0x74, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x67, + 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x61, 0x75, 0x74, + 0x6f, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x6c, + 0x65, 0x66, 0x74, 0x3a, 0x31, 0x35, 0x70, 0x78, 0x3b, 0x70, 0x61, + 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x3a, 0x31, 0x35, 0x70, 0x78, 0x7d, 0x40, 0x6d, 0x65, 0x64, 0x69, + 0x61, 0x20, 0x28, 0x6d, 0x69, 0x6e, 0x2d, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x3a, 0x37, 0x36, 0x38, 0x70, 0x78, 0x29, 0x7b, 0x2e, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x7b, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3a, 0x37, 0x35, 0x30, 0x70, 0x78, 0x7d, 0x7d, + 0x40, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x20, 0x28, 0x6d, 0x69, 0x6e, + 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x39, 0x39, 0x32, 0x70, + 0x78, 0x29, 0x7b, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x39, 0x37, + 0x30, 0x70, 0x78, 0x7d, 0x7d, 0x40, 0x6d, 0x65, 0x64, 0x69, 0x61, + 0x20, 0x28, 0x6d, 0x69, 0x6e, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x3a, 0x31, 0x32, 0x30, 0x30, 0x70, 0x78, 0x29, 0x7b, 0x2e, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x7b, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3a, 0x31, 0x31, 0x37, 0x30, 0x70, 0x78, 0x7d, + 0x7d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x2d, 0x66, 0x6c, 0x75, 0x69, 0x64, 0x7b, 0x6d, 0x61, 0x72, 0x67, + 0x69, 0x6e, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x61, 0x75, + 0x74, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, + 0x65, 0x66, 0x74, 0x3a, 0x61, 0x75, 0x74, 0x6f, 0x3b, 0x70, 0x61, + 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, + 0x31, 0x35, 0x70, 0x78, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, + 0x67, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x31, 0x35, 0x70, + 0x78, 0x7d, 0x2e, 0x72, 0x6f, 0x77, 0x7b, 0x6d, 0x61, 0x72, 0x67, + 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x2d, 0x31, 0x35, + 0x70, 0x78, 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x3a, 0x2d, 0x31, 0x35, 0x70, 0x78, 0x7d, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x31, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x31, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x31, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x31, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x32, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x32, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x32, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x32, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x33, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x33, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x33, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x33, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x34, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x34, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x34, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x34, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x35, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x35, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x35, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x35, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x36, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x36, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x36, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x36, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x37, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x37, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x37, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x37, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x38, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x38, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x38, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x38, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x39, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x39, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x39, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x39, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x31, 0x30, 0x2c, + 0x20, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x31, 0x30, + 0x2c, 0x20, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x31, + 0x30, 0x2c, 0x20, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, + 0x31, 0x30, 0x2c, 0x20, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, + 0x2d, 0x31, 0x31, 0x2c, 0x20, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, + 0x6d, 0x2d, 0x31, 0x31, 0x2c, 0x20, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, + 0x6d, 0x64, 0x2d, 0x31, 0x31, 0x2c, 0x20, 0x2e, 0x63, 0x6f, 0x6c, + 0x2d, 0x6c, 0x67, 0x2d, 0x31, 0x31, 0x2c, 0x20, 0x2e, 0x63, 0x6f, + 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x31, 0x32, 0x2c, 0x20, 0x2e, 0x63, + 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x31, 0x32, 0x2c, 0x20, 0x2e, + 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x31, 0x32, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x31, 0x32, 0x7b, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x72, 0x65, + 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x3b, 0x6d, 0x69, 0x6e, 0x2d, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x31, 0x70, 0x78, 0x3b, + 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x6c, 0x65, 0x66, + 0x74, 0x3a, 0x31, 0x35, 0x70, 0x78, 0x3b, 0x70, 0x61, 0x64, 0x64, + 0x69, 0x6e, 0x67, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x31, + 0x35, 0x70, 0x78, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, + 0x2d, 0x31, 0x2c, 0x20, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, + 0x2d, 0x32, 0x2c, 0x20, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, + 0x2d, 0x33, 0x2c, 0x20, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, + 0x2d, 0x34, 0x2c, 0x20, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, + 0x2d, 0x35, 0x2c, 0x20, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, + 0x2d, 0x36, 0x2c, 0x20, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, + 0x2d, 0x37, 0x2c, 0x20, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, + 0x2d, 0x38, 0x2c, 0x20, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, + 0x2d, 0x39, 0x2c, 0x20, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, + 0x2d, 0x31, 0x30, 0x2c, 0x20, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, + 0x73, 0x2d, 0x31, 0x31, 0x2c, 0x20, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, + 0x78, 0x73, 0x2d, 0x31, 0x32, 0x7b, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x3a, 0x6c, 0x65, 0x66, 0x74, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, + 0x78, 0x73, 0x2d, 0x31, 0x32, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x3a, 0x31, 0x30, 0x30, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, + 0x78, 0x73, 0x2d, 0x31, 0x31, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x3a, 0x39, 0x31, 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, + 0x31, 0x30, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x38, 0x33, + 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x39, 0x7b, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x3a, 0x37, 0x35, 0x25, 0x7d, 0x2e, 0x63, + 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x38, 0x7b, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x3a, 0x36, 0x36, 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, + 0x73, 0x2d, 0x37, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x35, + 0x38, 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x25, + 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x36, 0x7b, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x35, 0x30, 0x25, 0x7d, 0x2e, + 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x35, 0x7b, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3a, 0x34, 0x31, 0x2e, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, + 0x78, 0x73, 0x2d, 0x34, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, + 0x33, 0x33, 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x33, + 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x32, 0x35, 0x25, 0x7d, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x32, 0x7b, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, 0x36, 0x2e, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, + 0x2d, 0x78, 0x73, 0x2d, 0x31, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x3a, 0x38, 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x70, + 0x75, 0x6c, 0x6c, 0x2d, 0x31, 0x32, 0x7b, 0x72, 0x69, 0x67, 0x68, + 0x74, 0x3a, 0x31, 0x30, 0x30, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, + 0x2d, 0x78, 0x73, 0x2d, 0x70, 0x75, 0x6c, 0x6c, 0x2d, 0x31, 0x31, + 0x7b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x39, 0x31, 0x2e, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, + 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x70, 0x75, 0x6c, 0x6c, 0x2d, + 0x31, 0x30, 0x7b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x38, 0x33, + 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x70, 0x75, 0x6c, + 0x6c, 0x2d, 0x39, 0x7b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x37, + 0x35, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, + 0x70, 0x75, 0x6c, 0x6c, 0x2d, 0x38, 0x7b, 0x72, 0x69, 0x67, 0x68, + 0x74, 0x3a, 0x36, 0x36, 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, + 0x2d, 0x70, 0x75, 0x6c, 0x6c, 0x2d, 0x37, 0x7b, 0x72, 0x69, 0x67, + 0x68, 0x74, 0x3a, 0x35, 0x38, 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, + 0x73, 0x2d, 0x70, 0x75, 0x6c, 0x6c, 0x2d, 0x36, 0x7b, 0x72, 0x69, + 0x67, 0x68, 0x74, 0x3a, 0x35, 0x30, 0x25, 0x7d, 0x2e, 0x63, 0x6f, + 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x70, 0x75, 0x6c, 0x6c, 0x2d, 0x35, + 0x7b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x34, 0x31, 0x2e, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, + 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x70, 0x75, 0x6c, 0x6c, 0x2d, + 0x34, 0x7b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x33, 0x33, 0x2e, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, 0x2e, + 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x70, 0x75, 0x6c, 0x6c, + 0x2d, 0x33, 0x7b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x32, 0x35, + 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x70, + 0x75, 0x6c, 0x6c, 0x2d, 0x32, 0x7b, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x3a, 0x31, 0x36, 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, + 0x70, 0x75, 0x6c, 0x6c, 0x2d, 0x31, 0x7b, 0x72, 0x69, 0x67, 0x68, + 0x74, 0x3a, 0x38, 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, + 0x70, 0x75, 0x6c, 0x6c, 0x2d, 0x30, 0x7b, 0x72, 0x69, 0x67, 0x68, + 0x74, 0x3a, 0x61, 0x75, 0x74, 0x6f, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, + 0x2d, 0x78, 0x73, 0x2d, 0x70, 0x75, 0x73, 0x68, 0x2d, 0x31, 0x32, + 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x31, 0x30, 0x30, 0x25, 0x7d, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x70, 0x75, 0x73, + 0x68, 0x2d, 0x31, 0x31, 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x39, + 0x31, 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x25, + 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x70, 0x75, + 0x73, 0x68, 0x2d, 0x31, 0x30, 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, + 0x38, 0x33, 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x70, + 0x75, 0x73, 0x68, 0x2d, 0x39, 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, + 0x37, 0x35, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, + 0x2d, 0x70, 0x75, 0x73, 0x68, 0x2d, 0x38, 0x7b, 0x6c, 0x65, 0x66, + 0x74, 0x3a, 0x36, 0x36, 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, + 0x2d, 0x70, 0x75, 0x73, 0x68, 0x2d, 0x37, 0x7b, 0x6c, 0x65, 0x66, + 0x74, 0x3a, 0x35, 0x38, 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, + 0x2d, 0x70, 0x75, 0x73, 0x68, 0x2d, 0x36, 0x7b, 0x6c, 0x65, 0x66, + 0x74, 0x3a, 0x35, 0x30, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, + 0x78, 0x73, 0x2d, 0x70, 0x75, 0x73, 0x68, 0x2d, 0x35, 0x7b, 0x6c, + 0x65, 0x66, 0x74, 0x3a, 0x34, 0x31, 0x2e, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, + 0x78, 0x73, 0x2d, 0x70, 0x75, 0x73, 0x68, 0x2d, 0x34, 0x7b, 0x6c, + 0x65, 0x66, 0x74, 0x3a, 0x33, 0x33, 0x2e, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, + 0x78, 0x73, 0x2d, 0x70, 0x75, 0x73, 0x68, 0x2d, 0x33, 0x7b, 0x6c, + 0x65, 0x66, 0x74, 0x3a, 0x32, 0x35, 0x25, 0x7d, 0x2e, 0x63, 0x6f, + 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x70, 0x75, 0x73, 0x68, 0x2d, 0x32, + 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x31, 0x36, 0x2e, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, + 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x70, 0x75, 0x73, 0x68, 0x2d, 0x31, + 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x38, 0x2e, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, + 0x2d, 0x78, 0x73, 0x2d, 0x70, 0x75, 0x73, 0x68, 0x2d, 0x30, 0x7b, + 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x61, 0x75, 0x74, 0x6f, 0x7d, 0x2e, + 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x2d, 0x31, 0x32, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, + 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x31, 0x30, 0x30, 0x25, + 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x6f, 0x66, + 0x66, 0x73, 0x65, 0x74, 0x2d, 0x31, 0x31, 0x7b, 0x6d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x39, 0x31, + 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x25, 0x7d, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x2d, 0x31, 0x30, 0x7b, 0x6d, 0x61, 0x72, 0x67, + 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x38, 0x33, 0x2e, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, 0x2e, + 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x2d, 0x39, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, + 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x37, 0x35, 0x25, 0x7d, 0x2e, + 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x2d, 0x38, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, + 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x36, 0x36, 0x2e, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, + 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x2d, 0x37, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, + 0x65, 0x66, 0x74, 0x3a, 0x35, 0x38, 0x2e, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, + 0x78, 0x73, 0x2d, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2d, 0x36, + 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, + 0x74, 0x3a, 0x35, 0x30, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, + 0x78, 0x73, 0x2d, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2d, 0x35, + 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, + 0x74, 0x3a, 0x34, 0x31, 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, + 0x2d, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2d, 0x34, 0x7b, 0x6d, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, + 0x33, 0x33, 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x6f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x2d, 0x33, 0x7b, 0x6d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x32, 0x35, + 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x6f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x2d, 0x32, 0x7b, 0x6d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x31, 0x36, + 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x25, 0x7d, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x2d, 0x31, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, + 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x38, 0x2e, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, 0x2e, 0x63, 0x6f, + 0x6c, 0x2d, 0x78, 0x73, 0x2d, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x2d, 0x30, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, + 0x65, 0x66, 0x74, 0x3a, 0x30, 0x7d, 0x40, 0x6d, 0x65, 0x64, 0x69, + 0x61, 0x20, 0x28, 0x6d, 0x69, 0x6e, 0x2d, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x3a, 0x37, 0x36, 0x38, 0x70, 0x78, 0x29, 0x7b, 0x2e, 0x63, + 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x31, 0x2c, 0x20, 0x2e, 0x63, + 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x32, 0x2c, 0x20, 0x2e, 0x63, + 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x33, 0x2c, 0x20, 0x2e, 0x63, + 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x34, 0x2c, 0x20, 0x2e, 0x63, + 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x35, 0x2c, 0x20, 0x2e, 0x63, + 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x36, 0x2c, 0x20, 0x2e, 0x63, + 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x37, 0x2c, 0x20, 0x2e, 0x63, + 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x38, 0x2c, 0x20, 0x2e, 0x63, + 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x39, 0x2c, 0x20, 0x2e, 0x63, + 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x31, 0x30, 0x2c, 0x20, 0x2e, + 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x31, 0x31, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x31, 0x32, 0x7b, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3a, 0x6c, 0x65, 0x66, 0x74, 0x7d, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x31, 0x32, 0x7b, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, 0x30, 0x30, 0x25, 0x7d, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x31, 0x31, 0x7b, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x39, 0x31, 0x2e, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, + 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x31, 0x30, 0x7b, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x3a, 0x38, 0x33, 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, + 0x6d, 0x2d, 0x39, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x37, + 0x35, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, + 0x38, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x36, 0x36, 0x2e, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x25, 0x7d, 0x2e, + 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x37, 0x7b, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3a, 0x35, 0x38, 0x2e, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, + 0x73, 0x6d, 0x2d, 0x36, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, + 0x35, 0x30, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, + 0x2d, 0x35, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x34, 0x31, + 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x25, 0x7d, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x34, 0x7b, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x3a, 0x33, 0x33, 0x2e, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, + 0x2d, 0x73, 0x6d, 0x2d, 0x33, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x3a, 0x32, 0x35, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, + 0x6d, 0x2d, 0x32, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, + 0x36, 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x25, + 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x31, 0x7b, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x38, 0x2e, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, + 0x2d, 0x73, 0x6d, 0x2d, 0x70, 0x75, 0x6c, 0x6c, 0x2d, 0x31, 0x32, + 0x7b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x31, 0x30, 0x30, 0x25, + 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x70, 0x75, + 0x6c, 0x6c, 0x2d, 0x31, 0x31, 0x7b, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x3a, 0x39, 0x31, 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, + 0x70, 0x75, 0x6c, 0x6c, 0x2d, 0x31, 0x30, 0x7b, 0x72, 0x69, 0x67, + 0x68, 0x74, 0x3a, 0x38, 0x33, 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, + 0x6d, 0x2d, 0x70, 0x75, 0x6c, 0x6c, 0x2d, 0x39, 0x7b, 0x72, 0x69, + 0x67, 0x68, 0x74, 0x3a, 0x37, 0x35, 0x25, 0x7d, 0x2e, 0x63, 0x6f, + 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x70, 0x75, 0x6c, 0x6c, 0x2d, 0x38, + 0x7b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x36, 0x36, 0x2e, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, + 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x70, 0x75, 0x6c, 0x6c, 0x2d, + 0x37, 0x7b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x35, 0x38, 0x2e, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, 0x2e, + 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x70, 0x75, 0x6c, 0x6c, + 0x2d, 0x36, 0x7b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x35, 0x30, + 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x70, + 0x75, 0x6c, 0x6c, 0x2d, 0x35, 0x7b, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x3a, 0x34, 0x31, 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, + 0x70, 0x75, 0x6c, 0x6c, 0x2d, 0x34, 0x7b, 0x72, 0x69, 0x67, 0x68, + 0x74, 0x3a, 0x33, 0x33, 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, + 0x2d, 0x70, 0x75, 0x6c, 0x6c, 0x2d, 0x33, 0x7b, 0x72, 0x69, 0x67, + 0x68, 0x74, 0x3a, 0x32, 0x35, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, + 0x2d, 0x73, 0x6d, 0x2d, 0x70, 0x75, 0x6c, 0x6c, 0x2d, 0x32, 0x7b, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x31, 0x36, 0x2e, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, + 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x70, 0x75, 0x6c, 0x6c, 0x2d, 0x31, + 0x7b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x38, 0x2e, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, 0x2e, 0x63, 0x6f, + 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x70, 0x75, 0x6c, 0x6c, 0x2d, 0x30, + 0x7b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x61, 0x75, 0x74, 0x6f, + 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x70, 0x75, + 0x73, 0x68, 0x2d, 0x31, 0x32, 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, + 0x31, 0x30, 0x30, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, + 0x6d, 0x2d, 0x70, 0x75, 0x73, 0x68, 0x2d, 0x31, 0x31, 0x7b, 0x6c, + 0x65, 0x66, 0x74, 0x3a, 0x39, 0x31, 0x2e, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, + 0x73, 0x6d, 0x2d, 0x70, 0x75, 0x73, 0x68, 0x2d, 0x31, 0x30, 0x7b, + 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x38, 0x33, 0x2e, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, + 0x2d, 0x73, 0x6d, 0x2d, 0x70, 0x75, 0x73, 0x68, 0x2d, 0x39, 0x7b, + 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x37, 0x35, 0x25, 0x7d, 0x2e, 0x63, + 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x70, 0x75, 0x73, 0x68, 0x2d, + 0x38, 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x36, 0x36, 0x2e, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, + 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x70, 0x75, 0x73, 0x68, 0x2d, + 0x37, 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x35, 0x38, 0x2e, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, 0x2e, 0x63, + 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x70, 0x75, 0x73, 0x68, 0x2d, + 0x36, 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x35, 0x30, 0x25, 0x7d, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x70, 0x75, 0x73, + 0x68, 0x2d, 0x35, 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x34, 0x31, + 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x25, 0x7d, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x70, 0x75, 0x73, + 0x68, 0x2d, 0x34, 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x33, 0x33, + 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x70, 0x75, 0x73, + 0x68, 0x2d, 0x33, 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x32, 0x35, + 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x70, + 0x75, 0x73, 0x68, 0x2d, 0x32, 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, + 0x31, 0x36, 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, + 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x70, + 0x75, 0x73, 0x68, 0x2d, 0x31, 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, + 0x38, 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x25, + 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x70, 0x75, + 0x73, 0x68, 0x2d, 0x30, 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x61, + 0x75, 0x74, 0x6f, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, + 0x2d, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2d, 0x31, 0x32, 0x7b, + 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, + 0x3a, 0x31, 0x30, 0x30, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, + 0x73, 0x6d, 0x2d, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2d, 0x31, + 0x31, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, + 0x66, 0x74, 0x3a, 0x39, 0x31, 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, + 0x6d, 0x2d, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2d, 0x31, 0x30, + 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, + 0x74, 0x3a, 0x38, 0x33, 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, + 0x2d, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2d, 0x39, 0x7b, 0x6d, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, + 0x37, 0x35, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, + 0x2d, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2d, 0x38, 0x7b, 0x6d, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, + 0x36, 0x36, 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, + 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x6f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x2d, 0x37, 0x7b, 0x6d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x35, 0x38, + 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x2d, 0x36, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, + 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x35, 0x30, 0x25, 0x7d, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x2d, 0x35, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, + 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x34, 0x31, 0x2e, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, + 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x6f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x2d, 0x34, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, + 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x33, 0x33, 0x2e, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, + 0x2d, 0x73, 0x6d, 0x2d, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2d, + 0x33, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, + 0x66, 0x74, 0x3a, 0x32, 0x35, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, + 0x2d, 0x73, 0x6d, 0x2d, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2d, + 0x32, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, + 0x66, 0x74, 0x3a, 0x31, 0x36, 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, + 0x6d, 0x2d, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2d, 0x31, 0x7b, + 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, + 0x3a, 0x38, 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x2d, 0x6f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x2d, 0x30, 0x7b, 0x6d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x30, 0x7d, + 0x7d, 0x40, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x20, 0x28, 0x6d, 0x69, + 0x6e, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x39, 0x39, 0x32, + 0x70, 0x78, 0x29, 0x7b, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, + 0x2d, 0x31, 0x2c, 0x20, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, + 0x2d, 0x32, 0x2c, 0x20, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, + 0x2d, 0x33, 0x2c, 0x20, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, + 0x2d, 0x34, 0x2c, 0x20, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, + 0x2d, 0x35, 0x2c, 0x20, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, + 0x2d, 0x36, 0x2c, 0x20, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, + 0x2d, 0x37, 0x2c, 0x20, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, + 0x2d, 0x38, 0x2c, 0x20, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, + 0x2d, 0x39, 0x2c, 0x20, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, + 0x2d, 0x31, 0x30, 0x2c, 0x20, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, + 0x64, 0x2d, 0x31, 0x31, 0x2c, 0x20, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, + 0x6d, 0x64, 0x2d, 0x31, 0x32, 0x7b, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x3a, 0x6c, 0x65, 0x66, 0x74, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, + 0x6d, 0x64, 0x2d, 0x31, 0x32, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x3a, 0x31, 0x30, 0x30, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, + 0x6d, 0x64, 0x2d, 0x31, 0x31, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x3a, 0x39, 0x31, 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, + 0x31, 0x30, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x38, 0x33, + 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x39, 0x7b, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x3a, 0x37, 0x35, 0x25, 0x7d, 0x2e, 0x63, + 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x38, 0x7b, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x3a, 0x36, 0x36, 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, + 0x64, 0x2d, 0x37, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x35, + 0x38, 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x25, + 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x36, 0x7b, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x35, 0x30, 0x25, 0x7d, 0x2e, + 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x35, 0x7b, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3a, 0x34, 0x31, 0x2e, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, + 0x6d, 0x64, 0x2d, 0x34, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, + 0x33, 0x33, 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x33, + 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x32, 0x35, 0x25, 0x7d, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x32, 0x7b, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, 0x36, 0x2e, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, + 0x2d, 0x6d, 0x64, 0x2d, 0x31, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x3a, 0x38, 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x70, + 0x75, 0x6c, 0x6c, 0x2d, 0x31, 0x32, 0x7b, 0x72, 0x69, 0x67, 0x68, + 0x74, 0x3a, 0x31, 0x30, 0x30, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, + 0x2d, 0x6d, 0x64, 0x2d, 0x70, 0x75, 0x6c, 0x6c, 0x2d, 0x31, 0x31, + 0x7b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x39, 0x31, 0x2e, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, + 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x70, 0x75, 0x6c, 0x6c, 0x2d, + 0x31, 0x30, 0x7b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x38, 0x33, + 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x70, 0x75, 0x6c, + 0x6c, 0x2d, 0x39, 0x7b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x37, + 0x35, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, + 0x70, 0x75, 0x6c, 0x6c, 0x2d, 0x38, 0x7b, 0x72, 0x69, 0x67, 0x68, + 0x74, 0x3a, 0x36, 0x36, 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, + 0x2d, 0x70, 0x75, 0x6c, 0x6c, 0x2d, 0x37, 0x7b, 0x72, 0x69, 0x67, + 0x68, 0x74, 0x3a, 0x35, 0x38, 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, + 0x64, 0x2d, 0x70, 0x75, 0x6c, 0x6c, 0x2d, 0x36, 0x7b, 0x72, 0x69, + 0x67, 0x68, 0x74, 0x3a, 0x35, 0x30, 0x25, 0x7d, 0x2e, 0x63, 0x6f, + 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x70, 0x75, 0x6c, 0x6c, 0x2d, 0x35, + 0x7b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x34, 0x31, 0x2e, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, + 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x70, 0x75, 0x6c, 0x6c, 0x2d, + 0x34, 0x7b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x33, 0x33, 0x2e, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, 0x2e, + 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x70, 0x75, 0x6c, 0x6c, + 0x2d, 0x33, 0x7b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x32, 0x35, + 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x70, + 0x75, 0x6c, 0x6c, 0x2d, 0x32, 0x7b, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x3a, 0x31, 0x36, 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, + 0x70, 0x75, 0x6c, 0x6c, 0x2d, 0x31, 0x7b, 0x72, 0x69, 0x67, 0x68, + 0x74, 0x3a, 0x38, 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, + 0x70, 0x75, 0x6c, 0x6c, 0x2d, 0x30, 0x7b, 0x72, 0x69, 0x67, 0x68, + 0x74, 0x3a, 0x61, 0x75, 0x74, 0x6f, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, + 0x2d, 0x6d, 0x64, 0x2d, 0x70, 0x75, 0x73, 0x68, 0x2d, 0x31, 0x32, + 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x31, 0x30, 0x30, 0x25, 0x7d, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x70, 0x75, 0x73, + 0x68, 0x2d, 0x31, 0x31, 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x39, + 0x31, 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x25, + 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x70, 0x75, + 0x73, 0x68, 0x2d, 0x31, 0x30, 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, + 0x38, 0x33, 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x70, + 0x75, 0x73, 0x68, 0x2d, 0x39, 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, + 0x37, 0x35, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, + 0x2d, 0x70, 0x75, 0x73, 0x68, 0x2d, 0x38, 0x7b, 0x6c, 0x65, 0x66, + 0x74, 0x3a, 0x36, 0x36, 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, + 0x2d, 0x70, 0x75, 0x73, 0x68, 0x2d, 0x37, 0x7b, 0x6c, 0x65, 0x66, + 0x74, 0x3a, 0x35, 0x38, 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, + 0x2d, 0x70, 0x75, 0x73, 0x68, 0x2d, 0x36, 0x7b, 0x6c, 0x65, 0x66, + 0x74, 0x3a, 0x35, 0x30, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, + 0x6d, 0x64, 0x2d, 0x70, 0x75, 0x73, 0x68, 0x2d, 0x35, 0x7b, 0x6c, + 0x65, 0x66, 0x74, 0x3a, 0x34, 0x31, 0x2e, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, + 0x6d, 0x64, 0x2d, 0x70, 0x75, 0x73, 0x68, 0x2d, 0x34, 0x7b, 0x6c, + 0x65, 0x66, 0x74, 0x3a, 0x33, 0x33, 0x2e, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, + 0x6d, 0x64, 0x2d, 0x70, 0x75, 0x73, 0x68, 0x2d, 0x33, 0x7b, 0x6c, + 0x65, 0x66, 0x74, 0x3a, 0x32, 0x35, 0x25, 0x7d, 0x2e, 0x63, 0x6f, + 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x70, 0x75, 0x73, 0x68, 0x2d, 0x32, + 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x31, 0x36, 0x2e, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, + 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x70, 0x75, 0x73, 0x68, 0x2d, 0x31, + 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x38, 0x2e, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, + 0x2d, 0x6d, 0x64, 0x2d, 0x70, 0x75, 0x73, 0x68, 0x2d, 0x30, 0x7b, + 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x61, 0x75, 0x74, 0x6f, 0x7d, 0x2e, + 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x2d, 0x31, 0x32, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, + 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x31, 0x30, 0x30, 0x25, + 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x6f, 0x66, + 0x66, 0x73, 0x65, 0x74, 0x2d, 0x31, 0x31, 0x7b, 0x6d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x39, 0x31, + 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x25, 0x7d, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x2d, 0x31, 0x30, 0x7b, 0x6d, 0x61, 0x72, 0x67, + 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x38, 0x33, 0x2e, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, 0x2e, + 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x2d, 0x39, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, + 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x37, 0x35, 0x25, 0x7d, 0x2e, + 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x2d, 0x38, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, + 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x36, 0x36, 0x2e, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, + 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x2d, 0x37, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, + 0x65, 0x66, 0x74, 0x3a, 0x35, 0x38, 0x2e, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, + 0x6d, 0x64, 0x2d, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2d, 0x36, + 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, + 0x74, 0x3a, 0x35, 0x30, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, + 0x6d, 0x64, 0x2d, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2d, 0x35, + 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, + 0x74, 0x3a, 0x34, 0x31, 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, + 0x2d, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2d, 0x34, 0x7b, 0x6d, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, + 0x33, 0x33, 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x6f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x2d, 0x33, 0x7b, 0x6d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x32, 0x35, + 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x6f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x2d, 0x32, 0x7b, 0x6d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x31, 0x36, + 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x25, 0x7d, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x2d, 0x31, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, + 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x38, 0x2e, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, 0x2e, 0x63, 0x6f, + 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x2d, 0x30, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, + 0x65, 0x66, 0x74, 0x3a, 0x30, 0x7d, 0x7d, 0x40, 0x6d, 0x65, 0x64, + 0x69, 0x61, 0x20, 0x28, 0x6d, 0x69, 0x6e, 0x2d, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x3a, 0x31, 0x32, 0x30, 0x30, 0x70, 0x78, 0x29, 0x7b, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x31, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x32, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x33, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x34, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x35, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x36, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x37, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x38, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x39, 0x2c, 0x20, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x31, 0x30, 0x2c, + 0x20, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x31, 0x31, + 0x2c, 0x20, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x31, + 0x32, 0x7b, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3a, 0x6c, 0x65, 0x66, + 0x74, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x31, + 0x32, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, 0x30, 0x30, + 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x31, + 0x31, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x39, 0x31, 0x2e, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x25, 0x7d, 0x2e, + 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x31, 0x30, 0x7b, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x3a, 0x38, 0x33, 0x2e, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, + 0x2d, 0x6c, 0x67, 0x2d, 0x39, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x3a, 0x37, 0x35, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, + 0x67, 0x2d, 0x38, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x36, + 0x36, 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x25, + 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x37, 0x7b, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x35, 0x38, 0x2e, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, 0x2e, 0x63, 0x6f, + 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x36, 0x7b, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x3a, 0x35, 0x30, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, + 0x6c, 0x67, 0x2d, 0x35, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, + 0x34, 0x31, 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, + 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x34, + 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x33, 0x33, 0x2e, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, 0x2e, 0x63, + 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x33, 0x7b, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x3a, 0x32, 0x35, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, + 0x2d, 0x6c, 0x67, 0x2d, 0x32, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x3a, 0x31, 0x36, 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, + 0x31, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x38, 0x2e, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, 0x2e, 0x63, + 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x70, 0x75, 0x6c, 0x6c, 0x2d, + 0x31, 0x32, 0x7b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x31, 0x30, + 0x30, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, + 0x70, 0x75, 0x6c, 0x6c, 0x2d, 0x31, 0x31, 0x7b, 0x72, 0x69, 0x67, + 0x68, 0x74, 0x3a, 0x39, 0x31, 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, + 0x67, 0x2d, 0x70, 0x75, 0x6c, 0x6c, 0x2d, 0x31, 0x30, 0x7b, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x3a, 0x38, 0x33, 0x2e, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, + 0x2d, 0x6c, 0x67, 0x2d, 0x70, 0x75, 0x6c, 0x6c, 0x2d, 0x39, 0x7b, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x37, 0x35, 0x25, 0x7d, 0x2e, + 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x70, 0x75, 0x6c, 0x6c, + 0x2d, 0x38, 0x7b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x36, 0x36, + 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x25, 0x7d, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x70, 0x75, 0x6c, + 0x6c, 0x2d, 0x37, 0x7b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x35, + 0x38, 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x25, + 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x70, 0x75, + 0x6c, 0x6c, 0x2d, 0x36, 0x7b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, + 0x35, 0x30, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, + 0x2d, 0x70, 0x75, 0x6c, 0x6c, 0x2d, 0x35, 0x7b, 0x72, 0x69, 0x67, + 0x68, 0x74, 0x3a, 0x34, 0x31, 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, + 0x67, 0x2d, 0x70, 0x75, 0x6c, 0x6c, 0x2d, 0x34, 0x7b, 0x72, 0x69, + 0x67, 0x68, 0x74, 0x3a, 0x33, 0x33, 0x2e, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, + 0x6c, 0x67, 0x2d, 0x70, 0x75, 0x6c, 0x6c, 0x2d, 0x33, 0x7b, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x3a, 0x32, 0x35, 0x25, 0x7d, 0x2e, 0x63, + 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x70, 0x75, 0x6c, 0x6c, 0x2d, + 0x32, 0x7b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x31, 0x36, 0x2e, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x25, 0x7d, 0x2e, + 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x70, 0x75, 0x6c, 0x6c, + 0x2d, 0x31, 0x7b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x38, 0x2e, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, 0x2e, + 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x70, 0x75, 0x6c, 0x6c, + 0x2d, 0x30, 0x7b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x61, 0x75, + 0x74, 0x6f, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, + 0x70, 0x75, 0x73, 0x68, 0x2d, 0x31, 0x32, 0x7b, 0x6c, 0x65, 0x66, + 0x74, 0x3a, 0x31, 0x30, 0x30, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, + 0x2d, 0x6c, 0x67, 0x2d, 0x70, 0x75, 0x73, 0x68, 0x2d, 0x31, 0x31, + 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x39, 0x31, 0x2e, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, + 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x70, 0x75, 0x73, 0x68, 0x2d, 0x31, + 0x30, 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x38, 0x33, 0x2e, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, 0x2e, 0x63, + 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x70, 0x75, 0x73, 0x68, 0x2d, + 0x39, 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x37, 0x35, 0x25, 0x7d, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x70, 0x75, 0x73, + 0x68, 0x2d, 0x38, 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x36, 0x36, + 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x25, 0x7d, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x70, 0x75, 0x73, + 0x68, 0x2d, 0x37, 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x35, 0x38, + 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x70, 0x75, 0x73, + 0x68, 0x2d, 0x36, 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x35, 0x30, + 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x70, + 0x75, 0x73, 0x68, 0x2d, 0x35, 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, + 0x34, 0x31, 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, + 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x70, + 0x75, 0x73, 0x68, 0x2d, 0x34, 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, + 0x33, 0x33, 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x70, + 0x75, 0x73, 0x68, 0x2d, 0x33, 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, + 0x32, 0x35, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, + 0x2d, 0x70, 0x75, 0x73, 0x68, 0x2d, 0x32, 0x7b, 0x6c, 0x65, 0x66, + 0x74, 0x3a, 0x31, 0x36, 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, + 0x2d, 0x70, 0x75, 0x73, 0x68, 0x2d, 0x31, 0x7b, 0x6c, 0x65, 0x66, + 0x74, 0x3a, 0x38, 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, + 0x70, 0x75, 0x73, 0x68, 0x2d, 0x30, 0x7b, 0x6c, 0x65, 0x66, 0x74, + 0x3a, 0x61, 0x75, 0x74, 0x6f, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, + 0x6c, 0x67, 0x2d, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2d, 0x31, + 0x32, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, + 0x66, 0x74, 0x3a, 0x31, 0x30, 0x30, 0x25, 0x7d, 0x2e, 0x63, 0x6f, + 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x2d, 0x31, 0x31, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, + 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x39, 0x31, 0x2e, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, + 0x2d, 0x6c, 0x67, 0x2d, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2d, + 0x31, 0x30, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, + 0x65, 0x66, 0x74, 0x3a, 0x38, 0x33, 0x2e, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, + 0x6c, 0x67, 0x2d, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2d, 0x39, + 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, + 0x74, 0x3a, 0x37, 0x35, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, + 0x6c, 0x67, 0x2d, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2d, 0x38, + 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, + 0x74, 0x3a, 0x36, 0x36, 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, + 0x2d, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2d, 0x37, 0x7b, 0x6d, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, + 0x35, 0x38, 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x6f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x2d, 0x36, 0x7b, 0x6d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x35, 0x30, + 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x6f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x2d, 0x35, 0x7b, 0x6d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x34, 0x31, + 0x2e, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x25, 0x7d, + 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x2d, 0x34, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, + 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x33, 0x33, 0x2e, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x25, 0x7d, 0x2e, 0x63, + 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x6f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x2d, 0x33, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, + 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x32, 0x35, 0x25, 0x7d, 0x2e, 0x63, + 0x6f, 0x6c, 0x2d, 0x6c, 0x67, 0x2d, 0x6f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x2d, 0x32, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, + 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x31, 0x36, 0x2e, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x37, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, + 0x2d, 0x6c, 0x67, 0x2d, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2d, + 0x31, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, + 0x66, 0x74, 0x3a, 0x38, 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x25, 0x7d, 0x2e, 0x63, 0x6f, 0x6c, 0x2d, 0x6c, 0x67, + 0x2d, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2d, 0x30, 0x7b, 0x6d, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, + 0x30, 0x7d, 0x7d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x7b, 0x62, 0x61, + 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x7d, 0x63, 0x61, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x7b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x74, + 0x6f, 0x70, 0x3a, 0x38, 0x70, 0x78, 0x3b, 0x70, 0x61, 0x64, 0x64, + 0x69, 0x6e, 0x67, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, + 0x38, 0x70, 0x78, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, + 0x37, 0x37, 0x37, 0x3b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x3a, 0x6c, 0x65, 0x66, 0x74, 0x7d, 0x74, 0x68, + 0x7b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, + 0x3a, 0x6c, 0x65, 0x66, 0x74, 0x7d, 0x2e, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, 0x30, 0x30, + 0x25, 0x3b, 0x6d, 0x61, 0x78, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x3a, 0x31, 0x30, 0x30, 0x25, 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, + 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x32, 0x30, + 0x70, 0x78, 0x7d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, + 0x68, 0x65, 0x61, 0x64, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x68, 0x2c, + 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x62, 0x6f, 0x64, + 0x79, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x68, 0x2c, 0x2e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x66, 0x6f, 0x6f, 0x74, 0x3e, 0x74, + 0x72, 0x3e, 0x74, 0x68, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x3e, 0x74, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x74, 0x72, 0x3e, 0x74, + 0x64, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x62, + 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x64, 0x2c, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x66, 0x6f, 0x6f, 0x74, + 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x64, 0x7b, 0x70, 0x61, 0x64, 0x64, + 0x69, 0x6e, 0x67, 0x3a, 0x38, 0x70, 0x78, 0x3b, 0x6c, 0x69, 0x6e, + 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x31, 0x2e, + 0x34, 0x32, 0x38, 0x35, 0x37, 0x31, 0x34, 0x33, 0x3b, 0x76, 0x65, + 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x2d, 0x61, 0x6c, 0x69, 0x67, + 0x6e, 0x3a, 0x74, 0x6f, 0x70, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x31, 0x70, 0x78, 0x20, 0x73, + 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x23, 0x64, 0x64, 0x64, 0x7d, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x68, 0x65, 0x61, 0x64, + 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x68, 0x7b, 0x76, 0x65, 0x72, 0x74, + 0x69, 0x63, 0x61, 0x6c, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, + 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3b, 0x62, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x32, + 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x23, 0x64, + 0x64, 0x64, 0x7d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x63, + 0x61, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2b, 0x74, 0x68, 0x65, 0x61, + 0x64, 0x3e, 0x74, 0x72, 0x3a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x2d, + 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x74, 0x68, 0x2c, 0x2e, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x63, 0x6f, 0x6c, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x2b, 0x74, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x74, 0x72, + 0x3a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x2d, 0x63, 0x68, 0x69, 0x6c, + 0x64, 0x3e, 0x74, 0x68, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x3e, 0x74, 0x68, 0x65, 0x61, 0x64, 0x3a, 0x66, 0x69, 0x72, 0x73, + 0x74, 0x2d, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x74, 0x72, 0x3a, + 0x66, 0x69, 0x72, 0x73, 0x74, 0x2d, 0x63, 0x68, 0x69, 0x6c, 0x64, + 0x3e, 0x74, 0x68, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, + 0x63, 0x61, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2b, 0x74, 0x68, 0x65, + 0x61, 0x64, 0x3e, 0x74, 0x72, 0x3a, 0x66, 0x69, 0x72, 0x73, 0x74, + 0x2d, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x74, 0x64, 0x2c, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x63, 0x6f, 0x6c, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x2b, 0x74, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x74, + 0x72, 0x3a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x2d, 0x63, 0x68, 0x69, + 0x6c, 0x64, 0x3e, 0x74, 0x64, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x3e, 0x74, 0x68, 0x65, 0x61, 0x64, 0x3a, 0x66, 0x69, 0x72, + 0x73, 0x74, 0x2d, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x74, 0x72, + 0x3a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x2d, 0x63, 0x68, 0x69, 0x6c, + 0x64, 0x3e, 0x74, 0x64, 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x30, 0x7d, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x2b, 0x74, 0x62, + 0x6f, 0x64, 0x79, 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, + 0x74, 0x6f, 0x70, 0x3a, 0x32, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, + 0x69, 0x64, 0x20, 0x23, 0x64, 0x64, 0x64, 0x7d, 0x2e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x7b, + 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x7d, + 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x63, 0x6f, 0x6e, 0x64, + 0x65, 0x6e, 0x73, 0x65, 0x64, 0x3e, 0x74, 0x68, 0x65, 0x61, 0x64, + 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x68, 0x2c, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2d, 0x63, 0x6f, 0x6e, 0x64, 0x65, 0x6e, 0x73, 0x65, + 0x64, 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, 0x3e, + 0x74, 0x68, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x63, + 0x6f, 0x6e, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x64, 0x3e, 0x74, 0x66, + 0x6f, 0x6f, 0x74, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x68, 0x2c, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x63, 0x6f, 0x6e, 0x64, 0x65, + 0x6e, 0x73, 0x65, 0x64, 0x3e, 0x74, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0x74, 0x72, 0x3e, 0x74, 0x64, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2d, 0x63, 0x6f, 0x6e, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x64, + 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, 0x3e, 0x74, + 0x64, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x63, 0x6f, + 0x6e, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x64, 0x3e, 0x74, 0x66, 0x6f, + 0x6f, 0x74, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x64, 0x7b, 0x70, 0x61, + 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x35, 0x70, 0x78, 0x7d, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x62, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x65, 0x64, 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, + 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x23, + 0x64, 0x64, 0x64, 0x7d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, + 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x3e, 0x74, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x68, 0x2c, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x62, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x65, 0x64, 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, + 0x72, 0x3e, 0x74, 0x68, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2d, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x3e, 0x74, + 0x66, 0x6f, 0x6f, 0x74, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x68, 0x2c, + 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x62, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x65, 0x64, 0x3e, 0x74, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0x74, 0x72, 0x3e, 0x74, 0x64, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2d, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x3e, + 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x64, + 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x62, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x65, 0x64, 0x3e, 0x74, 0x66, 0x6f, 0x6f, 0x74, + 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x64, 0x7b, 0x62, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x3a, 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, + 0x64, 0x20, 0x23, 0x64, 0x64, 0x64, 0x7d, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2d, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, + 0x3e, 0x74, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x74, 0x72, 0x3e, 0x74, + 0x68, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x62, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x3e, 0x74, 0x68, 0x65, 0x61, + 0x64, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x64, 0x7b, 0x62, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x2d, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x32, 0x70, 0x78, 0x7d, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x73, 0x74, 0x72, 0x69, 0x70, + 0x65, 0x64, 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, + 0x3a, 0x6e, 0x74, 0x68, 0x2d, 0x6f, 0x66, 0x2d, 0x74, 0x79, 0x70, + 0x65, 0x28, 0x6f, 0x64, 0x64, 0x29, 0x7b, 0x62, 0x61, 0x63, 0x6b, + 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x23, 0x66, 0x39, 0x66, 0x39, 0x66, 0x39, 0x7d, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x68, 0x6f, 0x76, 0x65, 0x72, + 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, 0x3a, 0x68, + 0x6f, 0x76, 0x65, 0x72, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, + 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, + 0x23, 0x66, 0x35, 0x66, 0x35, 0x66, 0x35, 0x7d, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x5b, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x2a, 0x3d, 0x22, 0x63, 0x6f, 0x6c, 0x2d, 0x22, 0x5d, 0x7b, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x73, 0x74, + 0x61, 0x74, 0x69, 0x63, 0x3b, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3a, + 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x3a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x63, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x7d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, + 0x64, 0x5b, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x2a, 0x3d, 0x22, 0x63, + 0x6f, 0x6c, 0x2d, 0x22, 0x5d, 0x2c, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x74, 0x68, 0x5b, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x2a, 0x3d, + 0x22, 0x63, 0x6f, 0x6c, 0x2d, 0x22, 0x5d, 0x7b, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x73, 0x74, 0x61, 0x74, 0x69, + 0x63, 0x3b, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3a, 0x6e, 0x6f, 0x6e, + 0x65, 0x3b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x63, 0x65, 0x6c, 0x6c, 0x7d, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x68, 0x65, 0x61, 0x64, + 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x64, 0x2e, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, + 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x64, 0x2e, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2c, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x3e, 0x74, 0x66, 0x6f, 0x6f, 0x74, 0x3e, 0x74, 0x72, + 0x3e, 0x74, 0x64, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2c, + 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x68, 0x65, 0x61, + 0x64, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x68, 0x2e, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, + 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x68, + 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2c, 0x2e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x66, 0x6f, 0x6f, 0x74, 0x3e, 0x74, + 0x72, 0x3e, 0x74, 0x68, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x68, 0x65, + 0x61, 0x64, 0x3e, 0x74, 0x72, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x3e, 0x74, 0x64, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, 0x2e, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x3e, 0x74, 0x64, 0x2c, 0x2e, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x66, 0x6f, 0x6f, 0x74, 0x3e, + 0x74, 0x72, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x3e, 0x74, + 0x64, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0x74, 0x72, 0x2e, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x3e, 0x74, 0x68, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, 0x2e, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x3e, 0x74, 0x68, 0x2c, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x66, 0x6f, 0x6f, 0x74, + 0x3e, 0x74, 0x72, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x3e, + 0x74, 0x68, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, + 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, + 0x35, 0x66, 0x35, 0x66, 0x35, 0x7d, 0x2e, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2d, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x3e, 0x74, 0x62, 0x6f, + 0x64, 0x79, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x64, 0x2e, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, + 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x68, 0x6f, 0x76, 0x65, + 0x72, 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, 0x3e, + 0x74, 0x68, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x3a, 0x68, + 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2d, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x3e, 0x74, 0x62, 0x6f, 0x64, + 0x79, 0x3e, 0x74, 0x72, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x3e, 0x74, 0x64, 0x2c, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x68, 0x6f, 0x76, 0x65, 0x72, + 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, 0x3a, 0x68, + 0x6f, 0x76, 0x65, 0x72, 0x3e, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x68, 0x6f, + 0x76, 0x65, 0x72, 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, + 0x72, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x3a, 0x68, 0x6f, + 0x76, 0x65, 0x72, 0x3e, 0x74, 0x68, 0x7b, 0x62, 0x61, 0x63, 0x6b, + 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x23, 0x65, 0x38, 0x65, 0x38, 0x65, 0x38, 0x7d, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x68, 0x65, 0x61, 0x64, + 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x64, 0x2e, 0x73, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, + 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x64, + 0x2e, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2c, 0x2e, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x66, 0x6f, 0x6f, 0x74, 0x3e, + 0x74, 0x72, 0x3e, 0x74, 0x64, 0x2e, 0x73, 0x75, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, + 0x68, 0x65, 0x61, 0x64, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x68, 0x2e, + 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2c, 0x2e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, + 0x72, 0x3e, 0x74, 0x68, 0x2e, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x66, + 0x6f, 0x6f, 0x74, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x68, 0x2e, 0x73, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2c, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x3e, 0x74, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x74, 0x72, + 0x2e, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x3e, 0x74, 0x64, + 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x62, 0x6f, + 0x64, 0x79, 0x3e, 0x74, 0x72, 0x2e, 0x73, 0x75, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x3e, 0x74, 0x64, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x3e, 0x74, 0x66, 0x6f, 0x6f, 0x74, 0x3e, 0x74, 0x72, 0x2e, + 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x3e, 0x74, 0x64, 0x2c, + 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x68, 0x65, 0x61, + 0x64, 0x3e, 0x74, 0x72, 0x2e, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x3e, 0x74, 0x68, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, 0x2e, 0x73, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x3e, 0x74, 0x68, 0x2c, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x66, 0x6f, 0x6f, 0x74, + 0x3e, 0x74, 0x72, 0x2e, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x3e, 0x74, 0x68, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, + 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, + 0x64, 0x66, 0x66, 0x30, 0x64, 0x38, 0x7d, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2d, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x3e, 0x74, 0x62, + 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x64, 0x2e, 0x73, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x3a, 0x68, 0x6f, 0x76, 0x65, + 0x72, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x68, 0x6f, + 0x76, 0x65, 0x72, 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, + 0x72, 0x3e, 0x74, 0x68, 0x2e, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2d, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x3e, 0x74, + 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, 0x2e, 0x73, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x3e, + 0x74, 0x64, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x68, + 0x6f, 0x76, 0x65, 0x72, 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, + 0x74, 0x72, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x3e, 0x2e, 0x73, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2c, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2d, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x3e, 0x74, 0x62, + 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, 0x2e, 0x73, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x3e, 0x74, + 0x68, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x64, 0x30, + 0x65, 0x39, 0x63, 0x36, 0x7d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x3e, 0x74, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x74, 0x72, 0x3e, 0x74, + 0x64, 0x2e, 0x69, 0x6e, 0x66, 0x6f, 0x2c, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, + 0x3e, 0x74, 0x64, 0x2e, 0x69, 0x6e, 0x66, 0x6f, 0x2c, 0x2e, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x66, 0x6f, 0x6f, 0x74, 0x3e, + 0x74, 0x72, 0x3e, 0x74, 0x64, 0x2e, 0x69, 0x6e, 0x66, 0x6f, 0x2c, + 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x68, 0x65, 0x61, + 0x64, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x68, 0x2e, 0x69, 0x6e, 0x66, + 0x6f, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x62, + 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x68, 0x2e, 0x69, + 0x6e, 0x66, 0x6f, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, + 0x74, 0x66, 0x6f, 0x6f, 0x74, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x68, + 0x2e, 0x69, 0x6e, 0x66, 0x6f, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x3e, 0x74, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x74, 0x72, 0x2e, + 0x69, 0x6e, 0x66, 0x6f, 0x3e, 0x74, 0x64, 0x2c, 0x2e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, + 0x72, 0x2e, 0x69, 0x6e, 0x66, 0x6f, 0x3e, 0x74, 0x64, 0x2c, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x66, 0x6f, 0x6f, 0x74, + 0x3e, 0x74, 0x72, 0x2e, 0x69, 0x6e, 0x66, 0x6f, 0x3e, 0x74, 0x64, + 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x68, 0x65, + 0x61, 0x64, 0x3e, 0x74, 0x72, 0x2e, 0x69, 0x6e, 0x66, 0x6f, 0x3e, + 0x74, 0x68, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, + 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, 0x2e, 0x69, 0x6e, 0x66, + 0x6f, 0x3e, 0x74, 0x68, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x3e, 0x74, 0x66, 0x6f, 0x6f, 0x74, 0x3e, 0x74, 0x72, 0x2e, 0x69, + 0x6e, 0x66, 0x6f, 0x3e, 0x74, 0x68, 0x7b, 0x62, 0x61, 0x63, 0x6b, + 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x23, 0x64, 0x39, 0x65, 0x64, 0x66, 0x37, 0x7d, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x68, 0x6f, 0x76, 0x65, 0x72, + 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, 0x3e, 0x74, + 0x64, 0x2e, 0x69, 0x6e, 0x66, 0x6f, 0x3a, 0x68, 0x6f, 0x76, 0x65, + 0x72, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x68, 0x6f, + 0x76, 0x65, 0x72, 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, + 0x72, 0x3e, 0x74, 0x68, 0x2e, 0x69, 0x6e, 0x66, 0x6f, 0x3a, 0x68, + 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2d, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x3e, 0x74, 0x62, 0x6f, 0x64, + 0x79, 0x3e, 0x74, 0x72, 0x2e, 0x69, 0x6e, 0x66, 0x6f, 0x3a, 0x68, + 0x6f, 0x76, 0x65, 0x72, 0x3e, 0x74, 0x64, 0x2c, 0x2e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2d, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x3e, 0x74, + 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, 0x3a, 0x68, 0x6f, 0x76, + 0x65, 0x72, 0x3e, 0x2e, 0x69, 0x6e, 0x66, 0x6f, 0x2c, 0x2e, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x3e, + 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, 0x2e, 0x69, 0x6e, + 0x66, 0x6f, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x3e, 0x74, 0x68, + 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, + 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x63, 0x34, 0x65, + 0x33, 0x66, 0x33, 0x7d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, + 0x74, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x64, + 0x2e, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x2c, 0x2e, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, + 0x74, 0x72, 0x3e, 0x74, 0x64, 0x2e, 0x77, 0x61, 0x72, 0x6e, 0x69, + 0x6e, 0x67, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, + 0x66, 0x6f, 0x6f, 0x74, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x64, 0x2e, + 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x2c, 0x2e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x74, + 0x72, 0x3e, 0x74, 0x68, 0x2e, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, + 0x67, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x62, + 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x68, 0x2e, 0x77, + 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x2c, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x3e, 0x74, 0x66, 0x6f, 0x6f, 0x74, 0x3e, 0x74, 0x72, + 0x3e, 0x74, 0x68, 0x2e, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, + 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x68, 0x65, + 0x61, 0x64, 0x3e, 0x74, 0x72, 0x2e, 0x77, 0x61, 0x72, 0x6e, 0x69, + 0x6e, 0x67, 0x3e, 0x74, 0x64, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, 0x2e, + 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x3e, 0x74, 0x64, 0x2c, + 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x66, 0x6f, 0x6f, + 0x74, 0x3e, 0x74, 0x72, 0x2e, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, + 0x67, 0x3e, 0x74, 0x64, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x3e, 0x74, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x74, 0x72, 0x2e, 0x77, + 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x3e, 0x74, 0x68, 0x2c, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, + 0x3e, 0x74, 0x72, 0x2e, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, + 0x3e, 0x74, 0x68, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, + 0x74, 0x66, 0x6f, 0x6f, 0x74, 0x3e, 0x74, 0x72, 0x2e, 0x77, 0x61, + 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x3e, 0x74, 0x68, 0x7b, 0x62, 0x61, + 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x63, 0x66, 0x38, 0x65, 0x33, + 0x7d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x68, 0x6f, 0x76, + 0x65, 0x72, 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, + 0x3e, 0x74, 0x64, 0x2e, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, + 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2d, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x3e, 0x74, 0x62, + 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x68, 0x2e, 0x77, + 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x3a, 0x68, 0x6f, 0x76, 0x65, + 0x72, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x68, 0x6f, + 0x76, 0x65, 0x72, 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, + 0x72, 0x2e, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x3a, 0x68, + 0x6f, 0x76, 0x65, 0x72, 0x3e, 0x74, 0x64, 0x2c, 0x2e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2d, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x3e, 0x74, + 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, 0x3a, 0x68, 0x6f, 0x76, + 0x65, 0x72, 0x3e, 0x2e, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, + 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x68, 0x6f, 0x76, + 0x65, 0x72, 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, + 0x2e, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x3a, 0x68, 0x6f, + 0x76, 0x65, 0x72, 0x3e, 0x74, 0x68, 0x7b, 0x62, 0x61, 0x63, 0x6b, + 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x23, 0x66, 0x61, 0x66, 0x32, 0x63, 0x63, 0x7d, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x68, 0x65, 0x61, 0x64, + 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x64, 0x2e, 0x64, 0x61, 0x6e, 0x67, + 0x65, 0x72, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, + 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x64, 0x2e, + 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x2c, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x3e, 0x74, 0x66, 0x6f, 0x6f, 0x74, 0x3e, 0x74, 0x72, + 0x3e, 0x74, 0x64, 0x2e, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x2c, + 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x68, 0x65, 0x61, + 0x64, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x68, 0x2e, 0x64, 0x61, 0x6e, + 0x67, 0x65, 0x72, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, + 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x68, + 0x2e, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x2c, 0x2e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x66, 0x6f, 0x6f, 0x74, 0x3e, 0x74, + 0x72, 0x3e, 0x74, 0x68, 0x2e, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, + 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x68, 0x65, + 0x61, 0x64, 0x3e, 0x74, 0x72, 0x2e, 0x64, 0x61, 0x6e, 0x67, 0x65, + 0x72, 0x3e, 0x74, 0x64, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, 0x2e, 0x64, + 0x61, 0x6e, 0x67, 0x65, 0x72, 0x3e, 0x74, 0x64, 0x2c, 0x2e, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x66, 0x6f, 0x6f, 0x74, 0x3e, + 0x74, 0x72, 0x2e, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x3e, 0x74, + 0x64, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0x74, 0x72, 0x2e, 0x64, 0x61, 0x6e, 0x67, + 0x65, 0x72, 0x3e, 0x74, 0x68, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, 0x2e, + 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x3e, 0x74, 0x68, 0x2c, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x66, 0x6f, 0x6f, 0x74, + 0x3e, 0x74, 0x72, 0x2e, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x3e, + 0x74, 0x68, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, + 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, + 0x32, 0x64, 0x65, 0x64, 0x65, 0x7d, 0x2e, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2d, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x3e, 0x74, 0x62, 0x6f, + 0x64, 0x79, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x64, 0x2e, 0x64, 0x61, + 0x6e, 0x67, 0x65, 0x72, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, + 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x68, 0x6f, 0x76, 0x65, + 0x72, 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, 0x3e, + 0x74, 0x68, 0x2e, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x3a, 0x68, + 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2d, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x3e, 0x74, 0x62, 0x6f, 0x64, + 0x79, 0x3e, 0x74, 0x72, 0x2e, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, + 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x3e, 0x74, 0x64, 0x2c, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x68, 0x6f, 0x76, 0x65, 0x72, + 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, 0x3a, 0x68, + 0x6f, 0x76, 0x65, 0x72, 0x3e, 0x2e, 0x64, 0x61, 0x6e, 0x67, 0x65, + 0x72, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x68, 0x6f, + 0x76, 0x65, 0x72, 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, + 0x72, 0x2e, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x3a, 0x68, 0x6f, + 0x76, 0x65, 0x72, 0x3e, 0x74, 0x68, 0x7b, 0x62, 0x61, 0x63, 0x6b, + 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x23, 0x65, 0x62, 0x63, 0x63, 0x63, 0x63, 0x7d, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x69, 0x76, 0x65, 0x7b, 0x6f, 0x76, 0x65, 0x72, 0x66, + 0x6c, 0x6f, 0x77, 0x2d, 0x78, 0x3a, 0x61, 0x75, 0x74, 0x6f, 0x3b, + 0x6d, 0x69, 0x6e, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, + 0x30, 0x2e, 0x30, 0x31, 0x25, 0x7d, 0x40, 0x6d, 0x65, 0x64, 0x69, + 0x61, 0x20, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x28, 0x6d, 0x61, 0x78, 0x2d, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x3a, 0x37, 0x36, 0x37, 0x70, 0x78, 0x29, 0x7b, 0x2e, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x69, 0x76, 0x65, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, + 0x31, 0x30, 0x30, 0x25, 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, + 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x31, 0x35, 0x70, + 0x78, 0x3b, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x2d, + 0x79, 0x3a, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x3b, 0x2d, 0x6d, + 0x73, 0x2d, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x2d, + 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3a, 0x2d, 0x6d, 0x73, 0x2d, 0x61, + 0x75, 0x74, 0x6f, 0x68, 0x69, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x73, + 0x63, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x72, 0x3b, 0x62, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x3a, 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, + 0x6c, 0x69, 0x64, 0x20, 0x23, 0x64, 0x64, 0x64, 0x7d, 0x2e, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x69, 0x76, 0x65, 0x3e, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, + 0x74, 0x6f, 0x6d, 0x3a, 0x30, 0x7d, 0x2e, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x76, + 0x65, 0x3e, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x68, 0x2c, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x69, 0x76, 0x65, 0x3e, 0x2e, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, 0x3e, + 0x74, 0x68, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x3e, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x66, 0x6f, 0x6f, 0x74, + 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x68, 0x2c, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, + 0x76, 0x65, 0x3e, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, + 0x68, 0x65, 0x61, 0x64, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x64, 0x2c, + 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x3e, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, + 0x3e, 0x74, 0x64, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x3e, + 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x74, 0x66, 0x6f, 0x6f, + 0x74, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x64, 0x7b, 0x77, 0x68, 0x69, + 0x74, 0x65, 0x2d, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3a, 0x6e, 0x6f, + 0x77, 0x72, 0x61, 0x70, 0x7d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x76, 0x65, + 0x3e, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x62, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x65, 0x64, 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x3a, 0x30, 0x7d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x3e, + 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x62, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x65, 0x64, 0x3e, 0x74, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0x74, 0x72, 0x3e, 0x74, 0x68, 0x3a, 0x66, 0x69, 0x72, 0x73, 0x74, + 0x2d, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x2c, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, + 0x76, 0x65, 0x3e, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x62, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x3e, 0x74, 0x62, 0x6f, + 0x64, 0x79, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x68, 0x3a, 0x66, 0x69, + 0x72, 0x73, 0x74, 0x2d, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x2c, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x69, 0x76, 0x65, 0x3e, 0x2e, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2d, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x3e, + 0x74, 0x66, 0x6f, 0x6f, 0x74, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x68, + 0x3a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x2d, 0x63, 0x68, 0x69, 0x6c, + 0x64, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x3e, 0x2e, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x65, 0x64, 0x3e, 0x74, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x74, 0x72, + 0x3e, 0x74, 0x64, 0x3a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x2d, 0x63, + 0x68, 0x69, 0x6c, 0x64, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x76, 0x65, + 0x3e, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x62, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x65, 0x64, 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, + 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x64, 0x3a, 0x66, 0x69, 0x72, 0x73, + 0x74, 0x2d, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x2c, 0x2e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x69, 0x76, 0x65, 0x3e, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, + 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x3e, 0x74, 0x66, + 0x6f, 0x6f, 0x74, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x64, 0x3a, 0x66, + 0x69, 0x72, 0x73, 0x74, 0x2d, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x7b, + 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x6c, 0x65, 0x66, 0x74, + 0x3a, 0x30, 0x7d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x3e, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x62, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x65, 0x64, 0x3e, 0x74, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x74, + 0x72, 0x3e, 0x74, 0x68, 0x3a, 0x6c, 0x61, 0x73, 0x74, 0x2d, 0x63, + 0x68, 0x69, 0x6c, 0x64, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x76, 0x65, + 0x3e, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x62, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x65, 0x64, 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, + 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x68, 0x3a, 0x6c, 0x61, 0x73, 0x74, + 0x2d, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x2c, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, + 0x76, 0x65, 0x3e, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x62, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x3e, 0x74, 0x66, 0x6f, + 0x6f, 0x74, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x68, 0x3a, 0x6c, 0x61, + 0x73, 0x74, 0x2d, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x2c, 0x2e, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x69, 0x76, 0x65, 0x3e, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2d, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x3e, 0x74, + 0x68, 0x65, 0x61, 0x64, 0x3e, 0x74, 0x72, 0x3e, 0x74, 0x64, 0x3a, + 0x6c, 0x61, 0x73, 0x74, 0x2d, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x2c, + 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x3e, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2d, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, + 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, 0x3e, 0x74, + 0x64, 0x3a, 0x6c, 0x61, 0x73, 0x74, 0x2d, 0x63, 0x68, 0x69, 0x6c, + 0x64, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x3e, 0x2e, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x65, 0x64, 0x3e, 0x74, 0x66, 0x6f, 0x6f, 0x74, 0x3e, 0x74, 0x72, + 0x3e, 0x74, 0x64, 0x3a, 0x6c, 0x61, 0x73, 0x74, 0x2d, 0x63, 0x68, + 0x69, 0x6c, 0x64, 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x30, 0x7d, 0x2e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x69, 0x76, 0x65, 0x3e, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, + 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x3e, 0x74, 0x62, + 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, 0x3a, 0x6c, 0x61, 0x73, 0x74, + 0x2d, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x74, 0x68, 0x2c, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x69, 0x76, 0x65, 0x3e, 0x2e, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2d, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x3e, + 0x74, 0x66, 0x6f, 0x6f, 0x74, 0x3e, 0x74, 0x72, 0x3a, 0x6c, 0x61, + 0x73, 0x74, 0x2d, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x74, 0x68, + 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x3e, 0x2e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2d, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, + 0x64, 0x3e, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x74, 0x72, 0x3a, + 0x6c, 0x61, 0x73, 0x74, 0x2d, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, + 0x74, 0x64, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x3e, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x62, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x65, 0x64, 0x3e, 0x74, 0x66, 0x6f, 0x6f, 0x74, 0x3e, 0x74, + 0x72, 0x3a, 0x6c, 0x61, 0x73, 0x74, 0x2d, 0x63, 0x68, 0x69, 0x6c, + 0x64, 0x3e, 0x74, 0x64, 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x30, 0x7d, 0x7d, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x65, 0x74, 0x7b, 0x70, 0x61, + 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x30, 0x3b, 0x6d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x3a, 0x30, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x3a, 0x30, 0x3b, 0x6d, 0x69, 0x6e, 0x2d, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x3a, 0x30, 0x7d, 0x6c, 0x65, 0x67, 0x65, 0x6e, 0x64, + 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x3b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, + 0x30, 0x30, 0x25, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, + 0x3a, 0x30, 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62, + 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x32, 0x30, 0x70, 0x78, 0x3b, + 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x32, + 0x31, 0x70, 0x78, 0x3b, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x68, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x3a, 0x69, 0x6e, 0x68, 0x65, 0x72, 0x69, + 0x74, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x33, 0x33, + 0x33, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x30, 0x3b, + 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x62, 0x6f, 0x74, 0x74, + 0x6f, 0x6d, 0x3a, 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, + 0x64, 0x20, 0x23, 0x65, 0x35, 0x65, 0x35, 0x65, 0x35, 0x7d, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x3a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x3b, 0x6d, 0x61, 0x78, 0x2d, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x3a, 0x31, 0x30, 0x30, 0x25, 0x3b, 0x6d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, + 0x35, 0x70, 0x78, 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x3a, 0x62, 0x6f, 0x6c, 0x64, 0x7d, 0x69, + 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x22, 0x5d, 0x7b, 0x2d, 0x77, + 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x62, 0x6f, 0x78, 0x2d, 0x73, + 0x69, 0x7a, 0x69, 0x6e, 0x67, 0x3a, 0x62, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x2d, 0x62, 0x6f, 0x78, 0x3b, 0x2d, 0x6d, 0x6f, 0x7a, 0x2d, + 0x62, 0x6f, 0x78, 0x2d, 0x73, 0x69, 0x7a, 0x69, 0x6e, 0x67, 0x3a, + 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x62, 0x6f, 0x78, 0x3b, + 0x62, 0x6f, 0x78, 0x2d, 0x73, 0x69, 0x7a, 0x69, 0x6e, 0x67, 0x3a, + 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x62, 0x6f, 0x78, 0x7d, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, + 0x22, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x22, 0x5d, 0x2c, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x62, 0x6f, 0x78, 0x22, 0x5d, 0x7b, 0x6d, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x34, 0x70, 0x78, 0x20, 0x30, + 0x20, 0x30, 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x74, + 0x6f, 0x70, 0x3a, 0x31, 0x70, 0x78, 0x20, 0x5c, 0x39, 0x3b, 0x6c, + 0x69, 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, + 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x7d, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x66, 0x69, 0x6c, + 0x65, 0x22, 0x5d, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, + 0x3a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x7d, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x72, 0x61, 0x6e, + 0x67, 0x65, 0x22, 0x5d, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x3a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3b, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x3a, 0x31, 0x30, 0x30, 0x25, 0x7d, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x5b, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, + 0x65, 0x5d, 0x2c, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x5b, 0x73, + 0x69, 0x7a, 0x65, 0x5d, 0x7b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x3a, 0x61, 0x75, 0x74, 0x6f, 0x7d, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x66, 0x69, 0x6c, 0x65, + 0x22, 0x5d, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x72, + 0x61, 0x64, 0x69, 0x6f, 0x22, 0x5d, 0x3a, 0x66, 0x6f, 0x63, 0x75, + 0x73, 0x2c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, + 0x65, 0x3d, 0x22, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x62, 0x6f, 0x78, + 0x22, 0x5d, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x7b, 0x6f, 0x75, + 0x74, 0x6c, 0x69, 0x6e, 0x65, 0x3a, 0x35, 0x70, 0x78, 0x20, 0x61, + 0x75, 0x74, 0x6f, 0x20, 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, + 0x2d, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2d, 0x72, 0x69, 0x6e, 0x67, + 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x6f, 0x75, 0x74, 0x6c, + 0x69, 0x6e, 0x65, 0x2d, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3a, + 0x2d, 0x32, 0x70, 0x78, 0x7d, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, + 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x37, 0x70, 0x78, 0x3b, 0x66, 0x6f, + 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x31, 0x34, 0x70, + 0x78, 0x3b, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x3a, 0x31, 0x2e, 0x34, 0x32, 0x38, 0x35, 0x37, 0x31, + 0x34, 0x33, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x35, + 0x35, 0x35, 0x7d, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, + 0x61, 0x79, 0x3a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3b, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3a, 0x31, 0x30, 0x30, 0x25, 0x3b, 0x68, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x3a, 0x33, 0x34, 0x70, 0x78, 0x3b, 0x70, + 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x36, 0x70, 0x78, 0x20, + 0x31, 0x32, 0x70, 0x78, 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, + 0x69, 0x7a, 0x65, 0x3a, 0x31, 0x34, 0x70, 0x78, 0x3b, 0x6c, 0x69, + 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x31, + 0x2e, 0x34, 0x32, 0x38, 0x35, 0x37, 0x31, 0x34, 0x33, 0x3b, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x35, 0x35, 0x35, 0x3b, 0x62, + 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x62, + 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x69, + 0x6d, 0x61, 0x67, 0x65, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x62, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x31, 0x70, 0x78, 0x20, 0x73, + 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x23, 0x63, 0x63, 0x63, 0x3b, 0x62, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, + 0x73, 0x3a, 0x34, 0x70, 0x78, 0x3b, 0x2d, 0x77, 0x65, 0x62, 0x6b, + 0x69, 0x74, 0x2d, 0x62, 0x6f, 0x78, 0x2d, 0x73, 0x68, 0x61, 0x64, + 0x6f, 0x77, 0x3a, 0x69, 0x6e, 0x73, 0x65, 0x74, 0x20, 0x30, 0x20, + 0x31, 0x70, 0x78, 0x20, 0x31, 0x70, 0x78, 0x20, 0x72, 0x67, 0x62, + 0x61, 0x28, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2e, 0x30, + 0x37, 0x35, 0x29, 0x3b, 0x62, 0x6f, 0x78, 0x2d, 0x73, 0x68, 0x61, + 0x64, 0x6f, 0x77, 0x3a, 0x69, 0x6e, 0x73, 0x65, 0x74, 0x20, 0x30, + 0x20, 0x31, 0x70, 0x78, 0x20, 0x31, 0x70, 0x78, 0x20, 0x72, 0x67, + 0x62, 0x61, 0x28, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2e, + 0x30, 0x37, 0x35, 0x29, 0x3b, 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, + 0x74, 0x2d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x3a, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x20, 0x65, 0x61, 0x73, 0x65, 0x2d, 0x69, 0x6e, + 0x2d, 0x6f, 0x75, 0x74, 0x20, 0x2e, 0x31, 0x35, 0x73, 0x2c, 0x20, + 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x62, 0x6f, 0x78, + 0x2d, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x20, 0x65, 0x61, 0x73, + 0x65, 0x2d, 0x69, 0x6e, 0x2d, 0x6f, 0x75, 0x74, 0x20, 0x2e, 0x31, + 0x35, 0x73, 0x3b, 0x2d, 0x6f, 0x2d, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x62, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x65, 0x61, 0x73, + 0x65, 0x2d, 0x69, 0x6e, 0x2d, 0x6f, 0x75, 0x74, 0x20, 0x2e, 0x31, + 0x35, 0x73, 0x2c, 0x20, 0x62, 0x6f, 0x78, 0x2d, 0x73, 0x68, 0x61, + 0x64, 0x6f, 0x77, 0x20, 0x65, 0x61, 0x73, 0x65, 0x2d, 0x69, 0x6e, + 0x2d, 0x6f, 0x75, 0x74, 0x20, 0x2e, 0x31, 0x35, 0x73, 0x3b, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x62, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x20, 0x65, 0x61, 0x73, 0x65, 0x2d, 0x69, 0x6e, 0x2d, 0x6f, 0x75, + 0x74, 0x20, 0x2e, 0x31, 0x35, 0x73, 0x2c, 0x20, 0x62, 0x6f, 0x78, + 0x2d, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x20, 0x65, 0x61, 0x73, + 0x65, 0x2d, 0x69, 0x6e, 0x2d, 0x6f, 0x75, 0x74, 0x20, 0x2e, 0x31, + 0x35, 0x73, 0x7d, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, + 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x36, 0x36, 0x61, 0x66, 0x65, 0x39, 0x3b, + 0x6f, 0x75, 0x74, 0x6c, 0x69, 0x6e, 0x65, 0x3a, 0x30, 0x3b, 0x2d, + 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x62, 0x6f, 0x78, 0x2d, + 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x3a, 0x69, 0x6e, 0x73, 0x65, + 0x74, 0x20, 0x30, 0x20, 0x31, 0x70, 0x78, 0x20, 0x31, 0x70, 0x78, + 0x20, 0x72, 0x67, 0x62, 0x61, 0x28, 0x30, 0x2c, 0x30, 0x2c, 0x30, + 0x2c, 0x2e, 0x30, 0x37, 0x35, 0x29, 0x2c, 0x20, 0x30, 0x20, 0x30, + 0x20, 0x38, 0x70, 0x78, 0x20, 0x72, 0x67, 0x62, 0x61, 0x28, 0x31, + 0x30, 0x32, 0x2c, 0x20, 0x31, 0x37, 0x35, 0x2c, 0x20, 0x32, 0x33, + 0x33, 0x2c, 0x20, 0x30, 0x2e, 0x36, 0x29, 0x3b, 0x62, 0x6f, 0x78, + 0x2d, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x3a, 0x69, 0x6e, 0x73, + 0x65, 0x74, 0x20, 0x30, 0x20, 0x31, 0x70, 0x78, 0x20, 0x31, 0x70, + 0x78, 0x20, 0x72, 0x67, 0x62, 0x61, 0x28, 0x30, 0x2c, 0x30, 0x2c, + 0x30, 0x2c, 0x2e, 0x30, 0x37, 0x35, 0x29, 0x2c, 0x20, 0x30, 0x20, + 0x30, 0x20, 0x38, 0x70, 0x78, 0x20, 0x72, 0x67, 0x62, 0x61, 0x28, + 0x31, 0x30, 0x32, 0x2c, 0x20, 0x31, 0x37, 0x35, 0x2c, 0x20, 0x32, + 0x33, 0x33, 0x2c, 0x20, 0x30, 0x2e, 0x36, 0x29, 0x7d, 0x2e, 0x66, + 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x3a, 0x3a, 0x2d, 0x6d, 0x6f, 0x7a, 0x2d, 0x70, 0x6c, 0x61, 0x63, + 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x7b, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x39, 0x39, 0x39, 0x3b, 0x6f, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x3a, 0x31, 0x7d, 0x2e, 0x66, 0x6f, 0x72, + 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x3a, 0x2d, + 0x6d, 0x73, 0x2d, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2d, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x7b, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x39, 0x39, 0x39, 0x7d, 0x2e, + 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x3a, 0x3a, 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2d, 0x70, 0x6c, 0x61, 0x63, 0x65, + 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x23, 0x39, 0x39, 0x39, 0x7d, 0x2e, 0x66, 0x6f, 0x72, + 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x3a, 0x3a, + 0x2d, 0x6d, 0x73, 0x2d, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x7b, + 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x30, 0x3b, 0x62, 0x61, + 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x7d, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5b, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x2c, 0x2e, 0x66, 0x6f, 0x72, + 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5b, 0x72, + 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x5d, 0x2c, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x73, 0x65, 0x74, 0x5b, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x20, 0x2e, 0x66, 0x6f, 0x72, 0x6d, + 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x7b, 0x62, 0x61, + 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x65, 0x65, 0x65, 0x3b, 0x6f, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x31, 0x7d, 0x2e, 0x66, 0x6f, + 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5b, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x2c, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x73, 0x65, 0x74, 0x5b, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x20, 0x2e, 0x66, 0x6f, 0x72, + 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x7b, 0x63, + 0x75, 0x72, 0x73, 0x6f, 0x72, 0x3a, 0x6e, 0x6f, 0x74, 0x2d, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x7d, 0x74, 0x65, 0x78, 0x74, + 0x61, 0x72, 0x65, 0x61, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x7b, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x3a, 0x61, 0x75, 0x74, 0x6f, 0x7d, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x73, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x22, 0x5d, 0x7b, 0x2d, 0x77, 0x65, 0x62, + 0x6b, 0x69, 0x74, 0x2d, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, + 0x6e, 0x63, 0x65, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x7d, 0x40, 0x6d, + 0x65, 0x64, 0x69, 0x61, 0x20, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x2d, 0x77, 0x65, 0x62, 0x6b, + 0x69, 0x74, 0x2d, 0x6d, 0x69, 0x6e, 0x2d, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x2d, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x2d, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x3a, 0x30, 0x29, 0x7b, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x64, 0x61, 0x74, + 0x65, 0x22, 0x5d, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2c, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x69, 0x6d, 0x65, + 0x22, 0x5d, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, + 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x64, 0x61, 0x74, 0x65, 0x74, + 0x69, 0x6d, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x5d, + 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, + 0x70, 0x65, 0x3d, 0x22, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x22, 0x5d, + 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x7b, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x3a, 0x33, 0x34, 0x70, 0x78, 0x7d, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x64, + 0x61, 0x74, 0x65, 0x22, 0x5d, 0x2e, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x2d, 0x73, 0x6d, 0x2c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, + 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x5d, + 0x2e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2d, 0x73, 0x6d, 0x2c, 0x69, + 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, + 0x64, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x2d, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x22, 0x5d, 0x2e, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x2d, 0x73, 0x6d, 0x2c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, + 0x79, 0x70, 0x65, 0x3d, 0x22, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x22, + 0x5d, 0x2e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2d, 0x73, 0x6d, 0x2c, + 0x2e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2d, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x2d, 0x73, 0x6d, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, + 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x64, 0x61, 0x74, 0x65, 0x22, + 0x5d, 0x2c, 0x2e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2d, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x2d, 0x73, 0x6d, 0x20, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x69, 0x6d, + 0x65, 0x22, 0x5d, 0x2c, 0x2e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2d, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2d, 0x73, 0x6d, 0x20, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x64, + 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x2d, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x22, 0x5d, 0x2c, 0x2e, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x2d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2d, 0x73, 0x6d, 0x20, 0x69, + 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, + 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x22, 0x5d, 0x7b, 0x6c, 0x69, 0x6e, + 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x33, 0x30, + 0x70, 0x78, 0x7d, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, + 0x70, 0x65, 0x3d, 0x22, 0x64, 0x61, 0x74, 0x65, 0x22, 0x5d, 0x2e, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2d, 0x6c, 0x67, 0x2c, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, + 0x69, 0x6d, 0x65, 0x22, 0x5d, 0x2e, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x2d, 0x6c, 0x67, 0x2c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, + 0x79, 0x70, 0x65, 0x3d, 0x22, 0x64, 0x61, 0x74, 0x65, 0x74, 0x69, + 0x6d, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x5d, 0x2e, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2d, 0x6c, 0x67, 0x2c, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x6d, + 0x6f, 0x6e, 0x74, 0x68, 0x22, 0x5d, 0x2e, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x2d, 0x6c, 0x67, 0x2c, 0x2e, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x2d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2d, 0x6c, 0x67, 0x20, 0x69, + 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, + 0x64, 0x61, 0x74, 0x65, 0x22, 0x5d, 0x2c, 0x2e, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x2d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2d, 0x6c, 0x67, + 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, + 0x3d, 0x22, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x5d, 0x2c, 0x2e, 0x69, + 0x6e, 0x70, 0x75, 0x74, 0x2d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2d, + 0x6c, 0x67, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, + 0x70, 0x65, 0x3d, 0x22, 0x64, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, + 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x5d, 0x2c, 0x2e, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2d, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x2d, 0x6c, 0x67, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, + 0x79, 0x70, 0x65, 0x3d, 0x22, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x22, + 0x5d, 0x7b, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x3a, 0x34, 0x36, 0x70, 0x78, 0x7d, 0x7d, 0x2e, 0x66, + 0x6f, 0x72, 0x6d, 0x2d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x7b, 0x6d, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, + 0x6d, 0x3a, 0x31, 0x35, 0x70, 0x78, 0x7d, 0x2e, 0x72, 0x61, 0x64, + 0x69, 0x6f, 0x2c, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x62, 0x6f, + 0x78, 0x7b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, + 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x3b, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x74, 0x6f, 0x70, + 0x3a, 0x31, 0x30, 0x70, 0x78, 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, + 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x31, 0x30, + 0x70, 0x78, 0x7d, 0x2e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x20, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x2c, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x62, 0x6f, 0x78, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x7b, 0x6d, + 0x69, 0x6e, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x32, + 0x30, 0x70, 0x78, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, + 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x32, 0x30, 0x70, 0x78, 0x3b, + 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, + 0x6f, 0x6d, 0x3a, 0x30, 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x6e, 0x6f, 0x72, 0x6d, 0x61, + 0x6c, 0x3b, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x3a, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x7d, 0x2e, 0x72, 0x61, 0x64, 0x69, + 0x6f, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, + 0x65, 0x3d, 0x22, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x22, 0x5d, 0x2c, + 0x2e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x2d, 0x69, 0x6e, 0x6c, 0x69, + 0x6e, 0x65, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, + 0x70, 0x65, 0x3d, 0x22, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x22, 0x5d, + 0x2c, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x62, 0x6f, 0x78, 0x20, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, + 0x22, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x62, 0x6f, 0x78, 0x22, 0x5d, + 0x2c, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x62, 0x6f, 0x78, 0x2d, + 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x62, 0x6f, 0x78, 0x22, 0x5d, 0x7b, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x61, 0x62, 0x73, 0x6f, 0x6c, + 0x75, 0x74, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, + 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x2d, 0x32, 0x30, 0x70, 0x78, 0x3b, + 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x74, 0x6f, 0x70, 0x3a, + 0x34, 0x70, 0x78, 0x20, 0x5c, 0x39, 0x7d, 0x2e, 0x72, 0x61, 0x64, + 0x69, 0x6f, 0x2b, 0x2e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x2c, 0x2e, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x62, 0x6f, 0x78, 0x2b, 0x2e, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x62, 0x6f, 0x78, 0x7b, 0x6d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x2d, 0x35, 0x70, + 0x78, 0x7d, 0x2e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x2d, 0x69, 0x6e, + 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x62, 0x6f, 0x78, 0x2d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x7b, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x72, 0x65, + 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x3b, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x3a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2d, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, + 0x6e, 0x67, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x32, 0x30, 0x70, + 0x78, 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, + 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x30, 0x3b, 0x76, 0x65, 0x72, 0x74, + 0x69, 0x63, 0x61, 0x6c, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, + 0x6d, 0x69, 0x64, 0x64, 0x6c, 0x65, 0x3b, 0x66, 0x6f, 0x6e, 0x74, + 0x2d, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x6e, 0x6f, 0x72, + 0x6d, 0x61, 0x6c, 0x3b, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x3a, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x7d, 0x2e, 0x72, 0x61, + 0x64, 0x69, 0x6f, 0x2d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2b, + 0x2e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x2d, 0x69, 0x6e, 0x6c, 0x69, + 0x6e, 0x65, 0x2c, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x62, 0x6f, + 0x78, 0x2d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2b, 0x2e, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x62, 0x6f, 0x78, 0x2d, 0x69, 0x6e, 0x6c, + 0x69, 0x6e, 0x65, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, + 0x74, 0x6f, 0x70, 0x3a, 0x30, 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, + 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x31, 0x30, 0x70, 0x78, + 0x7d, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, + 0x3d, 0x22, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x22, 0x5d, 0x5b, 0x64, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x2c, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x62, 0x6f, 0x78, 0x22, 0x5d, 0x5b, 0x64, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x2c, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x72, + 0x61, 0x64, 0x69, 0x6f, 0x22, 0x5d, 0x2e, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x2c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, + 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x62, 0x6f, 0x78, 0x22, 0x5d, 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x2c, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x65, + 0x74, 0x5b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, + 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, + 0x3d, 0x22, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x22, 0x5d, 0x2c, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x73, 0x65, 0x74, 0x5b, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x20, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x62, 0x6f, 0x78, 0x22, 0x5d, 0x7b, 0x63, 0x75, 0x72, + 0x73, 0x6f, 0x72, 0x3a, 0x6e, 0x6f, 0x74, 0x2d, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x65, 0x64, 0x7d, 0x2e, 0x72, 0x61, 0x64, 0x69, 0x6f, + 0x2d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2e, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x2c, 0x2e, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x62, 0x6f, 0x78, 0x2d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, + 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x2c, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x73, 0x65, 0x74, 0x5b, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x20, 0x2e, 0x72, 0x61, 0x64, + 0x69, 0x6f, 0x2d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x73, 0x65, 0x74, 0x5b, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x20, 0x2e, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x62, 0x6f, 0x78, 0x2d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, + 0x65, 0x7b, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x3a, 0x6e, 0x6f, + 0x74, 0x2d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x7d, 0x2e, + 0x72, 0x61, 0x64, 0x69, 0x6f, 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2c, 0x2e, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x62, 0x6f, 0x78, 0x2e, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x20, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x2c, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x65, 0x74, 0x5b, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x20, 0x2e, + 0x72, 0x61, 0x64, 0x69, 0x6f, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x2c, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x65, 0x74, 0x5b, 0x64, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x20, 0x2e, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x62, 0x6f, 0x78, 0x20, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x7b, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x3a, 0x6e, + 0x6f, 0x74, 0x2d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x7d, + 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x7b, 0x70, + 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x74, 0x6f, 0x70, 0x3a, + 0x37, 0x70, 0x78, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, + 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x37, 0x70, 0x78, + 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, + 0x74, 0x6f, 0x6d, 0x3a, 0x30, 0x3b, 0x6d, 0x69, 0x6e, 0x2d, 0x68, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x33, 0x34, 0x70, 0x78, 0x7d, + 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2e, 0x69, + 0x6e, 0x70, 0x75, 0x74, 0x2d, 0x6c, 0x67, 0x2c, 0x2e, 0x66, 0x6f, + 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, + 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x2e, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x2d, 0x73, 0x6d, 0x7b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, + 0x67, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x30, 0x3b, 0x70, 0x61, + 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x3a, 0x30, 0x7d, 0x2e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2d, 0x73, + 0x6d, 0x7b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x33, 0x30, + 0x70, 0x78, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, + 0x35, 0x70, 0x78, 0x20, 0x31, 0x30, 0x70, 0x78, 0x3b, 0x66, 0x6f, + 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x31, 0x32, 0x70, + 0x78, 0x3b, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x3a, 0x31, 0x2e, 0x35, 0x3b, 0x62, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, 0x33, + 0x70, 0x78, 0x7d, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x2e, 0x69, + 0x6e, 0x70, 0x75, 0x74, 0x2d, 0x73, 0x6d, 0x7b, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x3a, 0x33, 0x30, 0x70, 0x78, 0x3b, 0x6c, 0x69, + 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x33, + 0x30, 0x70, 0x78, 0x7d, 0x74, 0x65, 0x78, 0x74, 0x61, 0x72, 0x65, + 0x61, 0x2e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2d, 0x73, 0x6d, 0x2c, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x5b, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x70, 0x6c, 0x65, 0x5d, 0x2e, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x2d, 0x73, 0x6d, 0x7b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, + 0x61, 0x75, 0x74, 0x6f, 0x7d, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2d, 0x73, 0x6d, 0x20, 0x2e, 0x66, + 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x7b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x33, 0x30, 0x70, + 0x78, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x35, + 0x70, 0x78, 0x20, 0x31, 0x30, 0x70, 0x78, 0x3b, 0x66, 0x6f, 0x6e, + 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x31, 0x32, 0x70, 0x78, + 0x3b, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x3a, 0x31, 0x2e, 0x35, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, 0x33, 0x70, + 0x78, 0x7d, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x2d, 0x73, 0x6d, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x7b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, + 0x33, 0x30, 0x70, 0x78, 0x3b, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x68, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x33, 0x30, 0x70, 0x78, 0x7d, + 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x2d, 0x73, 0x6d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x61, 0x72, 0x65, + 0x61, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2c, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x2d, 0x73, 0x6d, 0x20, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x5b, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, + 0x65, 0x5d, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x7b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x3a, 0x61, 0x75, 0x74, 0x6f, 0x7d, 0x2e, 0x66, 0x6f, 0x72, 0x6d, + 0x2d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2d, 0x73, 0x6d, 0x20, 0x2e, + 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x7b, 0x68, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x3a, 0x33, 0x30, 0x70, 0x78, 0x3b, 0x6d, + 0x69, 0x6e, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x33, + 0x32, 0x70, 0x78, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, + 0x3a, 0x36, 0x70, 0x78, 0x20, 0x31, 0x30, 0x70, 0x78, 0x3b, 0x66, + 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x31, 0x32, + 0x70, 0x78, 0x3b, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x3a, 0x31, 0x2e, 0x35, 0x7d, 0x2e, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x2d, 0x6c, 0x67, 0x7b, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x3a, 0x34, 0x36, 0x70, 0x78, 0x3b, 0x70, 0x61, 0x64, + 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x31, 0x30, 0x70, 0x78, 0x20, 0x31, + 0x36, 0x70, 0x78, 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, + 0x7a, 0x65, 0x3a, 0x31, 0x38, 0x70, 0x78, 0x3b, 0x6c, 0x69, 0x6e, + 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x31, 0x2e, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3b, 0x62, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, + 0x36, 0x70, 0x78, 0x7d, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x2e, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2d, 0x6c, 0x67, 0x7b, 0x68, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x3a, 0x34, 0x36, 0x70, 0x78, 0x3b, 0x6c, + 0x69, 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, + 0x34, 0x36, 0x70, 0x78, 0x7d, 0x74, 0x65, 0x78, 0x74, 0x61, 0x72, + 0x65, 0x61, 0x2e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2d, 0x6c, 0x67, + 0x2c, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x5b, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x70, 0x6c, 0x65, 0x5d, 0x2e, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x2d, 0x6c, 0x67, 0x7b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x3a, 0x61, 0x75, 0x74, 0x6f, 0x7d, 0x2e, 0x66, 0x6f, 0x72, 0x6d, + 0x2d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2d, 0x6c, 0x67, 0x20, 0x2e, + 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x7b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x34, 0x36, + 0x70, 0x78, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, + 0x31, 0x30, 0x70, 0x78, 0x20, 0x31, 0x36, 0x70, 0x78, 0x3b, 0x66, + 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x31, 0x38, + 0x70, 0x78, 0x3b, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x3a, 0x31, 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x72, + 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, 0x36, 0x70, 0x78, 0x7d, 0x2e, + 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2d, + 0x6c, 0x67, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x2e, 0x66, + 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x7b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x34, 0x36, 0x70, + 0x78, 0x3b, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x3a, 0x34, 0x36, 0x70, 0x78, 0x7d, 0x2e, 0x66, 0x6f, + 0x72, 0x6d, 0x2d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2d, 0x6c, 0x67, + 0x20, 0x74, 0x65, 0x78, 0x74, 0x61, 0x72, 0x65, 0x61, 0x2e, 0x66, + 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2c, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x2d, 0x6c, 0x67, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x5b, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x5d, 0x2e, + 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x7b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x61, 0x75, + 0x74, 0x6f, 0x7d, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x2d, 0x6c, 0x67, 0x20, 0x2e, 0x66, 0x6f, 0x72, + 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x73, + 0x74, 0x61, 0x74, 0x69, 0x63, 0x7b, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x3a, 0x34, 0x36, 0x70, 0x78, 0x3b, 0x6d, 0x69, 0x6e, 0x2d, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x33, 0x38, 0x70, 0x78, + 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x31, 0x31, + 0x70, 0x78, 0x20, 0x31, 0x36, 0x70, 0x78, 0x3b, 0x66, 0x6f, 0x6e, + 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x31, 0x38, 0x70, 0x78, + 0x3b, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x3a, 0x31, 0x2e, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x7d, 0x2e, 0x68, 0x61, 0x73, 0x2d, 0x66, 0x65, 0x65, 0x64, 0x62, + 0x61, 0x63, 0x6b, 0x7b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x3a, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x7d, + 0x2e, 0x68, 0x61, 0x73, 0x2d, 0x66, 0x65, 0x65, 0x64, 0x62, 0x61, + 0x63, 0x6b, 0x20, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x7b, 0x70, 0x61, 0x64, 0x64, 0x69, + 0x6e, 0x67, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x34, 0x32, + 0x2e, 0x35, 0x70, 0x78, 0x7d, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x66, 0x65, 0x65, + 0x64, 0x62, 0x61, 0x63, 0x6b, 0x7b, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x3a, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, + 0x65, 0x3b, 0x74, 0x6f, 0x70, 0x3a, 0x30, 0x3b, 0x72, 0x69, 0x67, + 0x68, 0x74, 0x3a, 0x30, 0x3b, 0x7a, 0x2d, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x3a, 0x32, 0x3b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, + 0x3a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3b, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x3a, 0x33, 0x34, 0x70, 0x78, 0x3b, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x3a, 0x33, 0x34, 0x70, 0x78, 0x3b, 0x6c, 0x69, 0x6e, + 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x33, 0x34, + 0x70, 0x78, 0x3b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, + 0x67, 0x6e, 0x3a, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x2d, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x7d, 0x2e, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x2d, 0x6c, 0x67, 0x2b, 0x2e, 0x66, 0x6f, 0x72, + 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x66, + 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x2c, 0x2e, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x2d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2d, 0x6c, + 0x67, 0x2b, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x66, 0x65, 0x65, 0x64, 0x62, 0x61, + 0x63, 0x6b, 0x2c, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x2d, 0x6c, 0x67, 0x20, 0x2e, 0x66, 0x6f, 0x72, + 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2b, 0x2e, + 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2d, 0x66, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x7b, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x34, 0x36, 0x70, 0x78, 0x3b, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x34, 0x36, 0x70, 0x78, + 0x3b, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x3a, 0x34, 0x36, 0x70, 0x78, 0x7d, 0x2e, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x2d, 0x73, 0x6d, 0x2b, 0x2e, 0x66, 0x6f, 0x72, 0x6d, + 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x66, 0x65, + 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x2c, 0x2e, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x2d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2d, 0x73, 0x6d, + 0x2b, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2d, 0x66, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, + 0x6b, 0x2c, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x2d, 0x73, 0x6d, 0x20, 0x2e, 0x66, 0x6f, 0x72, 0x6d, + 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2b, 0x2e, 0x66, + 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2d, 0x66, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x7b, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x3a, 0x33, 0x30, 0x70, 0x78, 0x3b, 0x68, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x33, 0x30, 0x70, 0x78, 0x3b, + 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x3a, 0x33, 0x30, 0x70, 0x78, 0x7d, 0x2e, 0x68, 0x61, 0x73, 0x2d, + 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x2e, 0x68, 0x65, + 0x6c, 0x70, 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x2e, 0x68, + 0x61, 0x73, 0x2d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, + 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x2c, 0x2e, 0x68, 0x61, 0x73, 0x2d, 0x73, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x2e, 0x72, 0x61, 0x64, 0x69, + 0x6f, 0x2c, 0x2e, 0x68, 0x61, 0x73, 0x2d, 0x73, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x20, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x62, + 0x6f, 0x78, 0x2c, 0x2e, 0x68, 0x61, 0x73, 0x2d, 0x73, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x20, 0x2e, 0x72, 0x61, 0x64, 0x69, 0x6f, + 0x2d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x2e, 0x68, 0x61, + 0x73, 0x2d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x2e, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x62, 0x6f, 0x78, 0x2d, 0x69, 0x6e, + 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x2e, 0x68, 0x61, 0x73, 0x2d, 0x73, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x72, 0x61, 0x64, 0x69, + 0x6f, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2c, 0x2e, 0x68, 0x61, + 0x73, 0x2d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x62, 0x6f, 0x78, 0x20, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x2c, 0x2e, 0x68, 0x61, 0x73, 0x2d, 0x73, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x2d, + 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x2c, 0x2e, 0x68, 0x61, 0x73, 0x2d, 0x73, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x62, 0x6f, + 0x78, 0x2d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, + 0x33, 0x63, 0x37, 0x36, 0x33, 0x64, 0x7d, 0x2e, 0x68, 0x61, 0x73, + 0x2d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x2e, 0x66, + 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x33, 0x63, 0x37, 0x36, 0x33, 0x64, 0x3b, + 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x62, 0x6f, 0x78, + 0x2d, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x3a, 0x69, 0x6e, 0x73, + 0x65, 0x74, 0x20, 0x30, 0x20, 0x31, 0x70, 0x78, 0x20, 0x31, 0x70, + 0x78, 0x20, 0x72, 0x67, 0x62, 0x61, 0x28, 0x30, 0x2c, 0x30, 0x2c, + 0x30, 0x2c, 0x30, 0x2e, 0x30, 0x37, 0x35, 0x29, 0x3b, 0x62, 0x6f, + 0x78, 0x2d, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x3a, 0x69, 0x6e, + 0x73, 0x65, 0x74, 0x20, 0x30, 0x20, 0x31, 0x70, 0x78, 0x20, 0x31, + 0x70, 0x78, 0x20, 0x72, 0x67, 0x62, 0x61, 0x28, 0x30, 0x2c, 0x30, + 0x2c, 0x30, 0x2c, 0x30, 0x2e, 0x30, 0x37, 0x35, 0x29, 0x7d, 0x2e, + 0x68, 0x61, 0x73, 0x2d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x20, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x7b, 0x62, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x23, 0x32, 0x62, 0x35, 0x34, 0x32, 0x63, 0x3b, 0x2d, 0x77, + 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x62, 0x6f, 0x78, 0x2d, 0x73, + 0x68, 0x61, 0x64, 0x6f, 0x77, 0x3a, 0x69, 0x6e, 0x73, 0x65, 0x74, + 0x20, 0x30, 0x20, 0x31, 0x70, 0x78, 0x20, 0x31, 0x70, 0x78, 0x20, + 0x72, 0x67, 0x62, 0x61, 0x28, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, + 0x30, 0x2e, 0x30, 0x37, 0x35, 0x29, 0x2c, 0x30, 0x20, 0x30, 0x20, + 0x36, 0x70, 0x78, 0x20, 0x23, 0x36, 0x37, 0x62, 0x31, 0x36, 0x38, + 0x3b, 0x62, 0x6f, 0x78, 0x2d, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, + 0x3a, 0x69, 0x6e, 0x73, 0x65, 0x74, 0x20, 0x30, 0x20, 0x31, 0x70, + 0x78, 0x20, 0x31, 0x70, 0x78, 0x20, 0x72, 0x67, 0x62, 0x61, 0x28, + 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2e, 0x30, 0x37, 0x35, + 0x29, 0x2c, 0x30, 0x20, 0x30, 0x20, 0x36, 0x70, 0x78, 0x20, 0x23, + 0x36, 0x37, 0x62, 0x31, 0x36, 0x38, 0x7d, 0x2e, 0x68, 0x61, 0x73, + 0x2d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x2e, 0x69, + 0x6e, 0x70, 0x75, 0x74, 0x2d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2d, + 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x23, 0x33, 0x63, 0x37, 0x36, 0x33, 0x64, 0x3b, 0x62, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, + 0x23, 0x33, 0x63, 0x37, 0x36, 0x33, 0x64, 0x3b, 0x62, 0x61, 0x63, + 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x64, 0x66, 0x66, 0x30, 0x64, 0x38, 0x7d, + 0x2e, 0x68, 0x61, 0x73, 0x2d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x20, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x66, 0x65, 0x65, 0x64, 0x62, 0x61, + 0x63, 0x6b, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x33, + 0x63, 0x37, 0x36, 0x33, 0x64, 0x7d, 0x2e, 0x68, 0x61, 0x73, 0x2d, + 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x2e, 0x68, 0x65, + 0x6c, 0x70, 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x2e, 0x68, + 0x61, 0x73, 0x2d, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, + 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x2c, 0x2e, 0x68, 0x61, 0x73, 0x2d, 0x77, 0x61, + 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x2e, 0x72, 0x61, 0x64, 0x69, + 0x6f, 0x2c, 0x2e, 0x68, 0x61, 0x73, 0x2d, 0x77, 0x61, 0x72, 0x6e, + 0x69, 0x6e, 0x67, 0x20, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x62, + 0x6f, 0x78, 0x2c, 0x2e, 0x68, 0x61, 0x73, 0x2d, 0x77, 0x61, 0x72, + 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x2e, 0x72, 0x61, 0x64, 0x69, 0x6f, + 0x2d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x2e, 0x68, 0x61, + 0x73, 0x2d, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x2e, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x62, 0x6f, 0x78, 0x2d, 0x69, 0x6e, + 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x2e, 0x68, 0x61, 0x73, 0x2d, 0x77, + 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x72, 0x61, 0x64, 0x69, + 0x6f, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2c, 0x2e, 0x68, 0x61, + 0x73, 0x2d, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x62, 0x6f, 0x78, 0x20, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x2c, 0x2e, 0x68, 0x61, 0x73, 0x2d, 0x77, 0x61, 0x72, + 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x2d, + 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x2c, 0x2e, 0x68, 0x61, 0x73, 0x2d, 0x77, 0x61, 0x72, 0x6e, + 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x62, 0x6f, + 0x78, 0x2d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, + 0x38, 0x61, 0x36, 0x64, 0x33, 0x62, 0x7d, 0x2e, 0x68, 0x61, 0x73, + 0x2d, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x2e, 0x66, + 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x38, 0x61, 0x36, 0x64, 0x33, 0x62, 0x3b, + 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x62, 0x6f, 0x78, + 0x2d, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x3a, 0x69, 0x6e, 0x73, + 0x65, 0x74, 0x20, 0x30, 0x20, 0x31, 0x70, 0x78, 0x20, 0x31, 0x70, + 0x78, 0x20, 0x72, 0x67, 0x62, 0x61, 0x28, 0x30, 0x2c, 0x30, 0x2c, + 0x30, 0x2c, 0x30, 0x2e, 0x30, 0x37, 0x35, 0x29, 0x3b, 0x62, 0x6f, + 0x78, 0x2d, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x3a, 0x69, 0x6e, + 0x73, 0x65, 0x74, 0x20, 0x30, 0x20, 0x31, 0x70, 0x78, 0x20, 0x31, + 0x70, 0x78, 0x20, 0x72, 0x67, 0x62, 0x61, 0x28, 0x30, 0x2c, 0x30, + 0x2c, 0x30, 0x2c, 0x30, 0x2e, 0x30, 0x37, 0x35, 0x29, 0x7d, 0x2e, + 0x68, 0x61, 0x73, 0x2d, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, + 0x20, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x7b, 0x62, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x23, 0x36, 0x36, 0x35, 0x31, 0x32, 0x63, 0x3b, 0x2d, 0x77, + 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x62, 0x6f, 0x78, 0x2d, 0x73, + 0x68, 0x61, 0x64, 0x6f, 0x77, 0x3a, 0x69, 0x6e, 0x73, 0x65, 0x74, + 0x20, 0x30, 0x20, 0x31, 0x70, 0x78, 0x20, 0x31, 0x70, 0x78, 0x20, + 0x72, 0x67, 0x62, 0x61, 0x28, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, + 0x30, 0x2e, 0x30, 0x37, 0x35, 0x29, 0x2c, 0x30, 0x20, 0x30, 0x20, + 0x36, 0x70, 0x78, 0x20, 0x23, 0x63, 0x30, 0x61, 0x31, 0x36, 0x62, + 0x3b, 0x62, 0x6f, 0x78, 0x2d, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, + 0x3a, 0x69, 0x6e, 0x73, 0x65, 0x74, 0x20, 0x30, 0x20, 0x31, 0x70, + 0x78, 0x20, 0x31, 0x70, 0x78, 0x20, 0x72, 0x67, 0x62, 0x61, 0x28, + 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2e, 0x30, 0x37, 0x35, + 0x29, 0x2c, 0x30, 0x20, 0x30, 0x20, 0x36, 0x70, 0x78, 0x20, 0x23, + 0x63, 0x30, 0x61, 0x31, 0x36, 0x62, 0x7d, 0x2e, 0x68, 0x61, 0x73, + 0x2d, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x2e, 0x69, + 0x6e, 0x70, 0x75, 0x74, 0x2d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2d, + 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x23, 0x38, 0x61, 0x36, 0x64, 0x33, 0x62, 0x3b, 0x62, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, + 0x23, 0x38, 0x61, 0x36, 0x64, 0x33, 0x62, 0x3b, 0x62, 0x61, 0x63, + 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x63, 0x66, 0x38, 0x65, 0x33, 0x7d, + 0x2e, 0x68, 0x61, 0x73, 0x2d, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, + 0x67, 0x20, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x66, 0x65, 0x65, 0x64, 0x62, 0x61, + 0x63, 0x6b, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x38, + 0x61, 0x36, 0x64, 0x33, 0x62, 0x7d, 0x2e, 0x68, 0x61, 0x73, 0x2d, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x2e, 0x68, 0x65, 0x6c, 0x70, + 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x2e, 0x68, 0x61, 0x73, + 0x2d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x2e, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2c, + 0x2e, 0x68, 0x61, 0x73, 0x2d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, + 0x2e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x2c, 0x2e, 0x68, 0x61, 0x73, + 0x2d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x2e, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x62, 0x6f, 0x78, 0x2c, 0x2e, 0x68, 0x61, 0x73, 0x2d, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x2e, 0x72, 0x61, 0x64, 0x69, + 0x6f, 0x2d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x2e, 0x68, + 0x61, 0x73, 0x2d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x2e, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x62, 0x6f, 0x78, 0x2d, 0x69, 0x6e, 0x6c, + 0x69, 0x6e, 0x65, 0x2c, 0x2e, 0x68, 0x61, 0x73, 0x2d, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x2e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x20, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x2c, 0x2e, 0x68, 0x61, 0x73, 0x2d, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x62, + 0x6f, 0x78, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2c, 0x2e, 0x68, + 0x61, 0x73, 0x2d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x72, 0x61, + 0x64, 0x69, 0x6f, 0x2d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2c, 0x2e, 0x68, 0x61, 0x73, 0x2d, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x62, 0x6f, 0x78, 0x2d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x23, 0x61, 0x39, 0x34, 0x34, 0x34, 0x32, 0x7d, 0x2e, 0x68, + 0x61, 0x73, 0x2d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x2e, 0x66, + 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x61, 0x39, 0x34, 0x34, 0x34, 0x32, 0x3b, + 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x62, 0x6f, 0x78, + 0x2d, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x3a, 0x69, 0x6e, 0x73, + 0x65, 0x74, 0x20, 0x30, 0x20, 0x31, 0x70, 0x78, 0x20, 0x31, 0x70, + 0x78, 0x20, 0x72, 0x67, 0x62, 0x61, 0x28, 0x30, 0x2c, 0x30, 0x2c, + 0x30, 0x2c, 0x30, 0x2e, 0x30, 0x37, 0x35, 0x29, 0x3b, 0x62, 0x6f, + 0x78, 0x2d, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x3a, 0x69, 0x6e, + 0x73, 0x65, 0x74, 0x20, 0x30, 0x20, 0x31, 0x70, 0x78, 0x20, 0x31, + 0x70, 0x78, 0x20, 0x72, 0x67, 0x62, 0x61, 0x28, 0x30, 0x2c, 0x30, + 0x2c, 0x30, 0x2c, 0x30, 0x2e, 0x30, 0x37, 0x35, 0x29, 0x7d, 0x2e, + 0x68, 0x61, 0x73, 0x2d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x2e, + 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x7b, 0x62, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, + 0x38, 0x34, 0x33, 0x35, 0x33, 0x34, 0x3b, 0x2d, 0x77, 0x65, 0x62, + 0x6b, 0x69, 0x74, 0x2d, 0x62, 0x6f, 0x78, 0x2d, 0x73, 0x68, 0x61, + 0x64, 0x6f, 0x77, 0x3a, 0x69, 0x6e, 0x73, 0x65, 0x74, 0x20, 0x30, + 0x20, 0x31, 0x70, 0x78, 0x20, 0x31, 0x70, 0x78, 0x20, 0x72, 0x67, + 0x62, 0x61, 0x28, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2e, + 0x30, 0x37, 0x35, 0x29, 0x2c, 0x30, 0x20, 0x30, 0x20, 0x36, 0x70, + 0x78, 0x20, 0x23, 0x63, 0x65, 0x38, 0x34, 0x38, 0x33, 0x3b, 0x62, + 0x6f, 0x78, 0x2d, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x3a, 0x69, + 0x6e, 0x73, 0x65, 0x74, 0x20, 0x30, 0x20, 0x31, 0x70, 0x78, 0x20, + 0x31, 0x70, 0x78, 0x20, 0x72, 0x67, 0x62, 0x61, 0x28, 0x30, 0x2c, + 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2e, 0x30, 0x37, 0x35, 0x29, 0x2c, + 0x30, 0x20, 0x30, 0x20, 0x36, 0x70, 0x78, 0x20, 0x23, 0x63, 0x65, + 0x38, 0x34, 0x38, 0x33, 0x7d, 0x2e, 0x68, 0x61, 0x73, 0x2d, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x20, 0x2e, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x2d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2d, 0x61, 0x64, 0x64, 0x6f, + 0x6e, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x61, 0x39, + 0x34, 0x34, 0x34, 0x32, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x61, 0x39, 0x34, + 0x34, 0x34, 0x32, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, + 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, + 0x66, 0x32, 0x64, 0x65, 0x64, 0x65, 0x7d, 0x2e, 0x68, 0x61, 0x73, + 0x2d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x2e, 0x66, 0x6f, 0x72, + 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x66, + 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x7b, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x61, 0x39, 0x34, 0x34, 0x34, 0x32, 0x7d, + 0x2e, 0x68, 0x61, 0x73, 0x2d, 0x66, 0x65, 0x65, 0x64, 0x62, 0x61, + 0x63, 0x6b, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x7e, 0x2e, 0x66, + 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2d, 0x66, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x7b, 0x74, + 0x6f, 0x70, 0x3a, 0x32, 0x35, 0x70, 0x78, 0x7d, 0x2e, 0x68, 0x61, + 0x73, 0x2d, 0x66, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x20, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2e, 0x73, 0x72, 0x2d, 0x6f, 0x6e, + 0x6c, 0x79, 0x7e, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x66, 0x65, 0x65, 0x64, 0x62, + 0x61, 0x63, 0x6b, 0x7b, 0x74, 0x6f, 0x70, 0x3a, 0x30, 0x7d, 0x2e, + 0x68, 0x65, 0x6c, 0x70, 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x7b, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x74, + 0x6f, 0x70, 0x3a, 0x35, 0x70, 0x78, 0x3b, 0x6d, 0x61, 0x72, 0x67, + 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x31, + 0x30, 0x70, 0x78, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, + 0x37, 0x33, 0x37, 0x33, 0x37, 0x33, 0x7d, 0x40, 0x6d, 0x65, 0x64, + 0x69, 0x61, 0x20, 0x28, 0x6d, 0x69, 0x6e, 0x2d, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x3a, 0x37, 0x36, 0x38, 0x70, 0x78, 0x29, 0x7b, 0x2e, + 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, + 0x20, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x69, + 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, + 0x74, 0x6f, 0x6d, 0x3a, 0x30, 0x3b, 0x76, 0x65, 0x72, 0x74, 0x69, + 0x63, 0x61, 0x6c, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x6d, + 0x69, 0x64, 0x64, 0x6c, 0x65, 0x7d, 0x2e, 0x66, 0x6f, 0x72, 0x6d, + 0x2d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x2e, 0x66, 0x6f, + 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x7b, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x69, 0x6e, 0x6c, + 0x69, 0x6e, 0x65, 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3b, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x3a, 0x61, 0x75, 0x74, 0x6f, 0x3b, 0x76, + 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x2d, 0x61, 0x6c, 0x69, + 0x67, 0x6e, 0x3a, 0x6d, 0x69, 0x64, 0x64, 0x6c, 0x65, 0x7d, 0x2e, + 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, + 0x20, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x7b, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x69, 0x6e, 0x6c, + 0x69, 0x6e, 0x65, 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x7d, 0x2e, + 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, + 0x20, 0x2e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2d, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, + 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x3b, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x2d, + 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x6d, 0x69, 0x64, 0x64, 0x6c, + 0x65, 0x7d, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x69, 0x6e, 0x6c, + 0x69, 0x6e, 0x65, 0x20, 0x2e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2d, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x2e, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x2d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2d, 0x61, 0x64, 0x64, + 0x6f, 0x6e, 0x2c, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x69, 0x6e, + 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x2e, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x2d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x2e, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x2d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2d, 0x62, 0x74, + 0x6e, 0x2c, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x69, 0x6e, 0x6c, + 0x69, 0x6e, 0x65, 0x20, 0x2e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2d, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x2e, 0x66, 0x6f, 0x72, 0x6d, + 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x7b, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3a, 0x61, 0x75, 0x74, 0x6f, 0x7d, 0x2e, 0x66, + 0x6f, 0x72, 0x6d, 0x2d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, + 0x2e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2d, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x3e, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, + 0x31, 0x30, 0x30, 0x25, 0x7d, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, + 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x2e, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x7b, + 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, + 0x6f, 0x6d, 0x3a, 0x30, 0x3b, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, + 0x61, 0x6c, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x6d, 0x69, + 0x64, 0x64, 0x6c, 0x65, 0x7d, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, + 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x2e, 0x72, 0x61, 0x64, + 0x69, 0x6f, 0x2c, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x69, 0x6e, + 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x62, 0x6f, 0x78, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, + 0x3a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x74, + 0x6f, 0x70, 0x3a, 0x30, 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, + 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x30, 0x3b, 0x76, + 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x2d, 0x61, 0x6c, 0x69, + 0x67, 0x6e, 0x3a, 0x6d, 0x69, 0x64, 0x64, 0x6c, 0x65, 0x7d, 0x2e, + 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, + 0x20, 0x2e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x20, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x2c, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x69, 0x6e, + 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x62, 0x6f, 0x78, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x7b, 0x70, + 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x6c, 0x65, 0x66, 0x74, + 0x3a, 0x30, 0x7d, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x69, 0x6e, + 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x2e, 0x72, 0x61, 0x64, 0x69, 0x6f, + 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, + 0x3d, 0x22, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x22, 0x5d, 0x2c, 0x2e, + 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, + 0x20, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x62, 0x6f, 0x78, 0x20, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, + 0x22, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x62, 0x6f, 0x78, 0x22, 0x5d, + 0x7b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x72, + 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x3b, 0x6d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x30, 0x7d, + 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, + 0x65, 0x20, 0x2e, 0x68, 0x61, 0x73, 0x2d, 0x66, 0x65, 0x65, 0x64, + 0x62, 0x61, 0x63, 0x6b, 0x20, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x66, 0x65, 0x65, + 0x64, 0x62, 0x61, 0x63, 0x6b, 0x7b, 0x74, 0x6f, 0x70, 0x3a, 0x30, + 0x7d, 0x7d, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x68, 0x6f, 0x72, + 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x20, 0x2e, 0x72, 0x61, + 0x64, 0x69, 0x6f, 0x2c, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x68, + 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x20, 0x2e, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x62, 0x6f, 0x78, 0x2c, 0x2e, 0x66, + 0x6f, 0x72, 0x6d, 0x2d, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, + 0x74, 0x61, 0x6c, 0x20, 0x2e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x2d, + 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x2e, 0x66, 0x6f, 0x72, + 0x6d, 0x2d, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, + 0x6c, 0x20, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x62, 0x6f, 0x78, + 0x2d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x7b, 0x6d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x30, 0x3b, 0x6d, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, + 0x6d, 0x3a, 0x30, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, + 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x37, 0x70, 0x78, 0x7d, 0x2e, 0x66, + 0x6f, 0x72, 0x6d, 0x2d, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, + 0x74, 0x61, 0x6c, 0x20, 0x2e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x2c, + 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x68, 0x6f, 0x72, 0x69, 0x7a, + 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x20, 0x2e, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x62, 0x6f, 0x78, 0x7b, 0x6d, 0x69, 0x6e, 0x2d, 0x68, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x3a, 0x32, 0x37, 0x70, 0x78, 0x7d, 0x2e, + 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, + 0x6e, 0x74, 0x61, 0x6c, 0x20, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, + 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x2d, 0x31, 0x35, 0x70, + 0x78, 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x72, 0x69, + 0x67, 0x68, 0x74, 0x3a, 0x2d, 0x31, 0x35, 0x70, 0x78, 0x7d, 0x40, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x20, 0x28, 0x6d, 0x69, 0x6e, 0x2d, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x37, 0x36, 0x38, 0x70, 0x78, + 0x29, 0x7b, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x68, 0x6f, 0x72, + 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x20, 0x2e, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x7b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, + 0x3a, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x6d, 0x61, 0x72, 0x67, + 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x30, + 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x74, 0x6f, + 0x70, 0x3a, 0x37, 0x70, 0x78, 0x7d, 0x7d, 0x2e, 0x66, 0x6f, 0x72, + 0x6d, 0x2d, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, + 0x6c, 0x20, 0x2e, 0x68, 0x61, 0x73, 0x2d, 0x66, 0x65, 0x65, 0x64, + 0x62, 0x61, 0x63, 0x6b, 0x20, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x66, 0x65, 0x65, + 0x64, 0x62, 0x61, 0x63, 0x6b, 0x7b, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x3a, 0x31, 0x35, 0x70, 0x78, 0x7d, 0x40, 0x6d, 0x65, 0x64, 0x69, + 0x61, 0x20, 0x28, 0x6d, 0x69, 0x6e, 0x2d, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x3a, 0x37, 0x36, 0x38, 0x70, 0x78, 0x29, 0x7b, 0x2e, 0x66, + 0x6f, 0x72, 0x6d, 0x2d, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, + 0x74, 0x61, 0x6c, 0x20, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x2d, 0x6c, 0x67, 0x20, 0x2e, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x7b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x74, 0x6f, + 0x70, 0x3a, 0x31, 0x31, 0x70, 0x78, 0x3b, 0x66, 0x6f, 0x6e, 0x74, + 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x31, 0x38, 0x70, 0x78, 0x7d, + 0x7d, 0x40, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x20, 0x28, 0x6d, 0x69, + 0x6e, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x37, 0x36, 0x38, + 0x70, 0x78, 0x29, 0x7b, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x68, + 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x20, 0x2e, + 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2d, + 0x73, 0x6d, 0x20, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2d, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x7b, 0x70, 0x61, 0x64, 0x64, + 0x69, 0x6e, 0x67, 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x36, 0x70, 0x78, + 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, + 0x31, 0x32, 0x70, 0x78, 0x7d, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x7b, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x69, 0x6e, 0x6c, + 0x69, 0x6e, 0x65, 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3b, 0x6d, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, + 0x6d, 0x3a, 0x30, 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x3a, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, + 0x3b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, + 0x3a, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x76, 0x65, 0x72, + 0x74, 0x69, 0x63, 0x61, 0x6c, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, + 0x3a, 0x6d, 0x69, 0x64, 0x64, 0x6c, 0x65, 0x3b, 0x2d, 0x6d, 0x73, + 0x2d, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x2d, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x3a, 0x6d, 0x61, 0x6e, 0x69, 0x70, 0x75, 0x6c, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x2d, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x6d, 0x61, 0x6e, 0x69, + 0x70, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x63, 0x75, + 0x72, 0x73, 0x6f, 0x72, 0x3a, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x2d, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3a, 0x6e, 0x6f, 0x6e, + 0x65, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x31, 0x70, + 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3b, 0x77, 0x68, + 0x69, 0x74, 0x65, 0x2d, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3a, 0x6e, + 0x6f, 0x77, 0x72, 0x61, 0x70, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, + 0x6e, 0x67, 0x3a, 0x36, 0x70, 0x78, 0x20, 0x31, 0x32, 0x70, 0x78, + 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, + 0x31, 0x34, 0x70, 0x78, 0x3b, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x68, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x31, 0x2e, 0x34, 0x32, 0x38, + 0x35, 0x37, 0x31, 0x34, 0x33, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, 0x34, 0x70, + 0x78, 0x3b, 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x75, + 0x73, 0x65, 0x72, 0x2d, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x3a, + 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x2d, 0x6d, 0x6f, 0x7a, 0x2d, 0x75, + 0x73, 0x65, 0x72, 0x2d, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x3a, + 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x2d, 0x6d, 0x73, 0x2d, 0x75, 0x73, + 0x65, 0x72, 0x2d, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x3a, 0x6e, + 0x6f, 0x6e, 0x65, 0x3b, 0x75, 0x73, 0x65, 0x72, 0x2d, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x7d, 0x2e, + 0x62, 0x74, 0x6e, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, + 0x62, 0x74, 0x6e, 0x3a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x3a, + 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2e, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x3a, 0x66, 0x6f, 0x63, 0x75, + 0x73, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2e, 0x66, 0x6f, 0x63, 0x75, + 0x73, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x3a, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x2e, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x62, + 0x74, 0x6e, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2e, 0x66, + 0x6f, 0x63, 0x75, 0x73, 0x7b, 0x6f, 0x75, 0x74, 0x6c, 0x69, 0x6e, + 0x65, 0x3a, 0x35, 0x70, 0x78, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x20, + 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x66, 0x6f, 0x63, + 0x75, 0x73, 0x2d, 0x72, 0x69, 0x6e, 0x67, 0x2d, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3b, 0x6f, 0x75, 0x74, 0x6c, 0x69, 0x6e, 0x65, 0x2d, + 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3a, 0x2d, 0x32, 0x70, 0x78, + 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, + 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, + 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2e, 0x66, 0x6f, 0x63, 0x75, 0x73, + 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x33, 0x33, 0x33, + 0x3b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x64, 0x65, 0x63, 0x6f, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x7d, + 0x2e, 0x62, 0x74, 0x6e, 0x3a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x7b, 0x6f, 0x75, 0x74, 0x6c, 0x69, 0x6e, 0x65, 0x3a, 0x30, + 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, + 0x2d, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, + 0x3b, 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x62, 0x6f, + 0x78, 0x2d, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x3a, 0x69, 0x6e, + 0x73, 0x65, 0x74, 0x20, 0x30, 0x20, 0x33, 0x70, 0x78, 0x20, 0x35, + 0x70, 0x78, 0x20, 0x72, 0x67, 0x62, 0x61, 0x28, 0x30, 0x2c, 0x30, + 0x2c, 0x30, 0x2c, 0x30, 0x2e, 0x31, 0x32, 0x35, 0x29, 0x3b, 0x62, + 0x6f, 0x78, 0x2d, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x3a, 0x69, + 0x6e, 0x73, 0x65, 0x74, 0x20, 0x30, 0x20, 0x33, 0x70, 0x78, 0x20, + 0x35, 0x70, 0x78, 0x20, 0x72, 0x67, 0x62, 0x61, 0x28, 0x30, 0x2c, + 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2e, 0x31, 0x32, 0x35, 0x29, 0x7d, + 0x2e, 0x62, 0x74, 0x6e, 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x5b, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x2c, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x73, 0x65, 0x74, 0x5b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x5d, 0x20, 0x2e, 0x62, 0x74, 0x6e, 0x7b, 0x63, 0x75, + 0x72, 0x73, 0x6f, 0x72, 0x3a, 0x6e, 0x6f, 0x74, 0x2d, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x3b, 0x6f, 0x70, 0x61, 0x63, 0x69, + 0x74, 0x79, 0x3a, 0x2e, 0x36, 0x35, 0x3b, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x3a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x28, 0x6f, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x3d, 0x36, 0x35, 0x29, 0x3b, 0x2d, + 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x62, 0x6f, 0x78, 0x2d, + 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, + 0x3b, 0x62, 0x6f, 0x78, 0x2d, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, + 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x7d, 0x61, 0x2e, 0x62, 0x74, 0x6e, + 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x2c, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x73, 0x65, 0x74, 0x5b, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x20, 0x61, 0x2e, 0x62, 0x74, + 0x6e, 0x7b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x2d, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x7d, + 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x33, 0x33, + 0x33, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, + 0x66, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x63, 0x63, 0x63, 0x7d, 0x2e, 0x62, + 0x74, 0x6e, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3a, + 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x66, 0x6f, 0x63, + 0x75, 0x73, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x33, + 0x33, 0x33, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, + 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x65, + 0x36, 0x65, 0x36, 0x65, 0x36, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x38, 0x63, + 0x38, 0x63, 0x38, 0x63, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x68, 0x6f, 0x76, 0x65, + 0x72, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x33, 0x33, + 0x33, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x65, 0x36, + 0x65, 0x36, 0x65, 0x36, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x61, 0x64, 0x61, + 0x64, 0x61, 0x64, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2c, + 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x3e, 0x2e, 0x64, 0x72, 0x6f, 0x70, + 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, + 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x33, 0x33, + 0x33, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x65, 0x36, + 0x65, 0x36, 0x65, 0x36, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x61, 0x64, 0x61, + 0x64, 0x61, 0x64, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x62, 0x74, + 0x6e, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, + 0x2c, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x3e, 0x2e, 0x64, 0x72, 0x6f, + 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x74, 0x6f, 0x67, 0x67, 0x6c, + 0x65, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x62, + 0x74, 0x6e, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3a, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x3a, 0x66, 0x6f, 0x63, 0x75, + 0x73, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x3a, + 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x6f, 0x70, 0x65, 0x6e, + 0x3e, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, + 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x2e, 0x62, 0x74, 0x6e, 0x2d, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x66, 0x6f, 0x63, + 0x75, 0x73, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x2e, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x62, 0x74, 0x6e, + 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x2e, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, + 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x3e, 0x2e, 0x64, 0x72, 0x6f, 0x70, + 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, + 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x2e, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x7b, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x33, 0x33, 0x33, 0x3b, 0x62, 0x61, 0x63, + 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x64, 0x34, 0x64, 0x34, 0x64, 0x34, 0x3b, + 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x23, 0x38, 0x63, 0x38, 0x63, 0x38, 0x63, 0x7d, 0x2e, + 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x3a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2c, 0x2e, 0x62, 0x74, + 0x6e, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x2c, 0x2e, 0x6f, 0x70, 0x65, 0x6e, + 0x3e, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, + 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x2e, 0x62, 0x74, 0x6e, 0x2d, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x7b, 0x62, 0x61, 0x63, + 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x7d, 0x2e, 0x62, 0x74, + 0x6e, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x64, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x3a, 0x68, 0x6f, 0x76, + 0x65, 0x72, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x5b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x5d, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x73, 0x65, 0x74, 0x5b, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x20, 0x2e, 0x62, 0x74, 0x6e, + 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x68, 0x6f, + 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, + 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x5b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x3a, + 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x73, 0x65, 0x74, 0x5b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x5d, 0x20, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, + 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x2e, + 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5b, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x2e, 0x66, 0x6f, 0x63, 0x75, + 0x73, 0x2c, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x65, 0x74, 0x5b, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x20, 0x2e, + 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x2e, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x7b, 0x62, 0x61, 0x63, 0x6b, + 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x62, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x63, + 0x63, 0x63, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x20, 0x2e, 0x62, 0x61, 0x64, 0x67, 0x65, + 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, + 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, + 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x33, 0x33, 0x33, + 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x70, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, + 0x66, 0x66, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, + 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x33, + 0x33, 0x37, 0x61, 0x62, 0x37, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x32, 0x65, + 0x36, 0x64, 0x61, 0x34, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x3a, 0x66, 0x6f, 0x63, 0x75, + 0x73, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x70, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x2e, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x7b, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x62, + 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x32, 0x38, 0x36, 0x30, 0x39, + 0x30, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x31, 0x32, 0x32, 0x62, 0x34, 0x30, + 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x70, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x7b, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x62, 0x61, + 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x32, 0x38, 0x36, 0x30, 0x39, 0x30, + 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x32, 0x30, 0x34, 0x64, 0x37, 0x34, 0x7d, + 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x3a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2c, 0x2e, 0x62, + 0x74, 0x6e, 0x2d, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x2e, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2c, 0x2e, 0x6f, 0x70, 0x65, + 0x6e, 0x3e, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, + 0x2d, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x2e, 0x62, 0x74, 0x6e, + 0x2d, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x7b, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x62, 0x61, + 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x32, 0x38, 0x36, 0x30, 0x39, 0x30, + 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x32, 0x30, 0x34, 0x64, 0x37, 0x34, 0x7d, + 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x3a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x3a, 0x68, 0x6f, + 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x70, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x6f, 0x70, + 0x65, 0x6e, 0x3e, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, + 0x6e, 0x2d, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x2e, 0x62, 0x74, + 0x6e, 0x2d, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x3a, 0x68, + 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x3a, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x62, + 0x74, 0x6e, 0x2d, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x2e, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x3a, 0x66, 0x6f, 0x63, 0x75, + 0x73, 0x2c, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x3e, 0x2e, 0x64, 0x72, + 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x74, 0x6f, 0x67, 0x67, + 0x6c, 0x65, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x70, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, + 0x62, 0x74, 0x6e, 0x2d, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x3a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2e, 0x66, 0x6f, 0x63, + 0x75, 0x73, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x70, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x2e, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x6f, 0x70, 0x65, + 0x6e, 0x3e, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, + 0x2d, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x2e, 0x62, 0x74, 0x6e, + 0x2d, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x2e, 0x66, 0x6f, + 0x63, 0x75, 0x73, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, + 0x66, 0x66, 0x66, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, + 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, + 0x32, 0x30, 0x34, 0x64, 0x37, 0x34, 0x3b, 0x62, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x31, + 0x32, 0x32, 0x62, 0x34, 0x30, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, + 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x3a, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x70, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x2c, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x3e, 0x2e, 0x64, 0x72, + 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x74, 0x6f, 0x67, 0x67, + 0x6c, 0x65, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x70, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, + 0x75, 0x6e, 0x64, 0x2d, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3a, 0x6e, + 0x6f, 0x6e, 0x65, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x70, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, + 0x62, 0x74, 0x6e, 0x2d, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x5b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x3a, + 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x73, 0x65, 0x74, 0x5b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x5d, 0x20, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x70, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, + 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x3a, + 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, + 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5b, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x3a, 0x66, 0x6f, 0x63, 0x75, + 0x73, 0x2c, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x65, 0x74, 0x5b, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x20, 0x2e, + 0x62, 0x74, 0x6e, 0x2d, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x62, 0x74, 0x6e, + 0x2d, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x2e, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x2e, 0x66, 0x6f, 0x63, 0x75, + 0x73, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x70, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x5b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x5d, 0x2e, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x73, 0x65, 0x74, 0x5b, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x20, 0x2e, 0x62, 0x74, 0x6e, 0x2d, + 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x2e, 0x66, 0x6f, 0x63, + 0x75, 0x73, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, + 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x33, + 0x33, 0x37, 0x61, 0x62, 0x37, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x32, 0x65, + 0x36, 0x64, 0x61, 0x34, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x20, 0x2e, 0x62, 0x61, 0x64, + 0x67, 0x65, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x33, + 0x33, 0x37, 0x61, 0x62, 0x37, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x23, 0x66, 0x66, 0x66, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, + 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x7b, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x62, 0x61, 0x63, + 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x35, 0x63, 0x62, 0x38, 0x35, 0x63, 0x3b, + 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x23, 0x34, 0x63, 0x61, 0x65, 0x34, 0x63, 0x7d, 0x2e, + 0x62, 0x74, 0x6e, 0x2d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x62, 0x74, 0x6e, + 0x2d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x66, 0x6f, + 0x63, 0x75, 0x73, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, + 0x66, 0x66, 0x66, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, + 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, + 0x34, 0x34, 0x39, 0x64, 0x34, 0x34, 0x3b, 0x62, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x32, + 0x35, 0x35, 0x36, 0x32, 0x35, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, + 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x3a, 0x68, 0x6f, 0x76, + 0x65, 0x72, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, + 0x66, 0x66, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, + 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x34, + 0x34, 0x39, 0x64, 0x34, 0x34, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x33, 0x39, + 0x38, 0x34, 0x33, 0x39, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x73, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x3a, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x73, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x2c, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x3e, 0x2e, 0x64, 0x72, 0x6f, + 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x74, 0x6f, 0x67, 0x67, 0x6c, + 0x65, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x73, 0x75, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, + 0x66, 0x66, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, + 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x34, + 0x34, 0x39, 0x64, 0x34, 0x34, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x33, 0x39, + 0x38, 0x34, 0x33, 0x39, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x73, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x3a, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x62, + 0x74, 0x6e, 0x2d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x3a, 0x68, 0x6f, 0x76, 0x65, + 0x72, 0x2c, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x3e, 0x2e, 0x64, 0x72, + 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x74, 0x6f, 0x67, 0x67, + 0x6c, 0x65, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x73, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, + 0x62, 0x74, 0x6e, 0x2d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x3a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x3a, 0x66, 0x6f, 0x63, + 0x75, 0x73, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x73, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x6f, 0x70, 0x65, + 0x6e, 0x3e, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, + 0x2d, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x2e, 0x62, 0x74, 0x6e, + 0x2d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x3a, 0x66, 0x6f, + 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x73, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x3a, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x2e, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x62, 0x74, + 0x6e, 0x2d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x2e, 0x66, 0x6f, 0x63, 0x75, 0x73, + 0x2c, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x3e, 0x2e, 0x64, 0x72, 0x6f, + 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x74, 0x6f, 0x67, 0x67, 0x6c, + 0x65, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x73, 0x75, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x2e, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x7b, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x62, 0x61, + 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x33, 0x39, 0x38, 0x34, 0x33, 0x39, + 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x32, 0x35, 0x35, 0x36, 0x32, 0x35, 0x7d, + 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x3a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2c, 0x2e, 0x62, + 0x74, 0x6e, 0x2d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2c, 0x2e, 0x6f, 0x70, 0x65, + 0x6e, 0x3e, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, + 0x2d, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x2e, 0x62, 0x74, 0x6e, + 0x2d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x7b, 0x62, 0x61, + 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x7d, 0x2e, 0x62, + 0x74, 0x6e, 0x2d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x3a, 0x68, 0x6f, + 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x73, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x5b, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x5d, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x65, 0x74, 0x5b, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x20, 0x2e, 0x62, 0x74, + 0x6e, 0x2d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x3a, 0x68, + 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x73, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, + 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x5b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, + 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x73, 0x65, 0x74, 0x5b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x5d, 0x20, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x73, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, + 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x73, 0x75, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x2e, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x62, 0x74, 0x6e, + 0x2d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5b, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x2e, 0x66, 0x6f, 0x63, + 0x75, 0x73, 0x2c, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x65, 0x74, + 0x5b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x20, + 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x7b, 0x62, 0x61, 0x63, + 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x35, 0x63, 0x62, 0x38, 0x35, 0x63, 0x3b, + 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x23, 0x34, 0x63, 0x61, 0x65, 0x34, 0x63, 0x7d, 0x2e, + 0x62, 0x74, 0x6e, 0x2d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x20, 0x2e, 0x62, 0x61, 0x64, 0x67, 0x65, 0x7b, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x35, 0x63, 0x62, 0x38, 0x35, 0x63, 0x3b, + 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x7d, + 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x7b, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x62, + 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x35, 0x62, 0x63, 0x30, 0x64, + 0x65, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x34, 0x36, 0x62, 0x38, 0x64, 0x61, + 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x3a, + 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, + 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x7b, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x3b, + 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x33, 0x31, 0x62, 0x30, + 0x64, 0x35, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x31, 0x62, 0x36, 0x64, 0x38, + 0x35, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x69, 0x6e, 0x66, 0x6f, + 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x62, 0x61, 0x63, 0x6b, + 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x23, 0x33, 0x31, 0x62, 0x30, 0x64, 0x35, 0x3b, 0x62, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x23, 0x32, 0x36, 0x39, 0x61, 0x62, 0x63, 0x7d, 0x2e, 0x62, + 0x74, 0x6e, 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x3a, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x69, 0x6e, + 0x66, 0x6f, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2c, 0x2e, + 0x6f, 0x70, 0x65, 0x6e, 0x3e, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, + 0x6f, 0x77, 0x6e, 0x2d, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x2e, + 0x62, 0x74, 0x6e, 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x7b, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x62, 0x61, + 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x33, 0x31, 0x62, 0x30, 0x64, 0x35, + 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x32, 0x36, 0x39, 0x61, 0x62, 0x63, 0x7d, + 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x3a, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, + 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x2e, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x3a, 0x68, 0x6f, 0x76, 0x65, + 0x72, 0x2c, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x3e, 0x2e, 0x64, 0x72, + 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x74, 0x6f, 0x67, 0x67, + 0x6c, 0x65, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x69, 0x6e, 0x66, 0x6f, + 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x62, 0x74, 0x6e, + 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x3a, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x62, 0x74, + 0x6e, 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x6f, + 0x70, 0x65, 0x6e, 0x3e, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, + 0x77, 0x6e, 0x2d, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x2e, 0x62, + 0x74, 0x6e, 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x3a, 0x66, 0x6f, 0x63, + 0x75, 0x73, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x69, 0x6e, 0x66, + 0x6f, 0x3a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2e, 0x66, 0x6f, + 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x69, 0x6e, + 0x66, 0x6f, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2e, 0x66, + 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x3e, + 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x74, + 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x69, + 0x6e, 0x66, 0x6f, 0x2e, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x7b, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x62, + 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x32, 0x36, 0x39, 0x61, 0x62, + 0x63, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x31, 0x62, 0x36, 0x64, 0x38, 0x35, + 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x3a, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2c, 0x2e, 0x62, 0x74, 0x6e, + 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x2c, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x3e, 0x2e, 0x64, 0x72, + 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x74, 0x6f, 0x67, 0x67, + 0x6c, 0x65, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x69, 0x6e, 0x66, 0x6f, + 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, + 0x2d, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, + 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x2e, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x3a, 0x68, 0x6f, + 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x69, 0x6e, + 0x66, 0x6f, 0x5b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x5d, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x73, 0x65, 0x74, 0x5b, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x5d, 0x20, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x69, + 0x6e, 0x66, 0x6f, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, + 0x62, 0x74, 0x6e, 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x3a, 0x66, 0x6f, 0x63, 0x75, + 0x73, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x69, 0x6e, 0x66, 0x6f, + 0x5b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x3a, + 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x73, 0x65, 0x74, 0x5b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x5d, 0x20, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x69, 0x6e, 0x66, + 0x6f, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x62, 0x74, + 0x6e, 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x2e, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, + 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x5b, 0x64, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x2e, 0x66, 0x6f, + 0x63, 0x75, 0x73, 0x2c, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x65, + 0x74, 0x5b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, + 0x20, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x2e, + 0x66, 0x6f, 0x63, 0x75, 0x73, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x23, 0x35, 0x62, 0x63, 0x30, 0x64, 0x65, 0x3b, 0x62, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, + 0x23, 0x34, 0x36, 0x62, 0x38, 0x64, 0x61, 0x7d, 0x2e, 0x62, 0x74, + 0x6e, 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x2e, 0x62, 0x61, 0x64, + 0x67, 0x65, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x35, + 0x62, 0x63, 0x30, 0x64, 0x65, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x23, 0x66, 0x66, 0x66, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, + 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x7b, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x62, 0x61, 0x63, + 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x30, 0x61, 0x64, 0x34, 0x65, 0x3b, + 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x23, 0x65, 0x65, 0x61, 0x32, 0x33, 0x36, 0x7d, 0x2e, + 0x62, 0x74, 0x6e, 0x2d, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, + 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x62, 0x74, 0x6e, + 0x2d, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, + 0x63, 0x75, 0x73, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, + 0x66, 0x66, 0x66, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, + 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, + 0x65, 0x63, 0x39, 0x37, 0x31, 0x66, 0x3b, 0x62, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x39, + 0x38, 0x35, 0x66, 0x30, 0x64, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, + 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x3a, 0x68, 0x6f, 0x76, + 0x65, 0x72, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, + 0x66, 0x66, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, + 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x65, + 0x63, 0x39, 0x37, 0x31, 0x66, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x64, 0x35, + 0x38, 0x35, 0x31, 0x32, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x77, + 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x3a, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x77, 0x61, 0x72, + 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x2c, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x3e, 0x2e, 0x64, 0x72, 0x6f, + 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x74, 0x6f, 0x67, 0x67, 0x6c, + 0x65, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x77, 0x61, 0x72, 0x6e, 0x69, + 0x6e, 0x67, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, + 0x66, 0x66, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, + 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x65, + 0x63, 0x39, 0x37, 0x31, 0x66, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x64, 0x35, + 0x38, 0x35, 0x31, 0x32, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x77, + 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x3a, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x62, + 0x74, 0x6e, 0x2d, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x2e, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x3a, 0x68, 0x6f, 0x76, 0x65, + 0x72, 0x2c, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x3e, 0x2e, 0x64, 0x72, + 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x74, 0x6f, 0x67, 0x67, + 0x6c, 0x65, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x77, 0x61, 0x72, 0x6e, + 0x69, 0x6e, 0x67, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, + 0x62, 0x74, 0x6e, 0x2d, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, + 0x3a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x3a, 0x66, 0x6f, 0x63, + 0x75, 0x73, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x77, 0x61, 0x72, + 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x6f, 0x70, 0x65, + 0x6e, 0x3e, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, + 0x2d, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x2e, 0x62, 0x74, 0x6e, + 0x2d, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x3a, 0x66, 0x6f, + 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x77, 0x61, + 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x3a, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x2e, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x62, 0x74, + 0x6e, 0x2d, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x2e, 0x66, 0x6f, 0x63, 0x75, 0x73, + 0x2c, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x3e, 0x2e, 0x64, 0x72, 0x6f, + 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x74, 0x6f, 0x67, 0x67, 0x6c, + 0x65, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x77, 0x61, 0x72, 0x6e, 0x69, + 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x7b, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x62, 0x61, + 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x64, 0x35, 0x38, 0x35, 0x31, 0x32, + 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x39, 0x38, 0x35, 0x66, 0x30, 0x64, 0x7d, + 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, + 0x67, 0x3a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2c, 0x2e, 0x62, + 0x74, 0x6e, 0x2d, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x2e, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2c, 0x2e, 0x6f, 0x70, 0x65, + 0x6e, 0x3e, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, + 0x2d, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x2e, 0x62, 0x74, 0x6e, + 0x2d, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x7b, 0x62, 0x61, + 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x7d, 0x2e, 0x62, + 0x74, 0x6e, 0x2d, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x2e, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x3a, 0x68, 0x6f, + 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x77, 0x61, + 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x5b, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x5d, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x65, 0x74, 0x5b, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x20, 0x2e, 0x62, 0x74, + 0x6e, 0x2d, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x3a, 0x68, + 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x77, + 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, + 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, + 0x67, 0x5b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, + 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x73, 0x65, 0x74, 0x5b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x5d, 0x20, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x77, 0x61, + 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, + 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x77, 0x61, 0x72, 0x6e, 0x69, + 0x6e, 0x67, 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x2e, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x62, 0x74, 0x6e, + 0x2d, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x5b, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x2e, 0x66, 0x6f, 0x63, + 0x75, 0x73, 0x2c, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x65, 0x74, + 0x5b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x20, + 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, + 0x67, 0x2e, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x7b, 0x62, 0x61, 0x63, + 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x30, 0x61, 0x64, 0x34, 0x65, 0x3b, + 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x23, 0x65, 0x65, 0x61, 0x32, 0x33, 0x36, 0x7d, 0x2e, + 0x62, 0x74, 0x6e, 0x2d, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, + 0x20, 0x2e, 0x62, 0x61, 0x64, 0x67, 0x65, 0x7b, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x30, 0x61, 0x64, 0x34, 0x65, 0x3b, + 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x7d, + 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, + 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, + 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, + 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x64, 0x39, 0x35, + 0x33, 0x34, 0x66, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x64, 0x34, 0x33, 0x66, + 0x33, 0x61, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x61, 0x6e, + 0x67, 0x65, 0x72, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, + 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x2e, + 0x66, 0x6f, 0x63, 0x75, 0x73, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x23, 0x63, 0x39, 0x33, 0x30, 0x32, 0x63, 0x3b, 0x62, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, + 0x23, 0x37, 0x36, 0x31, 0x63, 0x31, 0x39, 0x7d, 0x2e, 0x62, 0x74, + 0x6e, 0x2d, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x3a, 0x68, 0x6f, + 0x76, 0x65, 0x72, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, + 0x66, 0x66, 0x66, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, + 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, + 0x63, 0x39, 0x33, 0x30, 0x32, 0x63, 0x3b, 0x62, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x61, + 0x63, 0x32, 0x39, 0x32, 0x35, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, + 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x3a, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x61, 0x6e, + 0x67, 0x65, 0x72, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2c, + 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x3e, 0x2e, 0x64, 0x72, 0x6f, 0x70, + 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, + 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, + 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, + 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, + 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x63, 0x39, 0x33, + 0x30, 0x32, 0x63, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x61, 0x63, 0x32, 0x39, + 0x32, 0x35, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x61, 0x6e, + 0x67, 0x65, 0x72, 0x3a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x3a, + 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, + 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x6f, + 0x70, 0x65, 0x6e, 0x3e, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, + 0x77, 0x6e, 0x2d, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x2e, 0x62, + 0x74, 0x6e, 0x2d, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x3a, 0x68, + 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, + 0x61, 0x6e, 0x67, 0x65, 0x72, 0x3a, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x62, 0x74, + 0x6e, 0x2d, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, + 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x3e, 0x2e, 0x64, 0x72, 0x6f, 0x70, + 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, + 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, + 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x62, 0x74, 0x6e, + 0x2d, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x3a, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x2e, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, + 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x2e, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2e, 0x66, 0x6f, 0x63, 0x75, + 0x73, 0x2c, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x3e, 0x2e, 0x64, 0x72, + 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x74, 0x6f, 0x67, 0x67, + 0x6c, 0x65, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x61, 0x6e, 0x67, + 0x65, 0x72, 0x2e, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x7b, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x62, 0x61, + 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x61, 0x63, 0x32, 0x39, 0x32, 0x35, + 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x37, 0x36, 0x31, 0x63, 0x31, 0x39, 0x7d, + 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, + 0x3a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2c, 0x2e, 0x62, 0x74, + 0x6e, 0x2d, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x2c, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x3e, + 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x74, + 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, + 0x61, 0x6e, 0x67, 0x65, 0x72, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, + 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, + 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, + 0x5b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x3a, + 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x73, 0x65, 0x74, 0x5b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x5d, 0x20, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x61, 0x6e, + 0x67, 0x65, 0x72, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, + 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x2e, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x3a, 0x66, 0x6f, + 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x61, + 0x6e, 0x67, 0x65, 0x72, 0x5b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x5d, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x73, 0x65, 0x74, 0x5b, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x20, 0x2e, 0x62, 0x74, 0x6e, + 0x2d, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x3a, 0x66, 0x6f, 0x63, + 0x75, 0x73, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x61, 0x6e, + 0x67, 0x65, 0x72, 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x2e, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x62, 0x74, + 0x6e, 0x2d, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x5b, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x2e, 0x66, 0x6f, 0x63, + 0x75, 0x73, 0x2c, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x65, 0x74, + 0x5b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x20, + 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, + 0x2e, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x7b, 0x62, 0x61, 0x63, 0x6b, + 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x23, 0x64, 0x39, 0x35, 0x33, 0x34, 0x66, 0x3b, 0x62, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x23, 0x64, 0x34, 0x33, 0x66, 0x33, 0x61, 0x7d, 0x2e, 0x62, + 0x74, 0x6e, 0x2d, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x20, 0x2e, + 0x62, 0x61, 0x64, 0x67, 0x65, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x23, 0x64, 0x39, 0x35, 0x33, 0x34, 0x66, 0x3b, 0x62, 0x61, + 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x7d, 0x2e, 0x62, + 0x74, 0x6e, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, 0x7b, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x33, 0x33, 0x37, 0x61, 0x62, 0x37, 0x3b, + 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x3a, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x3b, 0x62, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, + 0x30, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, + 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, 0x3a, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2c, 0x2e, 0x62, 0x74, 0x6e, + 0x2d, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, + 0x5b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x2c, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x65, 0x74, 0x5b, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x20, 0x2e, 0x62, 0x74, + 0x6e, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, 0x7b, 0x62, 0x61, 0x63, 0x6b, + 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x3b, 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, + 0x62, 0x6f, 0x78, 0x2d, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x3a, + 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x62, 0x6f, 0x78, 0x2d, 0x73, 0x68, + 0x61, 0x64, 0x6f, 0x77, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x7d, 0x2e, + 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, 0x2c, 0x2e, 0x62, + 0x74, 0x6e, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, 0x3a, 0x68, 0x6f, 0x76, + 0x65, 0x72, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x69, 0x6e, + 0x6b, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x62, 0x74, + 0x6e, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, 0x3a, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, + 0x6c, 0x69, 0x6e, 0x6b, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, + 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, 0x3a, 0x66, + 0x6f, 0x63, 0x75, 0x73, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, + 0x23, 0x32, 0x33, 0x35, 0x32, 0x37, 0x63, 0x3b, 0x74, 0x65, 0x78, + 0x74, 0x2d, 0x64, 0x65, 0x63, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x3a, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x65, + 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, + 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x7d, 0x2e, 0x62, 0x74, + 0x6e, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, 0x5b, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, + 0x2c, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x65, 0x74, 0x5b, 0x64, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x20, 0x2e, 0x62, + 0x74, 0x6e, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, 0x3a, 0x68, 0x6f, 0x76, + 0x65, 0x72, 0x2c, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x69, 0x6e, + 0x6b, 0x5b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, + 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x73, 0x65, 0x74, 0x5b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x5d, 0x20, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x6c, 0x69, + 0x6e, 0x6b, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x7b, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x37, 0x37, 0x37, 0x3b, 0x74, 0x65, + 0x78, 0x74, 0x2d, 0x64, 0x65, 0x63, 0x6f, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x7d, 0x2e, 0x62, 0x74, + 0x6e, 0x2d, 0x6c, 0x67, 0x7b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, + 0x67, 0x3a, 0x31, 0x30, 0x70, 0x78, 0x20, 0x31, 0x36, 0x70, 0x78, + 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, + 0x31, 0x38, 0x70, 0x78, 0x3b, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x68, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x31, 0x2e, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, 0x36, 0x70, 0x78, + 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x73, 0x6d, 0x7b, 0x70, 0x61, + 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x35, 0x70, 0x78, 0x20, 0x31, + 0x30, 0x70, 0x78, 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, + 0x7a, 0x65, 0x3a, 0x31, 0x32, 0x70, 0x78, 0x3b, 0x6c, 0x69, 0x6e, + 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x31, 0x2e, + 0x35, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x72, 0x61, + 0x64, 0x69, 0x75, 0x73, 0x3a, 0x33, 0x70, 0x78, 0x7d, 0x2e, 0x62, + 0x74, 0x6e, 0x2d, 0x78, 0x73, 0x7b, 0x70, 0x61, 0x64, 0x64, 0x69, + 0x6e, 0x67, 0x3a, 0x31, 0x70, 0x78, 0x20, 0x35, 0x70, 0x78, 0x3b, + 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x31, + 0x32, 0x70, 0x78, 0x3b, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x68, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x3a, 0x31, 0x2e, 0x35, 0x3b, 0x62, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, + 0x3a, 0x33, 0x70, 0x78, 0x7d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x3a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3b, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x3a, 0x31, 0x30, 0x30, 0x25, 0x7d, 0x2e, 0x62, 0x74, + 0x6e, 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2b, 0x2e, 0x62, 0x74, + 0x6e, 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x7b, 0x6d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x35, 0x70, 0x78, + 0x7d, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, + 0x3d, 0x22, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x22, 0x5d, 0x2e, + 0x62, 0x74, 0x6e, 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x69, + 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, + 0x72, 0x65, 0x73, 0x65, 0x74, 0x22, 0x5d, 0x2e, 0x62, 0x74, 0x6e, + 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x62, 0x75, 0x74, + 0x74, 0x6f, 0x6e, 0x22, 0x5d, 0x2e, 0x62, 0x74, 0x6e, 0x2d, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, + 0x31, 0x30, 0x30, 0x25, 0x7d, 0x2e, 0x63, 0x61, 0x72, 0x65, 0x74, + 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x69, 0x6e, + 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3b, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x30, 0x3b, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x3a, 0x30, 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, + 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x32, 0x70, 0x78, 0x3b, + 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x2d, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x3a, 0x6d, 0x69, 0x64, 0x64, 0x6c, 0x65, 0x3b, + 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x74, 0x6f, 0x70, 0x3a, + 0x34, 0x70, 0x78, 0x20, 0x64, 0x61, 0x73, 0x68, 0x65, 0x64, 0x3b, + 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x74, 0x6f, 0x70, 0x3a, + 0x34, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x5c, + 0x39, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x72, 0x69, + 0x67, 0x68, 0x74, 0x3a, 0x34, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, + 0x69, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, + 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x34, 0x70, 0x78, 0x20, 0x73, 0x6f, + 0x6c, 0x69, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x7d, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x75, + 0x70, 0x2c, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, + 0x7b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x72, + 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x7d, 0x2e, 0x64, 0x72, + 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x74, 0x6f, 0x67, 0x67, + 0x6c, 0x65, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x7b, 0x6f, 0x75, + 0x74, 0x6c, 0x69, 0x6e, 0x65, 0x3a, 0x30, 0x7d, 0x2e, 0x64, 0x72, + 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x6d, 0x65, 0x6e, 0x75, + 0x7b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x61, + 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x3b, 0x74, 0x6f, 0x70, + 0x3a, 0x31, 0x30, 0x30, 0x25, 0x3b, 0x6c, 0x65, 0x66, 0x74, 0x3a, + 0x30, 0x3b, 0x7a, 0x2d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x31, + 0x30, 0x30, 0x30, 0x3b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, + 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x3a, 0x6c, 0x65, 0x66, 0x74, 0x3b, 0x6d, 0x69, 0x6e, 0x2d, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, 0x36, 0x30, 0x70, 0x78, 0x3b, + 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x35, 0x70, 0x78, + 0x20, 0x30, 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x32, + 0x70, 0x78, 0x20, 0x30, 0x20, 0x30, 0x3b, 0x6c, 0x69, 0x73, 0x74, + 0x2d, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, + 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, + 0x31, 0x34, 0x70, 0x78, 0x3b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, + 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x6c, 0x65, 0x66, 0x74, 0x3b, 0x62, + 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x62, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x31, 0x70, 0x78, 0x20, 0x73, + 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x23, 0x63, 0x63, 0x63, 0x3b, 0x62, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x31, 0x70, 0x78, 0x20, 0x73, + 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x72, 0x67, 0x62, 0x61, 0x28, 0x30, + 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2e, 0x31, 0x35, 0x29, 0x3b, + 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x72, 0x61, 0x64, 0x69, + 0x75, 0x73, 0x3a, 0x34, 0x70, 0x78, 0x3b, 0x2d, 0x77, 0x65, 0x62, + 0x6b, 0x69, 0x74, 0x2d, 0x62, 0x6f, 0x78, 0x2d, 0x73, 0x68, 0x61, + 0x64, 0x6f, 0x77, 0x3a, 0x30, 0x20, 0x36, 0x70, 0x78, 0x20, 0x31, + 0x32, 0x70, 0x78, 0x20, 0x72, 0x67, 0x62, 0x61, 0x28, 0x30, 0x2c, + 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2e, 0x31, 0x37, 0x35, 0x29, 0x3b, + 0x62, 0x6f, 0x78, 0x2d, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x3a, + 0x30, 0x20, 0x36, 0x70, 0x78, 0x20, 0x31, 0x32, 0x70, 0x78, 0x20, + 0x72, 0x67, 0x62, 0x61, 0x28, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, + 0x30, 0x2e, 0x31, 0x37, 0x35, 0x29, 0x3b, 0x2d, 0x77, 0x65, 0x62, + 0x6b, 0x69, 0x74, 0x2d, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, + 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6c, 0x69, 0x70, 0x3a, 0x70, 0x61, + 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x62, 0x6f, 0x78, 0x3b, 0x62, + 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, + 0x6c, 0x69, 0x70, 0x3a, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, + 0x2d, 0x62, 0x6f, 0x78, 0x7d, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, + 0x6f, 0x77, 0x6e, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x2e, 0x70, 0x75, + 0x6c, 0x6c, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x7b, 0x72, 0x69, + 0x67, 0x68, 0x74, 0x3a, 0x30, 0x3b, 0x6c, 0x65, 0x66, 0x74, 0x3a, + 0x61, 0x75, 0x74, 0x6f, 0x7d, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, + 0x6f, 0x77, 0x6e, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x20, 0x2e, 0x64, + 0x69, 0x76, 0x69, 0x64, 0x65, 0x72, 0x7b, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x3a, 0x31, 0x70, 0x78, 0x3b, 0x6d, 0x61, 0x72, 0x67, + 0x69, 0x6e, 0x3a, 0x39, 0x70, 0x78, 0x20, 0x30, 0x3b, 0x6f, 0x76, + 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x3a, 0x68, 0x69, 0x64, 0x64, + 0x65, 0x6e, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, + 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x65, + 0x35, 0x65, 0x35, 0x65, 0x35, 0x7d, 0x2e, 0x64, 0x72, 0x6f, 0x70, + 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x3e, 0x6c, + 0x69, 0x3e, 0x61, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, + 0x3a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3b, 0x70, 0x61, 0x64, 0x64, + 0x69, 0x6e, 0x67, 0x3a, 0x33, 0x70, 0x78, 0x20, 0x32, 0x30, 0x70, + 0x78, 0x3b, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x3a, 0x62, 0x6f, 0x74, + 0x68, 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x3a, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x3b, 0x6c, + 0x69, 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, + 0x31, 0x2e, 0x34, 0x32, 0x38, 0x35, 0x37, 0x31, 0x34, 0x33, 0x3b, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x33, 0x33, 0x33, 0x3b, + 0x77, 0x68, 0x69, 0x74, 0x65, 0x2d, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x3a, 0x6e, 0x6f, 0x77, 0x72, 0x61, 0x70, 0x7d, 0x2e, 0x64, 0x72, + 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x6d, 0x65, 0x6e, 0x75, + 0x3e, 0x6c, 0x69, 0x3e, 0x61, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, + 0x2c, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, + 0x6d, 0x65, 0x6e, 0x75, 0x3e, 0x6c, 0x69, 0x3e, 0x61, 0x3a, 0x66, + 0x6f, 0x63, 0x75, 0x73, 0x7b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x64, + 0x65, 0x63, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x6e, + 0x6f, 0x6e, 0x65, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, + 0x32, 0x36, 0x32, 0x36, 0x32, 0x36, 0x3b, 0x62, 0x61, 0x63, 0x6b, + 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x23, 0x66, 0x35, 0x66, 0x35, 0x66, 0x35, 0x7d, 0x2e, + 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x6d, 0x65, + 0x6e, 0x75, 0x3e, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x3e, + 0x61, 0x2c, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, + 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x3e, 0x2e, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x3e, 0x61, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, + 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x6d, + 0x65, 0x6e, 0x75, 0x3e, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x3e, 0x61, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x7b, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x74, 0x65, + 0x78, 0x74, 0x2d, 0x64, 0x65, 0x63, 0x6f, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x6f, 0x75, 0x74, + 0x6c, 0x69, 0x6e, 0x65, 0x3a, 0x30, 0x3b, 0x62, 0x61, 0x63, 0x6b, + 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x23, 0x33, 0x33, 0x37, 0x61, 0x62, 0x37, 0x7d, 0x2e, + 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x6d, 0x65, + 0x6e, 0x75, 0x3e, 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x3e, 0x61, 0x2c, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, + 0x77, 0x6e, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x3e, 0x2e, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x3e, 0x61, 0x3a, 0x68, 0x6f, + 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, + 0x77, 0x6e, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x3e, 0x2e, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x3e, 0x61, 0x3a, 0x66, 0x6f, + 0x63, 0x75, 0x73, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, + 0x37, 0x37, 0x37, 0x7d, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, + 0x77, 0x6e, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x3e, 0x2e, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x3e, 0x61, 0x3a, 0x68, 0x6f, + 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, + 0x77, 0x6e, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x3e, 0x2e, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x3e, 0x61, 0x3a, 0x66, 0x6f, + 0x63, 0x75, 0x73, 0x7b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x64, 0x65, + 0x63, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x6e, 0x6f, + 0x6e, 0x65, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, + 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3b, 0x62, + 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x69, + 0x6d, 0x61, 0x67, 0x65, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x66, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x3a, 0x70, 0x72, 0x6f, 0x67, 0x69, + 0x64, 0x3a, 0x44, 0x58, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x4d, 0x69, 0x63, + 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x2e, 0x67, 0x72, 0x61, 0x64, + 0x69, 0x65, 0x6e, 0x74, 0x28, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, + 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x3a, 0x6e, 0x6f, 0x74, 0x2d, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x7d, 0x2e, 0x6f, 0x70, + 0x65, 0x6e, 0x3e, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, + 0x6e, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x7b, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x3a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x7d, 0x2e, + 0x6f, 0x70, 0x65, 0x6e, 0x3e, 0x61, 0x7b, 0x6f, 0x75, 0x74, 0x6c, + 0x69, 0x6e, 0x65, 0x3a, 0x30, 0x7d, 0x2e, 0x64, 0x72, 0x6f, 0x70, + 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x2d, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x61, + 0x75, 0x74, 0x6f, 0x3b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x30, + 0x7d, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, + 0x6d, 0x65, 0x6e, 0x75, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x7b, 0x6c, + 0x65, 0x66, 0x74, 0x3a, 0x30, 0x3b, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x3a, 0x61, 0x75, 0x74, 0x6f, 0x7d, 0x2e, 0x64, 0x72, 0x6f, 0x70, + 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, + 0x3a, 0x33, 0x70, 0x78, 0x20, 0x32, 0x30, 0x70, 0x78, 0x3b, 0x66, + 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x31, 0x32, + 0x70, 0x78, 0x3b, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x3a, 0x31, 0x2e, 0x34, 0x32, 0x38, 0x35, 0x37, + 0x31, 0x34, 0x33, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, + 0x37, 0x37, 0x37, 0x3b, 0x77, 0x68, 0x69, 0x74, 0x65, 0x2d, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x3a, 0x6e, 0x6f, 0x77, 0x72, 0x61, 0x70, + 0x7d, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, + 0x62, 0x61, 0x63, 0x6b, 0x64, 0x72, 0x6f, 0x70, 0x7b, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x66, 0x69, 0x78, 0x65, + 0x64, 0x3b, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x30, 0x3b, 0x72, 0x69, + 0x67, 0x68, 0x74, 0x3a, 0x30, 0x3b, 0x62, 0x6f, 0x74, 0x74, 0x6f, + 0x6d, 0x3a, 0x30, 0x3b, 0x74, 0x6f, 0x70, 0x3a, 0x30, 0x3b, 0x7a, + 0x2d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x39, 0x39, 0x30, 0x7d, + 0x2e, 0x70, 0x75, 0x6c, 0x6c, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x3e, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, + 0x6d, 0x65, 0x6e, 0x75, 0x7b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, + 0x30, 0x3b, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x61, 0x75, 0x74, 0x6f, + 0x7d, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x75, 0x70, 0x20, 0x2e, 0x63, + 0x61, 0x72, 0x65, 0x74, 0x2c, 0x2e, 0x6e, 0x61, 0x76, 0x62, 0x61, + 0x72, 0x2d, 0x66, 0x69, 0x78, 0x65, 0x64, 0x2d, 0x62, 0x6f, 0x74, + 0x74, 0x6f, 0x6d, 0x20, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, + 0x77, 0x6e, 0x20, 0x2e, 0x63, 0x61, 0x72, 0x65, 0x74, 0x7b, 0x62, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x30, + 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x62, 0x6f, 0x74, + 0x74, 0x6f, 0x6d, 0x3a, 0x34, 0x70, 0x78, 0x20, 0x64, 0x61, 0x73, + 0x68, 0x65, 0x64, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, + 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x34, 0x70, 0x78, 0x20, + 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x5c, 0x39, 0x3b, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, 0x22, 0x7d, 0x2e, 0x64, + 0x72, 0x6f, 0x70, 0x75, 0x70, 0x20, 0x2e, 0x64, 0x72, 0x6f, 0x70, + 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x2c, 0x2e, + 0x6e, 0x61, 0x76, 0x62, 0x61, 0x72, 0x2d, 0x66, 0x69, 0x78, 0x65, + 0x64, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x20, 0x2e, 0x64, + 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x20, 0x2e, 0x64, 0x72, + 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x6d, 0x65, 0x6e, 0x75, + 0x7b, 0x74, 0x6f, 0x70, 0x3a, 0x61, 0x75, 0x74, 0x6f, 0x3b, 0x62, + 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x31, 0x30, 0x30, 0x25, 0x3b, + 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, + 0x6f, 0x6d, 0x3a, 0x32, 0x70, 0x78, 0x7d, 0x40, 0x6d, 0x65, 0x64, + 0x69, 0x61, 0x20, 0x28, 0x6d, 0x69, 0x6e, 0x2d, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x3a, 0x37, 0x36, 0x38, 0x70, 0x78, 0x29, 0x7b, 0x2e, + 0x6e, 0x61, 0x76, 0x62, 0x61, 0x72, 0x2d, 0x72, 0x69, 0x67, 0x68, + 0x74, 0x20, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, + 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, + 0x61, 0x75, 0x74, 0x6f, 0x3b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, + 0x30, 0x7d, 0x2e, 0x6e, 0x61, 0x76, 0x62, 0x61, 0x72, 0x2d, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x20, 0x2e, 0x64, 0x72, 0x6f, 0x70, 0x64, + 0x6f, 0x77, 0x6e, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x2d, 0x6c, 0x65, + 0x66, 0x74, 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x30, 0x3b, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x3a, 0x61, 0x75, 0x74, 0x6f, 0x7d, 0x7d, + 0x2e, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x69, 0x6e, + 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3b, + 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x6c, 0x65, 0x66, + 0x74, 0x3a, 0x30, 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, + 0x32, 0x30, 0x70, 0x78, 0x20, 0x30, 0x3b, 0x62, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, 0x34, + 0x70, 0x78, 0x7d, 0x2e, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x3e, 0x6c, 0x69, 0x7b, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x3a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x7d, + 0x2e, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x3e, 0x6c, 0x69, 0x3e, 0x61, 0x2c, 0x2e, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x6c, 0x69, 0x3e, 0x73, + 0x70, 0x61, 0x6e, 0x7b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x3a, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x3b, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3a, 0x6c, 0x65, 0x66, 0x74, 0x3b, + 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x36, 0x70, 0x78, + 0x20, 0x31, 0x32, 0x70, 0x78, 0x3b, 0x6c, 0x69, 0x6e, 0x65, 0x2d, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x31, 0x2e, 0x34, 0x32, + 0x38, 0x35, 0x37, 0x31, 0x34, 0x33, 0x3b, 0x74, 0x65, 0x78, 0x74, + 0x2d, 0x64, 0x65, 0x63, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x23, 0x33, 0x33, 0x37, 0x61, 0x62, 0x37, 0x3b, 0x62, 0x61, + 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x62, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x3a, 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, + 0x6c, 0x69, 0x64, 0x20, 0x23, 0x64, 0x64, 0x64, 0x3b, 0x6d, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x2d, + 0x31, 0x70, 0x78, 0x7d, 0x2e, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x6c, 0x69, 0x3a, 0x66, 0x69, 0x72, + 0x73, 0x74, 0x2d, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x61, 0x2c, + 0x2e, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x3e, 0x6c, 0x69, 0x3a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x2d, 0x63, + 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x73, 0x70, 0x61, 0x6e, 0x7b, 0x6d, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, + 0x30, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x62, 0x6f, + 0x74, 0x74, 0x6f, 0x6d, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x2d, 0x72, + 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, 0x34, 0x70, 0x78, 0x3b, 0x62, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x74, 0x6f, 0x70, 0x2d, 0x6c, + 0x65, 0x66, 0x74, 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, + 0x34, 0x70, 0x78, 0x7d, 0x2e, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x6c, 0x69, 0x3a, 0x6c, 0x61, 0x73, + 0x74, 0x2d, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x61, 0x2c, 0x2e, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, + 0x6c, 0x69, 0x3a, 0x6c, 0x61, 0x73, 0x74, 0x2d, 0x63, 0x68, 0x69, + 0x6c, 0x64, 0x3e, 0x73, 0x70, 0x61, 0x6e, 0x7b, 0x62, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x2d, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, + 0x73, 0x3a, 0x34, 0x70, 0x78, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x2d, 0x74, 0x6f, 0x70, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, 0x34, 0x70, 0x78, + 0x7d, 0x2e, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x3e, 0x6c, 0x69, 0x3e, 0x61, 0x3a, 0x68, 0x6f, 0x76, 0x65, + 0x72, 0x2c, 0x2e, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x3e, 0x6c, 0x69, 0x3e, 0x73, 0x70, 0x61, 0x6e, 0x3a, + 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x6c, 0x69, 0x3e, 0x61, + 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x6c, 0x69, 0x3e, + 0x73, 0x70, 0x61, 0x6e, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x7b, + 0x7a, 0x2d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x32, 0x3b, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x32, 0x33, 0x35, 0x32, 0x37, + 0x63, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x65, 0x65, + 0x65, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x64, 0x64, 0x64, 0x7d, 0x2e, 0x70, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x2e, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x3e, 0x61, 0x2c, 0x2e, 0x70, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x2e, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x3e, 0x73, 0x70, 0x61, 0x6e, + 0x2c, 0x2e, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x3e, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x3e, 0x61, + 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x2e, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x3e, 0x73, 0x70, 0x61, 0x6e, 0x3a, 0x68, + 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x70, 0x61, 0x67, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x2e, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x3e, 0x61, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, + 0x2e, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x3e, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x3e, 0x73, 0x70, + 0x61, 0x6e, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x7b, 0x7a, 0x2d, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x33, 0x3b, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x62, 0x61, 0x63, + 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x33, 0x33, 0x37, 0x61, 0x62, 0x37, 0x3b, + 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x23, 0x33, 0x33, 0x37, 0x61, 0x62, 0x37, 0x3b, 0x63, + 0x75, 0x72, 0x73, 0x6f, 0x72, 0x3a, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x7d, 0x2e, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x3e, 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x3e, 0x73, 0x70, 0x61, 0x6e, 0x2c, 0x2e, 0x70, 0x61, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x2e, 0x64, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x3e, 0x73, 0x70, 0x61, + 0x6e, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x70, 0x61, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x2e, 0x64, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x3e, 0x73, 0x70, 0x61, + 0x6e, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x2e, 0x70, 0x61, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x2e, 0x64, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x3e, 0x61, 0x2c, 0x2e, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, + 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x3e, 0x61, + 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x2e, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x3e, 0x61, 0x3a, 0x66, 0x6f, + 0x63, 0x75, 0x73, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, + 0x37, 0x37, 0x37, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, + 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, + 0x66, 0x66, 0x66, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x64, 0x64, 0x64, 0x3b, + 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x3a, 0x6e, 0x6f, 0x74, 0x2d, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x7d, 0x2e, 0x70, 0x61, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x6c, 0x67, + 0x3e, 0x6c, 0x69, 0x3e, 0x61, 0x2c, 0x2e, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x6c, 0x67, 0x3e, 0x6c, + 0x69, 0x3e, 0x73, 0x70, 0x61, 0x6e, 0x7b, 0x70, 0x61, 0x64, 0x64, + 0x69, 0x6e, 0x67, 0x3a, 0x31, 0x30, 0x70, 0x78, 0x20, 0x31, 0x36, + 0x70, 0x78, 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, + 0x65, 0x3a, 0x31, 0x38, 0x70, 0x78, 0x3b, 0x6c, 0x69, 0x6e, 0x65, + 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x31, 0x2e, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x7d, 0x2e, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x6c, 0x67, 0x3e, + 0x6c, 0x69, 0x3a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x2d, 0x63, 0x68, + 0x69, 0x6c, 0x64, 0x3e, 0x61, 0x2c, 0x2e, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x6c, 0x67, 0x3e, 0x6c, + 0x69, 0x3a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x2d, 0x63, 0x68, 0x69, + 0x6c, 0x64, 0x3e, 0x73, 0x70, 0x61, 0x6e, 0x7b, 0x62, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x2d, + 0x6c, 0x65, 0x66, 0x74, 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, + 0x3a, 0x36, 0x70, 0x78, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x2d, 0x74, 0x6f, 0x70, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x2d, 0x72, + 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, 0x36, 0x70, 0x78, 0x7d, 0x2e, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, + 0x6c, 0x67, 0x3e, 0x6c, 0x69, 0x3a, 0x6c, 0x61, 0x73, 0x74, 0x2d, + 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x61, 0x2c, 0x2e, 0x70, 0x61, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x6c, 0x67, + 0x3e, 0x6c, 0x69, 0x3a, 0x6c, 0x61, 0x73, 0x74, 0x2d, 0x63, 0x68, + 0x69, 0x6c, 0x64, 0x3e, 0x73, 0x70, 0x61, 0x6e, 0x7b, 0x62, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, + 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x72, 0x61, 0x64, 0x69, + 0x75, 0x73, 0x3a, 0x36, 0x70, 0x78, 0x3b, 0x62, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x2d, 0x74, 0x6f, 0x70, 0x2d, 0x72, 0x69, 0x67, 0x68, + 0x74, 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, 0x36, 0x70, + 0x78, 0x7d, 0x2e, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2d, 0x73, 0x6d, 0x3e, 0x6c, 0x69, 0x3e, 0x61, 0x2c, + 0x2e, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2d, 0x73, 0x6d, 0x3e, 0x6c, 0x69, 0x3e, 0x73, 0x70, 0x61, 0x6e, + 0x7b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x35, 0x70, + 0x78, 0x20, 0x31, 0x30, 0x70, 0x78, 0x3b, 0x66, 0x6f, 0x6e, 0x74, + 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x31, 0x32, 0x70, 0x78, 0x3b, + 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x3a, 0x31, 0x2e, 0x35, 0x7d, 0x2e, 0x70, 0x61, 0x67, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x73, 0x6d, 0x3e, 0x6c, 0x69, + 0x3a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x2d, 0x63, 0x68, 0x69, 0x6c, + 0x64, 0x3e, 0x61, 0x2c, 0x2e, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x73, 0x6d, 0x3e, 0x6c, 0x69, 0x3a, + 0x66, 0x69, 0x72, 0x73, 0x74, 0x2d, 0x63, 0x68, 0x69, 0x6c, 0x64, + 0x3e, 0x73, 0x70, 0x61, 0x6e, 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x2d, 0x6c, 0x65, + 0x66, 0x74, 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, 0x33, + 0x70, 0x78, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x74, + 0x6f, 0x70, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x2d, 0x72, 0x61, 0x64, + 0x69, 0x75, 0x73, 0x3a, 0x33, 0x70, 0x78, 0x7d, 0x2e, 0x70, 0x61, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x73, 0x6d, + 0x3e, 0x6c, 0x69, 0x3a, 0x6c, 0x61, 0x73, 0x74, 0x2d, 0x63, 0x68, + 0x69, 0x6c, 0x64, 0x3e, 0x61, 0x2c, 0x2e, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x73, 0x6d, 0x3e, 0x6c, + 0x69, 0x3a, 0x6c, 0x61, 0x73, 0x74, 0x2d, 0x63, 0x68, 0x69, 0x6c, + 0x64, 0x3e, 0x73, 0x70, 0x61, 0x6e, 0x7b, 0x62, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x2d, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, + 0x3a, 0x33, 0x70, 0x78, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x2d, 0x74, 0x6f, 0x70, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x2d, + 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, 0x33, 0x70, 0x78, 0x7d, + 0x2e, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x7b, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x3a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x3b, + 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x2e, 0x32, 0x65, + 0x6d, 0x20, 0x2e, 0x36, 0x65, 0x6d, 0x20, 0x2e, 0x33, 0x65, 0x6d, + 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, + 0x37, 0x35, 0x25, 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x3a, 0x62, 0x6f, 0x6c, 0x64, 0x3b, 0x6c, + 0x69, 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, + 0x31, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, + 0x66, 0x3b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, + 0x6e, 0x3a, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x77, 0x68, + 0x69, 0x74, 0x65, 0x2d, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3a, 0x6e, + 0x6f, 0x77, 0x72, 0x61, 0x70, 0x3b, 0x76, 0x65, 0x72, 0x74, 0x69, + 0x63, 0x61, 0x6c, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x62, + 0x61, 0x73, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x3b, 0x62, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, + 0x2e, 0x32, 0x35, 0x65, 0x6d, 0x7d, 0x61, 0x2e, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x61, 0x2e, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, + 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, + 0x3b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x64, 0x65, 0x63, 0x6f, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, + 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x3a, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x7d, 0x2e, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3a, + 0x65, 0x6d, 0x70, 0x74, 0x79, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, + 0x61, 0x79, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x7d, 0x2e, 0x62, 0x74, + 0x6e, 0x20, 0x2e, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x7b, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x72, 0x65, 0x6c, 0x61, + 0x74, 0x69, 0x76, 0x65, 0x3b, 0x74, 0x6f, 0x70, 0x3a, 0x2d, 0x31, + 0x70, 0x78, 0x7d, 0x2e, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2d, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x7b, 0x62, 0x61, 0x63, 0x6b, + 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x23, 0x37, 0x37, 0x37, 0x7d, 0x2e, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5b, + 0x68, 0x72, 0x65, 0x66, 0x5d, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, + 0x2c, 0x2e, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2d, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x5b, 0x68, 0x72, 0x65, 0x66, 0x5d, 0x3a, + 0x66, 0x6f, 0x63, 0x75, 0x73, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x23, 0x35, 0x65, 0x35, 0x65, 0x35, 0x65, 0x7d, 0x2e, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x2d, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x33, 0x33, + 0x37, 0x61, 0x62, 0x37, 0x7d, 0x2e, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x2d, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5b, 0x68, 0x72, + 0x65, 0x66, 0x5d, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2d, 0x70, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x5b, 0x68, 0x72, 0x65, 0x66, 0x5d, 0x3a, 0x66, 0x6f, + 0x63, 0x75, 0x73, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, + 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, + 0x32, 0x38, 0x36, 0x30, 0x39, 0x30, 0x7d, 0x2e, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x2d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x7b, + 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x35, 0x63, 0x62, 0x38, + 0x35, 0x63, 0x7d, 0x2e, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2d, 0x73, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5b, 0x68, 0x72, 0x65, 0x66, + 0x5d, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x2d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x5b, 0x68, 0x72, 0x65, 0x66, 0x5d, 0x3a, 0x66, 0x6f, 0x63, 0x75, + 0x73, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x34, 0x34, + 0x39, 0x64, 0x34, 0x34, 0x7d, 0x2e, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x23, 0x35, 0x62, 0x63, 0x30, 0x64, 0x65, 0x7d, 0x2e, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x5b, 0x68, + 0x72, 0x65, 0x66, 0x5d, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, + 0x2e, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2d, 0x69, 0x6e, 0x66, 0x6f, + 0x5b, 0x68, 0x72, 0x65, 0x66, 0x5d, 0x3a, 0x66, 0x6f, 0x63, 0x75, + 0x73, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x33, 0x31, + 0x62, 0x30, 0x64, 0x35, 0x7d, 0x2e, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x2d, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x7b, 0x62, 0x61, + 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x30, 0x61, 0x64, 0x34, 0x65, + 0x7d, 0x2e, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2d, 0x77, 0x61, 0x72, + 0x6e, 0x69, 0x6e, 0x67, 0x5b, 0x68, 0x72, 0x65, 0x66, 0x5d, 0x3a, + 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x2d, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x5b, 0x68, + 0x72, 0x65, 0x66, 0x5d, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x7b, + 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x65, 0x63, 0x39, 0x37, + 0x31, 0x66, 0x7d, 0x2e, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2d, 0x64, + 0x61, 0x6e, 0x67, 0x65, 0x72, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x23, 0x64, 0x39, 0x35, 0x33, 0x34, 0x66, 0x7d, 0x2e, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x2d, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, + 0x5b, 0x68, 0x72, 0x65, 0x66, 0x5d, 0x3a, 0x68, 0x6f, 0x76, 0x65, + 0x72, 0x2c, 0x2e, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2d, 0x64, 0x61, + 0x6e, 0x67, 0x65, 0x72, 0x5b, 0x68, 0x72, 0x65, 0x66, 0x5d, 0x3a, + 0x66, 0x6f, 0x63, 0x75, 0x73, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x23, 0x63, 0x39, 0x33, 0x30, 0x32, 0x63, 0x7d, 0x2e, 0x61, + 0x6c, 0x65, 0x72, 0x74, 0x7b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, + 0x67, 0x3a, 0x31, 0x35, 0x70, 0x78, 0x3b, 0x6d, 0x61, 0x72, 0x67, + 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x32, + 0x30, 0x70, 0x78, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, + 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3b, + 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x72, 0x61, 0x64, 0x69, + 0x75, 0x73, 0x3a, 0x34, 0x70, 0x78, 0x7d, 0x2e, 0x61, 0x6c, 0x65, + 0x72, 0x74, 0x20, 0x68, 0x34, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, + 0x6e, 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x30, 0x3b, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x69, 0x6e, 0x68, 0x65, 0x72, 0x69, 0x74, 0x7d, + 0x2e, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x20, 0x2e, 0x61, 0x6c, 0x65, + 0x72, 0x74, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, 0x7b, 0x66, 0x6f, 0x6e, + 0x74, 0x2d, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x62, 0x6f, + 0x6c, 0x64, 0x7d, 0x2e, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x3e, 0x70, + 0x2c, 0x2e, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x3e, 0x75, 0x6c, 0x7b, + 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, + 0x6f, 0x6d, 0x3a, 0x30, 0x7d, 0x2e, 0x61, 0x6c, 0x65, 0x72, 0x74, + 0x3e, 0x70, 0x2b, 0x70, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, + 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x35, 0x70, 0x78, 0x7d, 0x2e, 0x61, + 0x6c, 0x65, 0x72, 0x74, 0x2d, 0x64, 0x69, 0x73, 0x6d, 0x69, 0x73, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x2e, 0x61, 0x6c, 0x65, 0x72, + 0x74, 0x2d, 0x64, 0x69, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x62, + 0x6c, 0x65, 0x7b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2d, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x33, 0x35, 0x70, 0x78, 0x7d, + 0x2e, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x2d, 0x64, 0x69, 0x73, 0x6d, + 0x69, 0x73, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x2e, 0x63, 0x6c, + 0x6f, 0x73, 0x65, 0x2c, 0x2e, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x2d, + 0x64, 0x69, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, + 0x20, 0x2e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x7b, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x72, 0x65, 0x6c, 0x61, 0x74, + 0x69, 0x76, 0x65, 0x3b, 0x74, 0x6f, 0x70, 0x3a, 0x2d, 0x32, 0x70, + 0x78, 0x3b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x2d, 0x32, 0x31, + 0x70, 0x78, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x69, 0x6e, + 0x68, 0x65, 0x72, 0x69, 0x74, 0x7d, 0x2e, 0x61, 0x6c, 0x65, 0x72, + 0x74, 0x2d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x7b, 0x62, + 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x64, 0x66, 0x66, 0x30, 0x64, + 0x38, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x64, 0x36, 0x65, 0x39, 0x63, 0x36, + 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x33, 0x63, 0x37, + 0x36, 0x33, 0x64, 0x7d, 0x2e, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x2d, + 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x68, 0x72, 0x7b, + 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x74, 0x6f, 0x70, 0x2d, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x63, 0x39, 0x65, 0x32, + 0x62, 0x33, 0x7d, 0x2e, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x2d, 0x73, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x2e, 0x61, 0x6c, 0x65, + 0x72, 0x74, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, 0x7b, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x32, 0x62, 0x35, 0x34, 0x32, 0x63, 0x7d, + 0x2e, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x2d, 0x69, 0x6e, 0x66, 0x6f, + 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, + 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x64, 0x39, 0x65, + 0x64, 0x66, 0x37, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x62, 0x63, 0x65, 0x38, + 0x66, 0x31, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x33, + 0x31, 0x37, 0x30, 0x38, 0x66, 0x7d, 0x2e, 0x61, 0x6c, 0x65, 0x72, + 0x74, 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x68, 0x72, 0x7b, 0x62, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x74, 0x6f, 0x70, 0x2d, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x61, 0x36, 0x65, 0x31, 0x65, + 0x63, 0x7d, 0x2e, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x2d, 0x69, 0x6e, + 0x66, 0x6f, 0x20, 0x2e, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x2d, 0x6c, + 0x69, 0x6e, 0x6b, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, + 0x32, 0x34, 0x35, 0x32, 0x36, 0x39, 0x7d, 0x2e, 0x61, 0x6c, 0x65, + 0x72, 0x74, 0x2d, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x7b, + 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x63, 0x66, 0x38, + 0x65, 0x33, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x61, 0x65, 0x62, 0x63, + 0x63, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x38, 0x61, + 0x36, 0x64, 0x33, 0x62, 0x7d, 0x2e, 0x61, 0x6c, 0x65, 0x72, 0x74, + 0x2d, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x72, + 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x74, 0x6f, 0x70, + 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x37, 0x65, + 0x31, 0x62, 0x35, 0x7d, 0x2e, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x2d, + 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x2e, 0x61, 0x6c, + 0x65, 0x72, 0x74, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, 0x7b, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x36, 0x36, 0x35, 0x31, 0x32, 0x63, + 0x7d, 0x2e, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x2d, 0x64, 0x61, 0x6e, + 0x67, 0x65, 0x72, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, + 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, + 0x66, 0x32, 0x64, 0x65, 0x64, 0x65, 0x3b, 0x62, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x65, + 0x62, 0x63, 0x63, 0x64, 0x31, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x23, 0x61, 0x39, 0x34, 0x34, 0x34, 0x32, 0x7d, 0x2e, 0x61, + 0x6c, 0x65, 0x72, 0x74, 0x2d, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, + 0x20, 0x68, 0x72, 0x7b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, + 0x74, 0x6f, 0x70, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, + 0x65, 0x34, 0x62, 0x39, 0x63, 0x30, 0x7d, 0x2e, 0x61, 0x6c, 0x65, + 0x72, 0x74, 0x2d, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x20, 0x2e, + 0x61, 0x6c, 0x65, 0x72, 0x74, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, 0x7b, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x38, 0x34, 0x33, 0x35, + 0x33, 0x34, 0x7d, 0x2e, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x66, 0x69, + 0x78, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x2c, 0x2e, 0x63, + 0x6c, 0x65, 0x61, 0x72, 0x66, 0x69, 0x78, 0x3a, 0x61, 0x66, 0x74, + 0x65, 0x72, 0x2c, 0x2e, 0x64, 0x6c, 0x2d, 0x68, 0x6f, 0x72, 0x69, + 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x20, 0x64, 0x64, 0x3a, 0x62, + 0x65, 0x66, 0x6f, 0x72, 0x65, 0x2c, 0x2e, 0x64, 0x6c, 0x2d, 0x68, + 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x20, 0x64, + 0x64, 0x3a, 0x61, 0x66, 0x74, 0x65, 0x72, 0x2c, 0x2e, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3a, 0x62, 0x65, 0x66, + 0x6f, 0x72, 0x65, 0x2c, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x3a, 0x61, 0x66, 0x74, 0x65, 0x72, 0x2c, 0x2e, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2d, 0x66, + 0x6c, 0x75, 0x69, 0x64, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, + 0x2c, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x2d, 0x66, 0x6c, 0x75, 0x69, 0x64, 0x3a, 0x61, 0x66, 0x74, 0x65, + 0x72, 0x2c, 0x2e, 0x72, 0x6f, 0x77, 0x3a, 0x62, 0x65, 0x66, 0x6f, + 0x72, 0x65, 0x2c, 0x2e, 0x72, 0x6f, 0x77, 0x3a, 0x61, 0x66, 0x74, + 0x65, 0x72, 0x2c, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x68, 0x6f, + 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x20, 0x2e, 0x66, + 0x6f, 0x72, 0x6d, 0x2d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x3a, 0x62, + 0x65, 0x66, 0x6f, 0x72, 0x65, 0x2c, 0x2e, 0x66, 0x6f, 0x72, 0x6d, + 0x2d, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, + 0x20, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x3a, 0x61, 0x66, 0x74, 0x65, 0x72, 0x7b, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, 0x20, 0x22, 0x3b, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x7d, 0x2e, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x66, 0x69, 0x78, 0x3a, + 0x61, 0x66, 0x74, 0x65, 0x72, 0x2c, 0x2e, 0x64, 0x6c, 0x2d, 0x68, + 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x20, 0x64, + 0x64, 0x3a, 0x61, 0x66, 0x74, 0x65, 0x72, 0x2c, 0x2e, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3a, 0x61, 0x66, 0x74, + 0x65, 0x72, 0x2c, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x2d, 0x66, 0x6c, 0x75, 0x69, 0x64, 0x3a, 0x61, 0x66, + 0x74, 0x65, 0x72, 0x2c, 0x2e, 0x72, 0x6f, 0x77, 0x3a, 0x61, 0x66, + 0x74, 0x65, 0x72, 0x2c, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x68, + 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x20, 0x2e, + 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x3a, + 0x61, 0x66, 0x74, 0x65, 0x72, 0x7b, 0x63, 0x6c, 0x65, 0x61, 0x72, + 0x3a, 0x62, 0x6f, 0x74, 0x68, 0x7d, 0x2e, 0x63, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x7b, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, + 0x74, 0x3a, 0x61, 0x75, 0x74, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x67, + 0x69, 0x6e, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x61, 0x75, + 0x74, 0x6f, 0x7d, 0x2e, 0x70, 0x75, 0x6c, 0x6c, 0x2d, 0x72, 0x69, + 0x67, 0x68, 0x74, 0x7b, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3a, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, + 0x74, 0x61, 0x6e, 0x74, 0x7d, 0x2e, 0x70, 0x75, 0x6c, 0x6c, 0x2d, + 0x6c, 0x65, 0x66, 0x74, 0x7b, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3a, + 0x6c, 0x65, 0x66, 0x74, 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, + 0x74, 0x61, 0x6e, 0x74, 0x7d, 0x2e, 0x68, 0x69, 0x64, 0x65, 0x7b, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x6e, 0x6f, 0x6e, + 0x65, 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, + 0x74, 0x7d, 0x2e, 0x73, 0x68, 0x6f, 0x77, 0x7b, 0x64, 0x69, 0x73, + 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, + 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x7d, + 0x2e, 0x69, 0x6e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x7b, + 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x3a, + 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x7d, 0x2e, 0x74, 0x65, 0x78, + 0x74, 0x2d, 0x68, 0x69, 0x64, 0x65, 0x7b, 0x66, 0x6f, 0x6e, 0x74, + 0x3a, 0x30, 0x2f, 0x30, 0x20, 0x61, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x3b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x73, 0x68, 0x61, + 0x64, 0x6f, 0x77, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x62, 0x61, + 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x3a, 0x30, 0x7d, 0x2e, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x7b, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x6e, 0x6f, 0x6e, + 0x65, 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, + 0x74, 0x7d, 0x2e, 0x61, 0x66, 0x66, 0x69, 0x78, 0x7b, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x66, 0x69, 0x78, 0x65, + 0x64, 0x7d, 0x40, 0x2d, 0x6d, 0x73, 0x2d, 0x76, 0x69, 0x65, 0x77, + 0x70, 0x6f, 0x72, 0x74, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2d, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x7d, 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, + 0x78, 0x73, 0x2c, 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, + 0x2d, 0x73, 0x6d, 0x2c, 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, + 0x65, 0x2d, 0x6d, 0x64, 0x2c, 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, + 0x6c, 0x65, 0x2d, 0x6c, 0x67, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, + 0x61, 0x79, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x20, 0x21, 0x69, 0x6d, + 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x7d, 0x2e, 0x76, 0x69, + 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x78, 0x73, 0x2d, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x2c, 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, + 0x65, 0x2d, 0x78, 0x73, 0x2d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, + 0x2c, 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x78, + 0x73, 0x2d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x2c, 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, + 0x65, 0x2d, 0x73, 0x6d, 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, + 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x73, 0x6d, + 0x2d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x2e, 0x76, 0x69, + 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x73, 0x6d, 0x2d, 0x69, 0x6e, + 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, + 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x6d, 0x64, + 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x2e, 0x76, 0x69, 0x73, + 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x6d, 0x64, 0x2d, 0x69, 0x6e, 0x6c, + 0x69, 0x6e, 0x65, 0x2c, 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, + 0x65, 0x2d, 0x6d, 0x64, 0x2d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, + 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x2e, 0x76, 0x69, 0x73, + 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x6c, 0x67, 0x2d, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x2c, 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, + 0x2d, 0x6c, 0x67, 0x2d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2c, + 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x6c, 0x67, + 0x2d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, + 0x6e, 0x6f, 0x6e, 0x65, 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, + 0x74, 0x61, 0x6e, 0x74, 0x7d, 0x40, 0x6d, 0x65, 0x64, 0x69, 0x61, + 0x20, 0x28, 0x6d, 0x61, 0x78, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x3a, 0x37, 0x36, 0x37, 0x70, 0x78, 0x29, 0x7b, 0x2e, 0x76, 0x69, + 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x78, 0x73, 0x7b, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, + 0x7d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x76, 0x69, 0x73, 0x69, + 0x62, 0x6c, 0x65, 0x2d, 0x78, 0x73, 0x7b, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x3a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x21, + 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x7d, 0x74, + 0x72, 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x78, + 0x73, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x72, 0x6f, 0x77, 0x20, 0x21, 0x69, + 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x7d, 0x74, 0x68, + 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x78, 0x73, + 0x2c, 0x74, 0x64, 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, + 0x2d, 0x78, 0x73, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, + 0x3a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x63, 0x65, 0x6c, 0x6c, + 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, + 0x7d, 0x7d, 0x40, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x20, 0x28, 0x6d, + 0x61, 0x78, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x37, 0x36, + 0x37, 0x70, 0x78, 0x29, 0x7b, 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, + 0x6c, 0x65, 0x2d, 0x78, 0x73, 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x61, 0x6e, 0x74, 0x7d, 0x7d, 0x40, 0x6d, 0x65, 0x64, 0x69, 0x61, + 0x20, 0x28, 0x6d, 0x61, 0x78, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x3a, 0x37, 0x36, 0x37, 0x70, 0x78, 0x29, 0x7b, 0x2e, 0x76, 0x69, + 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x78, 0x73, 0x2d, 0x69, 0x6e, + 0x6c, 0x69, 0x6e, 0x65, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x3a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x21, 0x69, + 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x7d, 0x7d, 0x40, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x20, 0x28, 0x6d, 0x61, 0x78, 0x2d, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x37, 0x36, 0x37, 0x70, 0x78, + 0x29, 0x7b, 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, + 0x78, 0x73, 0x2d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x3a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x61, 0x6e, 0x74, 0x7d, 0x7d, 0x40, 0x6d, 0x65, 0x64, 0x69, 0x61, + 0x20, 0x28, 0x6d, 0x69, 0x6e, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x3a, 0x37, 0x36, 0x38, 0x70, 0x78, 0x29, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x28, 0x6d, 0x61, 0x78, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x3a, 0x39, 0x39, 0x31, 0x70, 0x78, 0x29, 0x7b, 0x2e, 0x76, 0x69, + 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x73, 0x6d, 0x7b, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, + 0x7d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x76, 0x69, 0x73, 0x69, + 0x62, 0x6c, 0x65, 0x2d, 0x73, 0x6d, 0x7b, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x3a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x21, + 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x7d, 0x74, + 0x72, 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x73, + 0x6d, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x72, 0x6f, 0x77, 0x20, 0x21, 0x69, + 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x7d, 0x74, 0x68, + 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x73, 0x6d, + 0x2c, 0x74, 0x64, 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, + 0x2d, 0x73, 0x6d, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, + 0x3a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x63, 0x65, 0x6c, 0x6c, + 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, + 0x7d, 0x7d, 0x40, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x20, 0x28, 0x6d, + 0x69, 0x6e, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x37, 0x36, + 0x38, 0x70, 0x78, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6d, + 0x61, 0x78, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x39, 0x39, + 0x31, 0x70, 0x78, 0x29, 0x7b, 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, + 0x6c, 0x65, 0x2d, 0x73, 0x6d, 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x61, 0x6e, 0x74, 0x7d, 0x7d, 0x40, 0x6d, 0x65, 0x64, 0x69, 0x61, + 0x20, 0x28, 0x6d, 0x69, 0x6e, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x3a, 0x37, 0x36, 0x38, 0x70, 0x78, 0x29, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x28, 0x6d, 0x61, 0x78, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x3a, 0x39, 0x39, 0x31, 0x70, 0x78, 0x29, 0x7b, 0x2e, 0x76, 0x69, + 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x73, 0x6d, 0x2d, 0x69, 0x6e, + 0x6c, 0x69, 0x6e, 0x65, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x3a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x21, 0x69, + 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x7d, 0x7d, 0x40, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x20, 0x28, 0x6d, 0x69, 0x6e, 0x2d, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x37, 0x36, 0x38, 0x70, 0x78, + 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6d, 0x61, 0x78, 0x2d, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x39, 0x39, 0x31, 0x70, 0x78, + 0x29, 0x7b, 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, + 0x73, 0x6d, 0x2d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x3a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x61, 0x6e, 0x74, 0x7d, 0x7d, 0x40, 0x6d, 0x65, 0x64, 0x69, 0x61, + 0x20, 0x28, 0x6d, 0x69, 0x6e, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x3a, 0x39, 0x39, 0x32, 0x70, 0x78, 0x29, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x28, 0x6d, 0x61, 0x78, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x3a, 0x31, 0x31, 0x39, 0x39, 0x70, 0x78, 0x29, 0x7b, 0x2e, 0x76, + 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x6d, 0x64, 0x7b, 0x64, + 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, + 0x74, 0x7d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x76, 0x69, 0x73, + 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x6d, 0x64, 0x7b, 0x64, 0x69, 0x73, + 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, + 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x7d, + 0x74, 0x72, 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, + 0x6d, 0x64, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x72, 0x6f, 0x77, 0x20, 0x21, + 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x7d, 0x74, + 0x68, 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x6d, + 0x64, 0x2c, 0x74, 0x64, 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, + 0x65, 0x2d, 0x6d, 0x64, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x3a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x63, 0x65, 0x6c, + 0x6c, 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, + 0x74, 0x7d, 0x7d, 0x40, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x20, 0x28, + 0x6d, 0x69, 0x6e, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x39, + 0x39, 0x32, 0x70, 0x78, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, + 0x6d, 0x61, 0x78, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, + 0x31, 0x39, 0x39, 0x70, 0x78, 0x29, 0x7b, 0x2e, 0x76, 0x69, 0x73, + 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x6d, 0x64, 0x2d, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, + 0x72, 0x74, 0x61, 0x6e, 0x74, 0x7d, 0x7d, 0x40, 0x6d, 0x65, 0x64, + 0x69, 0x61, 0x20, 0x28, 0x6d, 0x69, 0x6e, 0x2d, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x3a, 0x39, 0x39, 0x32, 0x70, 0x78, 0x29, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x28, 0x6d, 0x61, 0x78, 0x2d, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x3a, 0x31, 0x31, 0x39, 0x39, 0x70, 0x78, 0x29, 0x7b, + 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x6d, 0x64, + 0x2d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x7b, 0x64, 0x69, 0x73, + 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, + 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, + 0x7d, 0x7d, 0x40, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x20, 0x28, 0x6d, + 0x69, 0x6e, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x39, 0x39, + 0x32, 0x70, 0x78, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6d, + 0x61, 0x78, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, 0x31, + 0x39, 0x39, 0x70, 0x78, 0x29, 0x7b, 0x2e, 0x76, 0x69, 0x73, 0x69, + 0x62, 0x6c, 0x65, 0x2d, 0x6d, 0x64, 0x2d, 0x69, 0x6e, 0x6c, 0x69, + 0x6e, 0x65, 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x7b, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, + 0x65, 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x21, 0x69, 0x6d, + 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x7d, 0x7d, 0x40, 0x6d, + 0x65, 0x64, 0x69, 0x61, 0x20, 0x28, 0x6d, 0x69, 0x6e, 0x2d, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, 0x32, 0x30, 0x30, 0x70, 0x78, + 0x29, 0x7b, 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, + 0x6c, 0x67, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, + 0x72, 0x74, 0x61, 0x6e, 0x74, 0x7d, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x6c, 0x67, + 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x61, 0x6e, 0x74, 0x7d, 0x74, 0x72, 0x2e, 0x76, 0x69, 0x73, 0x69, + 0x62, 0x6c, 0x65, 0x2d, 0x6c, 0x67, 0x7b, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x3a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x72, + 0x6f, 0x77, 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, + 0x6e, 0x74, 0x7d, 0x74, 0x68, 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, + 0x6c, 0x65, 0x2d, 0x6c, 0x67, 0x2c, 0x74, 0x64, 0x2e, 0x76, 0x69, + 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x6c, 0x67, 0x7b, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2d, 0x63, 0x65, 0x6c, 0x6c, 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, + 0x72, 0x74, 0x61, 0x6e, 0x74, 0x7d, 0x7d, 0x40, 0x6d, 0x65, 0x64, + 0x69, 0x61, 0x20, 0x28, 0x6d, 0x69, 0x6e, 0x2d, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x3a, 0x31, 0x32, 0x30, 0x30, 0x70, 0x78, 0x29, 0x7b, + 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x6c, 0x67, + 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x7b, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x3a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x21, + 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x7d, 0x7d, + 0x40, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x20, 0x28, 0x6d, 0x69, 0x6e, + 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, 0x32, 0x30, 0x30, + 0x70, 0x78, 0x29, 0x7b, 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, + 0x65, 0x2d, 0x6c, 0x67, 0x2d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, + 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x69, 0x6e, + 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, + 0x74, 0x61, 0x6e, 0x74, 0x7d, 0x7d, 0x40, 0x6d, 0x65, 0x64, 0x69, + 0x61, 0x20, 0x28, 0x6d, 0x69, 0x6e, 0x2d, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x3a, 0x31, 0x32, 0x30, 0x30, 0x70, 0x78, 0x29, 0x7b, 0x2e, + 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x6c, 0x67, 0x2d, + 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x69, + 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, + 0x7d, 0x7d, 0x40, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x20, 0x28, 0x6d, + 0x61, 0x78, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x37, 0x36, + 0x37, 0x70, 0x78, 0x29, 0x7b, 0x2e, 0x68, 0x69, 0x64, 0x64, 0x65, + 0x6e, 0x2d, 0x78, 0x73, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x20, 0x21, 0x69, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x7d, 0x7d, 0x40, 0x6d, 0x65, + 0x64, 0x69, 0x61, 0x20, 0x28, 0x6d, 0x69, 0x6e, 0x2d, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3a, 0x37, 0x36, 0x38, 0x70, 0x78, 0x29, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6d, 0x61, 0x78, 0x2d, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3a, 0x39, 0x39, 0x31, 0x70, 0x78, 0x29, 0x7b, + 0x2e, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x2d, 0x73, 0x6d, 0x7b, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x6e, 0x6f, 0x6e, + 0x65, 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, + 0x74, 0x7d, 0x7d, 0x40, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x20, 0x28, + 0x6d, 0x69, 0x6e, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x39, + 0x39, 0x32, 0x70, 0x78, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, + 0x6d, 0x61, 0x78, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, + 0x31, 0x39, 0x39, 0x70, 0x78, 0x29, 0x7b, 0x2e, 0x68, 0x69, 0x64, + 0x64, 0x65, 0x6e, 0x2d, 0x6d, 0x64, 0x7b, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x20, 0x21, 0x69, + 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x7d, 0x7d, 0x40, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x20, 0x28, 0x6d, 0x69, 0x6e, 0x2d, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, 0x32, 0x30, 0x30, 0x70, + 0x78, 0x29, 0x7b, 0x2e, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x2d, + 0x6c, 0x67, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, + 0x6e, 0x6f, 0x6e, 0x65, 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, + 0x74, 0x61, 0x6e, 0x74, 0x7d, 0x7d, 0x2e, 0x76, 0x69, 0x73, 0x69, + 0x62, 0x6c, 0x65, 0x2d, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x7b, 0x64, + 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, + 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, + 0x7d, 0x40, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x20, 0x70, 0x72, 0x69, + 0x6e, 0x74, 0x7b, 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, + 0x2d, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x7b, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x3a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x21, + 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x7d, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, + 0x65, 0x2d, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x7b, 0x64, 0x69, 0x73, + 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, + 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x7d, + 0x74, 0x72, 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, + 0x70, 0x72, 0x69, 0x6e, 0x74, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, + 0x61, 0x79, 0x3a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x72, 0x6f, + 0x77, 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, + 0x74, 0x7d, 0x74, 0x68, 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, + 0x65, 0x2d, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2c, 0x74, 0x64, 0x2e, + 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x70, 0x72, 0x69, + 0x6e, 0x74, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x63, 0x65, 0x6c, 0x6c, 0x20, + 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x7d, + 0x7d, 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x70, + 0x72, 0x69, 0x6e, 0x74, 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x7b, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x6e, 0x6f, 0x6e, + 0x65, 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, + 0x74, 0x7d, 0x40, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x20, 0x70, 0x72, + 0x69, 0x6e, 0x74, 0x7b, 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, + 0x65, 0x2d, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2d, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, + 0x72, 0x74, 0x61, 0x6e, 0x74, 0x7d, 0x7d, 0x2e, 0x76, 0x69, 0x73, + 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2d, + 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x7b, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x20, 0x21, 0x69, + 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x7d, 0x40, 0x6d, + 0x65, 0x64, 0x69, 0x61, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x7b, + 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x70, 0x72, + 0x69, 0x6e, 0x74, 0x2d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x7b, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x69, 0x6e, 0x6c, + 0x69, 0x6e, 0x65, 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x61, 0x6e, 0x74, 0x7d, 0x7d, 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, + 0x6c, 0x65, 0x2d, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2d, 0x69, 0x6e, + 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x7b, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x6e, 0x6f, 0x6e, + 0x65, 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, + 0x74, 0x7d, 0x40, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x20, 0x70, 0x72, + 0x69, 0x6e, 0x74, 0x7b, 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, + 0x65, 0x2d, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2d, 0x69, 0x6e, 0x6c, + 0x69, 0x6e, 0x65, 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x7b, 0x64, + 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x69, 0x6e, 0x6c, 0x69, + 0x6e, 0x65, 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x21, 0x69, + 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x7d, 0x7d, 0x40, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, + 0x7b, 0x2e, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x2d, 0x70, 0x72, + 0x69, 0x6e, 0x74, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, + 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x20, 0x21, 0x69, 0x6d, 0x70, 0x6f, + 0x72, 0x74, 0x61, 0x6e, 0x74, 0x7d, 0x7d, 0x00 +}; + +const int bootstrap_css_length = 51609; diff --git a/goaccess++/src/browsers.c b/goaccess++/src/browsers.c new file mode 100644 index 0000000..3985b33 --- /dev/null +++ b/goaccess++/src/browsers.c @@ -0,0 +1,522 @@ +/** + 6 browsers.c -- functions for dealing with browsers + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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 <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stddef.h> + +#include "browsers.h" + +#include "error.h" +#include "settings.h" +#include "util.h" +#include "xmalloc.h" + +/* ###NOTE: The size of the list is proportional to the run time, + * which makes this pretty slow */ + +static char ***browsers_hash = NULL; + +/* {"search string", "belongs to"} */ +static const char *browsers[][2] = { + /* Game systems: most of them are based of major browsers, + * thus they need to go before. */ + {"Xbox One", "Game Systems"}, + {"Xbox", "Game Systems"}, + {"PlayStation", "Game Systems"}, + {"NintendoBrowser", "Game Systems"}, + {"Valve Steam", "Game Systems"}, + {"Origin", "Game Systems"}, + {"Raptr", "Game Systems"}, + + /* Based on Internet Explorer */ + {"America Online Browser", "Others"}, + {"Avant Browser", "Others"}, + /* Internet Explorer */ + {"IEMobile", "MSIE"}, + {"MSIE", "MSIE"}, + /* IE11 */ + {"Trident/7.0", "MSIE"}, + /* Microsoft Edge */ + {"Edge", "MSIE"}, + + /* Opera */ + {"Opera Mini", "Opera"}, + {"Opera Mobi", "Opera"}, + {"Opera", "Opera"}, + {"OPR", "Opera"}, + {"OPiOS", "Opera"}, + {"Coast", "Opera"}, + + /* Others */ + {"Homebrew", "Others"}, + {"APT-HTTP", "Others"}, + {"Apt-Cacher", "Others"}, + {"Chef Client", "Others"}, + {"Huawei", "Others"}, + {"HUAWEI", "Others"}, + {"BlackBerry", "Others"}, + {"BrowserX", "Others"}, + {"Dalvik", "Others"}, + {"Dillo", "Others"}, + {"ELinks", "Others"}, + {"Epiphany", "Others"}, + {"Firebird", "Others"}, + {"Galeon", "Others"}, + {"google-cloud-sdk", "Others"}, + {"GranParadiso", "Others"}, + {"IBrowse", "Others"}, + {"K-Meleon", "Others"}, + {"Kazehakase", "Others"}, + {"Konqueror", "Others"}, + {"Links", "Others"}, + {"Lynx", "Others"}, + {"Midori", "Others"}, + {"Minefield", "Others"}, + {"Mosaic", "Others"}, + {"Netscape", "Others"}, + {"SeaMonkey", "Others"}, + {"UCBrowser", "Others"}, + {"Wget", "Others"}, + {"libfetch", "Others"}, + {"check_http", "Others"}, + {"Go-http-client", "Others"}, + {"curl", "Others"}, + {"midori", "Others"}, + {"w3m", "Others"}, + {"MicroMessenger", "Others"}, + {"Apache", "Others"}, + {"JOSM", "Others"}, + + /* Feed-reader-as-a-service */ + {"AppleNewsBot", "Feeds"}, + {"Bloglines", "Feeds"}, + {"Digg Feed Fetcher", "Feeds"}, + {"Feedbin", "Feeds"}, + {"FeedHQ", "Feeds"}, + {"Feedly", "Feeds"}, + {"Flipboard", "Feeds"}, + {"Netvibes", "Feeds"}, + {"NewsBlur", "Feeds"}, + {"PinRSS", "Feeds"}, + {"WordPress.com Reader", "Feeds"}, + {"YandexBlogs", "Feeds"}, + + /* Google crawlers (some based on Chrome, + * therefore up on the list) */ + {"AdsBot-Google", "Crawlers"}, + {"AppEngine-Google", "Crawlers"}, + {"Mediapartners-Google", "Crawlers"}, + {"Google", "Crawlers"}, + {"WhatsApp", "Crawlers"}, + + /* Based on Firefox */ + {"Camino", "Others"}, + /* Rebranded Firefox but is really unmodified + * Firefox (Debian trademark policy) */ + {"Iceweasel", "Firefox"}, + {"Firefox", "Firefox"}, + + /* Based on Chromium */ + {"Vivaldi", "Others"}, + {"YaBrowser", "Others"}, + {"Flock", "Others"}, + /* Chrome has to go before Safari */ + {"HeadlessChrome", "Chrome"}, + {"Chrome", "Chrome"}, + {"CriOS", "Chrome"}, + + /* Crawlers/Bots (Possible Safari based) */ + {"AppleBot", "Crawlers"}, + {"Twitter", "Crawlers"}, + + {"Safari", "Safari"}, + + /* Crawlers/Bots */ + {"Sogou", "Crawlers"}, + {"Java", "Crawlers"}, + {"Jakarta Commons-HttpClient", "Crawlers"}, + {"netEstate", "Crawlers"}, + {"PiplBot", "Crawlers"}, + {"IstellaBot", "Crawlers"}, + {"heritrix", "Crawlers"}, + {"PagesInventory", "Crawlers"}, + {"rogerbot", "Crawlers"}, + {"fastbot", "Crawlers"}, + {"yacybot", "Crawlers"}, + {"PycURL", "Crawlers"}, + {"PHP", "Crawlers"}, + {"AndroidDownloadManager", "Crawlers"}, + {"Embedly", "Crawlers"}, + {"ruby", "Crawlers"}, + {"Ruby", "Crawlers"}, + {"python", "Crawlers"}, + {"Python", "Crawlers"}, + {"LinkedIn", "Crawlers"}, + {"Microsoft-WebDAV", "Crawlers"}, + + /* Podcast fetchers */ + {"Downcast", "Podcasts"}, + {"gPodder", "Podcasts"}, + {"Instacast", "Podcasts"}, + {"iTunes", "Podcasts"}, + {"Miro", "Podcasts"}, + {"Pocket Casts", "Podcasts"}, + {"BashPodder", "Podcasts"}, + + /* Feed reader clients */ + {"Akregator", "Feeds"}, + {"Apple-PubSub", "Feeds"}, + {"com.apple.Safari.WebFeedParser", "Feeds"}, + {"FeedDemon", "Feeds"}, + {"Feedy", "Feeds"}, + {"Liferea", "Feeds"}, + {"NetNewsWire", "Feeds"}, + {"RSSOwl", "Feeds"}, + {"Thunderbird", "Feeds"}, + + {"Pingdom.com", "Uptime"}, + {"jetmon", "Uptime"}, + {"NodeUptime", "Uptime"}, + {"NewRelicPinger", "Uptime"}, + {"StatusCake", "Uptime"}, + {"internetVista", "Uptime"}, + {"Server Density Service Monitoring v2", "Uptime"}, + + {"Mozilla", "Others"} +}; + +/* Free all browser entries from our array of key/value pairs. */ +void +free_browsers_hash (void) +{ + size_t i; + int j; + + for (i = 0; i < ARRAY_SIZE (browsers); ++i) { + free (browsers_hash[i][0]); + free (browsers_hash[i][1]); + free (browsers_hash[i]); + } + free (browsers_hash); + + + for (j = 0; j < conf.browsers_hash_idx; ++j) { + free (conf.user_browsers_hash[j][0]); + free (conf.user_browsers_hash[j][1]); + free (conf.user_browsers_hash[j]); + } + if (conf.browsers_file) { + free (conf.user_browsers_hash); + } +} + +static int +is_dup (char ***list, int len, const char *browser) +{ + int i; + /* check for dups */ + for (i = 0; i < len; ++i) { + if (strcmp (browser, list[i][0]) == 0) + return 1; + } + return 0; +} + +/* Set a browser/type pair into our multidimensional array of browsers. + * + * On duplicate functions returns void. + * Otherwise memory is mallo'd for our array entry. */ +static void +set_browser (char ***list, int idx, const char *browser, const char *type) +{ + list[idx] = xcalloc (2, sizeof (char *)); + list[idx][0] = xstrdup (browser); + list[idx][1] = xstrdup (type); +} + +/* Parse the key/value pair from the browser list file. */ +static void +parse_browser_token (char ***list, char *line, int n) +{ + char *val; + size_t idx = 0; + + /* key */ + idx = strcspn (line, "\t"); + if (strlen (line) == idx) + FATAL ("Malformed browser name at line: %d", n); + + line[idx] = '\0'; + + /* value */ + val = line + (idx + 1); + idx = strspn (val, "\t"); + if (strlen (val) == idx) + FATAL ("Malformed browser category at line: %d", n); + val = val + idx; + val = trim_str (val); + + if (is_dup (list, conf.browsers_hash_idx, line)) { + LOG_INVALID (("Duplicate browser entry: %s", line)); + return; + } + + set_browser (list, conf.browsers_hash_idx, line, val); + conf.browsers_hash_idx++; +} + +/* Parse our default array of browsers and put them on our hash including those + * from the custom parsed browsers file. + * + * On error functions returns void. + * Otherwise browser entries are put into the hash. */ +void +parse_browsers_file (void) +{ + char line[MAX_LINE_BROWSERS + 1]; + FILE *file; + int n = 0; + size_t i, len = ARRAY_SIZE (browsers); + + browsers_hash = xmalloc (ARRAY_SIZE (browsers) * sizeof (char **)); + /* load hash from the browser's array (default) */ + for (i = 0; i < len; ++i) { + set_browser (browsers_hash, i, browsers[i][0], browsers[i][1]); + } + + if (!conf.browsers_file) + return; + + /* could not open browsers file */ + if ((file = fopen (conf.browsers_file, "r")) == NULL) + FATAL ("Unable to open browser's file: %s", strerror (errno)); + + conf.user_browsers_hash = xmalloc (MAX_CUSTOM_BROWSERS * sizeof (char **)); + /* load hash from the user's given browsers file */ + while (fgets (line, sizeof line, file) != NULL) { + while (line[0] == ' ' || line[0] == '\t') + memmove (line, line + 1, strlen (line)); + n++; + + if (line[0] == '\n' || line[0] == '\r' || line[0] == '#') + continue; + if (conf.browsers_hash_idx >= MAX_CUSTOM_BROWSERS) + FATAL ("Maximum number of custom browsers has been reached"); + parse_browser_token (conf.user_browsers_hash, line, n); + } + fclose (file); +} + +/* Determine if the user-agent is a crawler. + * + * On error or is not a crawler, 0 is returned. + * If it is a crawler, 1 is returned . */ +int +is_crawler (const char *agent) +{ + char type[BROWSER_TYPE_LEN]; + char *browser, *a; + + if (agent == NULL || *agent == '\0') + return 0; + + if ((a = xstrdup (agent), browser = verify_browser (a, type)) != NULL) + free (browser); + free (a); + + return strcmp (type, "Crawlers") == 0 ? 1 : 0; +} + +/* Return the Opera 15 and beyond. + * + * On success, the opera string and version is returned. */ +static char * +parse_opera (char *token) +{ + char *val = xmalloc (snprintf (NULL, 0, "Opera%s", token) + 1); + sprintf (val, "Opera%s", token); + + return val; +} + +/* Given the original user agent string, and a partial crawler match, iterate + * back until the next delimiter is found and return occurrence. + * + * On error when attempting to extract crawler, NULL is returned. + * If a possible crawler string is matched, then possible bot is returned . */ +static char * +parse_crawler (char *str, char *match, char *type) +{ + char *ptr = NULL; + int found = 0; + + while (match != str) { + match--; + if (*match == ' ' || *match == '+') { + found = 1; + break; + } + } + + /* same addr */ + if (match == str) + return NULL; + + /* account for the previous +|space */ + if (found) + match++; + + if ((ptr = strpbrk (match, "; "))) + *ptr = '\0'; + /* empty string after parsing it */ + if (*match == '\0') + return NULL; + + xstrncpy (type, "Crawlers", BROWSER_TYPE_LEN); + + return xstrdup (match); +} + +/* If the following string matches are found within user agent, then it's + * highly likely it's a possible crawler. + * Note that this could certainly return false positives. + * + * If no occurrences are found, NULL is returned. + * If an occurrence is found, a pointer to the match is returned . */ +static char * +check_http_crawler (const char *str) +{ + char *match = NULL; + + /* e.g., compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm */ + if ((match = strstr (str, "; +http"))) + return match; + /* compatible; UptimeRobot/2.0; http://www.uptimerobot.com/ */ + if ((match = strstr (str, "; http"))) + return match; + /* Slack-ImgProxy (+https://api.slack.com/robots) */ + if ((match = strstr (str, " (+http"))) + return match; + /* TurnitinBot/3.0 (http://www.turnitin.com/robot/crawlerinfo.html) */ + if ((match = strstr (str, " (http"))) + return match; + /* w3c e.g., (compatible;+Googlebot/2.1;++http://www.google.com/bot.html) */ + if ((match = strstr (str, ";++http"))) + return match; + return NULL; +} + +/* Parse the given user agent match and extract the browser string. + * + * If no match, the original match is returned. + * Otherwise the parsed browser is returned. */ +static char * +parse_browser (char *match, char *type, int i, char ***hash) +{ + char *b = NULL, *ptr = NULL, *slh = NULL; + size_t cnt = 0, space = 0; + + /* Check if there are spaces in the token string, that way strpbrk + * does not stop at the first space within the token string */ + if ((cnt = count_matches (hash[i][0], ' ')) && (b = match)) { + while (space++ < cnt && (b = strchr (b, ' '))) + b++; + } else + b = match; + + xstrncpy (type, hash[i][1], BROWSER_TYPE_LEN); + /* Internet Explorer 11 */ + if (strstr (match, "rv:11") && strstr (match, "Trident/7.0")) { + return alloc_string ("MSIE/11.0"); + } + /* Opera +15 uses OPR/# */ + if (strstr (match, "OPR") != NULL && (slh = strrchr (match, '/'))) { + return parse_opera (slh); + } + /* Opera has the version number at the end */ + if (strstr (match, "Opera") && (slh = strrchr (match, '/')) && match < slh) { + memmove (match + 5, slh, strlen (slh) + 1); + } + /* IE Old */ + if (strstr (match, "MSIE") != NULL) { + if ((ptr = strpbrk (match, ";)-")) != NULL) + *ptr = '\0'; + match = char_replace (match, ' ', '/'); + } + /* all others */ + else if ((ptr = strpbrk (b, ";) ")) != NULL) { + *ptr = '\0'; + } + + return alloc_string (match); +} + +/* Given a user agent, determine the browser used. + * + * ###NOTE: The size of the list is proportional to the run time, + * which makes this pretty slow + * + * On error, NULL is returned. + * On success, a malloc'd string containing the browser is returned. */ +char * +verify_browser (char *str, char *type) +{ + char *match = NULL, *token = NULL; + int i = 0; + size_t j = 0; + + if (str == NULL || *str == '\0') + return NULL; + + /* check user's list */ + for (i = 0; i < conf.browsers_hash_idx; ++i) { + if ((match = strstr (str, conf.user_browsers_hash[i][0])) == NULL) + continue; + return parse_browser (match, type, i, conf.user_browsers_hash); + } + + if ((match = check_http_crawler (str)) && + (token = parse_crawler (str, match, type))) + return token; + + /* fallback to default browser list */ + for (j = 0; j < ARRAY_SIZE (browsers); ++j) { + if ((match = strstr (str, browsers_hash[j][0])) == NULL) + continue; + return parse_browser (match, type, j, browsers_hash); + } + + xstrncpy (type, "Unknown", BROWSER_TYPE_LEN); + + return alloc_string ("Unknown"); +} diff --git a/goaccess++/src/browsers.h b/goaccess++/src/browsers.h new file mode 100644 index 0000000..959999b --- /dev/null +++ b/goaccess++/src/browsers.h @@ -0,0 +1,49 @@ +/** + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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 BROWSERS_H_INCLUDED +#define BROWSERS_H_INCLUDED + +#define BROWSER_TYPE_LEN 13 +#define MAX_LINE_BROWSERS 128 +#define MAX_CUSTOM_BROWSERS 256 + +/* Each Browser contains the number of hits and the Browser's type */ +typedef struct GBrowser_ +{ + char browser_type[BROWSER_TYPE_LEN]; + int hits; +} GBrowser; + +char *verify_browser (char *str, char *browser_type); +int is_crawler (const char *agent); +void free_browsers_hash (void); +void parse_browsers_file (void); + +#endif diff --git a/goaccess++/src/browsers.o b/goaccess++/src/browsers.o new file mode 100644 index 0000000000000000000000000000000000000000..59e584049febf46649c8f113c471776ed22ee7d8 GIT binary patch literal 24128 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 literal 0 HcmV?d00001 diff --git a/goaccess++/src/chartsjs.h b/goaccess++/src/chartsjs.h new file mode 100644 index 0000000..1f201e1 --- /dev/null +++ b/goaccess++/src/chartsjs.h @@ -0,0 +1,1861 @@ +const char charts_js[20421] = { + 0x2f, 0x2a, 0x2a, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, + 0x5f, 0x2a, 0x20, 0x20, 0x20, 0x2f, 0x20, 0x5f, 0x5f, 0x5f, 0x5f, + 0x2f, 0x5f, 0x5f, 0x5f, 0x20, 0x20, 0x2f, 0x20, 0x20, 0x20, 0x7c, + 0x20, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x20, 0x20, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x2a, 0x20, 0x20, 0x2f, 0x20, 0x2f, 0x20, + 0x5f, 0x5f, 0x2f, 0x20, 0x5f, 0x5f, 0x20, 0x5c, 0x2f, 0x20, 0x2f, + 0x7c, 0x20, 0x7c, 0x2f, 0x20, 0x5f, 0x5f, 0x5f, 0x2f, 0x20, 0x5f, + 0x5f, 0x5f, 0x2f, 0x20, 0x5f, 0x20, 0x5c, 0x2f, 0x20, 0x5f, 0x5f, + 0x5f, 0x2f, 0x20, 0x5f, 0x5f, 0x5f, 0x2f, 0x2a, 0x20, 0x2f, 0x20, + 0x2f, 0x5f, 0x2f, 0x20, 0x2f, 0x20, 0x2f, 0x5f, 0x2f, 0x20, 0x2f, + 0x20, 0x5f, 0x5f, 0x5f, 0x20, 0x2f, 0x20, 0x2f, 0x5f, 0x5f, 0x2f, + 0x20, 0x2f, 0x5f, 0x5f, 0x2f, 0x20, 0x20, 0x5f, 0x5f, 0x28, 0x5f, + 0x5f, 0x20, 0x20, 0x7c, 0x5f, 0x5f, 0x20, 0x20, 0x29, 0x2a, 0x20, + 0x5c, 0x5f, 0x5f, 0x5f, 0x5f, 0x2f, 0x5c, 0x5f, 0x5f, 0x5f, 0x5f, + 0x2f, 0x5f, 0x2f, 0x20, 0x20, 0x7c, 0x5f, 0x5c, 0x5f, 0x5f, 0x5f, + 0x2f, 0x5c, 0x5f, 0x5f, 0x5f, 0x2f, 0x5c, 0x5f, 0x5f, 0x5f, 0x2f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x2f, 0x5f, 0x5f, 0x5f, 0x5f, 0x2f, 0x2a, + 0x2a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x4d, 0x49, 0x54, 0x20, 0x4c, + 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x28, 0x4d, 0x49, 0x54, + 0x29, 0x2a, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, + 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x39, 0x2d, + 0x32, 0x30, 0x31, 0x38, 0x20, 0x47, 0x65, 0x72, 0x61, 0x72, 0x64, + 0x6f, 0x20, 0x4f, 0x72, 0x65, 0x6c, 0x6c, 0x61, 0x6e, 0x61, 0x20, + 0x3c, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x40, 0x20, 0x67, 0x6f, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, 0x3e, 0x2a, + 0x2f, 0x27, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, + 0x74, 0x27, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x28, 0x74, + 0x65, 0x78, 0x74, 0x2c, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x29, + 0x20, 0x7b, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x65, 0x61, 0x63, 0x68, + 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, + 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x2c, 0x20, + 0x24, 0x64, 0x33, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x3d, + 0x20, 0x64, 0x33, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x3b, 0x76, 0x61, 0x72, + 0x20, 0x67, 0x77, 0x20, 0x3d, 0x20, 0x24, 0x64, 0x33, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x28, 0x29, + 0x2e, 0x67, 0x65, 0x74, 0x42, 0x42, 0x6f, 0x78, 0x28, 0x29, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x67, 0x77, 0x2e, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x2c, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x29, 0x20, 0x2f, 0x20, 0x32, 0x29, 0x20, 0x2a, 0x20, 0x2d, 0x31, + 0x3b, 0x69, 0x66, 0x20, 0x28, 0x27, 0x73, 0x76, 0x67, 0x27, 0x20, + 0x3d, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2e, 0x6e, + 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x7b, 0x24, + 0x64, 0x33, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x74, + 0x74, 0x72, 0x28, 0x27, 0x77, 0x69, 0x64, 0x74, 0x68, 0x27, 0x2c, + 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x29, 0x2e, 0x61, 0x74, 0x74, + 0x72, 0x28, 0x27, 0x78, 0x27, 0x2c, 0x20, 0x78, 0x29, 0x3b, 0x7d, + 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x24, 0x64, 0x33, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x28, 0x27, 0x73, 0x76, 0x67, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x3b, + 0x7d, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x29, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x27, 0x2c, 0x20, 0x27, 0x77, 0x72, 0x61, 0x70, + 0x2d, 0x74, 0x65, 0x78, 0x74, 0x27, 0x29, 0x2e, 0x61, 0x74, 0x74, + 0x72, 0x28, 0x27, 0x77, 0x69, 0x64, 0x74, 0x68, 0x27, 0x2c, 0x20, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, + 0x28, 0x27, 0x78, 0x27, 0x2c, 0x20, 0x78, 0x29, 0x2e, 0x61, 0x70, + 0x70, 0x65, 0x6e, 0x64, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x3b, 0x7d, 0x2e, 0x62, + 0x69, 0x6e, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x29, 0x3b, + 0x7d, 0x7d, 0x29, 0x3b, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x41, 0x72, 0x65, 0x61, 0x43, 0x68, 0x61, 0x72, + 0x74, 0x28, 0x64, 0x75, 0x61, 0x6c, 0x59, 0x61, 0x78, 0x69, 0x73, + 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6f, 0x70, 0x74, 0x73, + 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x6d, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x20, 0x3d, 0x20, 0x7b, 0x74, 0x6f, + 0x70, 0x20, 0x20, 0x20, 0x20, 0x3a, 0x20, 0x32, 0x30, 0x2c, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x20, 0x20, 0x3a, 0x20, 0x35, 0x30, 0x2c, + 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x20, 0x3a, 0x20, 0x34, 0x30, + 0x2c, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x20, 0x20, 0x3a, 0x20, 0x35, + 0x30, 0x2c, 0x7d, 0x2c, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, + 0x3d, 0x20, 0x31, 0x37, 0x30, 0x2c, 0x6e, 0x54, 0x69, 0x63, 0x6b, + 0x73, 0x20, 0x3d, 0x20, 0x31, 0x30, 0x2c, 0x70, 0x61, 0x64, 0x64, + 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x31, 0x30, 0x2c, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x37, 0x36, 0x30, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x20, 0x3d, + 0x20, 0x7b, 0x20, 0x78, 0x3a, 0x20, 0x27, 0x55, 0x6e, 0x6e, 0x61, + 0x6d, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x79, 0x30, 0x3a, 0x20, 0x27, + 0x55, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x79, + 0x31, 0x3a, 0x20, 0x27, 0x55, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x64, + 0x27, 0x20, 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x78, 0x3a, 0x20, + 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x20, 0x79, 0x30, 0x3a, 0x20, 0x6e, + 0x75, 0x6c, 0x6c, 0x2c, 0x20, 0x79, 0x31, 0x3a, 0x20, 0x6e, 0x75, + 0x6c, 0x6c, 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x78, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x29, 0x20, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x5b, 0x30, 0x5d, 0x3b, 0x7d, + 0x2c, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x30, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, + 0x29, 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, + 0x5b, 0x31, 0x5d, 0x3b, 0x7d, 0x2c, 0x79, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x29, 0x20, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x64, 0x5b, 0x32, 0x5d, 0x3b, 0x7d, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x78, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x20, + 0x3d, 0x20, 0x64, 0x33, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, + 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x28, 0x29, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x79, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x30, 0x20, + 0x3d, 0x20, 0x64, 0x33, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, + 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x28, 0x29, 0x2e, 0x6e, 0x69, + 0x63, 0x65, 0x28, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x79, 0x53, + 0x63, 0x61, 0x6c, 0x65, 0x31, 0x20, 0x3d, 0x20, 0x64, 0x33, 0x2e, + 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x61, + 0x72, 0x28, 0x29, 0x2e, 0x6e, 0x69, 0x63, 0x65, 0x28, 0x29, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x78, 0x41, 0x78, 0x69, 0x73, 0x20, 0x3d, + 0x20, 0x64, 0x33, 0x2e, 0x73, 0x76, 0x67, 0x2e, 0x61, 0x78, 0x69, + 0x73, 0x28, 0x29, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x28, 0x78, + 0x53, 0x63, 0x61, 0x6c, 0x65, 0x29, 0x2e, 0x6f, 0x72, 0x69, 0x65, + 0x6e, 0x74, 0x28, 0x27, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x27, + 0x29, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x46, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x28, 0x64, 0x29, 0x20, 0x7b, 0x69, 0x66, 0x20, 0x28, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x78, 0x29, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x55, 0x74, 0x69, 0x6c, 0x2e, 0x66, 0x6d, 0x74, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x28, 0x64, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x2e, 0x78, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x64, 0x3b, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x79, 0x41, 0x78, 0x69, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x64, 0x33, + 0x2e, 0x73, 0x76, 0x67, 0x2e, 0x61, 0x78, 0x69, 0x73, 0x28, 0x29, + 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x28, 0x79, 0x53, 0x63, 0x61, + 0x6c, 0x65, 0x30, 0x29, 0x2e, 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x74, + 0x28, 0x27, 0x6c, 0x65, 0x66, 0x74, 0x27, 0x29, 0x2e, 0x74, 0x69, + 0x63, 0x6b, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x29, 0x20, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x33, 0x2e, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x27, 0x2e, 0x32, 0x73, + 0x27, 0x29, 0x28, 0x64, 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x79, 0x41, 0x78, 0x69, 0x73, 0x31, 0x20, 0x3d, 0x20, + 0x64, 0x33, 0x2e, 0x73, 0x76, 0x67, 0x2e, 0x61, 0x78, 0x69, 0x73, + 0x28, 0x29, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x28, 0x79, 0x53, + 0x63, 0x61, 0x6c, 0x65, 0x31, 0x29, 0x2e, 0x6f, 0x72, 0x69, 0x65, + 0x6e, 0x74, 0x28, 0x27, 0x72, 0x69, 0x67, 0x68, 0x74, 0x27, 0x29, + 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, + 0x64, 0x29, 0x20, 0x7b, 0x69, 0x66, 0x20, 0x28, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x2e, 0x79, 0x31, 0x29, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x55, 0x74, 0x69, 0x6c, 0x2e, 0x66, 0x6d, 0x74, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x28, 0x64, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x2e, 0x79, 0x31, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x64, 0x33, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x28, 0x27, 0x2e, 0x32, 0x73, 0x27, 0x29, 0x28, 0x64, 0x29, + 0x3b, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x78, 0x47, 0x72, + 0x69, 0x64, 0x20, 0x3d, 0x20, 0x64, 0x33, 0x2e, 0x73, 0x76, 0x67, + 0x2e, 0x61, 0x78, 0x69, 0x73, 0x28, 0x29, 0x2e, 0x73, 0x63, 0x61, + 0x6c, 0x65, 0x28, 0x78, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x29, 0x2e, + 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x28, 0x27, 0x62, 0x6f, 0x74, + 0x74, 0x6f, 0x6d, 0x27, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x79, + 0x47, 0x72, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x64, 0x33, 0x2e, 0x73, + 0x76, 0x67, 0x2e, 0x61, 0x78, 0x69, 0x73, 0x28, 0x29, 0x2e, 0x73, + 0x63, 0x61, 0x6c, 0x65, 0x28, 0x79, 0x53, 0x63, 0x61, 0x6c, 0x65, + 0x30, 0x29, 0x2e, 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x28, 0x27, + 0x6c, 0x65, 0x66, 0x74, 0x27, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x61, 0x72, 0x65, 0x61, 0x30, 0x20, 0x3d, 0x20, 0x64, 0x33, 0x2e, + 0x73, 0x76, 0x67, 0x2e, 0x61, 0x72, 0x65, 0x61, 0x28, 0x29, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x6f, 0x6c, 0x61, 0x74, 0x65, + 0x28, 0x27, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x27, + 0x29, 0x2e, 0x78, 0x28, 0x58, 0x29, 0x2e, 0x79, 0x28, 0x59, 0x30, + 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x61, 0x72, 0x65, 0x61, 0x31, + 0x20, 0x3d, 0x20, 0x64, 0x33, 0x2e, 0x73, 0x76, 0x67, 0x2e, 0x61, + 0x72, 0x65, 0x61, 0x28, 0x29, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x70, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x28, 0x27, 0x63, 0x61, 0x72, + 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x27, 0x29, 0x2e, 0x78, 0x28, 0x58, + 0x29, 0x2e, 0x79, 0x28, 0x59, 0x31, 0x29, 0x3b, 0x76, 0x61, 0x72, + 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x30, 0x20, 0x3d, 0x20, 0x64, 0x33, + 0x2e, 0x73, 0x76, 0x67, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x29, + 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x6f, 0x6c, 0x61, 0x74, + 0x65, 0x28, 0x27, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, + 0x27, 0x29, 0x2e, 0x78, 0x28, 0x58, 0x29, 0x2e, 0x79, 0x28, 0x59, + 0x30, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x6c, 0x69, 0x6e, 0x65, + 0x31, 0x20, 0x3d, 0x20, 0x64, 0x33, 0x2e, 0x73, 0x76, 0x67, 0x2e, + 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x29, 0x2e, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x70, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x28, 0x27, 0x63, 0x61, + 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x27, 0x29, 0x2e, 0x78, 0x28, + 0x58, 0x29, 0x2e, 0x79, 0x28, 0x59, 0x31, 0x29, 0x3b, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x58, 0x28, 0x64, 0x29, + 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x53, + 0x63, 0x61, 0x6c, 0x65, 0x28, 0x64, 0x5b, 0x30, 0x5d, 0x29, 0x3b, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x59, + 0x30, 0x28, 0x64, 0x29, 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x79, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x30, 0x28, 0x64, + 0x5b, 0x31, 0x5d, 0x29, 0x3b, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x59, 0x31, 0x28, 0x64, 0x29, 0x20, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x79, 0x53, 0x63, 0x61, + 0x6c, 0x65, 0x31, 0x28, 0x64, 0x5b, 0x32, 0x5d, 0x29, 0x3b, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, + 0x6e, 0x65, 0x72, 0x57, 0x28, 0x29, 0x20, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x2d, + 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2e, 0x6c, 0x65, 0x66, + 0x74, 0x20, 0x2d, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2e, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, + 0x28, 0x29, 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x2d, 0x20, 0x6d, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x2e, 0x74, 0x6f, 0x70, 0x20, 0x2d, 0x20, + 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2e, 0x62, 0x6f, 0x74, 0x74, + 0x6f, 0x6d, 0x3b, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x67, 0x65, 0x74, 0x58, 0x54, 0x69, 0x63, 0x6b, 0x73, + 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x20, 0x7b, 0x69, 0x66, 0x20, + 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x20, 0x3c, 0x20, 0x6e, 0x54, 0x69, 0x63, 0x6b, 0x73, 0x29, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x53, 0x63, 0x61, + 0x6c, 0x65, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x33, 0x2e, + 0x72, 0x61, 0x6e, 0x67, 0x65, 0x28, 0x30, 0x2c, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x20, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x65, 0x69, 0x6c, 0x28, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, + 0x2f, 0x20, 0x6e, 0x54, 0x69, 0x63, 0x6b, 0x73, 0x29, 0x29, 0x2e, + 0x6d, 0x61, 0x70, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x28, 0x64, 0x29, 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x78, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x64, + 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x5b, 0x64, 0x5d, 0x3b, + 0x7d, 0x29, 0x3b, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x67, 0x65, 0x74, 0x59, 0x54, 0x69, 0x63, 0x6b, 0x73, + 0x28, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x29, 0x20, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x3d, 0x20, + 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x28, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x64, 0x33, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x28, 0x64, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x64, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x63, 0x65, 0x69, 0x6c, 0x28, 0x64, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x5b, 0x31, 0x5d, 0x20, 0x2f, 0x20, 0x6e, 0x54, + 0x69, 0x63, 0x6b, 0x73, 0x29, 0x29, 0x3b, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x70, 0x44, 0x61, + 0x74, 0x61, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x20, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x5f, 0x64, 0x61, 0x74, 0x75, 0x6d, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, + 0x64, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x64, 0x61, 0x74, 0x75, 0x6d, 0x20, 0x3d, 0x20, 0x5b, 0x78, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x64, + 0x61, 0x74, 0x61, 0x2c, 0x20, 0x64, 0x2c, 0x20, 0x69, 0x29, 0x2c, + 0x20, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x30, 0x2e, 0x63, 0x61, + 0x6c, 0x6c, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2c, 0x20, 0x64, 0x2c, + 0x20, 0x69, 0x29, 0x5d, 0x3b, 0x64, 0x75, 0x61, 0x6c, 0x59, 0x61, + 0x78, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x64, 0x61, 0x74, 0x75, + 0x6d, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x79, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x31, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x64, 0x61, + 0x74, 0x61, 0x2c, 0x20, 0x64, 0x2c, 0x20, 0x69, 0x29, 0x29, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x61, 0x74, 0x75, + 0x6d, 0x3b, 0x7d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x2c, 0x20, + 0x69, 0x29, 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x5f, 0x64, 0x61, 0x74, 0x75, 0x6d, 0x28, 0x64, 0x2c, 0x20, 0x69, + 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, + 0x63, 0x61, 0x6c, 0x65, 0x73, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, + 0x20, 0x7b, 0x78, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x64, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, + 0x61, 0x70, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x28, 0x64, 0x29, 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x64, 0x5b, 0x30, 0x5d, 0x3b, 0x7d, 0x29, 0x29, 0x2e, + 0x72, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, + 0x28, 0x5b, 0x30, 0x2c, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x57, + 0x28, 0x29, 0x5d, 0x2c, 0x20, 0x31, 0x29, 0x3b, 0x79, 0x53, 0x63, + 0x61, 0x6c, 0x65, 0x30, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, + 0x28, 0x5b, 0x30, 0x2c, 0x20, 0x64, 0x33, 0x2e, 0x6d, 0x61, 0x78, + 0x28, 0x64, 0x61, 0x74, 0x61, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x29, 0x20, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x5b, 0x31, 0x5d, 0x3b, + 0x7d, 0x29, 0x5d, 0x29, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x28, + 0x5b, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x28, 0x29, 0x2c, 0x20, + 0x30, 0x5d, 0x29, 0x3b, 0x64, 0x75, 0x61, 0x6c, 0x59, 0x61, 0x78, + 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x79, 0x53, 0x63, 0x61, 0x6c, + 0x65, 0x31, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x5b, + 0x30, 0x2c, 0x20, 0x64, 0x33, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x64, + 0x61, 0x74, 0x61, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x29, 0x20, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x64, 0x5b, 0x32, 0x5d, 0x3b, 0x7d, 0x29, + 0x5d, 0x29, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x28, 0x5b, 0x69, + 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x28, 0x29, 0x2c, 0x20, 0x30, 0x5d, + 0x29, 0x3b, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x4f, 0x70, 0x61, 0x63, + 0x69, 0x74, 0x79, 0x28, 0x65, 0x6c, 0x65, 0x2c, 0x20, 0x6f, 0x70, + 0x29, 0x20, 0x7b, 0x64, 0x33, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x28, 0x65, 0x6c, 0x65, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x29, 0x2e, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x41, 0x6c, 0x6c, 0x28, 0x27, 0x2e, 0x27, 0x20, 0x2b, + 0x20, 0x28, 0x65, 0x6c, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x27, 0x64, 0x61, + 0x74, 0x61, 0x2d, 0x79, 0x61, 0x78, 0x69, 0x73, 0x27, 0x29, 0x20, + 0x3d, 0x3d, 0x20, 0x27, 0x79, 0x30, 0x27, 0x20, 0x3f, 0x20, 0x27, + 0x79, 0x31, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x79, 0x30, 0x27, 0x29, + 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x73, 0x74, 0x79, + 0x6c, 0x65, 0x27, 0x2c, 0x20, 0x6f, 0x70, 0x29, 0x3b, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x74, + 0x4c, 0x65, 0x67, 0x65, 0x6e, 0x64, 0x4c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x28, 0x73, 0x76, 0x67, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x72, 0x65, 0x63, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x76, 0x67, + 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x41, 0x6c, 0x6c, 0x28, + 0x27, 0x72, 0x65, 0x63, 0x74, 0x2e, 0x6c, 0x65, 0x67, 0x65, 0x6e, + 0x64, 0x2e, 0x79, 0x30, 0x27, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x28, 0x5b, 0x6e, 0x75, 0x6c, 0x6c, 0x5d, 0x29, 0x3b, 0x72, 0x65, + 0x63, 0x74, 0x2e, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x28, 0x29, 0x2e, + 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, 0x72, 0x65, 0x63, + 0x74, 0x27, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x27, 0x2c, 0x20, 0x27, 0x6c, 0x65, 0x67, + 0x65, 0x6e, 0x64, 0x20, 0x79, 0x30, 0x27, 0x29, 0x2e, 0x61, 0x74, + 0x74, 0x72, 0x28, 0x27, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x79, 0x61, + 0x78, 0x69, 0x73, 0x27, 0x2c, 0x20, 0x27, 0x79, 0x30, 0x27, 0x29, + 0x2e, 0x6f, 0x6e, 0x28, 0x27, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x2c, 0x20, 0x69, 0x29, 0x20, + 0x7b, 0x20, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x4f, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x20, + 0x27, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x30, 0x2e, + 0x31, 0x27, 0x29, 0x3b, 0x20, 0x7d, 0x29, 0x2e, 0x6f, 0x6e, 0x28, + 0x27, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x6c, 0x65, 0x61, 0x76, 0x65, + 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x28, 0x64, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x7b, 0x20, 0x74, + 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x4f, 0x70, 0x61, 0x63, 0x69, 0x74, + 0x79, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x20, 0x6e, 0x75, 0x6c, + 0x6c, 0x29, 0x3b, 0x20, 0x7d, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, + 0x28, 0x27, 0x79, 0x27, 0x2c, 0x20, 0x28, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x20, 0x2d, 0x20, 0x31, 0x35, 0x29, 0x29, 0x3b, 0x72, + 0x65, 0x63, 0x74, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x78, + 0x27, 0x2c, 0x20, 0x28, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x2f, + 0x20, 0x32, 0x29, 0x20, 0x2d, 0x20, 0x31, 0x30, 0x30, 0x29, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, + 0x73, 0x76, 0x67, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x41, + 0x6c, 0x6c, 0x28, 0x27, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x6c, 0x65, + 0x67, 0x65, 0x6e, 0x64, 0x2e, 0x79, 0x30, 0x27, 0x29, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x28, 0x5b, 0x6e, 0x75, 0x6c, 0x6c, 0x5d, 0x29, + 0x3b, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x28, 0x29, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, + 0x74, 0x65, 0x78, 0x74, 0x27, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, + 0x28, 0x27, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x27, 0x2c, 0x20, 0x27, + 0x6c, 0x65, 0x67, 0x65, 0x6e, 0x64, 0x20, 0x79, 0x30, 0x27, 0x29, + 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x64, 0x61, 0x74, 0x61, + 0x2d, 0x79, 0x61, 0x78, 0x69, 0x73, 0x27, 0x2c, 0x20, 0x27, 0x79, + 0x30, 0x27, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x27, 0x6d, 0x6f, 0x75, + 0x73, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x27, 0x2c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x2c, 0x20, + 0x69, 0x29, 0x20, 0x7b, 0x20, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, + 0x4f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2c, 0x20, 0x27, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x3a, 0x30, 0x2e, 0x31, 0x27, 0x29, 0x3b, 0x20, 0x7d, 0x29, 0x2e, + 0x6f, 0x6e, 0x28, 0x27, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x6c, 0x65, + 0x61, 0x76, 0x65, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x2c, 0x20, 0x69, 0x29, 0x20, + 0x7b, 0x20, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x4f, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x20, + 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x20, 0x7d, 0x29, 0x2e, 0x61, + 0x74, 0x74, 0x72, 0x28, 0x27, 0x79, 0x27, 0x2c, 0x20, 0x28, 0x68, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x2d, 0x20, 0x36, 0x29, 0x29, + 0x3b, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, + 0x27, 0x78, 0x27, 0x2c, 0x20, 0x28, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x20, 0x2f, 0x20, 0x32, 0x29, 0x20, 0x2d, 0x20, 0x38, 0x35, 0x29, + 0x2e, 0x74, 0x65, 0x78, 0x74, 0x28, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x2e, 0x79, 0x30, 0x29, 0x3b, 0x69, 0x66, 0x20, 0x28, 0x21, + 0x64, 0x75, 0x61, 0x6c, 0x59, 0x61, 0x78, 0x69, 0x73, 0x29, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x72, 0x65, 0x63, 0x74, 0x20, + 0x3d, 0x20, 0x73, 0x76, 0x67, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x41, 0x6c, 0x6c, 0x28, 0x27, 0x72, 0x65, 0x63, 0x74, 0x2e, + 0x6c, 0x65, 0x67, 0x65, 0x6e, 0x64, 0x2e, 0x79, 0x31, 0x27, 0x29, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x28, 0x5b, 0x6e, 0x75, 0x6c, 0x6c, + 0x5d, 0x29, 0x3b, 0x72, 0x65, 0x63, 0x74, 0x2e, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x28, 0x29, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, + 0x28, 0x27, 0x72, 0x65, 0x63, 0x74, 0x27, 0x29, 0x2e, 0x61, 0x74, + 0x74, 0x72, 0x28, 0x27, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x27, 0x2c, + 0x20, 0x27, 0x6c, 0x65, 0x67, 0x65, 0x6e, 0x64, 0x20, 0x79, 0x31, + 0x27, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x64, 0x61, + 0x74, 0x61, 0x2d, 0x79, 0x61, 0x78, 0x69, 0x73, 0x27, 0x2c, 0x20, + 0x27, 0x79, 0x31, 0x27, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x27, 0x6d, + 0x6f, 0x75, 0x73, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x27, 0x2c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, + 0x2c, 0x20, 0x69, 0x29, 0x20, 0x7b, 0x20, 0x74, 0x6f, 0x67, 0x67, + 0x6c, 0x65, 0x4f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2c, 0x20, 0x27, 0x6f, 0x70, 0x61, 0x63, 0x69, + 0x74, 0x79, 0x3a, 0x30, 0x2e, 0x31, 0x27, 0x29, 0x3b, 0x20, 0x7d, + 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x27, 0x6d, 0x6f, 0x75, 0x73, 0x65, + 0x6c, 0x65, 0x61, 0x76, 0x65, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x2c, 0x20, 0x69, + 0x29, 0x20, 0x7b, 0x20, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x4f, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x2c, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x20, 0x7d, 0x29, + 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x79, 0x27, 0x2c, 0x20, + 0x28, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x2d, 0x20, 0x31, + 0x35, 0x29, 0x29, 0x3b, 0x72, 0x65, 0x63, 0x74, 0x2e, 0x61, 0x74, + 0x74, 0x72, 0x28, 0x27, 0x78, 0x27, 0x2c, 0x20, 0x28, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x20, 0x2f, 0x20, 0x32, 0x29, 0x29, 0x3b, 0x74, + 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x76, 0x67, 0x2e, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x41, 0x6c, 0x6c, 0x28, 0x27, 0x74, + 0x65, 0x78, 0x74, 0x2e, 0x6c, 0x65, 0x67, 0x65, 0x6e, 0x64, 0x2e, + 0x79, 0x31, 0x27, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x28, 0x5b, + 0x6e, 0x75, 0x6c, 0x6c, 0x5d, 0x29, 0x3b, 0x74, 0x65, 0x78, 0x74, + 0x2e, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x28, 0x29, 0x2e, 0x61, 0x70, + 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, 0x74, 0x65, 0x78, 0x74, 0x27, + 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x27, 0x2c, 0x20, 0x27, 0x6c, 0x65, 0x67, 0x65, 0x6e, + 0x64, 0x20, 0x79, 0x31, 0x27, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, + 0x28, 0x27, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x79, 0x61, 0x78, 0x69, + 0x73, 0x27, 0x2c, 0x20, 0x27, 0x79, 0x31, 0x27, 0x29, 0x2e, 0x6f, + 0x6e, 0x28, 0x27, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x28, 0x64, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x7b, 0x20, + 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x4f, 0x70, 0x61, 0x63, 0x69, + 0x74, 0x79, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x20, 0x27, 0x6f, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x30, 0x2e, 0x31, 0x27, + 0x29, 0x3b, 0x20, 0x7d, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x27, 0x6d, + 0x6f, 0x75, 0x73, 0x65, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x27, 0x2c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, + 0x64, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x7b, 0x20, 0x74, 0x6f, 0x67, + 0x67, 0x6c, 0x65, 0x4f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x2c, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x29, + 0x3b, 0x20, 0x7d, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, + 0x79, 0x27, 0x2c, 0x20, 0x28, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x20, 0x2d, 0x20, 0x36, 0x29, 0x29, 0x3b, 0x74, 0x65, 0x78, 0x74, + 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x78, 0x27, 0x2c, 0x20, + 0x28, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x2f, 0x20, 0x32, 0x29, + 0x20, 0x2b, 0x20, 0x31, 0x35, 0x29, 0x2e, 0x74, 0x65, 0x78, 0x74, + 0x28, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2e, 0x79, 0x31, 0x29, + 0x3b, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x73, 0x65, 0x74, 0x41, 0x78, 0x69, 0x73, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x28, 0x73, 0x76, 0x67, 0x29, 0x20, 0x7b, 0x73, 0x76, + 0x67, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x41, 0x6c, 0x6c, + 0x28, 0x27, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x61, 0x78, 0x69, 0x73, + 0x2d, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2e, 0x79, 0x30, 0x27, 0x29, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x28, 0x5b, 0x6e, 0x75, 0x6c, 0x6c, + 0x5d, 0x29, 0x2e, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x28, 0x29, 0x2e, + 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, 0x74, 0x65, 0x78, + 0x74, 0x27, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x27, 0x2c, 0x20, 0x27, 0x61, 0x78, 0x69, + 0x73, 0x2d, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x20, 0x79, 0x30, 0x27, + 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x79, 0x27, 0x2c, + 0x20, 0x31, 0x30, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, + 0x78, 0x27, 0x2c, 0x20, 0x35, 0x33, 0x29, 0x2e, 0x74, 0x65, 0x78, + 0x74, 0x28, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2e, 0x79, 0x30, + 0x29, 0x3b, 0x69, 0x66, 0x20, 0x28, 0x21, 0x64, 0x75, 0x61, 0x6c, + 0x59, 0x61, 0x78, 0x69, 0x73, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x45, 0x6e, 0x74, 0x65, + 0x72, 0x20, 0x3d, 0x20, 0x73, 0x76, 0x67, 0x2e, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x41, 0x6c, 0x6c, 0x28, 0x27, 0x74, 0x65, 0x78, + 0x74, 0x2e, 0x61, 0x78, 0x69, 0x73, 0x2d, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x2e, 0x79, 0x31, 0x27, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x28, 0x5b, 0x6e, 0x75, 0x6c, 0x6c, 0x5d, 0x29, 0x3b, 0x74, 0x45, + 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x28, + 0x29, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, 0x74, + 0x65, 0x78, 0x74, 0x27, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, + 0x27, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x27, 0x2c, 0x20, 0x27, 0x61, + 0x78, 0x69, 0x73, 0x2d, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x20, 0x79, + 0x31, 0x27, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x79, + 0x27, 0x2c, 0x20, 0x31, 0x30, 0x29, 0x2e, 0x74, 0x65, 0x78, 0x74, + 0x28, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2e, 0x79, 0x31, 0x29, + 0x3b, 0x64, 0x75, 0x61, 0x6c, 0x59, 0x61, 0x78, 0x69, 0x73, 0x20, + 0x26, 0x26, 0x20, 0x74, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x61, + 0x74, 0x74, 0x72, 0x28, 0x27, 0x78, 0x27, 0x2c, 0x20, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x20, 0x2d, 0x20, 0x32, 0x35, 0x29, 0x3b, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x53, 0x6b, 0x65, 0x6c, 0x65, 0x74, 0x6f, + 0x6e, 0x28, 0x73, 0x76, 0x67, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x67, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x73, + 0x76, 0x67, 0x2e, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x28, 0x29, 0x2e, + 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, 0x73, 0x76, 0x67, + 0x27, 0x29, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, + 0x67, 0x27, 0x29, 0x3b, 0x67, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x2e, + 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, 0x67, 0x27, 0x29, + 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x27, 0x2c, 0x20, 0x27, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x6c, + 0x69, 0x6e, 0x65, 0x30, 0x20, 0x79, 0x30, 0x27, 0x29, 0x3b, 0x64, + 0x75, 0x61, 0x6c, 0x59, 0x61, 0x78, 0x69, 0x73, 0x20, 0x26, 0x26, + 0x20, 0x67, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x70, + 0x65, 0x6e, 0x64, 0x28, 0x27, 0x67, 0x27, 0x29, 0x2e, 0x61, 0x74, + 0x74, 0x72, 0x28, 0x27, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x27, 0x2c, + 0x20, 0x27, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x6c, 0x69, 0x6e, 0x65, + 0x31, 0x20, 0x79, 0x31, 0x27, 0x29, 0x3b, 0x67, 0x45, 0x6e, 0x74, + 0x65, 0x72, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, + 0x67, 0x27, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x27, 0x2c, 0x20, 0x27, 0x61, 0x72, 0x65, + 0x61, 0x20, 0x61, 0x72, 0x65, 0x61, 0x30, 0x20, 0x79, 0x30, 0x27, + 0x29, 0x3b, 0x64, 0x75, 0x61, 0x6c, 0x59, 0x61, 0x78, 0x69, 0x73, + 0x20, 0x26, 0x26, 0x20, 0x67, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x2e, + 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, 0x67, 0x27, 0x29, + 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x27, 0x2c, 0x20, 0x27, 0x61, 0x72, 0x65, 0x61, 0x20, 0x61, + 0x72, 0x65, 0x61, 0x31, 0x20, 0x79, 0x31, 0x27, 0x29, 0x3b, 0x67, + 0x45, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, + 0x64, 0x28, 0x27, 0x67, 0x27, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, + 0x28, 0x27, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x27, 0x2c, 0x20, 0x27, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x20, 0x79, 0x30, 0x27, 0x29, + 0x3b, 0x64, 0x75, 0x61, 0x6c, 0x59, 0x61, 0x78, 0x69, 0x73, 0x20, + 0x26, 0x26, 0x20, 0x67, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x61, + 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, 0x67, 0x27, 0x29, 0x2e, + 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x27, 0x2c, 0x20, 0x27, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x20, + 0x79, 0x31, 0x27, 0x29, 0x3b, 0x67, 0x45, 0x6e, 0x74, 0x65, 0x72, + 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, 0x67, 0x27, + 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x27, 0x2c, 0x20, 0x27, 0x78, 0x20, 0x67, 0x72, 0x69, + 0x64, 0x27, 0x29, 0x3b, 0x67, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x2e, + 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, 0x67, 0x27, 0x29, + 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x27, 0x2c, 0x20, 0x27, 0x79, 0x20, 0x67, 0x72, 0x69, 0x64, + 0x27, 0x29, 0x3b, 0x67, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x61, + 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, 0x67, 0x27, 0x29, 0x2e, + 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x27, 0x2c, 0x20, 0x27, 0x78, 0x20, 0x61, 0x78, 0x69, 0x73, 0x27, + 0x29, 0x3b, 0x67, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x61, 0x70, + 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, 0x67, 0x27, 0x29, 0x2e, 0x61, + 0x74, 0x74, 0x72, 0x28, 0x27, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x27, + 0x2c, 0x20, 0x27, 0x79, 0x30, 0x20, 0x61, 0x78, 0x69, 0x73, 0x27, + 0x29, 0x3b, 0x64, 0x75, 0x61, 0x6c, 0x59, 0x61, 0x78, 0x69, 0x73, + 0x20, 0x26, 0x26, 0x20, 0x67, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x2e, + 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, 0x67, 0x27, 0x29, + 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x27, 0x2c, 0x20, 0x27, 0x79, 0x31, 0x20, 0x61, 0x78, 0x69, + 0x73, 0x27, 0x29, 0x3b, 0x67, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x2e, + 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, 0x67, 0x27, 0x29, + 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x27, 0x2c, 0x20, 0x27, 0x72, 0x65, 0x63, 0x74, 0x73, 0x27, + 0x29, 0x3b, 0x73, 0x65, 0x74, 0x41, 0x78, 0x69, 0x73, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x28, 0x73, 0x76, 0x67, 0x29, 0x3b, 0x73, + 0x65, 0x74, 0x4c, 0x65, 0x67, 0x65, 0x6e, 0x64, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x28, 0x73, 0x76, 0x67, 0x29, 0x3b, 0x67, 0x45, + 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, + 0x28, 0x27, 0x6c, 0x69, 0x6e, 0x65, 0x27, 0x29, 0x2e, 0x61, 0x74, + 0x74, 0x72, 0x28, 0x27, 0x79, 0x32, 0x27, 0x2c, 0x20, 0x69, 0x6e, + 0x6e, 0x65, 0x72, 0x48, 0x28, 0x29, 0x29, 0x2e, 0x61, 0x74, 0x74, + 0x72, 0x28, 0x27, 0x79, 0x31, 0x27, 0x2c, 0x20, 0x30, 0x29, 0x2e, + 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x27, 0x2c, 0x20, 0x27, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, + 0x6f, 0x72, 0x27, 0x29, 0x3b, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x68, 0x4c, 0x65, 0x6e, + 0x28, 0x64, 0x29, 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x64, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x28, 0x29, 0x2e, 0x67, + 0x65, 0x74, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x4c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x28, 0x29, 0x3b, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x4c, 0x69, 0x6e, 0x65, + 0x28, 0x67, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2c, 0x20, 0x6c, + 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x29, + 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, + 0x3d, 0x20, 0x67, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, + 0x27, 0x67, 0x2e, 0x27, 0x20, 0x2b, 0x20, 0x63, 0x4e, 0x61, 0x6d, + 0x65, 0x29, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x41, 0x6c, + 0x6c, 0x28, 0x27, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x27, 0x20, 0x2b, + 0x20, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x29, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x28, 0x5b, 0x64, 0x61, 0x74, 0x61, 0x5d, 0x29, 0x3b, 0x70, + 0x61, 0x74, 0x68, 0x2e, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x28, 0x29, + 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, 0x73, 0x76, + 0x67, 0x3a, 0x70, 0x61, 0x74, 0x68, 0x27, 0x29, 0x2e, 0x61, 0x74, + 0x74, 0x72, 0x28, 0x27, 0x64, 0x27, 0x2c, 0x20, 0x6c, 0x69, 0x6e, + 0x65, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x27, 0x2c, 0x20, 0x63, 0x4e, 0x61, 0x6d, 0x65, + 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x73, 0x74, 0x72, + 0x6f, 0x6b, 0x65, 0x2d, 0x64, 0x61, 0x73, 0x68, 0x61, 0x72, 0x72, + 0x61, 0x79, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x70, 0x6c, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x4c, + 0x65, 0x6e, 0x28, 0x64, 0x33, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x29, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x6c, 0x20, 0x2b, 0x20, 0x27, + 0x20, 0x27, 0x20, 0x2b, 0x20, 0x70, 0x6c, 0x3b, 0x7d, 0x29, 0x2e, + 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x73, 0x74, 0x72, 0x6f, 0x6b, + 0x65, 0x2d, 0x64, 0x61, 0x73, 0x68, 0x6f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x28, 0x64, 0x29, 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x68, 0x4c, 0x65, 0x6e, 0x28, + 0x64, 0x33, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x29, 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x70, 0x61, + 0x74, 0x68, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x64, 0x27, + 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x2e, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x2e, 0x61, + 0x74, 0x74, 0x72, 0x28, 0x27, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, + 0x2d, 0x64, 0x61, 0x73, 0x68, 0x61, 0x72, 0x72, 0x61, 0x79, 0x27, + 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x28, 0x64, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x70, 0x6c, + 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x4c, 0x65, 0x6e, 0x28, + 0x64, 0x33, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x29, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x70, 0x6c, 0x20, 0x2b, 0x20, 0x27, 0x20, 0x27, 0x20, + 0x2b, 0x20, 0x70, 0x6c, 0x3b, 0x7d, 0x29, 0x2e, 0x64, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x32, 0x30, 0x30, 0x30, 0x29, + 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x73, 0x74, 0x72, 0x6f, + 0x6b, 0x65, 0x2d, 0x64, 0x61, 0x73, 0x68, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x27, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x70, 0x61, 0x74, + 0x68, 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, 0x29, 0x2e, 0x72, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x29, 0x3b, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x41, 0x72, + 0x65, 0x61, 0x28, 0x67, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2c, + 0x20, 0x63, 0x62, 0x2c, 0x20, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x29, + 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x61, 0x72, 0x65, 0x61, 0x20, + 0x3d, 0x20, 0x67, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, + 0x27, 0x67, 0x2e, 0x27, 0x20, 0x2b, 0x20, 0x63, 0x4e, 0x61, 0x6d, + 0x65, 0x29, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x41, 0x6c, + 0x6c, 0x28, 0x27, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x27, 0x20, 0x2b, + 0x20, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x29, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x28, 0x5b, 0x64, 0x61, 0x74, 0x61, 0x5d, 0x29, 0x3b, 0x61, + 0x72, 0x65, 0x61, 0x2e, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x28, 0x29, + 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, 0x73, 0x76, + 0x67, 0x3a, 0x70, 0x61, 0x74, 0x68, 0x27, 0x29, 0x2e, 0x61, 0x74, + 0x74, 0x72, 0x28, 0x27, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x27, 0x2c, + 0x20, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x29, 0x3b, 0x61, 0x72, 0x65, + 0x61, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x64, 0x27, 0x2c, + 0x20, 0x63, 0x62, 0x29, 0x3b, 0x61, 0x72, 0x65, 0x61, 0x2e, 0x65, + 0x78, 0x69, 0x74, 0x28, 0x29, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x28, 0x29, 0x3b, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x41, 0x72, 0x65, 0x61, 0x4c, + 0x69, 0x6e, 0x65, 0x73, 0x28, 0x67, 0x2c, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x29, 0x20, 0x7b, 0x61, 0x64, 0x64, 0x41, 0x72, 0x65, 0x61, + 0x28, 0x67, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2c, 0x20, 0x61, + 0x72, 0x65, 0x61, 0x30, 0x2e, 0x79, 0x30, 0x28, 0x79, 0x53, 0x63, + 0x61, 0x6c, 0x65, 0x30, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x28, + 0x29, 0x5b, 0x30, 0x5d, 0x29, 0x2c, 0x20, 0x27, 0x61, 0x72, 0x65, + 0x61, 0x30, 0x27, 0x29, 0x3b, 0x61, 0x64, 0x64, 0x4c, 0x69, 0x6e, + 0x65, 0x28, 0x67, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2c, 0x20, + 0x6c, 0x69, 0x6e, 0x65, 0x30, 0x2c, 0x20, 0x27, 0x6c, 0x69, 0x6e, + 0x65, 0x30, 0x27, 0x29, 0x3b, 0x61, 0x64, 0x64, 0x41, 0x72, 0x65, + 0x61, 0x28, 0x67, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2c, 0x20, + 0x61, 0x72, 0x65, 0x61, 0x31, 0x2e, 0x79, 0x31, 0x28, 0x79, 0x53, + 0x63, 0x61, 0x6c, 0x65, 0x31, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, + 0x28, 0x29, 0x5b, 0x30, 0x5d, 0x29, 0x2c, 0x20, 0x27, 0x61, 0x72, + 0x65, 0x61, 0x31, 0x27, 0x29, 0x3b, 0x61, 0x64, 0x64, 0x4c, 0x69, + 0x6e, 0x65, 0x28, 0x67, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2c, + 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x31, 0x2c, 0x20, 0x27, 0x6c, 0x69, + 0x6e, 0x65, 0x31, 0x27, 0x29, 0x3b, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x50, 0x6f, 0x69, + 0x6e, 0x74, 0x73, 0x28, 0x67, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x61, 0x64, 0x69, + 0x75, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3e, 0x20, 0x31, 0x30, 0x30, + 0x20, 0x3f, 0x20, 0x31, 0x20, 0x3a, 0x20, 0x32, 0x2e, 0x35, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x20, + 0x3d, 0x20, 0x67, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, + 0x27, 0x67, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x2e, 0x79, + 0x30, 0x27, 0x29, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x41, + 0x6c, 0x6c, 0x28, 0x27, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x2e, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x27, 0x29, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x73, 0x2e, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x28, 0x29, + 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, 0x73, 0x76, + 0x67, 0x3a, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x27, 0x29, 0x2e, + 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x72, 0x27, 0x2c, 0x20, 0x72, + 0x61, 0x64, 0x69, 0x75, 0x73, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, + 0x28, 0x27, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x27, 0x2c, 0x20, 0x27, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x27, 0x29, 0x3b, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x73, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x63, + 0x78, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x28, 0x64, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x78, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x28, + 0x64, 0x5b, 0x30, 0x5d, 0x29, 0x3b, 0x20, 0x7d, 0x29, 0x2e, 0x61, + 0x74, 0x74, 0x72, 0x28, 0x27, 0x63, 0x79, 0x27, 0x2c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x29, + 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x79, + 0x53, 0x63, 0x61, 0x6c, 0x65, 0x30, 0x28, 0x64, 0x5b, 0x31, 0x5d, + 0x29, 0x3b, 0x20, 0x7d, 0x29, 0x3b, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x73, 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, 0x29, 0x2e, 0x72, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x29, 0x3b, 0x69, 0x66, 0x20, 0x28, + 0x21, 0x64, 0x75, 0x61, 0x6c, 0x59, 0x61, 0x78, 0x69, 0x73, 0x29, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x73, 0x20, 0x3d, 0x20, 0x67, 0x2e, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x28, 0x27, 0x67, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x73, 0x2e, 0x79, 0x31, 0x27, 0x29, 0x2e, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x41, 0x6c, 0x6c, 0x28, 0x27, 0x63, 0x69, 0x72, 0x63, + 0x6c, 0x65, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x27, 0x29, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x2e, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x28, 0x29, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, + 0x27, 0x73, 0x76, 0x67, 0x3a, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, + 0x27, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x72, 0x27, + 0x2c, 0x20, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x29, 0x2e, 0x61, + 0x74, 0x74, 0x72, 0x28, 0x27, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x27, + 0x2c, 0x20, 0x27, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x27, 0x29, 0x3b, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x2e, 0x61, 0x74, 0x74, 0x72, + 0x28, 0x27, 0x63, 0x78, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x29, 0x20, 0x7b, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x53, 0x63, 0x61, + 0x6c, 0x65, 0x28, 0x64, 0x5b, 0x30, 0x5d, 0x29, 0x3b, 0x20, 0x7d, + 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x63, 0x79, 0x27, + 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x28, 0x64, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x79, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x31, 0x28, 0x64, + 0x5b, 0x32, 0x5d, 0x29, 0x3b, 0x20, 0x7d, 0x29, 0x3b, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x73, 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, 0x29, + 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x29, 0x3b, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x64, + 0x64, 0x41, 0x78, 0x69, 0x73, 0x28, 0x67, 0x2c, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x78, 0x54, + 0x69, 0x63, 0x6b, 0x73, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x58, + 0x54, 0x69, 0x63, 0x6b, 0x73, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x69, 0x63, 0x6b, 0x44, 0x69, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x78, 0x54, + 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x20, 0x3e, 0x20, 0x31, 0x20, 0x3f, 0x20, 0x28, 0x78, 0x53, 0x63, + 0x61, 0x6c, 0x65, 0x28, 0x78, 0x54, 0x69, 0x63, 0x6b, 0x73, 0x5b, + 0x31, 0x5d, 0x29, 0x20, 0x2d, 0x20, 0x78, 0x53, 0x63, 0x61, 0x6c, + 0x65, 0x28, 0x78, 0x54, 0x69, 0x63, 0x6b, 0x73, 0x5b, 0x30, 0x5d, + 0x29, 0x29, 0x20, 0x3a, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x57, + 0x28, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x57, 0x20, 0x3d, 0x20, 0x74, 0x69, 0x63, 0x6b, 0x44, 0x69, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x2d, 0x20, 0x70, 0x61, + 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3b, 0x67, 0x2e, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x28, 0x27, 0x2e, 0x78, 0x2e, 0x61, 0x78, 0x69, + 0x73, 0x27, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x27, 0x2c, 0x20, + 0x27, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, 0x28, + 0x30, 0x2c, 0x27, 0x20, 0x2b, 0x20, 0x79, 0x53, 0x63, 0x61, 0x6c, + 0x65, 0x30, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x28, 0x29, 0x5b, + 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x27, 0x29, 0x27, 0x29, 0x2e, 0x63, + 0x61, 0x6c, 0x6c, 0x28, 0x78, 0x41, 0x78, 0x69, 0x73, 0x2e, 0x74, + 0x69, 0x63, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x78, + 0x54, 0x69, 0x63, 0x6b, 0x73, 0x29, 0x29, 0x2e, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x41, 0x6c, 0x6c, 0x28, 0x22, 0x2e, 0x74, 0x69, + 0x63, 0x6b, 0x20, 0x74, 0x65, 0x78, 0x74, 0x22, 0x29, 0x2e, 0x63, + 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, + 0x65, 0x2c, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x57, 0x20, 0x3e, + 0x20, 0x30, 0x20, 0x3f, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x57, + 0x20, 0x3a, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x57, 0x28, 0x29, + 0x29, 0x3b, 0x67, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, + 0x27, 0x2e, 0x79, 0x30, 0x2e, 0x61, 0x78, 0x69, 0x73, 0x27, 0x29, + 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x79, 0x41, 0x78, 0x69, 0x73, + 0x30, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x28, 0x67, 0x65, 0x74, 0x59, 0x54, 0x69, 0x63, 0x6b, 0x73, + 0x28, 0x79, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x30, 0x29, 0x29, 0x29, + 0x3b, 0x69, 0x66, 0x20, 0x28, 0x21, 0x64, 0x75, 0x61, 0x6c, 0x59, + 0x61, 0x78, 0x69, 0x73, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x3b, 0x67, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x27, + 0x2e, 0x79, 0x31, 0x2e, 0x61, 0x78, 0x69, 0x73, 0x27, 0x29, 0x2e, + 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x27, 0x2c, 0x20, 0x27, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, 0x28, 0x27, 0x20, 0x2b, 0x20, + 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x57, 0x28, 0x29, 0x20, 0x2b, 0x20, + 0x27, 0x2c, 0x20, 0x30, 0x29, 0x27, 0x29, 0x2e, 0x63, 0x61, 0x6c, + 0x6c, 0x28, 0x79, 0x41, 0x78, 0x69, 0x73, 0x31, 0x2e, 0x74, 0x69, + 0x63, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x67, 0x65, + 0x74, 0x59, 0x54, 0x69, 0x63, 0x6b, 0x73, 0x28, 0x79, 0x53, 0x63, + 0x61, 0x6c, 0x65, 0x31, 0x29, 0x29, 0x29, 0x3b, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x47, + 0x72, 0x69, 0x64, 0x28, 0x67, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x29, 0x20, 0x7b, 0x67, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x28, 0x27, 0x2e, 0x78, 0x2e, 0x67, 0x72, 0x69, 0x64, 0x27, 0x29, + 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x27, 0x2c, 0x20, 0x27, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, 0x28, 0x30, 0x2c, 0x27, + 0x20, 0x2b, 0x20, 0x79, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x30, 0x2e, + 0x72, 0x61, 0x6e, 0x67, 0x65, 0x28, 0x29, 0x5b, 0x30, 0x5d, 0x20, + 0x2b, 0x20, 0x27, 0x29, 0x27, 0x29, 0x2e, 0x63, 0x61, 0x6c, 0x6c, + 0x28, 0x78, 0x47, 0x72, 0x69, 0x64, 0x2e, 0x74, 0x69, 0x63, 0x6b, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x67, 0x65, 0x74, 0x58, + 0x54, 0x69, 0x63, 0x6b, 0x73, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, + 0x29, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x28, + 0x2d, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x28, 0x29, 0x2c, 0x20, + 0x30, 0x2c, 0x20, 0x30, 0x29, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x46, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x27, 0x27, 0x29, 0x29, 0x3b, + 0x67, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x27, 0x2e, + 0x79, 0x2e, 0x67, 0x72, 0x69, 0x64, 0x27, 0x29, 0x2e, 0x63, 0x61, + 0x6c, 0x6c, 0x28, 0x79, 0x47, 0x72, 0x69, 0x64, 0x2e, 0x74, 0x69, + 0x63, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x67, 0x65, + 0x74, 0x59, 0x54, 0x69, 0x63, 0x6b, 0x73, 0x28, 0x79, 0x53, 0x63, + 0x61, 0x6c, 0x65, 0x30, 0x29, 0x29, 0x2e, 0x74, 0x69, 0x63, 0x6b, + 0x53, 0x69, 0x7a, 0x65, 0x28, 0x2d, 0x69, 0x6e, 0x6e, 0x65, 0x72, + 0x57, 0x28, 0x29, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x29, 0x2e, + 0x74, 0x69, 0x63, 0x6b, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, + 0x27, 0x27, 0x29, 0x29, 0x3b, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x54, + 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x28, 0x64, 0x61, 0x74, 0x61, + 0x2c, 0x20, 0x69, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x64, + 0x20, 0x3d, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, 0x6c, 0x69, + 0x63, 0x65, 0x28, 0x30, 0x29, 0x3b, 0x64, 0x5b, 0x30, 0x5d, 0x20, + 0x3d, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x78, + 0x29, 0x20, 0x3f, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x55, 0x74, 0x69, 0x6c, 0x2e, 0x66, 0x6d, 0x74, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x28, 0x64, 0x5b, 0x30, 0x5d, 0x2c, 0x20, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x78, 0x29, 0x20, 0x3a, + 0x20, 0x64, 0x5b, 0x30, 0x5d, 0x3b, 0x64, 0x5b, 0x31, 0x5d, 0x20, + 0x3d, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x79, + 0x30, 0x29, 0x20, 0x3f, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x2e, 0x55, 0x74, 0x69, 0x6c, 0x2e, 0x66, 0x6d, 0x74, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x64, 0x5b, 0x31, 0x5d, 0x2c, + 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x79, 0x30, 0x29, + 0x20, 0x3a, 0x20, 0x64, 0x33, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x28, 0x27, 0x2c, 0x27, 0x29, 0x28, 0x64, 0x5b, 0x31, 0x5d, + 0x29, 0x3b, 0x64, 0x75, 0x61, 0x6c, 0x59, 0x61, 0x78, 0x69, 0x73, + 0x20, 0x26, 0x26, 0x20, 0x28, 0x64, 0x5b, 0x32, 0x5d, 0x20, 0x3d, + 0x20, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x79, 0x31, + 0x29, 0x20, 0x3f, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x55, 0x74, 0x69, 0x6c, 0x2e, 0x66, 0x6d, 0x74, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x28, 0x64, 0x5b, 0x32, 0x5d, 0x2c, 0x20, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x79, 0x31, 0x29, 0x20, + 0x3a, 0x20, 0x64, 0x33, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x28, 0x27, 0x2c, 0x27, 0x29, 0x28, 0x64, 0x5b, 0x32, 0x5d, 0x29, + 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x64, 0x33, 0x2e, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x28, 0x27, 0x23, 0x74, 0x70, 0x6c, 0x2d, + 0x63, 0x68, 0x61, 0x72, 0x74, 0x2d, 0x74, 0x6f, 0x6f, 0x6c, 0x74, + 0x69, 0x70, 0x27, 0x29, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x29, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x48, 0x6f, 0x67, + 0x61, 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, + 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x29, 0x2e, 0x72, + 0x65, 0x6e, 0x64, 0x65, 0x72, 0x28, 0x7b, 0x27, 0x64, 0x61, 0x74, + 0x61, 0x27, 0x3a, 0x20, 0x64, 0x7d, 0x29, 0x3b, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x75, 0x73, + 0x65, 0x6f, 0x76, 0x65, 0x72, 0x28, 0x5f, 0x73, 0x65, 0x6c, 0x66, + 0x2c, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2c, 0x20, 0x69, 0x64, 0x78, + 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x6f, 0x6c, + 0x74, 0x69, 0x70, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x28, 0x27, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x74, 0x2d, 0x74, 0x6f, + 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x2d, 0x77, 0x72, 0x61, 0x70, 0x27, + 0x29, 0x3b, 0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x2e, 0x68, + 0x74, 0x6d, 0x6c, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x54, + 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x28, 0x64, 0x61, 0x74, 0x61, + 0x2c, 0x20, 0x69, 0x64, 0x78, 0x29, 0x29, 0x2e, 0x73, 0x74, 0x79, + 0x6c, 0x65, 0x28, 0x27, 0x6c, 0x65, 0x66, 0x74, 0x27, 0x2c, 0x20, + 0x28, 0x78, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x28, 0x64, 0x61, 0x74, + 0x61, 0x5b, 0x30, 0x5d, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x27, 0x70, + 0x78, 0x27, 0x29, 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x28, 0x27, + 0x74, 0x6f, 0x70, 0x27, 0x2c, 0x20, 0x20, 0x28, 0x64, 0x33, 0x2e, + 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x28, 0x5f, 0x73, 0x65, 0x6c, 0x66, + 0x29, 0x5b, 0x31, 0x5d, 0x20, 0x2b, 0x20, 0x31, 0x30, 0x29, 0x20, + 0x2b, 0x20, 0x27, 0x70, 0x78, 0x27, 0x29, 0x2e, 0x73, 0x74, 0x79, + 0x6c, 0x65, 0x28, 0x27, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, + 0x27, 0x2c, 0x20, 0x27, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x27, 0x29, + 0x3b, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x27, 0x6c, 0x69, 0x6e, + 0x65, 0x2e, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, + 0x27, 0x29, 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x28, 0x27, 0x64, + 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x27, 0x2c, 0x20, 0x27, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x27, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, + 0x28, 0x27, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x27, 0x2c, 0x20, 0x27, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, + 0x74, 0x65, 0x28, 0x27, 0x20, 0x2b, 0x20, 0x78, 0x53, 0x63, 0x61, + 0x6c, 0x65, 0x28, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x30, 0x5d, 0x29, + 0x20, 0x2b, 0x20, 0x27, 0x2c, 0x27, 0x20, 0x2b, 0x20, 0x30, 0x20, + 0x2b, 0x20, 0x27, 0x29, 0x27, 0x29, 0x3b, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x75, 0x73, 0x65, + 0x6f, 0x75, 0x74, 0x28, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x2c, 0x20, 0x67, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x20, 0x3d, 0x20, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x27, 0x2e, 0x63, 0x68, 0x61, + 0x72, 0x74, 0x2d, 0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x2d, + 0x77, 0x72, 0x61, 0x70, 0x27, 0x29, 0x3b, 0x74, 0x6f, 0x6f, 0x6c, + 0x74, 0x69, 0x70, 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x28, 0x27, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x27, 0x2c, 0x20, 0x27, + 0x6e, 0x6f, 0x6e, 0x65, 0x27, 0x29, 0x3b, 0x67, 0x2e, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x28, 0x27, 0x6c, 0x69, 0x6e, 0x65, 0x2e, + 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x27, 0x29, + 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x28, 0x27, 0x64, 0x69, 0x73, + 0x70, 0x6c, 0x61, 0x79, 0x27, 0x2c, 0x20, 0x27, 0x6e, 0x6f, 0x6e, + 0x65, 0x27, 0x29, 0x3b, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x52, 0x65, 0x63, 0x74, 0x73, + 0x28, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2c, + 0x20, 0x67, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x29, 0x20, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x77, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x6e, + 0x6e, 0x65, 0x72, 0x57, 0x28, 0x29, 0x20, 0x2f, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x72, 0x65, 0x63, 0x74, 0x73, 0x20, 0x3d, + 0x20, 0x67, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x27, + 0x67, 0x2e, 0x72, 0x65, 0x63, 0x74, 0x73, 0x27, 0x29, 0x2e, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x41, 0x6c, 0x6c, 0x28, 0x27, 0x72, + 0x65, 0x63, 0x74, 0x27, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x28, + 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x72, 0x65, 0x63, 0x74, 0x73, + 0x2e, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x28, 0x29, 0x2e, 0x61, 0x70, + 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, 0x73, 0x76, 0x67, 0x3a, 0x72, + 0x65, 0x63, 0x74, 0x27, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, + 0x27, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x27, 0x2c, 0x20, 0x69, + 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x28, 0x29, 0x29, 0x2e, 0x61, 0x74, + 0x74, 0x72, 0x28, 0x27, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x27, 0x2c, + 0x20, 0x27, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x27, 0x29, 0x3b, 0x72, + 0x65, 0x63, 0x74, 0x73, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x27, 0x2c, 0x20, 0x64, 0x33, 0x2e, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x77, 0x29, 0x29, + 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x78, 0x27, 0x2c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, + 0x2c, 0x20, 0x69, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x28, 0x77, 0x20, 0x2a, 0x20, 0x69, 0x29, 0x3b, + 0x20, 0x7d, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x79, + 0x27, 0x2c, 0x20, 0x30, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x27, 0x6d, + 0x6f, 0x75, 0x73, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x27, 0x2c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, + 0x2c, 0x20, 0x69, 0x29, 0x20, 0x7b, 0x6d, 0x6f, 0x75, 0x73, 0x65, + 0x6f, 0x76, 0x65, 0x72, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x20, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, + 0x64, 0x2c, 0x20, 0x69, 0x29, 0x3b, 0x7d, 0x29, 0x2e, 0x6f, 0x6e, + 0x28, 0x27, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x6c, 0x65, 0x61, 0x76, + 0x65, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x28, 0x64, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x7b, 0x6d, + 0x6f, 0x75, 0x73, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x67, 0x29, 0x3b, + 0x7d, 0x29, 0x3b, 0x72, 0x65, 0x63, 0x74, 0x73, 0x2e, 0x65, 0x78, + 0x69, 0x74, 0x28, 0x29, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x28, 0x29, 0x3b, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x63, 0x68, 0x61, 0x72, 0x74, 0x28, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x20, 0x7b, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x65, 0x61, 0x63, + 0x68, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x20, 0x7b, 0x64, 0x61, 0x74, + 0x61, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x70, 0x44, 0x61, 0x74, 0x61, + 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x73, 0x28, 0x64, 0x61, + 0x74, 0x61, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x73, 0x76, 0x67, + 0x20, 0x3d, 0x20, 0x64, 0x33, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x2e, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x41, 0x6c, 0x6c, 0x28, 0x27, 0x73, 0x76, 0x67, + 0x27, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x28, 0x5b, 0x64, 0x61, + 0x74, 0x61, 0x5d, 0x29, 0x3b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x53, 0x6b, 0x65, 0x6c, 0x65, 0x74, 0x6f, 0x6e, 0x28, 0x73, 0x76, + 0x67, 0x29, 0x3b, 0x73, 0x76, 0x67, 0x2e, 0x61, 0x74, 0x74, 0x72, + 0x28, 0x7b, 0x27, 0x77, 0x69, 0x64, 0x74, 0x68, 0x27, 0x3a, 0x20, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x27, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x27, 0x3a, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x67, 0x20, 0x3d, 0x20, + 0x73, 0x76, 0x67, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, + 0x27, 0x67, 0x27, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x27, 0x2c, + 0x20, 0x27, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, + 0x28, 0x27, 0x20, 0x2b, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, + 0x2e, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x2b, 0x20, 0x27, 0x2c, 0x27, + 0x20, 0x2b, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2e, 0x74, + 0x6f, 0x70, 0x20, 0x2b, 0x20, 0x27, 0x29, 0x27, 0x29, 0x3b, 0x61, + 0x64, 0x64, 0x47, 0x72, 0x69, 0x64, 0x28, 0x67, 0x2c, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x29, 0x3b, 0x61, 0x64, 0x64, 0x41, 0x72, 0x65, + 0x61, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x28, 0x67, 0x2c, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x29, 0x3b, 0x61, 0x64, 0x64, 0x50, 0x6f, 0x69, + 0x6e, 0x74, 0x73, 0x28, 0x67, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x29, 0x3b, 0x61, 0x64, 0x64, 0x41, 0x78, 0x69, 0x73, 0x28, 0x67, + 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x61, 0x64, 0x64, + 0x52, 0x65, 0x63, 0x74, 0x73, 0x28, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x67, 0x2c, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x7d, 0x63, 0x68, 0x61, + 0x72, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x5f, 0x29, + 0x20, 0x7b, 0x69, 0x66, 0x20, 0x28, 0x21, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, + 0x70, 0x74, 0x73, 0x3b, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, + 0x5f, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x68, + 0x61, 0x72, 0x74, 0x3b, 0x7d, 0x3b, 0x63, 0x68, 0x61, 0x72, 0x74, + 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x5f, 0x29, + 0x20, 0x7b, 0x69, 0x66, 0x20, 0x28, 0x21, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3b, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x63, 0x68, 0x61, 0x72, 0x74, 0x3b, 0x7d, 0x3b, 0x63, + 0x68, 0x61, 0x72, 0x74, 0x2e, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x28, 0x5f, 0x29, 0x20, 0x7b, 0x69, 0x66, 0x20, 0x28, 0x21, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x3b, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x61, 0x72, 0x74, + 0x3b, 0x7d, 0x3b, 0x63, 0x68, 0x61, 0x72, 0x74, 0x2e, 0x6d, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x5f, 0x29, 0x20, 0x7b, 0x69, + 0x66, 0x20, 0x28, 0x21, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x72, 0x67, + 0x69, 0x6e, 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x20, 0x3d, + 0x20, 0x5f, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, + 0x68, 0x61, 0x72, 0x74, 0x3b, 0x7d, 0x3b, 0x63, 0x68, 0x61, 0x72, + 0x74, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x5f, 0x29, + 0x20, 0x7b, 0x69, 0x66, 0x20, 0x28, 0x21, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x3b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, + 0x3d, 0x20, 0x5f, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x63, 0x68, 0x61, 0x72, 0x74, 0x3b, 0x7d, 0x3b, 0x63, 0x68, 0x61, + 0x72, 0x74, 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, + 0x5f, 0x29, 0x20, 0x7b, 0x69, 0x66, 0x20, 0x28, 0x21, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x61, 0x72, 0x74, 0x3b, 0x7d, + 0x3b, 0x63, 0x68, 0x61, 0x72, 0x74, 0x2e, 0x78, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x5f, + 0x29, 0x20, 0x7b, 0x69, 0x66, 0x20, 0x28, 0x21, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3b, 0x78, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x63, 0x68, 0x61, 0x72, 0x74, 0x3b, 0x7d, 0x3b, + 0x63, 0x68, 0x61, 0x72, 0x74, 0x2e, 0x79, 0x30, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x5f, + 0x29, 0x20, 0x7b, 0x69, 0x66, 0x20, 0x28, 0x21, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x30, 0x3b, 0x79, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x61, 0x72, 0x74, 0x3b, + 0x7d, 0x3b, 0x63, 0x68, 0x61, 0x72, 0x74, 0x2e, 0x79, 0x31, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x28, 0x5f, 0x29, 0x20, 0x7b, 0x69, 0x66, 0x20, 0x28, 0x21, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x31, 0x3b, 0x79, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x61, 0x72, + 0x74, 0x3b, 0x7d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x63, 0x68, 0x61, 0x72, 0x74, 0x3b, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x42, 0x61, 0x72, 0x43, 0x68, 0x61, + 0x72, 0x74, 0x28, 0x64, 0x75, 0x61, 0x6c, 0x59, 0x61, 0x78, 0x69, + 0x73, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6f, 0x70, 0x74, + 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x20, 0x3d, 0x20, 0x7b, 0x74, + 0x6f, 0x70, 0x20, 0x20, 0x20, 0x20, 0x3a, 0x20, 0x32, 0x30, 0x2c, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x20, 0x3a, 0x20, 0x35, 0x30, + 0x2c, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x20, 0x3a, 0x20, 0x34, + 0x30, 0x2c, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x20, 0x20, 0x3a, 0x20, + 0x35, 0x30, 0x2c, 0x7d, 0x2c, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x20, 0x3d, 0x20, 0x31, 0x37, 0x30, 0x2c, 0x6e, 0x54, 0x69, 0x63, + 0x6b, 0x73, 0x20, 0x3d, 0x20, 0x31, 0x30, 0x2c, 0x70, 0x61, 0x64, + 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x31, 0x30, 0x2c, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x37, 0x36, 0x30, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x20, + 0x3d, 0x20, 0x7b, 0x20, 0x78, 0x3a, 0x20, 0x27, 0x55, 0x6e, 0x6e, + 0x61, 0x6d, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x79, 0x30, 0x3a, 0x20, + 0x27, 0x55, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x27, 0x2c, 0x20, + 0x79, 0x31, 0x3a, 0x20, 0x27, 0x55, 0x6e, 0x6e, 0x61, 0x6d, 0x65, + 0x64, 0x27, 0x20, 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x78, 0x3a, + 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x20, 0x79, 0x30, 0x3a, 0x20, + 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x20, 0x79, 0x31, 0x3a, 0x20, 0x6e, + 0x75, 0x6c, 0x6c, 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x78, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x29, 0x20, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x5b, 0x30, 0x5d, 0x3b, + 0x7d, 0x2c, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x30, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, + 0x64, 0x29, 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x64, 0x5b, 0x31, 0x5d, 0x3b, 0x7d, 0x2c, 0x79, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x29, 0x20, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x5b, 0x32, 0x5d, 0x3b, 0x7d, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x78, 0x53, 0x63, 0x61, 0x6c, 0x65, + 0x20, 0x3d, 0x20, 0x64, 0x33, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, + 0x2e, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x28, 0x29, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x79, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x30, + 0x20, 0x3d, 0x20, 0x64, 0x33, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, + 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x28, 0x29, 0x2e, 0x6e, + 0x69, 0x63, 0x65, 0x28, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x79, + 0x53, 0x63, 0x61, 0x6c, 0x65, 0x31, 0x20, 0x3d, 0x20, 0x64, 0x33, + 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x6c, 0x69, 0x6e, 0x65, + 0x61, 0x72, 0x28, 0x29, 0x2e, 0x6e, 0x69, 0x63, 0x65, 0x28, 0x29, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x78, 0x41, 0x78, 0x69, 0x73, 0x20, + 0x3d, 0x20, 0x64, 0x33, 0x2e, 0x73, 0x76, 0x67, 0x2e, 0x61, 0x78, + 0x69, 0x73, 0x28, 0x29, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x28, + 0x78, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x29, 0x2e, 0x6f, 0x72, 0x69, + 0x65, 0x6e, 0x74, 0x28, 0x27, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, + 0x27, 0x29, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x46, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x28, 0x64, 0x29, 0x20, 0x7b, 0x69, 0x66, 0x20, 0x28, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x78, 0x29, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x55, 0x74, 0x69, 0x6c, 0x2e, 0x66, 0x6d, 0x74, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x28, 0x64, 0x2c, 0x20, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x2e, 0x78, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x64, 0x3b, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, + 0x20, 0x79, 0x41, 0x78, 0x69, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x64, + 0x33, 0x2e, 0x73, 0x76, 0x67, 0x2e, 0x61, 0x78, 0x69, 0x73, 0x28, + 0x29, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x28, 0x79, 0x53, 0x63, + 0x61, 0x6c, 0x65, 0x30, 0x29, 0x2e, 0x6f, 0x72, 0x69, 0x65, 0x6e, + 0x74, 0x28, 0x27, 0x6c, 0x65, 0x66, 0x74, 0x27, 0x29, 0x2e, 0x74, + 0x69, 0x63, 0x6b, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x29, + 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x33, + 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x27, 0x2e, 0x32, + 0x73, 0x27, 0x29, 0x28, 0x64, 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x79, 0x41, 0x78, 0x69, 0x73, 0x31, 0x20, 0x3d, + 0x20, 0x64, 0x33, 0x2e, 0x73, 0x76, 0x67, 0x2e, 0x61, 0x78, 0x69, + 0x73, 0x28, 0x29, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x28, 0x79, + 0x53, 0x63, 0x61, 0x6c, 0x65, 0x31, 0x29, 0x2e, 0x6f, 0x72, 0x69, + 0x65, 0x6e, 0x74, 0x28, 0x27, 0x72, 0x69, 0x67, 0x68, 0x74, 0x27, + 0x29, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x46, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x28, 0x64, 0x29, 0x20, 0x7b, 0x69, 0x66, 0x20, 0x28, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x79, 0x31, 0x29, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x55, 0x74, 0x69, 0x6c, 0x2e, 0x66, 0x6d, 0x74, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x28, 0x64, 0x2c, 0x20, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x2e, 0x79, 0x31, 0x29, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x64, 0x33, 0x2e, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x28, 0x27, 0x2e, 0x32, 0x73, 0x27, 0x29, 0x28, 0x64, + 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x78, 0x47, + 0x72, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x64, 0x33, 0x2e, 0x73, 0x76, + 0x67, 0x2e, 0x61, 0x78, 0x69, 0x73, 0x28, 0x29, 0x2e, 0x73, 0x63, + 0x61, 0x6c, 0x65, 0x28, 0x78, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x29, + 0x2e, 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x28, 0x27, 0x62, 0x6f, + 0x74, 0x74, 0x6f, 0x6d, 0x27, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x79, 0x47, 0x72, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x64, 0x33, 0x2e, + 0x73, 0x76, 0x67, 0x2e, 0x61, 0x78, 0x69, 0x73, 0x28, 0x29, 0x2e, + 0x73, 0x63, 0x61, 0x6c, 0x65, 0x28, 0x79, 0x53, 0x63, 0x61, 0x6c, + 0x65, 0x30, 0x29, 0x2e, 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x28, + 0x27, 0x6c, 0x65, 0x66, 0x74, 0x27, 0x29, 0x3b, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, + 0x57, 0x28, 0x29, 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x2d, 0x20, 0x6d, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x2e, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x2d, + 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2e, 0x72, 0x69, 0x67, + 0x68, 0x74, 0x3b, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x28, 0x29, 0x20, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x20, 0x2d, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, + 0x6e, 0x2e, 0x74, 0x6f, 0x70, 0x20, 0x2d, 0x20, 0x6d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x2e, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3b, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, + 0x65, 0x74, 0x58, 0x54, 0x69, 0x63, 0x6b, 0x73, 0x28, 0x64, 0x61, + 0x74, 0x61, 0x29, 0x20, 0x7b, 0x69, 0x66, 0x20, 0x28, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3c, + 0x20, 0x6e, 0x54, 0x69, 0x63, 0x6b, 0x73, 0x29, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x78, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x2e, + 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x33, 0x2e, 0x72, 0x61, 0x6e, + 0x67, 0x65, 0x28, 0x30, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x20, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x63, 0x65, 0x69, 0x6c, 0x28, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2f, 0x20, 0x6e, + 0x54, 0x69, 0x63, 0x6b, 0x73, 0x29, 0x29, 0x2e, 0x6d, 0x61, 0x70, + 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, + 0x64, 0x29, 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x78, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x64, 0x6f, 0x6d, 0x61, + 0x69, 0x6e, 0x28, 0x29, 0x5b, 0x64, 0x5d, 0x3b, 0x7d, 0x29, 0x3b, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, + 0x65, 0x74, 0x59, 0x54, 0x69, 0x63, 0x6b, 0x73, 0x28, 0x73, 0x63, + 0x61, 0x6c, 0x65, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x64, + 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x63, 0x61, + 0x6c, 0x65, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x33, 0x2e, + 0x72, 0x61, 0x6e, 0x67, 0x65, 0x28, 0x64, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x64, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x63, 0x65, 0x69, 0x6c, 0x28, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, + 0x5b, 0x31, 0x5d, 0x20, 0x2f, 0x20, 0x6e, 0x54, 0x69, 0x63, 0x6b, + 0x73, 0x29, 0x29, 0x3b, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x70, 0x44, 0x61, 0x74, 0x61, 0x28, + 0x64, 0x61, 0x74, 0x61, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x5f, 0x64, 0x61, 0x74, 0x75, 0x6d, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x2c, 0x20, + 0x69, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x64, 0x61, 0x74, + 0x75, 0x6d, 0x20, 0x3d, 0x20, 0x5b, 0x78, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x64, 0x61, 0x74, 0x61, + 0x2c, 0x20, 0x64, 0x2c, 0x20, 0x69, 0x29, 0x2c, 0x20, 0x79, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x30, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, + 0x64, 0x61, 0x74, 0x61, 0x2c, 0x20, 0x64, 0x2c, 0x20, 0x69, 0x29, + 0x5d, 0x3b, 0x64, 0x75, 0x61, 0x6c, 0x59, 0x61, 0x78, 0x69, 0x73, + 0x20, 0x26, 0x26, 0x20, 0x64, 0x61, 0x74, 0x75, 0x6d, 0x2e, 0x70, + 0x75, 0x73, 0x68, 0x28, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x31, + 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2c, + 0x20, 0x64, 0x2c, 0x20, 0x69, 0x29, 0x29, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x64, 0x61, 0x74, 0x75, 0x6d, 0x3b, 0x7d, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x2c, 0x20, 0x69, 0x29, 0x20, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x64, 0x61, + 0x74, 0x75, 0x6d, 0x28, 0x64, 0x2c, 0x20, 0x69, 0x29, 0x3b, 0x7d, + 0x29, 0x3b, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x61, 0x6c, + 0x65, 0x73, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x20, 0x7b, 0x78, + 0x53, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x61, 0x70, 0x28, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, + 0x29, 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, + 0x5b, 0x30, 0x5d, 0x3b, 0x7d, 0x29, 0x29, 0x2e, 0x72, 0x61, 0x6e, + 0x67, 0x65, 0x42, 0x61, 0x6e, 0x64, 0x73, 0x28, 0x5b, 0x30, 0x2c, + 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x57, 0x28, 0x29, 0x5d, 0x2c, + 0x20, 0x30, 0x2e, 0x31, 0x29, 0x3b, 0x79, 0x53, 0x63, 0x61, 0x6c, + 0x65, 0x30, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x5b, + 0x30, 0x2c, 0x20, 0x64, 0x33, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x64, + 0x61, 0x74, 0x61, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x29, 0x20, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x64, 0x5b, 0x31, 0x5d, 0x3b, 0x7d, 0x29, + 0x5d, 0x29, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x28, 0x5b, 0x69, + 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x28, 0x29, 0x2c, 0x20, 0x30, 0x5d, + 0x29, 0x3b, 0x64, 0x75, 0x61, 0x6c, 0x59, 0x61, 0x78, 0x69, 0x73, + 0x20, 0x26, 0x26, 0x20, 0x79, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x31, + 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x5b, 0x30, 0x2c, + 0x20, 0x64, 0x33, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x61, 0x74, + 0x61, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x28, 0x64, 0x29, 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x64, 0x5b, 0x32, 0x5d, 0x3b, 0x7d, 0x29, 0x5d, 0x29, + 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x28, 0x5b, 0x69, 0x6e, 0x6e, + 0x65, 0x72, 0x48, 0x28, 0x29, 0x2c, 0x20, 0x30, 0x5d, 0x29, 0x3b, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, + 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x4f, 0x70, 0x61, 0x63, 0x69, 0x74, + 0x79, 0x28, 0x65, 0x6c, 0x65, 0x2c, 0x20, 0x6f, 0x70, 0x29, 0x20, + 0x7b, 0x64, 0x33, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, + 0x65, 0x6c, 0x65, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x29, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x41, 0x6c, 0x6c, 0x28, 0x27, 0x2e, 0x27, 0x20, 0x2b, 0x20, 0x28, + 0x65, 0x6c, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x27, 0x64, 0x61, 0x74, 0x61, + 0x2d, 0x79, 0x61, 0x78, 0x69, 0x73, 0x27, 0x29, 0x20, 0x3d, 0x3d, + 0x20, 0x27, 0x79, 0x30, 0x27, 0x20, 0x3f, 0x20, 0x27, 0x79, 0x31, + 0x27, 0x20, 0x3a, 0x20, 0x27, 0x79, 0x30, 0x27, 0x29, 0x29, 0x2e, + 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x73, 0x74, 0x79, 0x6c, 0x65, + 0x27, 0x2c, 0x20, 0x6f, 0x70, 0x29, 0x3b, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x74, 0x4c, 0x65, + 0x67, 0x65, 0x6e, 0x64, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x28, + 0x73, 0x76, 0x67, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, + 0x65, 0x63, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x76, 0x67, 0x2e, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x41, 0x6c, 0x6c, 0x28, 0x27, 0x72, + 0x65, 0x63, 0x74, 0x2e, 0x6c, 0x65, 0x67, 0x65, 0x6e, 0x64, 0x2e, + 0x79, 0x30, 0x27, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x28, 0x5b, + 0x6e, 0x75, 0x6c, 0x6c, 0x5d, 0x29, 0x3b, 0x72, 0x65, 0x63, 0x74, + 0x2e, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x28, 0x29, 0x2e, 0x61, 0x70, + 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, 0x72, 0x65, 0x63, 0x74, 0x27, + 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x27, 0x2c, 0x20, 0x27, 0x6c, 0x65, 0x67, 0x65, 0x6e, + 0x64, 0x20, 0x79, 0x30, 0x27, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, + 0x28, 0x27, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x79, 0x61, 0x78, 0x69, + 0x73, 0x27, 0x2c, 0x20, 0x27, 0x79, 0x30, 0x27, 0x29, 0x2e, 0x6f, + 0x6e, 0x28, 0x27, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x28, 0x64, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x7b, 0x20, + 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x4f, 0x70, 0x61, 0x63, 0x69, + 0x74, 0x79, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x20, 0x27, 0x6f, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x30, 0x2e, 0x31, 0x27, + 0x29, 0x3b, 0x20, 0x7d, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x27, 0x6d, + 0x6f, 0x75, 0x73, 0x65, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x27, 0x2c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, + 0x64, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x7b, 0x20, 0x74, 0x6f, 0x67, + 0x67, 0x6c, 0x65, 0x4f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x2c, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x29, + 0x3b, 0x20, 0x7d, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, + 0x79, 0x27, 0x2c, 0x20, 0x28, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x20, 0x2d, 0x20, 0x31, 0x35, 0x29, 0x29, 0x3b, 0x72, 0x65, 0x63, + 0x74, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x78, 0x27, 0x2c, + 0x20, 0x28, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x2f, 0x20, 0x32, + 0x29, 0x20, 0x2d, 0x20, 0x31, 0x30, 0x30, 0x29, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x76, + 0x67, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x41, 0x6c, 0x6c, + 0x28, 0x27, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x6c, 0x65, 0x67, 0x65, + 0x6e, 0x64, 0x2e, 0x79, 0x30, 0x27, 0x29, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x28, 0x5b, 0x6e, 0x75, 0x6c, 0x6c, 0x5d, 0x29, 0x3b, 0x74, + 0x65, 0x78, 0x74, 0x2e, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x28, 0x29, + 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, 0x74, 0x65, + 0x78, 0x74, 0x27, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x27, 0x2c, 0x20, 0x27, 0x6c, 0x65, + 0x67, 0x65, 0x6e, 0x64, 0x20, 0x79, 0x30, 0x27, 0x29, 0x2e, 0x61, + 0x74, 0x74, 0x72, 0x28, 0x27, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x79, + 0x61, 0x78, 0x69, 0x73, 0x27, 0x2c, 0x20, 0x27, 0x79, 0x30, 0x27, + 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x27, 0x6d, 0x6f, 0x75, 0x73, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x2c, 0x20, 0x69, 0x29, + 0x20, 0x7b, 0x20, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x4f, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, + 0x20, 0x27, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x30, + 0x2e, 0x31, 0x27, 0x29, 0x3b, 0x20, 0x7d, 0x29, 0x2e, 0x6f, 0x6e, + 0x28, 0x27, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x6c, 0x65, 0x61, 0x76, + 0x65, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x28, 0x64, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x7b, 0x20, + 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x4f, 0x70, 0x61, 0x63, 0x69, + 0x74, 0x79, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x20, 0x6e, 0x75, + 0x6c, 0x6c, 0x29, 0x3b, 0x20, 0x7d, 0x29, 0x2e, 0x61, 0x74, 0x74, + 0x72, 0x28, 0x27, 0x79, 0x27, 0x2c, 0x20, 0x28, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x20, 0x2d, 0x20, 0x36, 0x29, 0x29, 0x3b, 0x74, + 0x65, 0x78, 0x74, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x78, + 0x27, 0x2c, 0x20, 0x28, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x2f, + 0x20, 0x32, 0x29, 0x20, 0x2d, 0x20, 0x38, 0x35, 0x29, 0x2e, 0x74, + 0x65, 0x78, 0x74, 0x28, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2e, + 0x79, 0x30, 0x29, 0x3b, 0x69, 0x66, 0x20, 0x28, 0x21, 0x64, 0x75, + 0x61, 0x6c, 0x59, 0x61, 0x78, 0x69, 0x73, 0x29, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x3b, 0x72, 0x65, 0x63, 0x74, 0x20, 0x3d, 0x20, + 0x73, 0x76, 0x67, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x41, + 0x6c, 0x6c, 0x28, 0x27, 0x72, 0x65, 0x63, 0x74, 0x2e, 0x6c, 0x65, + 0x67, 0x65, 0x6e, 0x64, 0x2e, 0x79, 0x31, 0x27, 0x29, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x28, 0x5b, 0x6e, 0x75, 0x6c, 0x6c, 0x5d, 0x29, + 0x3b, 0x72, 0x65, 0x63, 0x74, 0x2e, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x28, 0x29, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, + 0x72, 0x65, 0x63, 0x74, 0x27, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, + 0x28, 0x27, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x27, 0x2c, 0x20, 0x27, + 0x6c, 0x65, 0x67, 0x65, 0x6e, 0x64, 0x20, 0x79, 0x31, 0x27, 0x29, + 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x64, 0x61, 0x74, 0x61, + 0x2d, 0x79, 0x61, 0x78, 0x69, 0x73, 0x27, 0x2c, 0x20, 0x27, 0x79, + 0x31, 0x27, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x27, 0x6d, 0x6f, 0x75, + 0x73, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x27, 0x2c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x2c, 0x20, + 0x69, 0x29, 0x20, 0x7b, 0x20, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, + 0x4f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2c, 0x20, 0x27, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x3a, 0x30, 0x2e, 0x31, 0x27, 0x29, 0x3b, 0x20, 0x7d, 0x29, 0x2e, + 0x6f, 0x6e, 0x28, 0x27, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x6c, 0x65, + 0x61, 0x76, 0x65, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x2c, 0x20, 0x69, 0x29, 0x20, + 0x7b, 0x20, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x4f, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x20, + 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x20, 0x7d, 0x29, 0x2e, 0x61, + 0x74, 0x74, 0x72, 0x28, 0x27, 0x79, 0x27, 0x2c, 0x20, 0x28, 0x68, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x2d, 0x20, 0x31, 0x35, 0x29, + 0x29, 0x3b, 0x72, 0x65, 0x63, 0x74, 0x2e, 0x61, 0x74, 0x74, 0x72, + 0x28, 0x27, 0x78, 0x27, 0x2c, 0x20, 0x28, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x20, 0x2f, 0x20, 0x32, 0x29, 0x29, 0x3b, 0x74, 0x65, 0x78, + 0x74, 0x20, 0x3d, 0x20, 0x73, 0x76, 0x67, 0x2e, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x41, 0x6c, 0x6c, 0x28, 0x27, 0x74, 0x65, 0x78, + 0x74, 0x2e, 0x6c, 0x65, 0x67, 0x65, 0x6e, 0x64, 0x2e, 0x79, 0x31, + 0x27, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x28, 0x5b, 0x6e, 0x75, + 0x6c, 0x6c, 0x5d, 0x29, 0x3b, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x28, 0x29, 0x2e, 0x61, 0x70, 0x70, 0x65, + 0x6e, 0x64, 0x28, 0x27, 0x74, 0x65, 0x78, 0x74, 0x27, 0x29, 0x2e, + 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x27, 0x2c, 0x20, 0x27, 0x6c, 0x65, 0x67, 0x65, 0x6e, 0x64, 0x20, + 0x79, 0x31, 0x27, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, + 0x64, 0x61, 0x74, 0x61, 0x2d, 0x79, 0x61, 0x78, 0x69, 0x73, 0x27, + 0x2c, 0x20, 0x27, 0x79, 0x31, 0x27, 0x29, 0x2e, 0x6f, 0x6e, 0x28, + 0x27, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x27, + 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x28, 0x64, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x7b, 0x20, 0x74, 0x6f, + 0x67, 0x67, 0x6c, 0x65, 0x4f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x20, 0x27, 0x6f, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x3a, 0x30, 0x2e, 0x31, 0x27, 0x29, 0x3b, + 0x20, 0x7d, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x27, 0x6d, 0x6f, 0x75, + 0x73, 0x65, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x27, 0x2c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x2c, + 0x20, 0x69, 0x29, 0x20, 0x7b, 0x20, 0x74, 0x6f, 0x67, 0x67, 0x6c, + 0x65, 0x4f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x2c, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x20, + 0x7d, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x79, 0x27, + 0x2c, 0x20, 0x28, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x2d, + 0x20, 0x36, 0x29, 0x29, 0x3b, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x61, + 0x74, 0x74, 0x72, 0x28, 0x27, 0x78, 0x27, 0x2c, 0x20, 0x28, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x20, 0x2f, 0x20, 0x32, 0x29, 0x20, 0x2b, + 0x20, 0x31, 0x35, 0x29, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x28, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2e, 0x79, 0x31, 0x29, 0x3b, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, + 0x74, 0x41, 0x78, 0x69, 0x73, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x28, 0x73, 0x76, 0x67, 0x29, 0x20, 0x7b, 0x73, 0x76, 0x67, 0x2e, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x41, 0x6c, 0x6c, 0x28, 0x27, + 0x74, 0x65, 0x78, 0x74, 0x2e, 0x61, 0x78, 0x69, 0x73, 0x2d, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x2e, 0x79, 0x30, 0x27, 0x29, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x28, 0x5b, 0x6e, 0x75, 0x6c, 0x6c, 0x5d, 0x29, + 0x2e, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x28, 0x29, 0x2e, 0x61, 0x70, + 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, 0x74, 0x65, 0x78, 0x74, 0x27, + 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x27, 0x2c, 0x20, 0x27, 0x61, 0x78, 0x69, 0x73, 0x2d, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x20, 0x79, 0x30, 0x27, 0x29, 0x2e, + 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x79, 0x27, 0x2c, 0x20, 0x31, + 0x30, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x78, 0x27, + 0x2c, 0x20, 0x35, 0x33, 0x29, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x28, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2e, 0x79, 0x30, 0x29, 0x3b, + 0x69, 0x66, 0x20, 0x28, 0x21, 0x64, 0x75, 0x61, 0x6c, 0x59, 0x61, + 0x78, 0x69, 0x73, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x74, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x20, + 0x3d, 0x20, 0x73, 0x76, 0x67, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x41, 0x6c, 0x6c, 0x28, 0x27, 0x74, 0x65, 0x78, 0x74, 0x2e, + 0x61, 0x78, 0x69, 0x73, 0x2d, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2e, + 0x79, 0x31, 0x27, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x28, 0x5b, + 0x6e, 0x75, 0x6c, 0x6c, 0x5d, 0x29, 0x3b, 0x74, 0x45, 0x6e, 0x74, + 0x65, 0x72, 0x2e, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x28, 0x29, 0x2e, + 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, 0x74, 0x65, 0x78, + 0x74, 0x27, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x27, 0x2c, 0x20, 0x27, 0x61, 0x78, 0x69, + 0x73, 0x2d, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x20, 0x79, 0x31, 0x27, + 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x79, 0x27, 0x2c, + 0x20, 0x31, 0x30, 0x29, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x28, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2e, 0x79, 0x31, 0x29, 0x3b, 0x64, + 0x75, 0x61, 0x6c, 0x59, 0x61, 0x78, 0x69, 0x73, 0x20, 0x26, 0x26, + 0x20, 0x74, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x61, 0x74, 0x74, + 0x72, 0x28, 0x27, 0x78, 0x27, 0x2c, 0x20, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x20, 0x2d, 0x20, 0x32, 0x35, 0x29, 0x3b, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x53, 0x6b, 0x65, 0x6c, 0x65, 0x74, 0x6f, 0x6e, 0x28, + 0x73, 0x76, 0x67, 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x67, + 0x45, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x76, 0x67, + 0x2e, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x28, 0x29, 0x2e, 0x61, 0x70, + 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, 0x73, 0x76, 0x67, 0x27, 0x29, + 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, 0x67, 0x27, + 0x29, 0x3b, 0x67, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x61, 0x70, + 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, 0x67, 0x27, 0x29, 0x2e, 0x61, + 0x74, 0x74, 0x72, 0x28, 0x27, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x27, + 0x2c, 0x20, 0x27, 0x78, 0x20, 0x67, 0x72, 0x69, 0x64, 0x27, 0x29, + 0x3b, 0x67, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x70, + 0x65, 0x6e, 0x64, 0x28, 0x27, 0x67, 0x27, 0x29, 0x2e, 0x61, 0x74, + 0x74, 0x72, 0x28, 0x27, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x27, 0x2c, + 0x20, 0x27, 0x79, 0x20, 0x67, 0x72, 0x69, 0x64, 0x27, 0x29, 0x3b, + 0x67, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x70, 0x65, + 0x6e, 0x64, 0x28, 0x27, 0x67, 0x27, 0x29, 0x2e, 0x61, 0x74, 0x74, + 0x72, 0x28, 0x27, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x27, 0x2c, 0x20, + 0x27, 0x78, 0x20, 0x61, 0x78, 0x69, 0x73, 0x27, 0x29, 0x3b, 0x67, + 0x45, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, + 0x64, 0x28, 0x27, 0x67, 0x27, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, + 0x28, 0x27, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x27, 0x2c, 0x20, 0x27, + 0x79, 0x30, 0x20, 0x61, 0x78, 0x69, 0x73, 0x27, 0x29, 0x3b, 0x64, + 0x75, 0x61, 0x6c, 0x59, 0x61, 0x78, 0x69, 0x73, 0x20, 0x26, 0x26, + 0x20, 0x67, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x70, + 0x65, 0x6e, 0x64, 0x28, 0x27, 0x67, 0x27, 0x29, 0x2e, 0x61, 0x74, + 0x74, 0x72, 0x28, 0x27, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x27, 0x2c, + 0x20, 0x27, 0x79, 0x31, 0x20, 0x61, 0x78, 0x69, 0x73, 0x27, 0x29, + 0x3b, 0x67, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x70, + 0x65, 0x6e, 0x64, 0x28, 0x27, 0x67, 0x27, 0x29, 0x2e, 0x61, 0x74, + 0x74, 0x72, 0x28, 0x27, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x27, 0x2c, + 0x20, 0x27, 0x62, 0x61, 0x72, 0x73, 0x20, 0x79, 0x30, 0x27, 0x29, + 0x3b, 0x64, 0x75, 0x61, 0x6c, 0x59, 0x61, 0x78, 0x69, 0x73, 0x20, + 0x26, 0x26, 0x20, 0x67, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x61, + 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, 0x67, 0x27, 0x29, 0x2e, + 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x27, 0x2c, 0x20, 0x27, 0x62, 0x61, 0x72, 0x73, 0x20, 0x79, 0x31, + 0x27, 0x29, 0x3b, 0x67, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x61, + 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, 0x67, 0x27, 0x29, 0x2e, + 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x27, 0x2c, 0x20, 0x27, 0x72, 0x65, 0x63, 0x74, 0x73, 0x27, 0x29, + 0x3b, 0x73, 0x65, 0x74, 0x41, 0x78, 0x69, 0x73, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x28, 0x73, 0x76, 0x67, 0x29, 0x3b, 0x73, 0x65, + 0x74, 0x4c, 0x65, 0x67, 0x65, 0x6e, 0x64, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x28, 0x73, 0x76, 0x67, 0x29, 0x3b, 0x67, 0x45, 0x6e, + 0x74, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, + 0x27, 0x6c, 0x69, 0x6e, 0x65, 0x27, 0x29, 0x2e, 0x61, 0x74, 0x74, + 0x72, 0x28, 0x27, 0x79, 0x32, 0x27, 0x2c, 0x20, 0x69, 0x6e, 0x6e, + 0x65, 0x72, 0x48, 0x28, 0x29, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, + 0x28, 0x27, 0x79, 0x31, 0x27, 0x2c, 0x20, 0x30, 0x29, 0x2e, 0x61, + 0x74, 0x74, 0x72, 0x28, 0x27, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x27, + 0x2c, 0x20, 0x27, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, + 0x72, 0x27, 0x29, 0x3b, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x42, 0x61, 0x72, 0x73, 0x28, + 0x67, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x29, 0x20, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x62, 0x61, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x67, + 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x27, 0x67, 0x2e, + 0x62, 0x61, 0x72, 0x73, 0x2e, 0x79, 0x30, 0x27, 0x29, 0x2e, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x41, 0x6c, 0x6c, 0x28, 0x27, 0x72, + 0x65, 0x63, 0x74, 0x2e, 0x62, 0x61, 0x72, 0x27, 0x29, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x62, + 0x61, 0x72, 0x73, 0x2e, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x28, 0x29, + 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, 0x73, 0x76, + 0x67, 0x3a, 0x72, 0x65, 0x63, 0x74, 0x27, 0x29, 0x2e, 0x61, 0x74, + 0x74, 0x72, 0x28, 0x27, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x27, 0x2c, + 0x20, 0x27, 0x62, 0x61, 0x72, 0x27, 0x29, 0x2e, 0x61, 0x74, 0x74, + 0x72, 0x28, 0x27, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x27, 0x2c, + 0x20, 0x30, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x2c, 0x20, 0x69, 0x29, + 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, + 0x53, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, + 0x42, 0x61, 0x6e, 0x64, 0x28, 0x29, 0x20, 0x2f, 0x20, 0x32, 0x3b, + 0x20, 0x7d, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x78, + 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x28, 0x64, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x7b, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x53, 0x63, 0x61, 0x6c, + 0x65, 0x28, 0x64, 0x5b, 0x30, 0x5d, 0x29, 0x3b, 0x20, 0x7d, 0x29, + 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x79, 0x27, 0x2c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, + 0x2c, 0x20, 0x69, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x28, 0x29, + 0x3b, 0x20, 0x7d, 0x29, 0x3b, 0x62, 0x61, 0x72, 0x73, 0x2e, 0x61, + 0x74, 0x74, 0x72, 0x28, 0x27, 0x77, 0x69, 0x64, 0x74, 0x68, 0x27, + 0x2c, 0x20, 0x78, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x42, 0x61, 0x6e, 0x64, 0x28, 0x29, 0x20, 0x2f, + 0x20, 0x32, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x78, + 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x28, 0x64, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x78, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x28, 0x64, + 0x5b, 0x30, 0x5d, 0x29, 0x3b, 0x20, 0x7d, 0x29, 0x2e, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x2e, + 0x64, 0x65, 0x6c, 0x61, 0x79, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x2c, 0x20, 0x69, 0x29, 0x20, + 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x20, + 0x2f, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x20, 0x2a, 0x20, 0x31, 0x30, 0x30, 0x30, 0x3b, 0x20, + 0x7d, 0x29, 0x2e, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x35, 0x30, 0x30, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, + 0x27, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x27, 0x2c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x2c, + 0x20, 0x69, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x28, 0x29, 0x20, + 0x2d, 0x20, 0x79, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x30, 0x28, 0x64, + 0x5b, 0x31, 0x5d, 0x29, 0x3b, 0x20, 0x7d, 0x29, 0x2e, 0x61, 0x74, + 0x74, 0x72, 0x28, 0x27, 0x79, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x2c, 0x20, 0x69, + 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x79, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x30, 0x28, 0x64, 0x5b, 0x31, + 0x5d, 0x29, 0x3b, 0x20, 0x7d, 0x29, 0x3b, 0x62, 0x61, 0x72, 0x73, + 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, 0x29, 0x2e, 0x72, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x28, 0x29, 0x3b, 0x69, 0x66, 0x20, 0x28, 0x21, + 0x64, 0x75, 0x61, 0x6c, 0x59, 0x61, 0x78, 0x69, 0x73, 0x29, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x62, 0x61, 0x72, 0x73, 0x20, + 0x3d, 0x20, 0x67, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, + 0x27, 0x67, 0x2e, 0x62, 0x61, 0x72, 0x73, 0x2e, 0x79, 0x31, 0x27, + 0x29, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x41, 0x6c, 0x6c, + 0x28, 0x27, 0x72, 0x65, 0x63, 0x74, 0x2e, 0x62, 0x61, 0x72, 0x27, + 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x28, 0x64, 0x61, 0x74, 0x61, + 0x29, 0x3b, 0x62, 0x61, 0x72, 0x73, 0x2e, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x28, 0x29, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, + 0x27, 0x73, 0x76, 0x67, 0x3a, 0x72, 0x65, 0x63, 0x74, 0x27, 0x29, + 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x27, 0x2c, 0x20, 0x27, 0x62, 0x61, 0x72, 0x27, 0x29, 0x2e, + 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x27, 0x2c, 0x20, 0x30, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, + 0x28, 0x27, 0x77, 0x69, 0x64, 0x74, 0x68, 0x27, 0x2c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x2c, + 0x20, 0x69, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x78, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x42, 0x61, 0x6e, 0x64, 0x28, 0x29, 0x20, 0x2f, + 0x20, 0x32, 0x3b, 0x20, 0x7d, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, + 0x28, 0x27, 0x78, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x29, 0x20, 0x7b, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x78, 0x53, 0x63, 0x61, + 0x6c, 0x65, 0x28, 0x64, 0x5b, 0x30, 0x5d, 0x29, 0x20, 0x2b, 0x20, + 0x78, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x72, 0x61, 0x6e, 0x67, + 0x65, 0x42, 0x61, 0x6e, 0x64, 0x28, 0x29, 0x20, 0x2f, 0x20, 0x32, + 0x29, 0x3b, 0x20, 0x7d, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, + 0x27, 0x79, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x7b, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x6e, 0x6e, + 0x65, 0x72, 0x48, 0x28, 0x29, 0x3b, 0x20, 0x7d, 0x29, 0x3b, 0x62, + 0x61, 0x72, 0x73, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x27, 0x2c, 0x20, 0x78, 0x53, 0x63, 0x61, + 0x6c, 0x65, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x61, 0x6e, + 0x64, 0x28, 0x29, 0x20, 0x2f, 0x20, 0x32, 0x29, 0x2e, 0x61, 0x74, + 0x74, 0x72, 0x28, 0x27, 0x78, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x29, 0x20, 0x7b, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x78, 0x53, + 0x63, 0x61, 0x6c, 0x65, 0x28, 0x64, 0x5b, 0x30, 0x5d, 0x29, 0x20, + 0x2b, 0x20, 0x78, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x42, 0x61, 0x6e, 0x64, 0x28, 0x29, 0x20, 0x2f, + 0x20, 0x32, 0x29, 0x3b, 0x20, 0x7d, 0x29, 0x2e, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x2e, 0x64, + 0x65, 0x6c, 0x61, 0x79, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x7b, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x20, 0x2f, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x20, 0x2a, 0x20, 0x31, 0x30, 0x30, 0x30, 0x3b, 0x20, 0x7d, + 0x29, 0x2e, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x35, 0x30, 0x30, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x27, 0x2c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x2c, 0x20, + 0x69, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x28, 0x29, 0x20, 0x2d, + 0x20, 0x79, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x31, 0x28, 0x64, 0x5b, + 0x32, 0x5d, 0x29, 0x3b, 0x20, 0x7d, 0x29, 0x2e, 0x61, 0x74, 0x74, + 0x72, 0x28, 0x27, 0x79, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x2c, 0x20, 0x69, 0x29, + 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x79, + 0x53, 0x63, 0x61, 0x6c, 0x65, 0x31, 0x28, 0x64, 0x5b, 0x32, 0x5d, + 0x29, 0x3b, 0x20, 0x7d, 0x29, 0x3b, 0x62, 0x61, 0x72, 0x73, 0x2e, + 0x65, 0x78, 0x69, 0x74, 0x28, 0x29, 0x2e, 0x72, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x28, 0x29, 0x3b, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x41, 0x78, 0x69, 0x73, + 0x28, 0x67, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x29, 0x20, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x78, 0x54, 0x69, 0x63, 0x6b, 0x73, 0x20, + 0x3d, 0x20, 0x67, 0x65, 0x74, 0x58, 0x54, 0x69, 0x63, 0x6b, 0x73, + 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x74, 0x69, 0x63, 0x6b, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x20, 0x3d, 0x20, 0x78, 0x54, 0x69, 0x63, 0x6b, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3e, 0x20, 0x31, 0x20, + 0x3f, 0x20, 0x28, 0x78, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x28, 0x78, + 0x54, 0x69, 0x63, 0x6b, 0x73, 0x5b, 0x31, 0x5d, 0x29, 0x20, 0x2d, + 0x20, 0x78, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x28, 0x78, 0x54, 0x69, + 0x63, 0x6b, 0x73, 0x5b, 0x30, 0x5d, 0x29, 0x29, 0x20, 0x3a, 0x20, + 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x57, 0x28, 0x29, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x57, 0x20, 0x3d, 0x20, + 0x74, 0x69, 0x63, 0x6b, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x20, 0x2d, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, + 0x3b, 0x67, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x27, + 0x2e, 0x78, 0x2e, 0x61, 0x78, 0x69, 0x73, 0x27, 0x29, 0x2e, 0x61, + 0x74, 0x74, 0x72, 0x28, 0x27, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x6f, 0x72, 0x6d, 0x27, 0x2c, 0x20, 0x27, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x6c, 0x61, 0x74, 0x65, 0x28, 0x30, 0x2c, 0x27, 0x20, 0x2b, + 0x20, 0x79, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x30, 0x2e, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x28, 0x29, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, + 0x27, 0x29, 0x27, 0x29, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x78, + 0x41, 0x78, 0x69, 0x73, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x28, 0x78, 0x54, 0x69, 0x63, 0x6b, 0x73, + 0x29, 0x29, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x41, 0x6c, + 0x6c, 0x28, 0x22, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x20, 0x74, 0x65, + 0x78, 0x74, 0x22, 0x29, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, + 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x57, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x3f, 0x20, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x57, 0x20, 0x3a, 0x20, 0x69, 0x6e, + 0x6e, 0x65, 0x72, 0x57, 0x28, 0x29, 0x29, 0x3b, 0x67, 0x2e, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x27, 0x2e, 0x79, 0x30, 0x2e, + 0x61, 0x78, 0x69, 0x73, 0x27, 0x29, 0x2e, 0x63, 0x61, 0x6c, 0x6c, + 0x28, 0x79, 0x41, 0x78, 0x69, 0x73, 0x30, 0x2e, 0x74, 0x69, 0x63, + 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x67, 0x65, 0x74, + 0x59, 0x54, 0x69, 0x63, 0x6b, 0x73, 0x28, 0x79, 0x53, 0x63, 0x61, + 0x6c, 0x65, 0x30, 0x29, 0x29, 0x29, 0x3b, 0x69, 0x66, 0x20, 0x28, + 0x21, 0x64, 0x75, 0x61, 0x6c, 0x59, 0x61, 0x78, 0x69, 0x73, 0x29, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x67, 0x2e, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x28, 0x27, 0x2e, 0x79, 0x31, 0x2e, 0x61, + 0x78, 0x69, 0x73, 0x27, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, + 0x27, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x27, + 0x2c, 0x20, 0x27, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, + 0x65, 0x28, 0x27, 0x20, 0x2b, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, + 0x57, 0x28, 0x29, 0x20, 0x2b, 0x20, 0x27, 0x2c, 0x20, 0x30, 0x29, + 0x27, 0x29, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x79, 0x41, 0x78, + 0x69, 0x73, 0x31, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x28, 0x67, 0x65, 0x74, 0x59, 0x54, 0x69, 0x63, + 0x6b, 0x73, 0x28, 0x79, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x31, 0x29, + 0x29, 0x29, 0x3b, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x61, 0x64, 0x64, 0x47, 0x72, 0x69, 0x64, 0x28, 0x67, + 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x29, 0x20, 0x7b, 0x67, 0x2e, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x27, 0x2e, 0x78, 0x2e, + 0x67, 0x72, 0x69, 0x64, 0x27, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, + 0x28, 0x27, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x27, 0x2c, 0x20, 0x27, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, + 0x74, 0x65, 0x28, 0x30, 0x2c, 0x27, 0x20, 0x2b, 0x20, 0x79, 0x53, + 0x63, 0x61, 0x6c, 0x65, 0x30, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, + 0x28, 0x29, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x27, 0x29, 0x27, + 0x29, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x78, 0x47, 0x72, 0x69, + 0x64, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x28, 0x67, 0x65, 0x74, 0x58, 0x54, 0x69, 0x63, 0x6b, 0x73, + 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x29, 0x2e, 0x74, 0x69, 0x63, + 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x28, 0x2d, 0x69, 0x6e, 0x6e, 0x65, + 0x72, 0x48, 0x28, 0x29, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x29, + 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x28, 0x27, 0x27, 0x29, 0x29, 0x3b, 0x67, 0x2e, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x28, 0x27, 0x2e, 0x79, 0x2e, 0x67, 0x72, 0x69, + 0x64, 0x27, 0x29, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x79, 0x47, + 0x72, 0x69, 0x64, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x28, 0x67, 0x65, 0x74, 0x59, 0x54, 0x69, 0x63, + 0x6b, 0x73, 0x28, 0x79, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x30, 0x29, + 0x29, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x28, + 0x2d, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x57, 0x28, 0x29, 0x2c, 0x20, + 0x30, 0x2c, 0x20, 0x30, 0x29, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x46, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x27, 0x27, 0x29, 0x29, 0x3b, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x54, 0x6f, 0x6f, 0x6c, 0x74, 0x69, + 0x70, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2c, 0x20, 0x69, 0x29, 0x20, + 0x7b, 0x76, 0x61, 0x72, 0x20, 0x64, 0x20, 0x3d, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x30, 0x29, + 0x3b, 0x64, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x78, 0x29, 0x20, 0x3f, 0x20, 0x47, + 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x55, 0x74, 0x69, + 0x6c, 0x2e, 0x66, 0x6d, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, + 0x64, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x2e, 0x78, 0x29, 0x20, 0x3a, 0x20, 0x64, 0x5b, 0x30, 0x5d, + 0x3b, 0x64, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x79, 0x30, 0x29, 0x20, 0x3f, 0x20, + 0x47, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x55, 0x74, + 0x69, 0x6c, 0x2e, 0x66, 0x6d, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x28, 0x64, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x2e, 0x79, 0x30, 0x29, 0x20, 0x3a, 0x20, 0x64, 0x33, + 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x27, 0x2c, 0x27, + 0x29, 0x28, 0x64, 0x5b, 0x31, 0x5d, 0x29, 0x3b, 0x64, 0x75, 0x61, + 0x6c, 0x59, 0x61, 0x78, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x28, + 0x64, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x2e, 0x79, 0x31, 0x29, 0x20, 0x3f, 0x20, 0x47, + 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x55, 0x74, 0x69, + 0x6c, 0x2e, 0x66, 0x6d, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, + 0x64, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x2e, 0x79, 0x31, 0x29, 0x20, 0x3a, 0x20, 0x64, 0x33, 0x2e, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x27, 0x2c, 0x27, 0x29, + 0x28, 0x64, 0x5b, 0x32, 0x5d, 0x29, 0x29, 0x3b, 0x76, 0x61, 0x72, + 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3d, + 0x20, 0x64, 0x33, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, + 0x27, 0x23, 0x74, 0x70, 0x6c, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x74, + 0x2d, 0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x27, 0x29, 0x2e, + 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x48, 0x6f, 0x67, 0x61, 0x6e, 0x2e, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x29, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, + 0x28, 0x7b, 0x27, 0x64, 0x61, 0x74, 0x61, 0x27, 0x3a, 0x20, 0x64, + 0x7d, 0x29, 0x3b, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x6f, 0x76, 0x65, 0x72, + 0x28, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x2c, 0x20, 0x69, 0x64, 0x78, 0x29, 0x20, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x3d, 0x20, 0x78, 0x53, + 0x63, 0x61, 0x6c, 0x65, 0x28, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x30, + 0x5d, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x78, 0x53, 0x63, 0x61, 0x6c, + 0x65, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x61, 0x6e, 0x64, + 0x28, 0x29, 0x20, 0x2f, 0x20, 0x32, 0x29, 0x3b, 0x76, 0x61, 0x72, + 0x20, 0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x20, 0x3d, 0x20, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x27, 0x2e, 0x63, 0x68, 0x61, + 0x72, 0x74, 0x2d, 0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x2d, + 0x77, 0x72, 0x61, 0x70, 0x27, 0x29, 0x3b, 0x74, 0x6f, 0x6f, 0x6c, + 0x74, 0x69, 0x70, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x54, 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, + 0x28, 0x64, 0x61, 0x74, 0x61, 0x2c, 0x20, 0x69, 0x64, 0x78, 0x29, + 0x29, 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x28, 0x27, 0x6c, 0x65, + 0x66, 0x74, 0x27, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x2b, + 0x20, 0x27, 0x70, 0x78, 0x27, 0x29, 0x2e, 0x73, 0x74, 0x79, 0x6c, + 0x65, 0x28, 0x27, 0x74, 0x6f, 0x70, 0x27, 0x2c, 0x20, 0x20, 0x28, + 0x64, 0x33, 0x2e, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x28, 0x5f, 0x73, + 0x65, 0x6c, 0x66, 0x29, 0x5b, 0x31, 0x5d, 0x20, 0x2b, 0x20, 0x31, + 0x30, 0x29, 0x20, 0x2b, 0x20, 0x27, 0x70, 0x78, 0x27, 0x29, 0x2e, + 0x73, 0x74, 0x79, 0x6c, 0x65, 0x28, 0x27, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x27, 0x2c, 0x20, 0x27, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x27, 0x29, 0x3b, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x27, + 0x6c, 0x69, 0x6e, 0x65, 0x2e, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, + 0x74, 0x6f, 0x72, 0x27, 0x29, 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, + 0x28, 0x27, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x27, 0x2c, + 0x20, 0x27, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x27, 0x29, 0x2e, 0x61, + 0x74, 0x74, 0x72, 0x28, 0x27, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x6f, 0x72, 0x6d, 0x27, 0x2c, 0x20, 0x27, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x6c, 0x61, 0x74, 0x65, 0x28, 0x27, 0x20, 0x2b, 0x20, 0x6c, + 0x65, 0x66, 0x74, 0x20, 0x2b, 0x20, 0x27, 0x2c, 0x27, 0x20, 0x2b, + 0x20, 0x30, 0x20, 0x2b, 0x20, 0x27, 0x29, 0x27, 0x29, 0x3b, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, + 0x75, 0x73, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x67, 0x29, 0x20, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, + 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x27, 0x2e, + 0x63, 0x68, 0x61, 0x72, 0x74, 0x2d, 0x74, 0x6f, 0x6f, 0x6c, 0x74, + 0x69, 0x70, 0x2d, 0x77, 0x72, 0x61, 0x70, 0x27, 0x29, 0x3b, 0x74, + 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x2e, 0x73, 0x74, 0x79, 0x6c, + 0x65, 0x28, 0x27, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x27, + 0x2c, 0x20, 0x27, 0x6e, 0x6f, 0x6e, 0x65, 0x27, 0x29, 0x3b, 0x67, + 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x27, 0x6c, 0x69, + 0x6e, 0x65, 0x2e, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, + 0x72, 0x27, 0x29, 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x28, 0x27, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x27, 0x2c, 0x20, 0x27, + 0x6e, 0x6f, 0x6e, 0x65, 0x27, 0x29, 0x3b, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x52, 0x65, + 0x63, 0x74, 0x73, 0x28, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x2c, 0x20, 0x67, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x29, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x77, 0x20, 0x3d, 0x20, + 0x28, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x57, 0x28, 0x29, 0x20, 0x2f, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x65, 0x63, 0x74, + 0x73, 0x20, 0x3d, 0x20, 0x67, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x28, 0x27, 0x67, 0x2e, 0x72, 0x65, 0x63, 0x74, 0x73, 0x27, + 0x29, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x41, 0x6c, 0x6c, + 0x28, 0x27, 0x72, 0x65, 0x63, 0x74, 0x27, 0x29, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x72, 0x65, + 0x63, 0x74, 0x73, 0x2e, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x28, 0x29, + 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, 0x73, 0x76, + 0x67, 0x3a, 0x72, 0x65, 0x63, 0x74, 0x27, 0x29, 0x2e, 0x61, 0x74, + 0x74, 0x72, 0x28, 0x27, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x27, + 0x2c, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x28, 0x29, 0x29, + 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x27, 0x2c, 0x20, 0x27, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x27, + 0x29, 0x3b, 0x72, 0x65, 0x63, 0x74, 0x73, 0x2e, 0x61, 0x74, 0x74, + 0x72, 0x28, 0x27, 0x77, 0x69, 0x64, 0x74, 0x68, 0x27, 0x2c, 0x20, + 0x64, 0x33, 0x2e, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x6f, 0x72, 0x28, + 0x77, 0x29, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x27, 0x78, + 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x28, 0x64, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x7b, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x77, 0x20, 0x2a, 0x20, + 0x69, 0x29, 0x3b, 0x20, 0x7d, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, + 0x28, 0x27, 0x79, 0x27, 0x2c, 0x20, 0x30, 0x29, 0x2e, 0x6f, 0x6e, + 0x28, 0x27, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x28, 0x64, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x7b, 0x6d, 0x6f, + 0x75, 0x73, 0x65, 0x6f, 0x76, 0x65, 0x72, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2c, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x2c, 0x20, 0x64, 0x2c, 0x20, 0x69, 0x29, 0x3b, 0x7d, 0x29, + 0x2e, 0x6f, 0x6e, 0x28, 0x27, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x6c, + 0x65, 0x61, 0x76, 0x65, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x2c, 0x20, 0x69, 0x29, + 0x20, 0x7b, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x6f, 0x75, 0x74, 0x28, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, + 0x67, 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x72, 0x65, 0x63, 0x74, 0x73, + 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, 0x29, 0x2e, 0x72, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x28, 0x29, 0x3b, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x68, 0x61, 0x72, 0x74, 0x28, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x20, + 0x7b, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x65, 0x61, 0x63, 0x68, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x20, 0x7b, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x70, 0x44, + 0x61, 0x74, 0x61, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x73, + 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x73, 0x76, 0x67, 0x20, 0x3d, 0x20, 0x64, 0x33, 0x2e, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x2e, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x41, 0x6c, 0x6c, 0x28, 0x27, + 0x73, 0x76, 0x67, 0x27, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x28, + 0x5b, 0x64, 0x61, 0x74, 0x61, 0x5d, 0x29, 0x3b, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x53, 0x6b, 0x65, 0x6c, 0x65, 0x74, 0x6f, 0x6e, + 0x28, 0x73, 0x76, 0x67, 0x29, 0x3b, 0x73, 0x76, 0x67, 0x2e, 0x61, + 0x74, 0x74, 0x72, 0x28, 0x7b, 0x27, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x27, 0x3a, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x27, 0x68, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x27, 0x3a, 0x20, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x67, + 0x20, 0x3d, 0x20, 0x73, 0x76, 0x67, 0x2e, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x28, 0x27, 0x67, 0x27, 0x29, 0x2e, 0x61, 0x74, 0x74, + 0x72, 0x28, 0x27, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, + 0x6d, 0x27, 0x2c, 0x20, 0x27, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, + 0x61, 0x74, 0x65, 0x28, 0x27, 0x20, 0x2b, 0x20, 0x6d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x2e, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x2b, 0x20, + 0x27, 0x2c, 0x27, 0x20, 0x2b, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, + 0x6e, 0x2e, 0x74, 0x6f, 0x70, 0x20, 0x2b, 0x20, 0x27, 0x29, 0x27, + 0x29, 0x3b, 0x61, 0x64, 0x64, 0x47, 0x72, 0x69, 0x64, 0x28, 0x67, + 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x61, 0x64, 0x64, + 0x41, 0x78, 0x69, 0x73, 0x28, 0x67, 0x2c, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x29, 0x3b, 0x61, 0x64, 0x64, 0x42, 0x61, 0x72, 0x73, 0x28, + 0x67, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x61, 0x64, + 0x64, 0x52, 0x65, 0x63, 0x74, 0x73, 0x28, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x67, 0x2c, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x7d, 0x63, 0x68, + 0x61, 0x72, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x5f, + 0x29, 0x20, 0x7b, 0x69, 0x66, 0x20, 0x28, 0x21, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6f, 0x70, 0x74, 0x73, 0x3b, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, + 0x20, 0x5f, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, + 0x68, 0x61, 0x72, 0x74, 0x3b, 0x7d, 0x3b, 0x63, 0x68, 0x61, 0x72, + 0x74, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x5f, + 0x29, 0x20, 0x7b, 0x69, 0x66, 0x20, 0x28, 0x21, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3b, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x63, 0x68, 0x61, 0x72, 0x74, 0x3b, 0x7d, 0x3b, + 0x63, 0x68, 0x61, 0x72, 0x74, 0x2e, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x28, 0x5f, 0x29, 0x20, 0x7b, 0x69, 0x66, 0x20, 0x28, + 0x21, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x3b, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x61, 0x72, + 0x74, 0x3b, 0x7d, 0x3b, 0x63, 0x68, 0x61, 0x72, 0x74, 0x2e, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x5f, 0x29, 0x20, 0x7b, 0x69, + 0x66, 0x20, 0x28, 0x21, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x3b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x5f, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x61, + 0x72, 0x74, 0x3b, 0x7d, 0x3b, 0x63, 0x68, 0x61, 0x72, 0x74, 0x2e, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x5f, 0x29, 0x20, + 0x7b, 0x69, 0x66, 0x20, 0x28, 0x21, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x3b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x20, 0x3d, 0x20, 0x5f, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x63, 0x68, 0x61, 0x72, 0x74, 0x3b, 0x7d, 0x3b, 0x63, 0x68, + 0x61, 0x72, 0x74, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x5f, 0x29, 0x20, 0x7b, + 0x69, 0x66, 0x20, 0x28, 0x21, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x3b, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, + 0x3d, 0x20, 0x5f, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x63, 0x68, 0x61, 0x72, 0x74, 0x3b, 0x7d, 0x3b, 0x63, 0x68, 0x61, + 0x72, 0x74, 0x2e, 0x79, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x5f, 0x29, 0x20, 0x7b, + 0x69, 0x66, 0x20, 0x28, 0x21, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x79, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x30, 0x3b, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x63, 0x68, 0x61, 0x72, 0x74, 0x3b, 0x7d, 0x3b, 0x63, + 0x68, 0x61, 0x72, 0x74, 0x2e, 0x79, 0x31, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x5f, 0x29, + 0x20, 0x7b, 0x69, 0x66, 0x20, 0x28, 0x21, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x79, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x31, 0x3b, 0x79, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x61, 0x72, 0x74, 0x3b, 0x7d, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x61, + 0x72, 0x74, 0x3b, 0x7d, 0x00 +}; + +const int charts_js_length = 20421; diff --git a/goaccess++/src/color.c b/goaccess++/src/color.c new file mode 100644 index 0000000..dbc7ff6 --- /dev/null +++ b/goaccess++/src/color.c @@ -0,0 +1,840 @@ +/** + * color.c -- functions related to custom color + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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. + */ + +#if HAVE_CONFIG_H +#include <config.h> +#endif + +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <strings.h> + +#include "color.h" + +#include "error.h" +#include "gslist.h" +#include "util.h" +#include "xmalloc.h" + +static GSLList *color_list = NULL; +static GSLList *pair_list = NULL; + +/* *INDENT-OFF* */ +static GEnum CSTM_COLORS[] = { + {"COLOR_MTRC_HITS" , COLOR_MTRC_HITS}, + {"COLOR_MTRC_VISITORS" , COLOR_MTRC_VISITORS}, + {"COLOR_MTRC_HITS_PERC" , COLOR_MTRC_HITS_PERC}, + {"COLOR_MTRC_VISITORS_PERC" , COLOR_MTRC_VISITORS_PERC}, + {"COLOR_MTRC_BW" , COLOR_MTRC_BW}, + {"COLOR_MTRC_AVGTS" , COLOR_MTRC_AVGTS}, + {"COLOR_MTRC_CUMTS" , COLOR_MTRC_CUMTS}, + {"COLOR_MTRC_MAXTS" , COLOR_MTRC_MAXTS}, + {"COLOR_MTRC_PROT" , COLOR_MTRC_PROT}, + {"COLOR_MTRC_MTHD" , COLOR_MTRC_MTHD}, + {"COLOR_MTRC_DATA" , COLOR_MTRC_DATA}, + {"COLOR_MTRC_HITS_PERC_MAX" , COLOR_MTRC_HITS_PERC_MAX}, + {"COLOR_MTRC_VISITORS_PERC_MAX" , COLOR_MTRC_VISITORS_PERC_MAX}, + {"COLOR_PANEL_COLS" , COLOR_PANEL_COLS}, + {"COLOR_BARS" , COLOR_BARS}, + {"COLOR_ERROR" , COLOR_ERROR}, + {"COLOR_SELECTED" , COLOR_SELECTED}, + {"COLOR_PANEL_ACTIVE" , COLOR_PANEL_ACTIVE}, + {"COLOR_PANEL_HEADER" , COLOR_PANEL_HEADER}, + {"COLOR_PANEL_DESC" , COLOR_PANEL_DESC}, + {"COLOR_OVERALL_LBLS" , COLOR_OVERALL_LBLS}, + {"COLOR_OVERALL_VALS" , COLOR_OVERALL_VALS}, + {"COLOR_OVERALL_PATH" , COLOR_OVERALL_PATH}, + {"COLOR_ACTIVE_LABEL" , COLOR_ACTIVE_LABEL}, + {"COLOR_BG" , COLOR_BG}, + {"COLOR_DEFAULT" , COLOR_DEFAULT}, + {"COLOR_PROGRESS" , COLOR_PROGRESS}, +}; + +static const char *colors256_mono[] = { + "COLOR_MTRC_HITS color7:color-1", + "COLOR_MTRC_VISITORS color8:color-1", + "COLOR_MTRC_DATA color7:color-1", + "COLOR_MTRC_BW color8:color-1", + "COLOR_MTRC_AVGTS color8:color-1", + "COLOR_MTRC_CUMTS color8:color-1", + "COLOR_MTRC_MAXTS color8:color-1", + "COLOR_MTRC_PROT color8:color-1", + "COLOR_MTRC_MTHD color7:color-1", + "COLOR_MTRC_HITS_PERC color0:color-1 bold", + "COLOR_MTRC_HITS_PERC color1:color-1 bold VISITORS", + "COLOR_MTRC_HITS_PERC color1:color-1 bold OS", + "COLOR_MTRC_HITS_PERC color1:color-1 bold BROWSERS", + "COLOR_MTRC_HITS_PERC color1:color-1 bold VISIT_TIMES", + "COLOR_MTRC_HITS_PERC_MAX color0:color-1 bold", + "COLOR_MTRC_HITS_PERC_MAX color3:color-1 bold VISITORS", + "COLOR_MTRC_HITS_PERC_MAX color3:color-1 bold OS", + "COLOR_MTRC_HITS_PERC_MAX color3:color-1 bold BROWSERS", + "COLOR_MTRC_HITS_PERC_MAX color3:color-1 bold VISIT_TIMES", + "COLOR_MTRC_VISITORS_PERC color0:color-1 bold", + "COLOR_MTRC_VISITORS_PERC_MAX color0:color-1 bold", + "COLOR_PANEL_COLS color7:color-1", + "COLOR_BARS color7:color-1", + "COLOR_ERROR color7:color1", + "COLOR_SELECTED color7:color8", + "COLOR_PANEL_ACTIVE color0:color3", + "COLOR_PANEL_HEADER color0:color7", + "COLOR_PANEL_DESC color7:color-1", + "COLOR_OVERALL_LBLS color7:color-1 bold", + "COLOR_OVERALL_VALS color6:color-1 bold", + "COLOR_OVERALL_PATH color3:color-1", + "COLOR_ACTIVE_LABEL color4:color7", + "COLOR_BG color7:color-1", + "COLOR_DEFAULT color7:color-1", + "COLOR_PROGRESS color0:color6", +}; + +static const char *colors256_green[] = { + "COLOR_MTRC_HITS color7:color-1", + "COLOR_MTRC_VISITORS color8:color-1", + "COLOR_MTRC_DATA color7:color-1", + "COLOR_MTRC_BW color8:color-1", + "COLOR_MTRC_AVGTS color8:color-1", + "COLOR_MTRC_CUMTS color8:color-1", + "COLOR_MTRC_MAXTS color8:color-1", + "COLOR_MTRC_PROT color8:color-1", + "COLOR_MTRC_MTHD color7:color-1", + "COLOR_MTRC_HITS_PERC color0:color-1 bold", + "COLOR_MTRC_HITS_PERC color1:color-1 bold VISITORS", + "COLOR_MTRC_HITS_PERC color1:color-1 bold OS", + "COLOR_MTRC_HITS_PERC color1:color-1 bold BROWSERS", + "COLOR_MTRC_HITS_PERC color1:color-1 bold VISIT_TIMES", + "COLOR_MTRC_HITS_PERC_MAX color0:color-1 bold", + "COLOR_MTRC_HITS_PERC_MAX color3:color-1 bold VISITORS", + "COLOR_MTRC_HITS_PERC_MAX color3:color-1 bold OS", + "COLOR_MTRC_HITS_PERC_MAX color3:color-1 bold BROWSERS", + "COLOR_MTRC_HITS_PERC_MAX color3:color-1 bold VISIT_TIMES", + "COLOR_MTRC_VISITORS_PERC color0:color-1 bold", + "COLOR_MTRC_VISITORS_PERC_MAX color0:color-1 bold", + "COLOR_PANEL_COLS color7:color-1", + "COLOR_BARS color7:color-1", + "COLOR_ERROR color7:color1", + "COLOR_SELECTED color7:color8", + "COLOR_PANEL_ACTIVE color0:color3", + "COLOR_PANEL_HEADER color0:color35", + "COLOR_PANEL_DESC color7:color-1", + "COLOR_OVERALL_LBLS color7:color-1 bold", + "COLOR_OVERALL_VALS color6:color-1 bold", + "COLOR_OVERALL_PATH color3:color-1", + "COLOR_ACTIVE_LABEL color7:color35", + "COLOR_BG color7:color-1", + "COLOR_DEFAULT color7:color-1", + "COLOR_PROGRESS color0:color6", +}; + +static const char *colors256_monokai[] = { + "COLOR_MTRC_HITS color197:color-1", + "COLOR_MTRC_VISITORS color148:color-1", + "COLOR_MTRC_DATA color7:color-1", + "COLOR_MTRC_BW color81:color-1", + "COLOR_MTRC_AVGTS color247:color-1", + "COLOR_MTRC_CUMTS color95:color-1", + "COLOR_MTRC_MAXTS color186:color-1", + "COLOR_MTRC_PROT color141:color-1", + "COLOR_MTRC_MTHD color81:color-1", + "COLOR_MTRC_HITS_PERC color186:color-1", + "COLOR_MTRC_HITS_PERC color186:color-1 VISITORS", + "COLOR_MTRC_HITS_PERC color186:color-1 OS", + "COLOR_MTRC_HITS_PERC color186:color-1 BROWSERS", + "COLOR_MTRC_HITS_PERC color186:color-1 VISIT_TIMES", + "COLOR_MTRC_HITS_PERC_MAX color208:color-1", + "COLOR_MTRC_HITS_PERC_MAX color208:color-1 VISITORS", + "COLOR_MTRC_HITS_PERC_MAX color208:color-1 OS", + "COLOR_MTRC_HITS_PERC_MAX color208:color-1 BROWSERS", + "COLOR_MTRC_HITS_PERC_MAX color208:color-1 VISIT_TIMES", + "COLOR_MTRC_VISITORS_PERC color187:color-1", + "COLOR_MTRC_VISITORS_PERC_MAX color208:color-1", + "COLOR_PANEL_COLS color242:color-1", + "COLOR_BARS color186:color-1", + "COLOR_ERROR color231:color197", + "COLOR_SELECTED color0:color215", + "COLOR_PANEL_ACTIVE color7:color240", + "COLOR_PANEL_HEADER color7:color237", + "COLOR_PANEL_DESC color242:color-1", + "COLOR_OVERALL_LBLS color251:color-1", + "COLOR_OVERALL_VALS color148:color-1", + "COLOR_OVERALL_PATH color186:color-1", + "COLOR_ACTIVE_LABEL color7:color237", + "COLOR_BG color7:color-1", + "COLOR_DEFAULT color7:color-1", + "COLOR_PROGRESS color7:color141", +}; + +static const char *colors8_mono[] = { + "COLOR_MTRC_HITS color7:color-1", + "COLOR_MTRC_VISITORS color0:color-1 bold", + "COLOR_MTRC_DATA color7:color-1", + "COLOR_MTRC_BW color0:color-1 bold", + "COLOR_MTRC_AVGTS color0:color-1 bold", + "COLOR_MTRC_CUMTS color0:color-1 bold", + "COLOR_MTRC_MAXTS color0:color-1 bold", + "COLOR_MTRC_PROT color0:color-1 bold", + "COLOR_MTRC_MTHD color7:color-1 ", + "COLOR_MTRC_HITS_PERC color0:color-1 bold", + "COLOR_MTRC_HITS_PERC color1:color-1 bold VISITORS", + "COLOR_MTRC_HITS_PERC color1:color-1 bold OS", + "COLOR_MTRC_HITS_PERC color1:color-1 bold BROWSERS", + "COLOR_MTRC_HITS_PERC color1:color-1 bold VISIT_TIMES", + "COLOR_MTRC_HITS_PERC_MAX color0:color-1 bold", + "COLOR_MTRC_HITS_PERC_MAX color3:color-1 bold VISITORS", + "COLOR_MTRC_HITS_PERC_MAX color3:color-1 bold OS", + "COLOR_MTRC_HITS_PERC_MAX color3:color-1 bold BROWSERS", + "COLOR_MTRC_HITS_PERC_MAX color3:color-1 bold VISIT_TIMES", + "COLOR_MTRC_VISITORS_PERC color0:color-1 bold", + "COLOR_MTRC_VISITORS_PERC_MAX color0:color-1 bold", + "COLOR_PANEL_COLS color7:color-1", + "COLOR_BARS color7:color-1", + "COLOR_ERROR color7:color1", + "COLOR_SELECTED color0:color7", + "COLOR_PANEL_ACTIVE color0:color3", + "COLOR_PANEL_HEADER color0:color7", + "COLOR_PANEL_DESC color7:color-1", + "COLOR_OVERALL_LBLS color7:color-1 bold", + "COLOR_OVERALL_VALS color6:color-1", + "COLOR_OVERALL_PATH color3:color-1", + "COLOR_ACTIVE_LABEL color4:color7", + "COLOR_BG color7:color-1", + "COLOR_DEFAULT color7:color-1", + "COLOR_PROGRESS color0:color6", +}; + +static const char *colors8_green[] = { + "COLOR_MTRC_HITS color7:color-1", + "COLOR_MTRC_VISITORS color0:color-1 bold", + "COLOR_MTRC_DATA color7:color-1", + "COLOR_MTRC_BW color0:color-1 bold", + "COLOR_MTRC_AVGTS color0:color-1 bold", + "COLOR_MTRC_CUMTS color0:color-1 bold", + "COLOR_MTRC_MAXTS color0:color-1 bold", + "COLOR_MTRC_PROT color0:color-1 bold", + "COLOR_MTRC_MTHD color7:color-1 ", + "COLOR_MTRC_HITS_PERC color0:color-1 bold", + "COLOR_MTRC_HITS_PERC color1:color-1 bold VISITORS", + "COLOR_MTRC_HITS_PERC color1:color-1 bold OS", + "COLOR_MTRC_HITS_PERC color1:color-1 bold BROWSERS", + "COLOR_MTRC_HITS_PERC color1:color-1 bold VISIT_TIMES", + "COLOR_MTRC_HITS_PERC_MAX color0:color-1 bold", + "COLOR_MTRC_HITS_PERC_MAX color3:color-1 bold VISITORS", + "COLOR_MTRC_HITS_PERC_MAX color3:color-1 bold OS", + "COLOR_MTRC_HITS_PERC_MAX color3:color-1 bold BROWSERS", + "COLOR_MTRC_HITS_PERC_MAX color3:color-1 bold VISIT_TIMES", + "COLOR_MTRC_VISITORS_PERC color0:color-1 bold", + "COLOR_MTRC_VISITORS_PERC_MAX color0:color-1 bold", + "COLOR_PANEL_COLS color7:color-1", + "COLOR_BARS color2:color-1", + "COLOR_ERROR color7:color1", + "COLOR_SELECTED color0:color7", + "COLOR_PANEL_ACTIVE color0:color3", + "COLOR_PANEL_HEADER color0:color2", + "COLOR_PANEL_DESC color7:color-1", + "COLOR_OVERALL_LBLS color7:color-1 bold", + "COLOR_OVERALL_VALS color6:color-1", + "COLOR_OVERALL_PATH color3:color-1", + "COLOR_ACTIVE_LABEL color0:color2", + "COLOR_BG color7:color-1", + "COLOR_DEFAULT color7:color-1", + "COLOR_PROGRESS color0:color6", +}; + +static const char *nocolors[] = { + "COLOR_MTRC_HITS color0:color-1", + "COLOR_MTRC_VISITORS color0:color-1", + "COLOR_MTRC_DATA color0:color-1", + "COLOR_MTRC_BW color0:color-1", + "COLOR_MTRC_AVGTS color0:color-1", + "COLOR_MTRC_CUMTS color0:color-1", + "COLOR_MTRC_MAXTS color0:color-1", + "COLOR_MTRC_PROT color0:color-1", + "COLOR_MTRC_MTHD color0:color-1", + "COLOR_MTRC_HITS_PERC color0:color-1", + "COLOR_MTRC_HITS_PERC_MAX color0:color-1", + "COLOR_MTRC_VISITORS_PERC color0:color-1", + "COLOR_MTRC_VISITORS_PERC_MAX color0:color-1", + "COLOR_PANEL_COLS color0:color-1", + "COLOR_BARS color0:color-1", + "COLOR_ERROR color0:color-1", + "COLOR_SELECTED color0:color-1 reverse", + "COLOR_PANEL_ACTIVE color0:color-1 reverse", + "COLOR_PANEL_HEADER color0:color-1 reverse", + "COLOR_PANEL_DESC color0:color-1", + "COLOR_OVERALL_LBLS color0:color-1", + "COLOR_OVERALL_VALS color0:color-1", + "COLOR_OVERALL_PATH color0:color-1", + "COLOR_ACTIVE_LABEL color0:color-1 reverse", + "COLOR_BG color0:color-1", + "COLOR_DEFAULT color0:color-1", + "COLOR_PROGRESS color0:color-1 reverse", +}; + +/* *INDENT-ON* */ + +/* Allocate memory for color elements */ +static GColors * +new_gcolors (void) +{ + GColors *color = xcalloc (1, sizeof (GColors)); + color->module = -1; + + return color; +} + +/* Allocate memory for a color element properties */ +static GColorPair * +new_gcolorpair (void) +{ + GColorPair *pair = xcalloc (1, sizeof (GColorPair)); + /* Must be between 2 and COLOR_PAIRS-1. + * Starts at 2 since COLOR_NORMAL has already been set */ + pair->idx = 2; + + return pair; +} + +/* Free malloc'd memory for color elements */ +void +free_color_lists (void) +{ + if (pair_list) + list_remove_nodes (pair_list); + if (color_list) + list_remove_nodes (color_list); + color_list = NULL; + pair_list = NULL; +} + +/* Set a default color - COLOR_NORMAL, this will be used if + * no colors are supported by the terminal */ +void +set_normal_color (void) +{ + GColorPair *pair = new_gcolorpair (); + GColors *color = new_gcolors (); + + pair->idx = 1; + pair->fg = COLOR_WHITE; + pair->bg = -1; + + color->pair = pair; + color->item = COLOR_NORMAL; + + pair_list = list_create (pair); + color_list = list_create (color); + + init_pair (pair->idx, pair->fg, pair->bg); +} + +/* Get color properties for COLOR_OVERALL_LBLS */ +GColors * +color_overall_lbls (void) +{ + return get_color (COLOR_OVERALL_LBLS); +} + +/* Get color properties for COLOR_OVERALL_VALS */ +GColors * +color_overall_vals (void) +{ + return get_color (COLOR_OVERALL_VALS); +} + +/* Get color properties for COLOR_OVERALL_PATH */ +GColors * +color_overall_path (void) +{ + return get_color (COLOR_OVERALL_PATH); +} + +/* Get color properties for COLOR_PANEL_HEADER */ +GColors * +color_panel_header (void) +{ + return get_color (COLOR_PANEL_HEADER); +} + +/* Get color properties for COLOR_PANEL_DESC */ +GColors * +color_panel_desc (void) +{ + return get_color (COLOR_PANEL_DESC); +} + +/* Get color properties for COLOR_PANEL_ACTIVE*/ +GColors * +color_panel_active (void) +{ + return get_color (COLOR_PANEL_ACTIVE); +} + +/* Get color properties for COLOR_SELECTED */ +GColors * +color_selected (void) +{ + return get_color (COLOR_SELECTED); +} + +/* Get color properties for COLOR_PROGRESS */ +GColors * +color_progress (void) +{ + return get_color (COLOR_PROGRESS); +} + +/* Get color properties for COLOR_DEFAULT */ +GColors * +color_default (void) +{ + return get_color (COLOR_DEFAULT); +} + +/* Get color properties for COLOR_ERROR */ +GColors * +color_error (void) +{ + return get_color (COLOR_ERROR); +} + +/* Get the enumerated color given its equivalent color string. + * + * On error, -1 is returned. + * On success, the enumerated color is returned. */ +static int +get_color_item_enum (const char *str) +{ + return str2enum (CSTM_COLORS, ARRAY_SIZE (CSTM_COLORS), str); +} + +/* Extract color number from the given config string. + * + * On error, -2 is returned. If color is greater than max colors, it aborts. + * On success, the color number is returned. */ +static int +extract_color (char *color) +{ + char *sEnd; + int col = 0; + + if (strncasecmp (color, "color", 5) != 0) + return -2; + + color += 5; + col = strtol (color, &sEnd, 10); + if (color == sEnd || *sEnd != '\0' || errno == ERANGE) + return -2; + /* ensure used color is supported by the terminal */ + if (col > COLORS) + FATAL ("Terminal doesn't support color: %d - max colors: %d", col, COLORS); + + return col; +} + +/* Assign the background and foreground color number from the given + * config string to GColorPair. + * + * On error, 1 is returned. + * On success, 0 is returned. */ +static int +parse_bg_fg_color (GColorPair * pair, const char *value) +{ + char bgcolor[COLOR_STR_LEN] = "", fgcolor[COLOR_STR_LEN] = ""; + int ret = 0; + + if (sscanf (value, "%8[^:]:%8[^ ]", fgcolor, bgcolor) != 2) + return 1; + + if ((pair->bg = extract_color (bgcolor)) == -2) + ret = 1; + + if ((pair->fg = extract_color (fgcolor)) == -2) + ret = 1; + + return ret; +} + +/* Assign color attributes from the given config string to GColors. */ +static void +locate_attr_color (GColors * color, const char *attr) +{ + if (strstr (attr, "bold")) + color->attr |= A_BOLD; + if (strstr (attr, "underline")) + color->attr |= A_UNDERLINE; + if (strstr (attr, "normal")) + color->attr |= A_NORMAL; + if (strstr (attr, "reverse")) + color->attr |= A_REVERSE; + if (strstr (attr, "standout")) + color->attr |= A_REVERSE; + if (strstr (attr, "blink")) + color->attr |= A_BLINK; +} + +/* Parse color attributes from the given config string. + * + * On error, 1 is returned. + * On success, 0 is returned. */ +static int +parse_attr_color (GColors * color, const char *value) +{ + char *line, *ptr, *start; + int ret = 0; + + line = xstrdup (value); + + start = strchr (line, ' '); + if ((!start) || (!*(start + 1))) { + LOG_DEBUG (("attempted to parse color attr: %s\n", value)); + goto clean; + } + + start++; + while (1) { + if ((ptr = strpbrk (start, ", ")) != NULL) + *ptr = 0; + locate_attr_color (color, start); + if (ptr == NULL) + break; + start = ptr + 1; + } + +clean: + free (line); + + return ret; +} + +/* Parse color module from the given config string. + * + * On error, 1 is returned. + * On success, 0 is returned. */ +static int +parse_module_color (GColors * color, const char *value) +{ + char *line = xstrdup (value), *p; + + p = strrchr (line, ' '); + if (!p || !*(p + 1)) { + LOG_DEBUG (("attempted to parse color module: %s\n", value)); + goto clean; + } + + if ((color->module = get_module_enum (p + 1)) == -1) + LOG_DEBUG (("attempted to parse color module: %s\n", value)); + +clean: + free (line); + + return 0; +} + +/* Find a color by item and module attributes on the list of already + * parsed colors. + * + * If color exists, 1 is returned. + * If color does not exist, 1 is returned. */ +static int +find_color_in_list (void *data, void *color) +{ + GColors *new_color = color; + GColors *old_color = data; + + if (old_color->item != new_color->item) + return 0; + if (old_color->module != new_color->module) + return 0; + return 1; +} + +/* Find a color by foreground and background attributes on the list of + * already parsed colors. + * + * If color exists, 1 is returned. + * If color does not exist, 1 is returned. */ +static int +find_pair_in_list (void *data, void *color) +{ + GColorPair *new_color = color; + GColorPair *old_color = data; + + if (old_color->fg != new_color->fg) + return 0; + if (old_color->bg != new_color->bg) + return 0; + return 1; +} + +/* Compare a color item (GColorItem) that has no module with the given needle + * item. + * + * If the items match and with no module, 1 is returned. + * If condition is not satisfied, 0 is returned. */ +static int +find_color_item_in_list (void *data, void *needle) +{ + GColors *color = data; + GColorItem *item = needle; + + return color->item == (GColorItem) (*(int *) item) && color->module == -1; +} + +/* Compare a color item (GColorItem) and module with the given needle item. + * + * If the items match and with no module, 1 is returned. + * If condition is not satisfied, 0 is returned. */ +static int +find_color_item_module_in_list (void *data, void *needle) +{ + GColors *color = data; + GColors *item = needle; + + return color->item == item->item && color->module == item->module; +} + +/* Get color item properties given an item (enumerated). + * + * On error, it aborts. + * On success, the color item properties are returned, or NULL if no match + * found. */ +GColors * +get_color (GColorItem item) +{ + GColorItem normal = COLOR_NORMAL; + GSLList *match = NULL; + + if ((match = list_find (color_list, find_color_item_in_list, &item))) + return (GColors *) match->data; + + if ((match = list_find (color_list, find_color_item_in_list, &normal))) + return (GColors *) match->data; + + /* should not get here */ + FATAL ("Unable to find color item %d", item); +} + +/* Get color item properties given an item (enumerated) and its module. + * + * On error, it aborts. + * On success, the color item properties are returned, or NULL if no match + * found. */ +GColors * +get_color_by_item_module (GColorItem item, GModule module) +{ + GColors *needle = new_gcolors (), *color = NULL; + GSLList *match = NULL; + + needle->module = module; + needle->item = item; + + /* find color for specific item/module pair */ + if ((match = list_find (color_list, find_color_item_module_in_list, needle))) + color = match->data; + + /* attempt to find color by item (fallback) */ + if (!color) + color = get_color (item); + free (needle); + + return color; +} + +/* Parse a color definition line from the config file. + * + * On error, it aborts. + * On success, the color properties are assigned */ +static void +parse_color_line (GColorPair * pair, GColors * color, char *line) +{ + char *val; + int item = 0; + size_t idx; + + /* key */ + idx = strcspn (line, " \t"); + if (strlen (line) == idx) + FATAL ("Malformed color key at line: %s", line); + + line[idx] = '\0'; + if ((item = get_color_item_enum (line)) == -1) + FATAL ("Unable to find color key: %s", line); + + /* value */ + val = line + (idx + 1); + idx = strspn (val, " \t"); + if (strlen (val) == idx) + FATAL ("Malformed color value at line: %s", line); + val = val + idx; + + /* get background/foreground color */ + if (parse_bg_fg_color (pair, val) == 1) + FATAL ("Invalid bg/fg color pairs at: %s %s", line, val); + + if (parse_attr_color (color, val) == 1) + FATAL ("Invalid color attrs at: %s %s", line, val); + + if (parse_module_color (color, val) == 1) + FATAL ("Invalid color module at: %s %s", line, val); + + color->item = item; +} + +/* Attempt to prepend the given color on our color linked list. + * + * On error, or if color already exists, the given color is freed. + * On success, or if not color found, store color properties */ +static void +prepend_color (GColors ** color) +{ + GSLList *match = NULL; + + /* create a list of colors if one does not exist */ + if (color_list == NULL) { + color_list = list_create (*color); + } + /* attempt to find the given color data type (by item and attributes) in + * our color list */ + else if ((match = list_find (color_list, find_color_in_list, *color))) { + /* if found, free the recently malloc'd color data type and use + * existing color */ + free (*color); + *color = NULL; + } else { + /* not a dup, so insert the new color in our color list */ + color_list = list_insert_prepend (color_list, *color); + } +} + +/* Parse a color definition line from the config file and store it on a signle + * linked-list. + * + * On error, it aborts. + * On success, the color properties are stored */ +static void +parse_color (char *line) +{ + GSLList *match = NULL; + GColors *color = NULL; + GColorPair *pair = NULL; + + color = new_gcolors (); + pair = new_gcolorpair (); + + /* extract a color pair and color attributes from the given config line */ + parse_color_line (pair, color, line); + + /* create a pair color list if one doesn't exist */ + if (pair_list == NULL) { + pair_list = list_create (pair); + } + /* attempt to find the given color pair in our pair list */ + else if ((match = list_find (pair_list, find_pair_in_list, pair))) { + /* pair found, use new pair and free existing one */ + free (pair); + pair = (GColorPair *) match->data; + } + /* pair not found, use it then */ + else { + pair->idx += list_count (pair_list); + pair_list = list_insert_prepend (pair_list, pair); + } + /* set color pair */ + color->pair = pair; + prepend_color (&color); + + /* if no color pair was found, then we init the color pair */ + if (!match && color) + init_pair (color->pair->idx, color->pair->fg, color->pair->bg); + + free (line); +} + +/* Iterate over all color definitions in the config file. + * + * On error, it aborts. + * On success, the color properties are parsed and stored */ +static void +parse_colors (const char *colors[], size_t n) +{ + char *line; + size_t i; + + for (i = 0; i < n; ++i) { + line = strdup (colors[i]); + /* did not find a valid format */ + if (strchr (line, ':') == NULL) { + free (line); + continue; + } + parse_color (line); + } +} + +/* Use default color definitions if necessary. */ +static void +add_default_colors (void) +{ + /* no colors */ + if (COLORS < 8) + parse_colors (nocolors, ARRAY_SIZE (nocolors)); + + /* 256 colors, and no color scheme set or set to monokai */ + if (COLORS == 256 && (!conf.color_scheme || conf.color_scheme == MONOKAI)) + parse_colors (colors256_monokai, ARRAY_SIZE (colors256_monokai)); + /* otherwise use 16 colors scheme */ + else if (COLORS > 16) { + if (conf.color_scheme == STD_GREEN) + parse_colors (colors256_green, ARRAY_SIZE (colors256_green)); + else + parse_colors (colors256_mono, ARRAY_SIZE (colors256_mono)); + } + + /* 8 colors */ + if (COLORS >= 8 && COLORS <= 16) { + if (conf.color_scheme == STD_GREEN) + parse_colors (colors8_green, ARRAY_SIZE (colors8_green)); + else + parse_colors (colors8_mono, ARRAY_SIZE (colors8_mono)); + } +} + +/* Entry point to parse color definitions or use default colors */ +void +set_colors (int force) +{ + errno = 0; + if (conf.color_idx > 0 && !force) + parse_colors (conf.colors, conf.color_idx); + else + add_default_colors (); +} diff --git a/goaccess++/src/color.h b/goaccess++/src/color.h new file mode 100644 index 0000000..5f54354 --- /dev/null +++ b/goaccess++/src/color.h @@ -0,0 +1,113 @@ +/** + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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 COLOR_H_INCLUDED +#define COLOR_H_INCLUDED + +#define COLOR_STR_LEN 9 + +/* Color Items/Fields */ +typedef enum CSTM_COLORS +{ + COLOR_NORMAL, + COLOR_MTRC_HITS, + COLOR_MTRC_VISITORS, + COLOR_MTRC_DATA, + COLOR_MTRC_BW, + COLOR_MTRC_AVGTS, + COLOR_MTRC_CUMTS, + COLOR_MTRC_MAXTS, + COLOR_MTRC_PROT, + COLOR_MTRC_MTHD, + COLOR_MTRC_HITS_PERC, + COLOR_MTRC_HITS_PERC_MAX, + COLOR_MTRC_VISITORS_PERC, + COLOR_MTRC_VISITORS_PERC_MAX, + COLOR_PANEL_COLS, + COLOR_BARS, + COLOR_ERROR, + COLOR_SELECTED, + COLOR_PANEL_ACTIVE, + COLOR_PANEL_HEADER, + COLOR_PANEL_DESC, + COLOR_OVERALL_LBLS, + COLOR_OVERALL_VALS, + COLOR_OVERALL_PATH, + COLOR_ACTIVE_LABEL, + COLOR_BG, + COLOR_DEFAULT, + COLOR_PROGRESS, +} GColorItem; + +/* Default Color Schemes */ +typedef enum SCHEMES +{ + NO_COLOR, + MONOCHROME, + STD_GREEN, + MONOKAI, +} GShemes; + +#include "commons.h" + +/* Each color properties */ +typedef struct GColorPair_ +{ + short idx; /* color pair index identifier */ + short fg; /* foreground color */ + short bg; /* background color */ +} GColorPair; + +/* Color */ +typedef struct GColors_ +{ + GColorItem item; /* screen item */ + GColorPair *pair; /* color pair */ + int attr; /* color attributes, e.g., bold */ + short module; /* panel */ +} GColors; + +GColors *color_default (void); +GColors *color_error (void); +GColors *color_overall_lbls (void); +GColors *color_overall_path (void); +GColors *color_overall_vals (void); +GColors *color_panel_active (void); +GColors *color_panel_desc (void); +GColors *color_panel_header (void); +GColors *color_progress (void); +GColors *color_selected (void); +GColors *get_color_by_item_module (GColorItem item, GModule module); +GColors *get_color (GColorItem item); +GColors *get_color_normal (void); +void free_color_lists (void); +void set_colors (int force); +void set_normal_color (void); + +#endif // for #ifndef COLOR_H diff --git a/goaccess++/src/color.o b/goaccess++/src/color.o new file mode 100644 index 0000000000000000000000000000000000000000..a37de4a533be0b8a5a3e3a8a6a5e8acfbf4faee7 GIT binary patch literal 31096 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 W?RPPxWy;?Yw=;cJ<i%5+|9=2&p3~d_ literal 0 HcmV?d00001 diff --git a/goaccess++/src/commons.c b/goaccess++/src/commons.c new file mode 100644 index 0000000..cc7d45d --- /dev/null +++ b/goaccess++/src/commons.c @@ -0,0 +1,504 @@ +/** + * commons.c -- holds different data types + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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. + */ + +#if HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <time.h> +#include <unistd.h> + +#include "commons.h" + +#include "error.h" +#include "labels.h" +#include "settings.h" +#include "util.h" +#include "xmalloc.h" + +/* processing time */ +time_t end_proc; +time_t timestamp; +time_t start_proc; + +/* list of available modules/panels */ +int module_list[TOTAL_MODULES] = {[0 ... TOTAL_MODULES - 1] = -1 }; + +/* Get number of items per panel to parse. + * + * The number of items per panel is returned. */ +int +get_max_choices (void) +{ + char *csv = NULL, *json = NULL, *html = NULL; + int max = MAX_CHOICES; + + /* no max choices, return defaults */ + if (conf.max_items <= 0) + return conf.real_time_html ? MAX_CHOICES_RT : MAX_CHOICES; + + /* TERM */ + if (!conf.output_stdout) + return conf.max_items > MAX_CHOICES ? MAX_CHOICES : conf.max_items; + + /* REAL-TIME STDOUT */ + /* real time HTML, display max rt choices */ + if (conf.real_time_html) + return conf.max_items > MAX_CHOICES_RT ? MAX_CHOICES_RT : conf.max_items; + + /* STDOUT */ + /* CSV - allow n amount of choices */ + if (find_output_type (&csv, "csv", 1) == 0) + max = conf.max_items; + /* JSON - allow n amount of choices */ + if (find_output_type (&json, "json", 1) == 0 && conf.max_items > 0) + max = conf.max_items; + /* HTML - takes priority on cases where multiple outputs were given. Note that + * we check either for an .html extension or we assume not extension was passed + * via -o and therefore we are redirecting the output to a file. */ + if (find_output_type (&html, "html", 1) == 0 || conf.output_format_idx == 0) + max = conf.max_items > MAX_CHOICES ? MAX_CHOICES : conf.max_items; + + free (csv); + free (html); + free (json); + + return max; +} + +/* Calculate a percentage. + * + * The percentage is returned. */ +float +get_percentage (unsigned long long total, unsigned long long hit) +{ + return (total == 0 ? 0 : (((float) hit) / total) * 100); +} + +/* Display the storage being used. */ +void +display_storage (void) +{ +#ifdef TCB_BTREE + fprintf (stdout, "%s\n", BUILT_WITH_TCBTREE); +#elif TCB_MEMHASH + fprintf (stdout, "%s\n", BUILT_WITH_TCMEMHASH); +#else + fprintf (stdout, "%s\n", BUILT_WITH_DEFHASH); +#endif +} + +/* Display the path of the default configuration file when `-p` is not used */ +void +display_default_config_file (void) +{ + char *path = get_config_file_path (); + + if (!path) { + fprintf (stdout, "%s\n", ERR_NODEF_CONF_FILE); + fprintf (stdout, "%s `-p /path/goaccess.conf`\n", ERR_NODEF_CONF_FILE_DESC); + } else { + fprintf (stdout, "%s\n", path); + free (path); + } +} + +/* Display the current version. */ +void +display_version (void) +{ + fprintf (stdout, "GoAccess - %s.\n", GO_VERSION); + fprintf (stdout, "%s: http://goaccess.io\n", INFO_MORE_INFO); + fprintf (stdout, "Copyright (C) 2009-2016 by Gerardo Orellana\n"); + fprintf (stdout, "\nBuild configure arguments:\n"); +#ifdef DEBUG + fprintf (stdout, " --enable-debug\n"); +#endif +#ifdef HAVE_NCURSESW_NCURSES_H + fprintf (stdout, " --enable-utf8\n"); +#endif +#ifdef HAVE_LIBGEOIP + fprintf (stdout, " --enable-geoip=legacy\n"); +#endif +#ifdef HAVE_LIBMAXMINDDB + fprintf (stdout, " --enable-geoip=mmdb\n"); +#endif +#ifdef TCB_MEMHASH + fprintf (stdout, " --enable-tcb=memhash\n"); +#endif +#ifdef TCB_BTREE + fprintf (stdout, " --enable-tcb=btree\n"); +#endif +#if defined(TCB_MEMHASH) || defined(TCB_BTREE) +#ifndef HAVE_ZLIB + fprintf (stdout, " --disable-zlib\n"); +#endif +#ifndef HAVE_BZ2 + fprintf (stdout, " --disable-bzip\n"); +#endif +#endif +#ifdef WITH_GETLINE + fprintf (stdout, " --with-getline\n"); +#endif +#ifdef HAVE_LIBSSL + fprintf (stdout, " --with-openssl\n"); +#endif +} + +/* Get the enumerated value given a string. + * + * On error, -1 is returned. + * On success, the enumerated module value is returned. */ +int +str2enum (const GEnum map[], int len, const char *str) +{ + int i; + + for (i = 0; i < len; ++i) { + if (!strcmp (str, map[i].str)) + return map[i].idx; + } + + return -1; +} + +/* Get the enumerated module value given a module string. + * + * On error, -1 is returned. + * On success, the enumerated module value is returned. */ +int +get_module_enum (const char *str) +{ + /* *INDENT-OFF* */ + /* String modules to enumerated modules */ + GEnum enum_modules[] = { + {"VISITORS" , VISITORS} , + {"REQUESTS" , REQUESTS} , + {"REQUESTS_STATIC" , REQUESTS_STATIC} , + {"NOT_FOUND" , NOT_FOUND} , + {"HOSTS" , HOSTS} , + {"OS" , OS} , + {"BROWSERS" , BROWSERS} , + {"VISIT_TIMES" , VISIT_TIMES} , + {"VIRTUAL_HOSTS" , VIRTUAL_HOSTS} , + {"REFERRERS" , REFERRERS} , + {"REFERRING_SITES" , REFERRING_SITES} , + {"KEYPHRASES" , KEYPHRASES} , + {"STATUS_CODES" , STATUS_CODES} , + {"REMOTE_USER" , REMOTE_USER} , +#ifdef HAVE_GEOLOCATION + {"GEO_LOCATION" , GEO_LOCATION} , +#endif + }; + /* *INDENT-ON* */ + + return str2enum (enum_modules, ARRAY_SIZE (enum_modules), str); +} + +/* Instantiate a new GAgents structure. + * + * On success, the newly malloc'd structure is returned. */ +GAgents * +new_gagents (void) +{ + GAgents *agents = xmalloc (sizeof (GAgents)); + memset (agents, 0, sizeof *agents); + + return agents; +} + +/* Instantiate a new GAgentItem structure. + * + * On success, the newly malloc'd structure is returned. */ +GAgentItem * +new_gagent_item (uint32_t size) +{ + GAgentItem *item = xcalloc (size, sizeof (GAgentItem)); + + return item; +} + +/* Clean the array of agents. */ +void +free_agents_array (GAgents * agents) +{ + int i; + + if (agents == NULL) + return; + + /* clean stuff up */ + for (i = 0; i < agents->size; ++i) + free (agents->items[i].agent); + if (agents->items) + free (agents->items); + free (agents); +} + +/* Determine if the given date format is a timestamp. + * + * On error, 0 is returned. + * On success, 1 is returned. */ +int +has_timestamp (const char *fmt) +{ + if (strcmp ("%s", fmt) == 0 || strcmp ("%f", fmt) == 0) + return 1; + return 0; +} + +/* Determine if the given module is set to be enabled. + * + * If enabled, 1 is returned, else 0 is returned. */ +int +enable_panel (GModule mod) +{ + int i, module; + + for (i = 0; i < conf.enable_panel_idx; ++i) { + if ((module = get_module_enum (conf.enable_panels[i])) == -1) + continue; + if (mod == (unsigned int) module) { + return 1; + } + } + + return 0; +} + +/* Determine if the given module is set to be ignored. + * + * If ignored, 1 is returned, else 0 is returned. */ +int +ignore_panel (GModule mod) +{ + int i, module; + + for (i = 0; i < conf.ignore_panel_idx; ++i) { + if ((module = get_module_enum (conf.ignore_panels[i])) == -1) + continue; + if (mod == (unsigned int) module) { + return 1; + } + } + + return 0; +} + +/* Get the number of available modules/panels. + * + * The number of modules available is returned. */ +uint32_t +get_num_modules (void) +{ + size_t idx = 0; + uint32_t num = 0; + + FOREACH_MODULE (idx, module_list) { + num++; + } + + return num; +} + +/* Get the index from the module_list given a module. + * + * If the module is not within the array, -1 is returned. + * If the module is within the array, the index is returned. */ +int +get_module_index (int module) +{ + size_t idx = 0; + + FOREACH_MODULE (idx, module_list) { + if (module_list[idx] == module) + return idx; + } + + return -1; +} + +/* Remove the given module from the module_list array. + * + * If the module is not within the array, 1 is returned. + * If the module is within the array, it is removed from the array and + * 0 is returned. */ +int +remove_module (GModule module) +{ + int idx = get_module_index (module); + if (idx == -1) + return 1; + + if (idx < TOTAL_MODULES - 1) + memmove (&module_list[idx], &module_list[idx + 1], + ((TOTAL_MODULES - 1) - idx) * sizeof (module_list[0])); + module_list[TOTAL_MODULES - 1] = -1; + + return 0; +} + +/* Find the next module given the current module. + * + * The next available module in the array is returned. */ +int +get_next_module (GModule module) +{ + int next = get_module_index (module) + 1; + + if (next == TOTAL_MODULES || module_list[next] == -1) + return module_list[0]; + + return module_list[next]; +} + +/* Find the previous module given the current module. + * + * The previous available module in the array is returned. */ +int +get_prev_module (GModule module) +{ + int i; + int next = get_module_index (module) - 1; + + if (next >= 0 && module_list[next] != -1) + return module_list[next]; + + for (i = TOTAL_MODULES - 1; i >= 0; i--) { + if (module_list[i] != -1) { + return module_list[i]; + } + } + + return 0; +} + +/* Perform some additional tasks to panels before they are being + * parsed. + * + * Note: This overwrites --enable-panel since it assumes there's + * truly nothing to do with the panel */ +void +verify_panels (void) +{ + int ignore_panel_idx = conf.ignore_panel_idx; + + /* Remove virtual host panel if no '%v' within log format */ + if (!conf.log_format) + return; + + if (!strstr (conf.log_format, "%v") && ignore_panel_idx < TOTAL_MODULES) { + if (str_inarray ("VIRTUAL_HOSTS", conf.ignore_panels, ignore_panel_idx) < 0) + remove_module (VIRTUAL_HOSTS); + } + if (!strstr (conf.log_format, "%e") && ignore_panel_idx < TOTAL_MODULES) { + if (str_inarray ("REMOTE_USER", conf.ignore_panels, ignore_panel_idx) < 0) + remove_module (REMOTE_USER); + } +} + +/* Build an array of available modules (ignores listed panels). + * + * If there are no modules enabled, 0 is returned. + * On success, the first enabled module is returned. */ +int +init_modules (void) +{ + GModule module; + int i; + + /* init - terminating with -1 */ + for (module = 0; module < TOTAL_MODULES; ++module) + module_list[module] = -1; + + for (i = 0, module = 0; module < TOTAL_MODULES; ++module) { + if (!ignore_panel (module) || enable_panel (module)) { + module_list[i++] = module; + } + } + + return module_list[0] > -1 ? module_list[0] : 0; +} + +/* Get the logs size. + * + * If log was piped (from stdin), 0 is returned. + * On success, it adds up all log sizes and its value is returned. + * if --log-size was specified, it will be returned explicitly */ +intmax_t +get_log_sizes (void) +{ + int i; + off_t size = 0; + + /* --log-size */ + if (conf.log_size > 0) + return (intmax_t) conf.log_size; + + for (i = 0; i < conf.filenames_idx; ++i) { + if (conf.filenames[i][0] == '-' && conf.filenames[i][1] == '\0') + size += 0; + else + size += file_size (conf.filenames[i]); + } + + return (intmax_t) size; +} + +/* Get the log sources used. + * + * On success, a newly malloc'd string containing the log source either + * from filename(s) and/or STDIN is returned. */ +char * +get_log_source_str (int max_len) +{ + char *str = xstrdup (""); + int i, len = 0; + + for (i = 0; i < conf.filenames_idx; ++i) { + if (conf.filenames[i][0] == '-' && conf.filenames[i][1] == '\0') + append_str (&str, "STDIN"); + else + append_str (&str, conf.filenames[i]); + if (i != conf.filenames_idx - 1) + append_str (&str, "; "); + } + + len = strlen (str); + if (max_len > 0 && len > 0 && len > max_len) { + str[max_len - 3] = 0; + append_str (&str, "..."); + } + + return str; +} diff --git a/goaccess++/src/commons.h b/goaccess++/src/commons.h new file mode 100644 index 0000000..9b01dc3 --- /dev/null +++ b/goaccess++/src/commons.h @@ -0,0 +1,272 @@ +/** + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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. + */ + +#if HAVE_CONFIG_H +#include <config.h> +#endif + +#ifndef COMMONS_H_INCLUDED +#define COMMONS_H_INCLUDED + +#include <time.h> +#include <stdint.h> + +/* Remove the __attribute__ stuff when the compiler is not GCC. */ +#if !__GNUC__ +#define __attribute__(x) /**/ +#endif +#define GO_UNUSED __attribute__((unused)) +#define GO_VERSION "1.3" +#define GO_WEBSITE "http://goaccess.io/" +struct tm *now_tm; + +/* common char array buffer size */ +#define INIT_BUF_SIZE 1024 + +/* total number of modules */ +#ifdef HAVE_GEOLOCATION +#define TOTAL_MODULES 15 +#else +#define TOTAL_MODULES 14 +#endif + +/* maximum number of items within a panel */ +#define MAX_CHOICES 366 +/* real-time */ +#define MAX_CHOICES_RT 50 + +/* date and time length - e.g., 2016/12/12 12:12:12 -0600 */ +#define DATE_TIME 25 + 1 +/* date length - e.g., 2016/12/12 */ +#define DATE_LEN 10 + 1 +/* date length - e.g., 12:12:12 */ +#define TIME_LEN 8 + 1 +/* hour + ':' + min length - e.g., 12:12 */ +#define HRMI_LEN 4 + 1 + 1 + +#define YR_FMT "%Y" +#define MO_FMT "%M" +#define DT_FMT "%d" + +/* maximum protocol string length */ +#define REQ_PROTO_LEN 9 + +#define IGNORE_LEVEL_PANEL 1 +#define IGNORE_LEVEL_REQ 2 + +/* Type of IP */ +typedef enum +{ + TYPE_IPINV, + TYPE_IPV4, + TYPE_IPV6 +} GTypeIP; + +/* Type of Modules */ +typedef enum MODULES +{ + VISITORS, + REQUESTS, + REQUESTS_STATIC, + NOT_FOUND, + HOSTS, + OS, + BROWSERS, + VISIT_TIMES, + VIRTUAL_HOSTS, + REFERRERS, + REFERRING_SITES, + KEYPHRASES, + STATUS_CODES, + REMOTE_USER, +#ifdef HAVE_GEOLOCATION + GEO_LOCATION, +#endif +} GModule; + +/* Metric totals. These are metrics that have a percent value and are + * calculated values. */ +typedef struct GPercTotals_ +{ + int hits; /* total valid hits */ + int visitors; /* total visitors */ + uint64_t bw; /* total bandwidth */ +} GPercTotals; + +/* Metrics within GHolder or GDashData */ +typedef struct GMetrics +{ + /* metric id can be used to identify + * a specific data field */ + uint8_t id; + char *data; + char *method; + char *protocol; + + float hits_perc; + float visitors_perc; + float bw_perc; + + int hits; + int visitors; + + /* holder has a numeric value, while + * dashboard has a displayable string value */ + union + { + char *sbw; + uint64_t nbw; + } bw; + + /* holder has a numeric value, while + * dashboard has a displayable string value */ + union + { + char *sts; + uint64_t nts; + } avgts; + + /* holder has a numeric value, while + * dashboard has a displayable string value */ + union + { + char *sts; + uint64_t nts; + } cumts; + + /* holder has a numeric value, while + * dashboard has a displayable string value */ + union + { + char *sts; + uint64_t nts; + } maxts; +} GMetrics; + +/* Holder sub item */ +typedef struct GSubItem_ +{ + GModule module; + GMetrics *metrics; + struct GSubItem_ *prev; + struct GSubItem_ *next; +} GSubItem; + +/* Double linked-list of sub items */ +typedef struct GSubList_ +{ + int size; + struct GSubItem_ *head; + struct GSubItem_ *tail; +} GSubList; + +/* Holder item */ +typedef struct GHolderItem_ +{ + GSubList *sub_list; + GMetrics *metrics; +} GHolderItem; + +/* Holder of GRawData */ +typedef struct GHolder_ +{ + GHolderItem *items; /* holder items */ + GModule module; /* current module */ + int idx; /* holder index */ + int holder_size; /* number of allocated items */ + int ht_size; /* size of the hash table/store */ + int sub_items_size; /* number of sub items */ +} GHolder; + +/* Enum-to-string */ +typedef struct GEnum_ +{ + const char *str; + int idx; +} GEnum; + +/* A metric can contain a root/data/uniq node id */ +typedef struct GDataMap_ +{ + int data; + int root; +} GDataMap; + +typedef struct GAgentItem_ +{ + char *agent; +} GAgentItem; + +typedef struct GAgents_ +{ + int size; + struct GAgentItem_ *items; +} GAgents; + +#define FOREACH_MODULE(item, array) \ + for (; (item < ARRAY_SIZE(array)) && array[item] != -1; ++item) + +/* Processing time */ +extern time_t end_proc; +extern time_t timestamp; +extern time_t start_proc; + +/* list of available modules/panels */ +extern int module_list[TOTAL_MODULES]; + +/* *INDENT-OFF* */ +GAgentItem *new_gagent_item (uint32_t size); +GAgents *new_gagents (void); +void free_agents_array (GAgents *agents); + +float get_percentage (unsigned long long total, unsigned long long hit); +int get_max_choices (void); +int get_module_enum (const char *str); +int has_timestamp (const char *fmt); +int str2enum (const GEnum map[], int len, const char *str); + +int enable_panel (GModule mod); +int get_module_index (int module); +int get_next_module (GModule module); +int get_prev_module (GModule module); +int ignore_panel (GModule mod); +int init_modules (void); +int remove_module(GModule module); +uint32_t get_num_modules (void); +void verify_panels (void); + +char *get_log_source_str (int max_len); +intmax_t get_log_sizes (void); + +void display_default_config_file (void); +void display_storage (void); +void display_version (void); +/* *INDENT-ON* */ + +#endif diff --git a/goaccess++/src/commons.o b/goaccess++/src/commons.o new file mode 100644 index 0000000000000000000000000000000000000000..f0716b9621b6e77b866e23a018a3bac24c62657b GIT binary patch literal 13024 zcmcgx4RBl4mA?K<6emcg1Tck?S8B6P6AQ}@A%;LLTXLR*5*z=dut^Y#EZG8E(nwE< z&C<j{F@r{^cstCL-FCOM+nK_)%&^@~#uI*`#Q7n!yG@#5mn^Vdx6LM@h9+%x*es;= zo^#&4^6|rJXS*|d$9nhP@1FDBbI<+1-sAPPmzI<W6-vZ?VlJmpA*P*k=@v@1h$`U_ zmmRl$?C#amA84LzE#m!pw!F3u5_-l{Q|-#@$IELF*N=N@Y${QO3GevX-4AB3!Q}V} zV{P_&N}V>gxzkr0CmSK>adb}WS)l3Hn@m#2_<6wf^byUInRaiRnsD#E8U=eN@q^+s zC&P{v9wE~AB3p^~rnBz7XV*iaJAI^a=7$q{=KKL{pPsuD1>CQp;ss3VxhHCDylg!0 zad@arR6d?hEz4G*Bo=^SAYaAhmDKvZR5ucv^d84%qS3SKYs{*$pjt@TDE0nzv$M0| z2~|Vt^vopT;jq)OVjos394lJL-(knaygoi_)am0NjW{uPS$BN#7(gTULGA?RPF{9A zeCV>{Au@PsjziB}N}nqshM!!}ms~>G{AI_3NH}^}&s<5L$I=rzmR`ZqH=*>z%qxx+ zV`u~RH}tmc01`_l>N#q#Y!Id2Fnvs2s%H*ChuK{D_mN<M_Vk&W<9WlSXGvYp97U}h z=@XYLZwh5DZYLV$lmDF^lI0I5$$Gbg39@ckC5$W8erc#I*K;(Cr6O7S2kNjmNEx;o zy=u-0DKY2T1GoIXLYz`XHLK?eu`4*W*(rrFhV2{wXm@L_eHNzmq3QBIJ@d~!zFhy} zDn0Yb%o064Rpo2`g>j>vZPGIrsi`nCE@azmTeri6+&T%vcotKXm?D4e{lEs}LC<{r zh64;?E5yE<D*(VEk)v@6le4f&WXfv_sHdiir8SmrVCfc??qcajSUO%v@2eSus#$ho ze)fg=*;nRg^YgQ(=4YoN3k|8pNdR$OsTr>;Gh@Bnj32~CL;2t$Gagxt@xGd;A+njt z=OJ2RCSQc8(o9Z5wA4(#3DGh$c?KdJhQM$EB0KyrhEeehxfvGGWwbJ<Z2I0K*dtR^ z&SqqILXGc(IG)U6SYI61;+kulGRrfwZ`h!eMh?ltTGR>S<hMPzGGrHz=Xc-gde>Zs z^{m$h>)sg{Hzh>Zyj|@1rJntY4Og%Vf{+@<(pGb3n|f1hy>aZnG5v9EYSGx9lBBVA zvKH!IdCItEJnwie@7SLQ(H7y@|K*a&FqNdvIreWT{jW2seCDT)6=G~pshGt6NFAJF z4W{<0HFtNfyEoT0+lLLweGX({c(mDkxtddK{mkA&Hm9%58s*IwU>>BWY%n2G=eD}? zIP9g}Td6VxTzOt0`s@F@KAc~)l7b)7>z|x;XYz*KlWQr_(|Pz^aire&WYCRredF?; zZ26OJZ0z;!<}1cc1&#A=n%@OI;KVff6ZL65g!;0}_ohFdHSEoA8_NsIza-~Szu|}h z6YQxQj?)r=s|V=gU?Y2S@sa~LlJ($6D-Y|3&XwxH)4p7}3wB@ERsGP<OMRJR)FCqm z=h?qN{kP23?>Y@M+44WfhFwE;<hn}GiVJ4nOu-;D_gw6+BJEi-$0wJOnQ}N^obqJh zuyJKJwM@@-UDcZprDnV?at@AD7+<i@oz#Pe!LxhGvxiM5&eiAc?IX8j>uC&*e`wsP zcG}EEdCW2=4p7}bS40>bp6q)nbSUwl7tJBr0u}-MD^KR<N}TQ4<M|O?ZM^2O$n@v| z=)Ynbqu)XHgXm_c;{A%>&CZhl5841R)qkMQEAC!j4kxYX^JS(xa=kU{dkX$NF0jYJ zljVBzsnoAsAG+Qpp3J`!2{dErT(VLR9!(!Dac6GX2g^zN6G!Td*<ZNzjOTG#6pjuW zN6@Kbn8p5s`pvUxU(crTv#AzS$Cvqqo+A&#dbL{hx1N3C-^AFL>S?tRhIuyYC^>@b zS2L{%d)|Xq&|X()-xhbDFL+TNgP`|t9js#8oTmm(Khz%ckgLPyHh$Xi)wjVw*Spd= zdgecTruS#ov-L*qv8K&1dYa!cu2+3HuZ%1_v-{SL?3(w+?yFB79ot<3tDP_Nk=mzc z4umIs*_s+(<~$kW9sjT+V|vZ)=s4<W&VQu>usvVEGq<g9=1#4HuC9`ec5in-489d@ z$2_Zl3tRemX$uh|`OIPJzmCk2nXeOwy-+-0@BgtOnA|BIO~#^P&=?*P1F=9b7)mBZ zZL(5qj%od&a3D2gXu()C92wBUk)e<lj-{ggPVrDIr40v0wPZXLjD$zESTv;ViWq~S zsy$L4*Y1c1jKMn;p%WP%sT3|}lh_b*QzcrxR-1HIiuPDS8;&JHP@55m3?;Rlkz~XG zp1ZX{!-(H~#~e!}Rw*i5Q<0&5X;KQ*0*Qgta42dd@2(V@R$m{A26haE>QhE|-8^6* z6pO^~9SRKuf}@pUOGi&fZ)bOp==MI)=k4j8OZa<W59??Xn>%~`?VWv_Jworq^3ER7 z+THo(9xo`7w!gPylNZz7y?t(<-<0b1wtKs~QN~PlY~J99nn3P;??YXBx4Q?DSVLcr zzpc{)nQrf<&R(y-4~WGEZ>Qha*#`A@ZWgsWMQuocu%~0QxJMICr+I-y2N+r^8Ho;P z#vuC5?4?MwemDf49MuK`$w93@U<7sqlA*$_vn>`MO+*F;4Xv(irPkQc&|Kfx;99Hg z7}Yj}5`jd2OzTX9hK2&s03MPcyxA%?w6)!>)%ER2MU9l!>|En)sCT6(=i1%a;A~jq zY+PyL0*_>P<iW*b!{$B#N47j-cx1z{+>AuY<K3cUq^jiRWs7YSaGuZr$8$M`0G=<} z?N!f|dh89Qu}XWD*KTWFO1v#70AbXOh_6?s-5Bfks)XG}TtgE7KE_^q)l;R>O1o{- z($Z~q8`|-VEdLjbL9g_6yKNmLzbo-Bj5nbjUVHUZWgfehE)Q4QtKIghR=dr;)NQW@ zD=|5B>>oiC?VpAphQGl!+;5*KE&EytRO-fKCbb=L2)E(~>g)qs(O-1Ng&5Nq>fpCp z%07g^Mzr5!uTG;KJMGn;DSMUs7-*Y14@z0(3v9=b#9;gg(PjD*+R=vXFrXc6WW4^V zcA)Nyf21zje^%<Q!g?Vfc12=eA_UqC@iIKmL-;fN81||y;HY+R6w1?CAL0#I1_814 zQhtySA=W_LB{B5BIcA_&sIN-Bg|6~0Ed_4bSsRz4Z=aTWG>&Mj>8RI%zA5ceeQfr_ zkEHCjLLDUQCfSZT*%m0Dma?~Ddx7_>rLFerT$#_VJyY(s*F9C?wl|~~dF(BvCoAm@ z9(x_IfJ7^Gg$GB;!U5^Z#jj@<DlJ>^r3vSpnsxKF%4n9($1qn$vvwgIFIJxpWdbi+ zpAKbo)mjLbONynaj4omGLDLg-1esTW;{aC|TvK?Ub2;F6$>ZU(l=-xsD+vE|yJ`rp zpj#j3St;=wIS6TUVXY81Tks|+-)zBgZlV3%7W_Vm$1J!<;z<j>QQ~O}-X-zBwBTDP zzet$%&lS>`277)u2T^JVeJjLC3vSN6io!alilb8gzZD>3L*k`!{;T50CBD>xk4gMy z3;vYEYc06BhF6GH7W`{c-f6*~m-t;4{I4b6X2H$9ph7%g!T(muZ?)jBNc=GizF*=y zE%<8^Ph0TA5`Wf$zbWx=TJRrB{96|MEs1}}g1;ki+NUUOex@b<l12WU#D8GH5iX-w z77{3YK7iC`*t$e}I$&4fXU^e*C?)Xed?EbCB6wX9yuJv2AK++D9AXT#?nAsu;+G`u zrc$_!L4F~728!VLO1+T$6M$pAEplJ@zT|(ti2Tb^{*siZvkB<DUPS(gls_ex`Yy@; zPetV4lJc5dKvn<ao{e^%l1na~Pk;;kvQWElKS%jXQeMf}z;2b6rchJ`ILZsT<US+| zZ<F{V5?AM!28rh-PG=a<xmV&1a!FVCMv1>5@l}%lPXWJ{?Stzj9+vW_q`W$p?2>qu z%@m}w2_(k>U#ML<DL*0QH%R`!lK8a52POWp#Jl81MdubMd$kDv;Uf5tC66YzR5hO8 zmG}!1H`jM~WGupSS<0&|n9eO=&mtI43$@o?1iz^Wt^t0n_|2?zLt&-39qL^OUsXhY zO%YrKW5dI-Xwn%JPG4ICeq8uz#LpW1+=-vH__+%|>+sWzAD1aj;x3YRH4#o~F4A+6 zqKh<Lr0OEwM$&CGt0LV-(rqN&M$&C0-A2-FB;7{RZ6e(!(rqH$Cem#p-6qm)BHbp^ zZ6e*KW-$;l{KJ6}e{e7sfg3tBJsKAN4ZhA+xOsNAxA%B^{k`s1pVu$Kk!Zg^mNMcg z!*7hnLn53Ag@oUqGy=iLfZ#EI7_QmG7!M_aaB~g}ghYQN86OIaf>bO)`5;tjghmXJ zH2Q%J2*UA1Bx;0_q988so__O%z>hBk#LV)3d<iHh><lH65qNJ1?@C0B5RfMtL($YQ zCW6Cpvz@X2)KJJza5S{bKLGZ?^<In&2Zn}XK{1E<fnr#U1Wg><={IHlfkYxOD&QXM zHzLC!XgYA44+CIMG&Ce415tQ$kQwwY7~vnLnv=qe{X>zY!7T#EhDJmJ?$|p+QdYo? z8?z)91$QYNDdUOIPL+pt!!wClUlLmje;D~AQPb8)G@_J~#5NQg@FydWLuaE`DLIG7 zQqXhISqU)$pZ-)_1mf`!biAY;3PpiEkU%5AWmrOqXl$3?7&aFqe0anF(~<5|&$m)m z$f$t7CIO#WT)^RVfPy-2mO>8iWydA{s##3(c&5K9AE}N>9Jish49BND49K$#eoFpl z2trW&%Fc5pO!ooKb4lV>`NgmWVL%+)uK1Tp+-lDaOdi|yTq}Ga;Q0fCmEXm9?t*f~ ze@_wITLka6@M~>U9i2-sg?8duUh#jM$=exD20|X~#D5wp`Nar8zzElQg{wO`^54Vo z>zF+5p-O%Q!>?s{yTp+P_f{p}&Ez?cpW&S6F~)N*<5Bl_EdC6`pJhC}UC%Kd-mY&j zd2Y}57|!kaJI2H9d7a5$$Lu-6aBj~D#>4G7#pJm?Z!>&3<Nt)=Tz(1cml&`Z@5aji zRSds@;nzzX`-`{h^GqJ^zKW-g;k;e-jEA=i_iqen54W?0;nh&4_%|{hZqF7b&v|w* z{3gaTz<AsYPcnJVvxniIW%B!q@Jujy&ht%%-^_TvU4-XlCeL|ZXZS6QM?HXGf3-2Z z0|5x==g+}U`P0vEJliY$F^1!th{AU<Tw{2e;h$&tvkbqD;oo5R7a0CMhSxCs?-^dp z@WTwho#8)W_@6L*n&EW}zsPWW(^2jH9mBuK@N4A#2K|Y53MKz7iKAL8!w)i?ug^ba zcsrA?Uj!Kl$iw%GmLm8uiK9KZAC+V0LwLu6UzPj8e=;5q$SM2R%6pIESuS}tT5tm! z0ij>wXeZ}+iOFw<GR6O|Mev*CMF8vN@;(dR0Oc6QC64tz06)e57Z!PipDu#GUj$zw z?_tUw^eKji8IIU@aq)ogD8pAnUe#+b9OaciM<tH-_c8f#CXfF-RXn*O@;_qo$gle4 zRfg9xo;>5(!tj4!^1NNA8P4r_oAGe_&oOy!&xZ`>^XNB>hud?5yr-gnx|p3SC9e8K z`DZJW$Fr!y!wkQl;ZGLfd9Dcl62q}wZ?(b)!hQ>Glk+8S!3{JR!p|g*?ZUSXW#_Lf z@`}ffhhqq+?u4I`UnOzm*~)MilSexh5B~oI1M*P6NPD^%eg~8({(i>4jp2_ndCot= zaGaxxXRHX%Q%s)oyjVnjlHuDKe>q+TAYgM`@Kg0JkvRH?+kY#=`8r%L{eklQT%r06 zalQ_pFCu@q3<M#dJU>@lW$U~SWy;RYY#rwO8pvS4YGhTE_t19^SMQb&T5$Dl8Mojq zl5E0)t9Qj0Ex39=JZr%<Y#@Ykxt}OI)jQ!W7F@jtHdt`=?zhc?t9L)uKE<!z{nUH2 z!qvOq1q+XQ_fz|xl2`A0`2L7N;p%;FwFOu2c*=iDUcKY>TIAI`-ZK_ly~|BnaP=;C z)`F||H{nc<4#WTKAvO|bJg8FefBAruo@1Q&e|_QHkxU9_B8C|hcRArriD%*ANM?gc z174T#tqfjKgfkj5LQeSid_BDf$^1Yx<%IVEcn>m0K@lqp4f?~0z;MX)-T&pQfiiZP zoCXD|7MZ$D&R11Xr4lm6Gc*px7MWMkq<p9zlMfjfVLfuYr~fmf?Clbl(-t8LW3pa6 zbMv6_45U}X4>_&+uUYI?YI1n0EUj6HH5L#vq4Zy|D5$K8TR?mv{WxCsAy~UewO{FX zf()kduFS(3sV}E_p-AObjB6|E<C@RIdr}|$!-J|<#b}>Ob2%G6N-PkpvMG?kBc+@+ z1r4RI6%aF_+OOaoB#_gpUnlFwcWNH2`cFgQLgR0pY`9uqaQxvGru3^N=|Xj5kuE!= uL7tD$o%p|Ft3DQ6Oaw%T5u6wh?y(eF{fBQD77^0ZofL_$n^ECw)&Czot+7)8 literal 0 HcmV?d00001 diff --git a/goaccess++/src/config.h b/goaccess++/src/config.h new file mode 100644 index 0000000..ae8e1c5 --- /dev/null +++ b/goaccess++/src/config.h @@ -0,0 +1,325 @@ +/* src/config.h. Generated from config.h.in by configure. */ +/* src/config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if translation of program messages to the user's native + language is requested. */ +#define ENABLE_NLS 1 + +/* Define to 1 if you have the `alarm' function. */ +#define HAVE_ALARM 1 + +/* Define to 1 if you have the <arpa/inet.h> header file. */ +#define HAVE_ARPA_INET_H 1 + +/* "Build using BZ2" */ +/* #undef HAVE_BZ2 */ + +/* Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the + CoreFoundation framework. */ +/* #undef HAVE_CFLOCALECOPYCURRENT */ + +/* Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in + the CoreFoundation framework. */ +/* #undef HAVE_CFPREFERENCESCOPYAPPVALUE */ + +/* Define to 1 if you have the <curses.h> header file. */ +/* #undef HAVE_CURSES_H */ + +/* Define if the GNU dcgettext() function is already present or preinstalled. + */ +#define HAVE_DCGETTEXT 1 + +/* Define to 1 if you have the <fcntl.h> header file. */ +#define HAVE_FCNTL_H 1 + +/* Define to 1 if you have the `floor' function. */ +/* #undef HAVE_FLOOR */ + +/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */ +#define HAVE_FSEEKO 1 + +/* Build using GeoIP. */ +#define HAVE_GEOLOCATION 1 + +/* Define to 1 if you have the `gethostbyaddr' function. */ +#define HAVE_GETHOSTBYADDR 1 + +/* Define to 1 if you have the `gethostbyname' function. */ +#define HAVE_GETHOSTBYNAME 1 + +/* Define if the GNU gettext() function is already present or preinstalled. */ +#define HAVE_GETTEXT 1 + +/* Define to 1 if you have the `gettimeofday' function. */ +#define HAVE_GETTIMEOFDAY 1 + +/* Define if you have the iconv() function and it works. */ +/* #undef HAVE_ICONV */ + +/* Define to 1 if you have the <inttypes.h> header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `crypto' library (-lcrypto). */ +/* #undef HAVE_LIBCRYPTO */ + +/* Define to 1 if you have the `GeoIP' library (-lGeoIP). */ +#define HAVE_LIBGEOIP 1 + +/* Define to 1 if you have the `intl' library (-lintl). */ +/* #undef HAVE_LIBINTL */ + +/* Define to 1 if you have the `maxminddb' library (-lmaxminddb). */ +/* #undef HAVE_LIBMAXMINDDB */ + +/* Define to 1 if you have the `ncurses' library (-lncurses). */ +/* #undef HAVE_LIBNCURSES */ + +/* "ncursesw is present." */ +#define HAVE_LIBNCURSESW 1 + +/* Define to 1 if you have the `nsl' library (-lnsl). */ +#define HAVE_LIBNSL 1 + +/* Define to 1 if you have the `pthread' library (-lpthread). */ +#define HAVE_LIBPTHREAD 1 + +/* Define to 1 if you have the `socket' library (-lsocket). */ +/* #undef HAVE_LIBSOCKET */ + +/* Define to 1 if you have the `ssl' library (-lssl). */ +/* #undef HAVE_LIBSSL */ + +/* Define to 1 if you have the `tokyocabinet' library (-ltokyocabinet). */ +/* #undef HAVE_LIBTOKYOCABINET */ + +/* Define to 1 if you have the <limits.h> header file. */ +#define HAVE_LIMITS_H 1 + +/* Define to 1 if you have the <locale.h> header file. */ +#define HAVE_LOCALE_H 1 + +/* Define to 1 if you have the `malloc' function. */ +#define HAVE_MALLOC 1 + +/* Define to 1 if you have the `memmove' function. */ +#define HAVE_MEMMOVE 1 + +/* Define to 1 if you have the <memory.h> header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `memset' function. */ +#define HAVE_MEMSET 1 + +/* Define to 1 if you have the `mkfifo' function. */ +#define HAVE_MKFIFO 1 + +/* Define to 1 if you have the <ncursesw/ncurses.h> header file. */ +#define HAVE_NCURSESW_NCURSES_H 1 + +/* Define to 1 if you have the <ncurses.h> header file. */ +#define HAVE_NCURSES_H 1 + +/* Define to 1 if you have the <ncurses/ncurses.h> header file. */ +/* #undef HAVE_NCURSES_NCURSES_H */ + +/* Define to 1 if you have the <netdb.h> header file. */ +#define HAVE_NETDB_H 1 + +/* Define to 1 if you have the <netinet/in.h> header file. */ +#define HAVE_NETINET_IN_H 1 + +/* Define to 1 if the system has the type `ptrdiff_t'. */ +#define HAVE_PTRDIFF_T 1 + +/* Define to 1 if you have the `realloc' function. */ +#define HAVE_REALLOC 1 + +/* Define to 1 if you have the `realpath' function. */ +#define HAVE_REALPATH 1 + +/* Define to 1 if you have the `regcomp' function. */ +#define HAVE_REGCOMP 1 + +/* Define to 1 if you have the `select' function. */ +#define HAVE_SELECT 1 + +/* Define to 1 if you have the `setlocale' function. */ +#define HAVE_SETLOCALE 1 + +/* Define to 1 if you have the `socket' function. */ +#define HAVE_SOCKET 1 + +/* Define to 1 if `stat' has the bug that it succeeds when given the + zero-length file name argument. */ +/* #undef HAVE_STAT_EMPTY_STRING_BUG */ + +/* Define to 1 if you have the <stddef.h> header file. */ +#define HAVE_STDDEF_H 1 + +/* Define to 1 if you have the <stdint.h> header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the <stdlib.h> header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `strcasecmp' function. */ +#define HAVE_STRCASECMP 1 + +/* Define to 1 if you have the `strchr' function. */ +#define HAVE_STRCHR 1 + +/* Define to 1 if you have the `strcspn' function. */ +#define HAVE_STRCSPN 1 + +/* Define to 1 if you have the `strdup' function. */ +#define HAVE_STRDUP 1 + +/* Define to 1 if you have the `strerror' function. */ +#define HAVE_STRERROR 1 + +/* Define to 1 if you have the `strftime' function. */ +#define HAVE_STRFTIME 1 + +/* Define to 1 if you have the <strings.h> header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the <string.h> header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the `strncasecmp' function. */ +#define HAVE_STRNCASECMP 1 + +/* Define to 1 if you have the `strpbrk' function. */ +#define HAVE_STRPBRK 1 + +/* Define to 1 if you have the `strrchr' function. */ +#define HAVE_STRRCHR 1 + +/* Define to 1 if you have the `strspn' function. */ +#define HAVE_STRSPN 1 + +/* Define to 1 if you have the `strstr' function. */ +#define HAVE_STRSTR 1 + +/* Define to 1 if you have the `strtol' function. */ +#define HAVE_STRTOL 1 + +/* Define to 1 if you have the `strtoull' function. */ +#define HAVE_STRTOULL 1 + +/* Define to 1 if you have the <sys/socket.h> header file. */ +#define HAVE_SYS_SOCKET_H 1 + +/* Define to 1 if you have the <sys/stat.h> header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the <sys/time.h> header file. */ +#define HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the <sys/types.h> header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the <unistd.h> header file. */ +#define HAVE_UNISTD_H 1 + +/* "Build using ZLIB" */ +/* #undef HAVE_ZLIB */ + +/* Define to 1 if `lstat' dereferences a symlink specified with a trailing + slash. */ +#define LSTAT_FOLLOWS_SLASHED_SYMLINK 1 + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +/* #undef NO_MINUS_C_MINUS_O */ + +/* Name of package */ +#define PACKAGE "goaccess" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "goaccess@prosoftcorp.com" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "goaccess" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "goaccess 1.3" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "goaccess" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "http://goaccess.io" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "1.3" + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* "Build using on-disk B+ Tree database" */ +/* #undef TCB_BTREE */ + +/* "Build using on-memory hash database" */ +/* #undef TCB_MEMHASH */ + +/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */ +#define TIME_WITH_SYS_TIME 1 + +/* Define to 1 if your <sys/time.h> declares `struct tm'. */ +/* #undef TM_IN_SYS_TIME */ + +/* Version number of package */ +#define VERSION "1.3" + +/* Build using GNU getline. */ +/* #undef WITH_GETLINE */ + +/* Debug option */ +/* #undef _DEBUG */ + +/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ +/* #undef _LARGEFILE_SOURCE */ + +/* Define for Solaris 2.5.1 so the uint32_t typedef from <sys/synch.h>, + <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the + #define below would cause a syntax error. */ +/* #undef _UINT32_T */ + +/* Define for Solaris 2.5.1 so the uint64_t typedef from <sys/synch.h>, + <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the + #define below would cause a syntax error. */ +/* #undef _UINT64_T */ + +/* Define for Solaris 2.5.1 so the uint8_t typedef from <sys/synch.h>, + <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the + #define below would cause a syntax error. */ +/* #undef _UINT8_T */ + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef const */ + +/* Define to the type of a signed integer type of width exactly 64 bits if + such a type exists and the standard includes do not define it. */ +/* #undef int64_t */ + +/* Define to the type of a signed integer type of width exactly 8 bits if such + a type exists and the standard includes do not define it. */ +/* #undef int8_t */ + +/* Define to `long int' if <sys/types.h> does not define. */ +/* #undef off_t */ + +/* Define to `unsigned int' if <sys/types.h> does not define. */ +/* #undef size_t */ + +/* Define to the type of an unsigned integer type of width exactly 32 bits if + such a type exists and the standard includes do not define it. */ +/* #undef uint32_t */ + +/* Define to the type of an unsigned integer type of width exactly 64 bits if + such a type exists and the standard includes do not define it. */ +/* #undef uint64_t */ + +/* Define to the type of an unsigned integer type of width exactly 8 bits if + such a type exists and the standard includes do not define it. */ +/* #undef uint8_t */ diff --git a/goaccess++/src/config.h.in b/goaccess++/src/config.h.in new file mode 100644 index 0000000..5d81edc --- /dev/null +++ b/goaccess++/src/config.h.in @@ -0,0 +1,324 @@ +/* src/config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if translation of program messages to the user's native + language is requested. */ +#undef ENABLE_NLS + +/* Define to 1 if you have the `alarm' function. */ +#undef HAVE_ALARM + +/* Define to 1 if you have the <arpa/inet.h> header file. */ +#undef HAVE_ARPA_INET_H + +/* "Build using BZ2" */ +#undef HAVE_BZ2 + +/* Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the + CoreFoundation framework. */ +#undef HAVE_CFLOCALECOPYCURRENT + +/* Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in + the CoreFoundation framework. */ +#undef HAVE_CFPREFERENCESCOPYAPPVALUE + +/* Define to 1 if you have the <curses.h> header file. */ +#undef HAVE_CURSES_H + +/* Define if the GNU dcgettext() function is already present or preinstalled. + */ +#undef HAVE_DCGETTEXT + +/* Define to 1 if you have the <fcntl.h> header file. */ +#undef HAVE_FCNTL_H + +/* Define to 1 if you have the `floor' function. */ +#undef HAVE_FLOOR + +/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */ +#undef HAVE_FSEEKO + +/* Build using GeoIP. */ +#undef HAVE_GEOLOCATION + +/* Define to 1 if you have the `gethostbyaddr' function. */ +#undef HAVE_GETHOSTBYADDR + +/* Define to 1 if you have the `gethostbyname' function. */ +#undef HAVE_GETHOSTBYNAME + +/* Define if the GNU gettext() function is already present or preinstalled. */ +#undef HAVE_GETTEXT + +/* Define to 1 if you have the `gettimeofday' function. */ +#undef HAVE_GETTIMEOFDAY + +/* Define if you have the iconv() function and it works. */ +#undef HAVE_ICONV + +/* Define to 1 if you have the <inttypes.h> header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the `crypto' library (-lcrypto). */ +#undef HAVE_LIBCRYPTO + +/* Define to 1 if you have the `GeoIP' library (-lGeoIP). */ +#undef HAVE_LIBGEOIP + +/* Define to 1 if you have the `intl' library (-lintl). */ +#undef HAVE_LIBINTL + +/* Define to 1 if you have the `maxminddb' library (-lmaxminddb). */ +#undef HAVE_LIBMAXMINDDB + +/* Define to 1 if you have the `ncurses' library (-lncurses). */ +#undef HAVE_LIBNCURSES + +/* "ncursesw is present." */ +#undef HAVE_LIBNCURSESW + +/* Define to 1 if you have the `nsl' library (-lnsl). */ +#undef HAVE_LIBNSL + +/* Define to 1 if you have the `pthread' library (-lpthread). */ +#undef HAVE_LIBPTHREAD + +/* Define to 1 if you have the `socket' library (-lsocket). */ +#undef HAVE_LIBSOCKET + +/* Define to 1 if you have the `ssl' library (-lssl). */ +#undef HAVE_LIBSSL + +/* Define to 1 if you have the `tokyocabinet' library (-ltokyocabinet). */ +#undef HAVE_LIBTOKYOCABINET + +/* Define to 1 if you have the <limits.h> header file. */ +#undef HAVE_LIMITS_H + +/* Define to 1 if you have the <locale.h> header file. */ +#undef HAVE_LOCALE_H + +/* Define to 1 if you have the `malloc' function. */ +#undef HAVE_MALLOC + +/* Define to 1 if you have the `memmove' function. */ +#undef HAVE_MEMMOVE + +/* Define to 1 if you have the <memory.h> header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `memset' function. */ +#undef HAVE_MEMSET + +/* Define to 1 if you have the `mkfifo' function. */ +#undef HAVE_MKFIFO + +/* Define to 1 if you have the <ncursesw/ncurses.h> header file. */ +#undef HAVE_NCURSESW_NCURSES_H + +/* Define to 1 if you have the <ncurses.h> header file. */ +#undef HAVE_NCURSES_H + +/* Define to 1 if you have the <ncurses/ncurses.h> header file. */ +#undef HAVE_NCURSES_NCURSES_H + +/* Define to 1 if you have the <netdb.h> header file. */ +#undef HAVE_NETDB_H + +/* Define to 1 if you have the <netinet/in.h> header file. */ +#undef HAVE_NETINET_IN_H + +/* Define to 1 if the system has the type `ptrdiff_t'. */ +#undef HAVE_PTRDIFF_T + +/* Define to 1 if you have the `realloc' function. */ +#undef HAVE_REALLOC + +/* Define to 1 if you have the `realpath' function. */ +#undef HAVE_REALPATH + +/* Define to 1 if you have the `regcomp' function. */ +#undef HAVE_REGCOMP + +/* Define to 1 if you have the `select' function. */ +#undef HAVE_SELECT + +/* Define to 1 if you have the `setlocale' function. */ +#undef HAVE_SETLOCALE + +/* Define to 1 if you have the `socket' function. */ +#undef HAVE_SOCKET + +/* Define to 1 if `stat' has the bug that it succeeds when given the + zero-length file name argument. */ +#undef HAVE_STAT_EMPTY_STRING_BUG + +/* Define to 1 if you have the <stddef.h> header file. */ +#undef HAVE_STDDEF_H + +/* Define to 1 if you have the <stdint.h> header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the <stdlib.h> header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the `strcasecmp' function. */ +#undef HAVE_STRCASECMP + +/* Define to 1 if you have the `strchr' function. */ +#undef HAVE_STRCHR + +/* Define to 1 if you have the `strcspn' function. */ +#undef HAVE_STRCSPN + +/* 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 `strftime' function. */ +#undef HAVE_STRFTIME + +/* Define to 1 if you have the <strings.h> header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the <string.h> header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the `strncasecmp' function. */ +#undef HAVE_STRNCASECMP + +/* Define to 1 if you have the `strpbrk' function. */ +#undef HAVE_STRPBRK + +/* Define to 1 if you have the `strrchr' function. */ +#undef HAVE_STRRCHR + +/* Define to 1 if you have the `strspn' function. */ +#undef HAVE_STRSPN + +/* Define to 1 if you have the `strstr' function. */ +#undef HAVE_STRSTR + +/* Define to 1 if you have the `strtol' function. */ +#undef HAVE_STRTOL + +/* Define to 1 if you have the `strtoull' function. */ +#undef HAVE_STRTOULL + +/* Define to 1 if you have the <sys/socket.h> header file. */ +#undef HAVE_SYS_SOCKET_H + +/* Define to 1 if you have the <sys/stat.h> header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the <sys/time.h> header file. */ +#undef HAVE_SYS_TIME_H + +/* Define to 1 if you have the <sys/types.h> header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the <unistd.h> header file. */ +#undef HAVE_UNISTD_H + +/* "Build using ZLIB" */ +#undef HAVE_ZLIB + +/* Define to 1 if `lstat' dereferences a symlink specified with a trailing + slash. */ +#undef LSTAT_FOLLOWS_SLASHED_SYMLINK + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +#undef NO_MINUS_C_MINUS_O + +/* 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 + +/* "Build using on-disk B+ Tree database" */ +#undef TCB_BTREE + +/* "Build using on-memory hash database" */ +#undef TCB_MEMHASH + +/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */ +#undef TIME_WITH_SYS_TIME + +/* Define to 1 if your <sys/time.h> declares `struct tm'. */ +#undef TM_IN_SYS_TIME + +/* Version number of package */ +#undef VERSION + +/* Build using GNU getline. */ +#undef WITH_GETLINE + +/* Debug option */ +#undef _DEBUG + +/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ +#undef _LARGEFILE_SOURCE + +/* Define for Solaris 2.5.1 so the uint32_t typedef from <sys/synch.h>, + <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the + #define below would cause a syntax error. */ +#undef _UINT32_T + +/* Define for Solaris 2.5.1 so the uint64_t typedef from <sys/synch.h>, + <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the + #define below would cause a syntax error. */ +#undef _UINT64_T + +/* Define for Solaris 2.5.1 so the uint8_t typedef from <sys/synch.h>, + <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the + #define below would cause a syntax error. */ +#undef _UINT8_T + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define to the type of a signed integer type of width exactly 64 bits if + such a type exists and the standard includes do not define it. */ +#undef int64_t + +/* Define to the type of a signed integer type of width exactly 8 bits if such + a type exists and the standard includes do not define it. */ +#undef int8_t + +/* Define to `long int' if <sys/types.h> does not define. */ +#undef off_t + +/* Define to `unsigned int' if <sys/types.h> does not define. */ +#undef size_t + +/* Define to the type of an unsigned integer type of width exactly 32 bits if + such a type exists and the standard includes do not define it. */ +#undef uint32_t + +/* Define to the type of an unsigned integer type of width exactly 64 bits if + such a type exists and the standard includes do not define it. */ +#undef uint64_t + +/* Define to the type of an unsigned integer type of width exactly 8 bits if + such a type exists and the standard includes do not define it. */ +#undef uint8_t diff --git a/goaccess++/src/csv.c b/goaccess++/src/csv.c new file mode 100644 index 0000000..5ccce0b --- /dev/null +++ b/goaccess++/src/csv.c @@ -0,0 +1,327 @@ +/** + * output.c -- output csv to the standard output stream + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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. + */ + +#define _LARGEFILE_SOURCE +#define _LARGEFILE64_SOURCE +#define _FILE_OFFSET_BITS 64 + +#include <ctype.h> + +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/stat.h> +#include <time.h> +#include <unistd.h> +#include <inttypes.h> + +#include "csv.h" + +#ifdef HAVE_LIBTOKYOCABINET +#include "tcabdb.h" +#else +#include "gkhash.h" +#endif + +#include "error.h" +#include "ui.h" +#include "util.h" + +/* Panel output */ +typedef struct GPanel_ +{ + GModule module; + void (*render) (FILE * fp, GHolder * h, GPercTotals totals); +} GPanel; + +static void print_csv_data (FILE * fp, GHolder * h, GPercTotals totals); + +/* *INDENT-OFF* */ +/* A function pointer for each panel */ +static GPanel paneling[] = { + {VISITORS , print_csv_data} , + {REQUESTS , print_csv_data} , + {REQUESTS_STATIC , print_csv_data} , + {NOT_FOUND , print_csv_data} , + {HOSTS , print_csv_data} , + {OS , print_csv_data} , + {BROWSERS , print_csv_data} , + {VISIT_TIMES , print_csv_data} , + {VIRTUAL_HOSTS , print_csv_data} , + {REFERRERS , print_csv_data} , + {REFERRING_SITES , print_csv_data} , + {KEYPHRASES , print_csv_data} , + {STATUS_CODES , print_csv_data} , + {REMOTE_USER , print_csv_data} , +#ifdef HAVE_GEOLOCATION + {GEO_LOCATION , print_csv_data} , +#endif +}; +/* *INDENT-ON* */ + +/* Get a panel from the GPanel structure given a module. + * + * On error, or if not found, NULL is returned. + * On success, the panel value is returned. */ +static GPanel * +panel_lookup (GModule module) +{ + int i, num_panels = ARRAY_SIZE (paneling); + + for (i = 0; i < num_panels; i++) { + if (paneling[i].module == module) + return &paneling[i]; + } + return NULL; +} + +/* Iterate over the string and escape CSV output. */ +static void +escape_cvs_output (FILE * fp, char *s) +{ + while (*s) { + switch (*s) { + case '"': + fprintf (fp, "\"\""); + break; + default: + fputc (*s, fp); + break; + } + s++; + } +} + +/* Output metrics. + * + * On success, outputs item value. */ +static void +print_csv_metric_block (FILE * fp, GMetrics * nmetrics) +{ + /* basic metrics */ + fprintf (fp, "\"%d\",", nmetrics->hits); + fprintf (fp, "\"%4.2f%%\",", nmetrics->hits_perc); + fprintf (fp, "\"%d\",", nmetrics->visitors); + fprintf (fp, "\"%4.2f%%\",", nmetrics->visitors_perc); + + /* bandwidth */ + if (conf.bandwidth) { + fprintf (fp, "\"%lld\",", (long long) nmetrics->bw.nbw); + fprintf (fp, "\"%4.2f%%\",", nmetrics->bw_perc); + } + + /* time served metrics */ + if (conf.serve_usecs) { + fprintf (fp, "\"%lld\",", (long long) nmetrics->avgts.nts); + fprintf (fp, "\"%lld\",", (long long) nmetrics->cumts.nts); + fprintf (fp, "\"%lld\",", (long long) nmetrics->maxts.nts); + } + + /* request method */ + if (conf.append_method && nmetrics->method) + fprintf (fp, "\"%s\"", nmetrics->method); + fprintf (fp, ","); + + /* request protocol */ + if (conf.append_protocol && nmetrics->protocol) + fprintf (fp, "\"%s\"", nmetrics->protocol); + fprintf (fp, ","); + + /* data field */ + fprintf (fp, "\""); + escape_cvs_output (fp, nmetrics->data); + fprintf (fp, "\"\r\n"); +} + +/* Output a sublist (double linked-list) items for a particular parent node. + * + * On error, it exits early. + * On success, outputs item value. */ +static void +print_csv_sub_items (FILE * fp, GHolder * h, int idx, GPercTotals totals) +{ + GMetrics *nmetrics; + GSubList *sub_list = h->items[idx].sub_list; + GSubItem *iter; + + int i = 0; + + if (sub_list == NULL) + return; + + for (iter = sub_list->head; iter; iter = iter->next, i++) { + set_data_metrics (iter->metrics, &nmetrics, totals); + + fprintf (fp, "\"%d\",", i); /* idx */ + fprintf (fp, "\"%d\",", idx); /* parent idx */ + fprintf (fp, "\"%s\",", module_to_id (h->module)); + + /* output metrics */ + print_csv_metric_block (fp, nmetrics); + free (nmetrics); + } +} + +/* Output first-level items. + * + * On success, outputs item value. */ +static void +print_csv_data (FILE * fp, GHolder * h, GPercTotals totals) +{ + GMetrics *nmetrics; + int i; + + for (i = 0; i < h->idx; i++) { + set_data_metrics (h->items[i].metrics, &nmetrics, totals); + + fprintf (fp, "\"%d\",", i); /* idx */ + fprintf (fp, ","); /* no parent */ + fprintf (fp, "\"%s\",", module_to_id (h->module)); + + /* output metrics */ + print_csv_metric_block (fp, nmetrics); + + if (h->sub_items_size) + print_csv_sub_items (fp, h, i, totals); + + free (nmetrics); + } +} + +#pragma GCC diagnostic ignored "-Wformat-nonliteral" +/* Output general statistics information. */ +static void +print_csv_summary (FILE * fp, GLog * glog) +{ + char now[DATE_TIME]; + char *source = NULL; + const char *fmt; + int i = 0, total = 0; + long long t = 0LL; + + generate_time (); + strftime (now, DATE_TIME, "%Y-%m-%d %H:%M:%S %z", now_tm); + + /* generated date time */ + fmt = "\"%d\",,\"%s\",,,,,,,,\"%s\",\"%s\"\r\n"; + fprintf (fp, fmt, i++, GENER_ID, now, OVERALL_DATETIME); + + /* total requests */ + fmt = "\"%d\",,\"%s\",,,,,,,,\"%d\",\"%s\"\r\n"; + total = glog->processed; + fprintf (fp, fmt, i++, GENER_ID, total, OVERALL_REQ); + + /* valid requests */ + fmt = "\"%d\",,\"%s\",,,,,,,,\"%d\",\"%s\"\r\n"; + total = glog->valid; + fprintf (fp, fmt, i++, GENER_ID, total, OVERALL_VALID); + + /* invalid requests */ + total = glog->invalid; + fprintf (fp, fmt, i++, GENER_ID, total, OVERALL_FAILED); + + /* generated time */ + fmt = "\"%d\",,\"%s\",,,,,,,,\"%lld\",\"%s\"\r\n"; + t = (long long) end_proc - start_proc; + fprintf (fp, fmt, i++, GENER_ID, t, OVERALL_GENTIME); + + /* visitors */ + fmt = "\"%d\",,\"%s\",,,,,,,,\"%d\",\"%s\"\r\n"; + total = ht_get_size_uniqmap (VISITORS); + fprintf (fp, fmt, i++, GENER_ID, total, OVERALL_VISITORS); + + /* files */ + total = ht_get_size_datamap (REQUESTS); + fprintf (fp, fmt, i++, GENER_ID, total, OVERALL_FILES); + + /* excluded hits */ + total = glog->excluded_ip; + fprintf (fp, fmt, i++, GENER_ID, total, OVERALL_EXCL_HITS); + + /* referrers */ + total = ht_get_size_datamap (REFERRERS); + fprintf (fp, fmt, i++, GENER_ID, total, OVERALL_REF); + + /* not found */ + total = ht_get_size_datamap (NOT_FOUND); + fprintf (fp, fmt, i++, GENER_ID, total, OVERALL_NOTFOUND); + + /* static files */ + total = ht_get_size_datamap (REQUESTS_STATIC); + fprintf (fp, fmt, i++, GENER_ID, total, OVERALL_STATIC); + + /* log size */ + fmt = "\"%d\",,\"%s\",,,,,,,,\"%jd\",\"%s\"\r\n"; + fprintf (fp, fmt, i++, GENER_ID, (intmax_t) get_log_sizes (), + OVERALL_LOGSIZE); + + /* bandwidth */ + fmt = "\"%d\",,\"%s\",,,,,,,,\"%llu\",\"%s\"\r\n"; + fprintf (fp, fmt, i++, GENER_ID, glog->resp_size, OVERALL_BANDWIDTH); + + /* log path */ + source = get_log_source_str (0); + fmt = "\"%d\",,\"%s\",,,,,,,,\"%s\",\"%s\"\r\n"; + fprintf (fp, fmt, i++, GENER_ID, source, OVERALL_LOG); + free (source); +} + +#pragma GCC diagnostic warning "-Wformat-nonliteral" + +/* Entry point to generate a a csv report writing it to the fp */ +void +output_csv (GLog * glog, GHolder * holder, const char *filename) +{ + GModule module; + GPercTotals totals; + const GPanel *panel = NULL; + size_t idx = 0; + FILE *fp; + + fp = (filename != NULL) ? fopen (filename, "w") : stdout; + if (!fp) + FATAL ("Unable to open CSV file: %s.", strerror (errno)); + + if (!conf.no_csv_summary) + print_csv_summary (fp, glog); + + FOREACH_MODULE (idx, module_list) { + module = module_list[idx]; + + if (!(panel = panel_lookup (module))) + continue; + + set_module_totals (module, &totals); + panel->render (fp, holder + module, totals); + } + + fclose (fp); +} diff --git a/goaccess++/src/csv.h b/goaccess++/src/csv.h new file mode 100644 index 0000000..bde8143 --- /dev/null +++ b/goaccess++/src/csv.h @@ -0,0 +1,43 @@ +/** + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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. + */ + +#if HAVE_CONFIG_H +#include <config.h> +#endif + +#ifndef CSV_H_INCLUDED +#define CSV_H_INCLUDED + +#include <stdio.h> +#include "parser.h" +#include "settings.h" + +void output_csv (GLog * glog, GHolder * holder, const char *filename); + +#endif diff --git a/goaccess++/src/csv.o b/goaccess++/src/csv.o new file mode 100644 index 0000000000000000000000000000000000000000..83d7a530763f71d1fe2cd411549f32f292a392de GIT binary patch literal 12168 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 literal 0 HcmV?d00001 diff --git a/goaccess++/src/d3js.h b/goaccess++/src/d3js.h new file mode 100644 index 0000000..cc55532 --- /dev/null +++ b/goaccess++/src/d3js.h @@ -0,0 +1,13744 @@ +const char d3_js[151140] = { + 0x21, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, + 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x26, 0x26, 0x28, 0x6e, 0x2e, 0x6f, 0x77, 0x6e, 0x65, 0x72, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x7c, 0x7c, 0x6e, + 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x7c, 0x7c, + 0x6e, 0x29, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x28, 0x6e, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x26, 0x26, 0x28, + 0x6e, 0x2e, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x26, 0x26, 0x6e, 0x2e, 0x6f, 0x77, 0x6e, + 0x65, 0x72, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x69, 0x65, 0x77, + 0x7c, 0x7c, 0x6e, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x26, 0x26, 0x6e, 0x7c, 0x7c, 0x6e, 0x2e, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x56, 0x69, 0x65, 0x77, 0x29, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x28, 0x6e, + 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x3e, 0x6e, 0x3f, 0x2d, 0x31, 0x3a, 0x6e, 0x3e, 0x74, 0x3f, + 0x31, 0x3a, 0x6e, 0x3e, 0x3d, 0x74, 0x3f, 0x30, 0x3a, 0x30, 0x2f, + 0x30, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x72, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x3d, 0x6e, 0x3f, 0x30, + 0x2f, 0x30, 0x3a, 0x2b, 0x6e, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x21, 0x69, 0x73, 0x4e, 0x61, 0x4e, 0x28, + 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x69, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x7b, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, + 0x75, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3c, 0x33, 0x26, 0x26, 0x28, 0x72, 0x3d, 0x30, 0x29, 0x2c, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3c, 0x34, 0x26, 0x26, 0x28, 0x75, + 0x3d, 0x74, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x3b, + 0x75, 0x3e, 0x72, 0x3b, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x69, + 0x3d, 0x72, 0x2b, 0x75, 0x3e, 0x3e, 0x3e, 0x31, 0x3b, 0x6e, 0x28, + 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x65, 0x29, 0x3c, 0x30, 0x3f, 0x72, + 0x3d, 0x69, 0x2b, 0x31, 0x3a, 0x75, 0x3d, 0x69, 0x7d, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x7d, 0x2c, 0x72, 0x69, 0x67, + 0x68, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x75, 0x29, 0x7b, 0x66, + 0x6f, 0x72, 0x28, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3c, 0x33, 0x26, + 0x26, 0x28, 0x72, 0x3d, 0x30, 0x29, 0x2c, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3c, 0x34, 0x26, 0x26, 0x28, 0x75, 0x3d, 0x74, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x3b, 0x75, 0x3e, 0x72, 0x3b, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, 0x72, 0x2b, 0x75, + 0x3e, 0x3e, 0x3e, 0x31, 0x3b, 0x6e, 0x28, 0x74, 0x5b, 0x69, 0x5d, + 0x2c, 0x65, 0x29, 0x3e, 0x30, 0x3f, 0x75, 0x3d, 0x69, 0x3a, 0x72, + 0x3d, 0x69, 0x2b, 0x31, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x72, 0x7d, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6f, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x61, 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, + 0x72, 0x20, 0x74, 0x3d, 0x31, 0x3b, 0x6e, 0x2a, 0x74, 0x25, 0x31, + 0x3b, 0x29, 0x74, 0x2a, 0x3d, 0x31, 0x30, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, + 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x65, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x29, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x28, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x74, 0x79, 0x70, 0x65, 0x2c, 0x65, 0x2c, 0x7b, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x74, 0x5b, 0x65, 0x5d, 0x2c, 0x65, 0x6e, 0x75, + 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x21, 0x31, 0x7d, + 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6c, 0x28, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x3d, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x28, 0x6e, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x6e, 0x2b, 0x3d, + 0x22, 0x22, 0x29, 0x3d, 0x3d, 0x3d, 0x70, 0x61, 0x7c, 0x7c, 0x6e, + 0x5b, 0x30, 0x5d, 0x3d, 0x3d, 0x3d, 0x76, 0x61, 0x3f, 0x76, 0x61, + 0x2b, 0x6e, 0x3a, 0x6e, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x66, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x28, 0x6e, 0x2b, 0x3d, 0x22, 0x22, 0x29, 0x5b, + 0x30, 0x5d, 0x3d, 0x3d, 0x3d, 0x76, 0x61, 0x3f, 0x6e, 0x2e, 0x73, + 0x6c, 0x69, 0x63, 0x65, 0x28, 0x31, 0x29, 0x3a, 0x6e, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x28, 0x6e, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x28, + 0x6e, 0x29, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, + 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, + 0x6e, 0x3d, 0x73, 0x28, 0x6e, 0x29, 0x29, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x26, 0x26, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x5b, 0x6e, + 0x5d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x70, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6e, 0x3d, 0x5b, + 0x5d, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x29, + 0x6e, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x66, 0x28, 0x74, 0x29, + 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, 0x28, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6e, 0x3d, 0x30, 0x3b, 0x66, + 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x29, 0x2b, 0x2b, 0x6e, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x28, 0x29, + 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x6e, 0x20, + 0x69, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x29, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x21, 0x31, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x21, 0x30, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x28, 0x29, 0x7b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x5f, 0x3d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x28, 0x6e, 0x75, 0x6c, 0x6c, + 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x79, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6e, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x4d, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, + 0x3d, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x74, 0x2c, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x3d, 0x3d, 0x3d, + 0x74, 0x3f, 0x6e, 0x3a, 0x72, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x78, 0x28, 0x6e, 0x2c, 0x74, 0x29, + 0x7b, 0x69, 0x66, 0x28, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x6e, 0x29, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x3b, 0x74, 0x3d, + 0x74, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x41, 0x74, 0x28, 0x30, 0x29, + 0x2e, 0x74, 0x6f, 0x55, 0x70, 0x70, 0x65, 0x72, 0x43, 0x61, 0x73, + 0x65, 0x28, 0x29, 0x2b, 0x74, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, + 0x28, 0x31, 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, + 0x20, 0x65, 0x3d, 0x30, 0x2c, 0x72, 0x3d, 0x64, 0x61, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x72, 0x3e, 0x65, 0x3b, 0x2b, + 0x2b, 0x65, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x75, 0x3d, 0x64, + 0x61, 0x5b, 0x65, 0x5d, 0x2b, 0x74, 0x3b, 0x69, 0x66, 0x28, 0x75, + 0x20, 0x69, 0x6e, 0x20, 0x6e, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x75, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x62, 0x28, 0x29, 0x7b, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x28, 0x29, 0x7b, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x28, + 0x6e, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x74, 0x28, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, + 0x72, 0x20, 0x74, 0x2c, 0x72, 0x3d, 0x65, 0x2c, 0x75, 0x3d, 0x2d, + 0x31, 0x2c, 0x69, 0x3d, 0x72, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3b, 0x2b, 0x2b, 0x75, 0x3c, 0x69, 0x3b, 0x29, 0x28, 0x74, + 0x3d, 0x72, 0x5b, 0x75, 0x5d, 0x2e, 0x6f, 0x6e, 0x29, 0x26, 0x26, + 0x74, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x7d, + 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x5b, 0x5d, 0x2c, 0x72, 0x3d, + 0x6e, 0x65, 0x77, 0x20, 0x6c, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x2e, 0x6f, 0x6e, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x2c, 0x75, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x69, 0x2c, 0x6f, 0x3d, 0x72, 0x2e, 0x67, 0x65, + 0x74, 0x28, 0x74, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3c, 0x32, 0x3f, 0x6f, 0x26, + 0x26, 0x6f, 0x2e, 0x6f, 0x6e, 0x3a, 0x28, 0x6f, 0x26, 0x26, 0x28, + 0x6f, 0x2e, 0x6f, 0x6e, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x65, + 0x3d, 0x65, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x30, 0x2c, + 0x69, 0x3d, 0x65, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, + 0x28, 0x6f, 0x29, 0x29, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, + 0x28, 0x65, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x69, 0x2b, + 0x31, 0x29, 0x29, 0x2c, 0x72, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x28, 0x74, 0x29, 0x29, 0x2c, 0x75, 0x26, 0x26, 0x65, 0x2e, + 0x70, 0x75, 0x73, 0x68, 0x28, 0x72, 0x2e, 0x73, 0x65, 0x74, 0x28, + 0x74, 0x2c, 0x7b, 0x6f, 0x6e, 0x3a, 0x75, 0x7d, 0x29, 0x29, 0x2c, + 0x6e, 0x29, 0x7d, 0x2c, 0x74, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x53, 0x28, 0x29, 0x7b, 0x74, 0x61, 0x2e, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x28, 0x29, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6b, + 0x28, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, + 0x6e, 0x2c, 0x74, 0x3d, 0x74, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3b, 0x6e, 0x3d, 0x74, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x3b, 0x29, 0x74, 0x3d, 0x6e, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x45, 0x28, 0x6e, + 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, + 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x5f, 0x2c, 0x65, 0x3d, 0x30, 0x2c, + 0x72, 0x3d, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x2b, 0x2b, 0x65, + 0x3c, 0x72, 0x3b, 0x29, 0x74, 0x5b, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x5b, 0x65, 0x5d, 0x5d, 0x3d, 0x77, 0x28, + 0x74, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x2e, 0x6f, 0x66, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x75, 0x29, 0x7b, 0x74, 0x72, 0x79, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x69, 0x3d, 0x75, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x74, 0x61, 0x2e, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3b, 0x75, 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x3d, 0x6e, 0x2c, 0x74, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x75, 0x2c, 0x74, 0x5b, 0x75, 0x2e, 0x74, 0x79, 0x70, + 0x65, 0x5d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x65, 0x2c, + 0x72, 0x29, 0x7d, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x7b, + 0x74, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x69, 0x7d, + 0x7d, 0x7d, 0x2c, 0x74, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x41, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x79, 0x61, 0x28, 0x6e, 0x2c, 0x5f, 0x61, + 0x29, 0x2c, 0x6e, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x4e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x6e, + 0x3f, 0x6e, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4d, + 0x61, 0x28, 0x6e, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x29, 0x7d, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x43, 0x28, + 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3d, 0x3d, 0x74, + 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x6e, 0x3f, 0x6e, 0x3a, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x61, 0x28, 0x6e, 0x2c, + 0x74, 0x68, 0x69, 0x73, 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x7a, 0x28, 0x6e, 0x2c, 0x74, 0x29, + 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, + 0x28, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x65, 0x28, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x72, 0x28, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x74, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x65, 0x4e, 0x53, 0x28, 0x6e, 0x2e, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x2c, 0x6e, 0x2e, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x75, 0x28, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, + 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, + 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x28, 0x29, 0x7b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x73, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x65, 0x4e, 0x53, 0x28, 0x6e, 0x2e, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x2c, 0x6e, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2c, + 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6f, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, + 0x74, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x29, 0x3b, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x65, 0x3f, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, + 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x6e, 0x29, + 0x3a, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x41, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x6e, 0x2c, 0x65, + 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x61, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x74, + 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, + 0x3b, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x65, 0x3f, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x4e, 0x53, 0x28, 0x6e, + 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2c, 0x6e, 0x2e, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x29, 0x3a, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, + 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, + 0x4e, 0x53, 0x28, 0x6e, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2c, + 0x6e, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2c, 0x65, 0x29, 0x7d, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x3d, 0x74, 0x61, + 0x2e, 0x6e, 0x73, 0x2e, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x79, + 0x28, 0x6e, 0x29, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x74, + 0x3f, 0x6e, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x3f, 0x72, 0x3a, + 0x65, 0x3a, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x74, + 0x3f, 0x6e, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x3f, 0x61, 0x3a, + 0x6f, 0x3a, 0x6e, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x3f, 0x69, + 0x3a, 0x75, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x71, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x2e, 0x74, 0x72, 0x69, 0x6d, 0x28, 0x29, 0x2e, + 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5c, 0x73, + 0x2b, 0x2f, 0x67, 0x2c, 0x22, 0x20, 0x22, 0x29, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4c, 0x28, 0x6e, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x65, 0x77, + 0x20, 0x52, 0x65, 0x67, 0x45, 0x78, 0x70, 0x28, 0x22, 0x28, 0x3f, + 0x3a, 0x5e, 0x7c, 0x5c, 0x5c, 0x73, 0x2b, 0x29, 0x22, 0x2b, 0x74, + 0x61, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x28, 0x6e, + 0x29, 0x2b, 0x22, 0x28, 0x3f, 0x3a, 0x5c, 0x5c, 0x73, 0x2b, 0x7c, + 0x24, 0x29, 0x22, 0x2c, 0x22, 0x67, 0x22, 0x29, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x54, 0x28, 0x6e, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x6e, 0x2b, 0x22, + 0x22, 0x29, 0x2e, 0x74, 0x72, 0x69, 0x6d, 0x28, 0x29, 0x2e, 0x73, + 0x70, 0x6c, 0x69, 0x74, 0x28, 0x2f, 0x5e, 0x7c, 0x5c, 0x73, 0x2b, + 0x2f, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x52, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x28, 0x29, 0x7b, 0x66, + 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x2d, 0x31, + 0x3b, 0x2b, 0x2b, 0x65, 0x3c, 0x75, 0x3b, 0x29, 0x6e, 0x5b, 0x65, + 0x5d, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x74, 0x29, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x28, 0x29, + 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, + 0x2d, 0x31, 0x2c, 0x72, 0x3d, 0x74, 0x2e, 0x61, 0x70, 0x70, 0x6c, + 0x79, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x3b, 0x2b, 0x2b, 0x65, 0x3c, + 0x75, 0x3b, 0x29, 0x6e, 0x5b, 0x65, 0x5d, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2c, 0x72, 0x29, 0x7d, 0x6e, 0x3d, 0x54, 0x28, 0x6e, 0x29, + 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x44, 0x29, 0x3b, 0x76, 0x61, 0x72, + 0x20, 0x75, 0x3d, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, + 0x65, 0x6f, 0x66, 0x20, 0x74, 0x3f, 0x72, 0x3a, 0x65, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x44, 0x28, 0x6e, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x4c, 0x28, 0x6e, + 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x2c, 0x72, 0x29, + 0x7b, 0x69, 0x66, 0x28, 0x75, 0x3d, 0x65, 0x2e, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x29, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x72, 0x3f, 0x75, 0x2e, 0x61, 0x64, 0x64, 0x28, + 0x6e, 0x29, 0x3a, 0x75, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x28, 0x6e, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x75, 0x3d, 0x65, + 0x2e, 0x67, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x65, 0x28, 0x22, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x22, 0x29, + 0x7c, 0x7c, 0x22, 0x22, 0x3b, 0x72, 0x3f, 0x28, 0x74, 0x2e, 0x6c, + 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x3d, 0x30, 0x2c, + 0x74, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x28, 0x75, 0x29, 0x7c, 0x7c, + 0x65, 0x2e, 0x73, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x65, 0x28, 0x22, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x22, + 0x2c, 0x71, 0x28, 0x75, 0x2b, 0x22, 0x20, 0x22, 0x2b, 0x6e, 0x29, + 0x29, 0x29, 0x3a, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x41, 0x74, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x22, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x22, 0x2c, 0x71, 0x28, 0x75, 0x2e, 0x72, 0x65, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x28, 0x74, 0x2c, 0x22, 0x20, 0x22, 0x29, + 0x29, 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x50, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x28, + 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x79, 0x6c, + 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x6e, 0x29, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x28, 0x29, 0x7b, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x2e, + 0x73, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x28, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x72, 0x3d, 0x74, 0x2e, 0x61, 0x70, 0x70, 0x6c, + 0x79, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x3b, 0x6e, 0x75, 0x6c, 0x6c, + 0x3d, 0x3d, 0x72, 0x3f, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x6e, 0x29, 0x3a, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x2e, + 0x73, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x28, 0x6e, 0x2c, 0x72, 0x2c, 0x65, 0x29, 0x7d, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x74, + 0x3f, 0x72, 0x3a, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, + 0x74, 0x3f, 0x69, 0x3a, 0x75, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x55, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x28, + 0x29, 0x7b, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x5b, 0x6e, 0x5d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x28, 0x29, 0x7b, 0x74, 0x68, 0x69, + 0x73, 0x5b, 0x6e, 0x5d, 0x3d, 0x74, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x28, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x65, 0x3d, 0x74, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, + 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x29, 0x3b, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, + 0x3d, 0x65, 0x3f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x5b, 0x6e, 0x5d, 0x3a, 0x74, 0x68, 0x69, 0x73, + 0x5b, 0x6e, 0x5d, 0x3d, 0x65, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x74, 0x3f, 0x65, + 0x3a, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3d, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x74, 0x3f, + 0x75, 0x3a, 0x72, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6a, 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x28, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x74, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x77, + 0x6e, 0x65, 0x72, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x2c, 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x55, 0x52, 0x49, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x3f, 0x74, 0x2e, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x4e, 0x53, 0x28, 0x65, 0x2c, 0x6e, 0x29, 0x3a, 0x74, 0x2e, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x28, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x77, + 0x6e, 0x65, 0x72, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x4e, 0x53, 0x28, 0x6e, 0x2e, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x2c, 0x6e, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x29, + 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, + 0x65, 0x6f, 0x66, 0x20, 0x6e, 0x3f, 0x6e, 0x3a, 0x28, 0x6e, 0x3d, + 0x74, 0x61, 0x2e, 0x6e, 0x73, 0x2e, 0x71, 0x75, 0x61, 0x6c, 0x69, + 0x66, 0x79, 0x28, 0x6e, 0x29, 0x29, 0x2e, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x3f, 0x65, 0x3a, 0x74, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x46, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x6e, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x3b, 0x6e, 0x26, 0x26, + 0x6e, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x68, 0x69, + 0x6c, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x48, 0x28, 0x6e, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7b, 0x5f, 0x5f, 0x64, + 0x61, 0x74, 0x61, 0x5f, 0x5f, 0x3a, 0x6e, 0x7d, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4f, 0x28, 0x6e, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x62, 0x61, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x2c, 0x6e, 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x49, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x7c, 0x7c, + 0x28, 0x6e, 0x3d, 0x65, 0x29, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x26, 0x26, 0x65, 0x3f, 0x6e, + 0x28, 0x74, 0x2e, 0x5f, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x5f, + 0x2c, 0x65, 0x2e, 0x5f, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x5f, + 0x29, 0x3a, 0x21, 0x74, 0x2d, 0x21, 0x65, 0x7d, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x59, 0x28, 0x6e, 0x2c, + 0x74, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, + 0x65, 0x3d, 0x30, 0x2c, 0x72, 0x3d, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3b, 0x72, 0x3e, 0x65, 0x3b, 0x65, 0x2b, 0x2b, + 0x29, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x75, 0x2c, + 0x69, 0x3d, 0x6e, 0x5b, 0x65, 0x5d, 0x2c, 0x6f, 0x3d, 0x30, 0x2c, + 0x61, 0x3d, 0x69, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, + 0x61, 0x3e, 0x6f, 0x3b, 0x6f, 0x2b, 0x2b, 0x29, 0x28, 0x75, 0x3d, + 0x69, 0x5b, 0x6f, 0x5d, 0x29, 0x26, 0x26, 0x74, 0x28, 0x75, 0x2c, + 0x6f, 0x2c, 0x65, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6e, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x5a, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x79, 0x61, 0x28, 0x6e, 0x2c, 0x53, 0x61, 0x29, 0x2c, + 0x6e, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x56, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x2c, + 0x65, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x72, 0x2c, 0x75, 0x2c, + 0x69, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6f, 0x2c, 0x61, 0x3d, + 0x6e, 0x5b, 0x69, 0x5d, 0x2e, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x2c, 0x63, 0x3d, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x69, 0x21, 0x3d, 0x65, 0x26, 0x26, + 0x28, 0x65, 0x3d, 0x69, 0x2c, 0x74, 0x3d, 0x30, 0x29, 0x2c, 0x75, + 0x3e, 0x3d, 0x74, 0x26, 0x26, 0x28, 0x74, 0x3d, 0x75, 0x2b, 0x31, + 0x29, 0x3b, 0x21, 0x28, 0x6f, 0x3d, 0x61, 0x5b, 0x74, 0x5d, 0x29, + 0x26, 0x26, 0x2b, 0x2b, 0x74, 0x3c, 0x63, 0x3b, 0x29, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x7d, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x58, 0x28, 0x6e, 0x2c, + 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x72, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x74, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x5b, 0x6f, 0x5d, 0x3b, 0x74, + 0x26, 0x26, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x74, + 0x2e, 0x24, 0x29, 0x2c, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x5b, 0x6f, 0x5d, 0x29, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x28, 0x29, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x75, 0x3d, 0x63, 0x28, 0x74, 0x2c, 0x72, + 0x61, 0x28, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x29, 0x29, 0x3b, 0x72, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, + 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x65, 0x72, 0x28, 0x6e, 0x2c, 0x74, 0x68, 0x69, 0x73, + 0x5b, 0x6f, 0x5d, 0x3d, 0x75, 0x2c, 0x75, 0x2e, 0x24, 0x3d, 0x65, + 0x29, 0x2c, 0x75, 0x2e, 0x5f, 0x3d, 0x74, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x28, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x74, 0x2c, 0x65, 0x3d, 0x6e, 0x65, 0x77, 0x20, + 0x52, 0x65, 0x67, 0x45, 0x78, 0x70, 0x28, 0x22, 0x5e, 0x5f, 0x5f, + 0x6f, 0x6e, 0x28, 0x5b, 0x5e, 0x2e, 0x5d, 0x2b, 0x29, 0x22, 0x2b, + 0x74, 0x61, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x28, + 0x6e, 0x29, 0x2b, 0x22, 0x24, 0x22, 0x29, 0x3b, 0x66, 0x6f, 0x72, + 0x28, 0x76, 0x61, 0x72, 0x20, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x29, 0x69, 0x66, 0x28, 0x74, 0x3d, 0x72, 0x2e, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x29, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x75, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x5b, 0x72, + 0x5d, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x65, 0x72, 0x28, 0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x75, + 0x2c, 0x75, 0x2e, 0x24, 0x29, 0x2c, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x5b, 0x72, 0x5d, 0x7d, 0x7d, + 0x76, 0x61, 0x72, 0x20, 0x6f, 0x3d, 0x22, 0x5f, 0x5f, 0x6f, 0x6e, + 0x22, 0x2b, 0x6e, 0x2c, 0x61, 0x3d, 0x6e, 0x2e, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x4f, 0x66, 0x28, 0x22, 0x2e, 0x22, 0x29, 0x2c, 0x63, + 0x3d, 0x24, 0x3b, 0x61, 0x3e, 0x30, 0x26, 0x26, 0x28, 0x6e, 0x3d, + 0x6e, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x30, 0x2c, 0x61, + 0x29, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x6c, 0x3d, 0x6b, 0x61, + 0x2e, 0x67, 0x65, 0x74, 0x28, 0x6e, 0x29, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x26, 0x26, 0x28, 0x6e, 0x3d, 0x6c, + 0x2c, 0x63, 0x3d, 0x42, 0x29, 0x2c, 0x61, 0x3f, 0x74, 0x3f, 0x75, + 0x3a, 0x72, 0x3a, 0x74, 0x3f, 0x62, 0x3a, 0x69, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x24, 0x28, 0x6e, 0x2c, + 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x29, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x74, 0x61, 0x2e, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3b, 0x74, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x65, 0x2c, 0x74, 0x5b, 0x30, 0x5d, 0x3d, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x5f, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x5f, + 0x3b, 0x74, 0x72, 0x79, 0x7b, 0x6e, 0x2e, 0x61, 0x70, 0x70, 0x6c, + 0x79, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x74, 0x29, 0x7d, 0x66, + 0x69, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x7b, 0x74, 0x61, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x72, 0x7d, 0x7d, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x42, 0x28, 0x6e, 0x2c, + 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x24, 0x28, + 0x6e, 0x2c, 0x74, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x74, 0x68, 0x69, + 0x73, 0x2c, 0x72, 0x3d, 0x6e, 0x2e, 0x72, 0x65, 0x6c, 0x61, 0x74, + 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3b, 0x72, 0x26, + 0x26, 0x28, 0x72, 0x3d, 0x3d, 0x3d, 0x74, 0x7c, 0x7c, 0x38, 0x26, + 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x29, 0x7c, 0x7c, 0x65, 0x2e, + 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x2c, 0x6e, 0x29, 0x7d, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x57, 0x28, + 0x65, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x22, 0x2e, + 0x64, 0x72, 0x61, 0x67, 0x73, 0x75, 0x70, 0x70, 0x72, 0x65, 0x73, + 0x73, 0x2d, 0x22, 0x2b, 0x20, 0x2b, 0x2b, 0x41, 0x61, 0x2c, 0x75, + 0x3d, 0x22, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x22, 0x2b, 0x72, 0x2c, + 0x69, 0x3d, 0x74, 0x61, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x28, 0x74, 0x28, 0x65, 0x29, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x22, + 0x74, 0x6f, 0x75, 0x63, 0x68, 0x6d, 0x6f, 0x76, 0x65, 0x22, 0x2b, + 0x72, 0x2c, 0x53, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x22, 0x64, 0x72, + 0x61, 0x67, 0x73, 0x74, 0x61, 0x72, 0x74, 0x22, 0x2b, 0x72, 0x2c, + 0x53, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x22, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x73, 0x74, 0x61, 0x72, 0x74, 0x22, 0x2b, 0x72, 0x2c, + 0x53, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, + 0x3d, 0x45, 0x61, 0x26, 0x26, 0x28, 0x45, 0x61, 0x3d, 0x22, 0x6f, + 0x6e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x22, 0x69, 0x6e, 0x20, 0x65, 0x3f, 0x21, 0x31, 0x3a, 0x78, + 0x28, 0x65, 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x2c, 0x22, 0x75, + 0x73, 0x65, 0x72, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x22, 0x29, + 0x29, 0x2c, 0x45, 0x61, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6f, + 0x3d, 0x6e, 0x28, 0x65, 0x29, 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, + 0x2c, 0x61, 0x3d, 0x6f, 0x5b, 0x45, 0x61, 0x5d, 0x3b, 0x6f, 0x5b, + 0x45, 0x61, 0x5d, 0x3d, 0x22, 0x6e, 0x6f, 0x6e, 0x65, 0x22, 0x7d, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x69, 0x66, 0x28, + 0x69, 0x2e, 0x6f, 0x6e, 0x28, 0x72, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, + 0x29, 0x2c, 0x45, 0x61, 0x26, 0x26, 0x28, 0x6f, 0x5b, 0x45, 0x61, + 0x5d, 0x3d, 0x61, 0x29, 0x2c, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x7b, 0x69, 0x2e, 0x6f, 0x6e, 0x28, 0x75, 0x2c, 0x6e, + 0x75, 0x6c, 0x6c, 0x29, 0x7d, 0x3b, 0x69, 0x2e, 0x6f, 0x6e, 0x28, + 0x75, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x29, 0x7b, 0x53, 0x28, 0x29, 0x2c, 0x74, 0x28, 0x29, 0x7d, 0x2c, + 0x21, 0x30, 0x29, 0x2c, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x28, 0x74, 0x2c, 0x30, 0x29, 0x7d, 0x7d, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4a, 0x28, + 0x6e, 0x2c, 0x65, 0x29, 0x7b, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x64, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x73, 0x26, + 0x26, 0x28, 0x65, 0x3d, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x64, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x73, 0x5b, 0x30, + 0x5d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x6e, 0x2e, + 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x53, 0x56, 0x47, 0x45, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x7c, 0x7c, 0x6e, 0x3b, 0x69, 0x66, 0x28, + 0x72, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x56, 0x47, + 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x75, 0x3d, 0x72, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, + 0x56, 0x47, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x29, 0x3b, 0x69, + 0x66, 0x28, 0x30, 0x3e, 0x4e, 0x61, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x69, 0x3d, 0x74, 0x28, 0x6e, 0x29, 0x3b, 0x69, 0x66, 0x28, + 0x69, 0x2e, 0x73, 0x63, 0x72, 0x6f, 0x6c, 0x6c, 0x58, 0x7c, 0x7c, + 0x69, 0x2e, 0x73, 0x63, 0x72, 0x6f, 0x6c, 0x6c, 0x59, 0x29, 0x7b, + 0x72, 0x3d, 0x74, 0x61, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x28, 0x22, 0x62, 0x6f, 0x64, 0x79, 0x22, 0x29, 0x2e, 0x61, 0x70, + 0x70, 0x65, 0x6e, 0x64, 0x28, 0x22, 0x73, 0x76, 0x67, 0x22, 0x29, + 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x28, 0x7b, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x22, 0x61, 0x62, 0x73, 0x6f, + 0x6c, 0x75, 0x74, 0x65, 0x22, 0x2c, 0x74, 0x6f, 0x70, 0x3a, 0x30, + 0x2c, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x30, 0x2c, 0x6d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x3a, 0x30, 0x2c, 0x70, 0x61, 0x64, 0x64, 0x69, + 0x6e, 0x67, 0x3a, 0x30, 0x2c, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x3a, 0x22, 0x6e, 0x6f, 0x6e, 0x65, 0x22, 0x7d, 0x2c, 0x22, 0x69, + 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x22, 0x29, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x6f, 0x3d, 0x72, 0x5b, 0x30, 0x5d, 0x5b, + 0x30, 0x5d, 0x2e, 0x67, 0x65, 0x74, 0x53, 0x63, 0x72, 0x65, 0x65, + 0x6e, 0x43, 0x54, 0x4d, 0x28, 0x29, 0x3b, 0x4e, 0x61, 0x3d, 0x21, + 0x28, 0x6f, 0x2e, 0x66, 0x7c, 0x7c, 0x6f, 0x2e, 0x65, 0x29, 0x2c, + 0x72, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x29, 0x7d, + 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4e, 0x61, 0x3f, + 0x28, 0x75, 0x2e, 0x78, 0x3d, 0x65, 0x2e, 0x70, 0x61, 0x67, 0x65, + 0x58, 0x2c, 0x75, 0x2e, 0x79, 0x3d, 0x65, 0x2e, 0x70, 0x61, 0x67, + 0x65, 0x59, 0x29, 0x3a, 0x28, 0x75, 0x2e, 0x78, 0x3d, 0x65, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x58, 0x2c, 0x75, 0x2e, 0x79, + 0x3d, 0x65, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x59, 0x29, + 0x2c, 0x75, 0x3d, 0x75, 0x2e, 0x6d, 0x61, 0x74, 0x72, 0x69, 0x78, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x6e, + 0x2e, 0x67, 0x65, 0x74, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x43, + 0x54, 0x4d, 0x28, 0x29, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x72, 0x73, + 0x65, 0x28, 0x29, 0x29, 0x2c, 0x5b, 0x75, 0x2e, 0x78, 0x2c, 0x75, + 0x2e, 0x79, 0x5d, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x61, 0x3d, 0x6e, + 0x2e, 0x67, 0x65, 0x74, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x74, + 0x28, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, 0x65, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x58, 0x2d, 0x61, 0x2e, + 0x6c, 0x65, 0x66, 0x74, 0x2d, 0x6e, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x4c, 0x65, 0x66, 0x74, 0x2c, 0x65, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x59, 0x2d, 0x61, 0x2e, 0x74, 0x6f, 0x70, + 0x2d, 0x6e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x6f, + 0x70, 0x5d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x47, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x54, 0x6f, 0x75, 0x63, 0x68, + 0x65, 0x73, 0x5b, 0x30, 0x5d, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x4b, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x3e, 0x30, 0x3f, 0x31, 0x3a, + 0x30, 0x3e, 0x6e, 0x3f, 0x2d, 0x31, 0x3a, 0x30, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x51, 0x28, 0x6e, 0x2c, + 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x28, 0x74, 0x5b, 0x30, 0x5d, 0x2d, 0x6e, 0x5b, 0x30, 0x5d, 0x29, + 0x2a, 0x28, 0x65, 0x5b, 0x31, 0x5d, 0x2d, 0x6e, 0x5b, 0x31, 0x5d, + 0x29, 0x2d, 0x28, 0x74, 0x5b, 0x31, 0x5d, 0x2d, 0x6e, 0x5b, 0x31, + 0x5d, 0x29, 0x2a, 0x28, 0x65, 0x5b, 0x30, 0x5d, 0x2d, 0x6e, 0x5b, + 0x30, 0x5d, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6e, 0x74, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x3e, 0x31, 0x3f, 0x30, 0x3a, 0x2d, + 0x31, 0x3e, 0x6e, 0x3f, 0x71, 0x61, 0x3a, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x61, 0x63, 0x6f, 0x73, 0x28, 0x6e, 0x29, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x74, 0x28, 0x6e, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x3e, + 0x31, 0x3f, 0x52, 0x61, 0x3a, 0x2d, 0x31, 0x3e, 0x6e, 0x3f, 0x2d, + 0x52, 0x61, 0x3a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x61, 0x73, 0x69, + 0x6e, 0x28, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x65, 0x74, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x28, 0x28, 0x6e, 0x3d, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x65, 0x78, 0x70, 0x28, 0x6e, 0x29, 0x29, 0x2d, 0x31, + 0x2f, 0x6e, 0x29, 0x2f, 0x32, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x74, 0x28, 0x6e, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x28, 0x6e, 0x3d, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x65, 0x78, 0x70, 0x28, 0x6e, 0x29, 0x29, 0x2b, + 0x31, 0x2f, 0x6e, 0x29, 0x2f, 0x32, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x74, 0x28, 0x6e, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x28, 0x6e, 0x3d, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x65, 0x78, 0x70, 0x28, 0x32, 0x2a, 0x6e, + 0x29, 0x29, 0x2d, 0x31, 0x29, 0x2f, 0x28, 0x6e, 0x2b, 0x31, 0x29, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, + 0x74, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x28, 0x6e, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, + 0x28, 0x6e, 0x2f, 0x32, 0x29, 0x29, 0x2a, 0x6e, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x74, 0x28, 0x29, + 0x7b, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x61, 0x74, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, + 0x61, 0x74, 0x3f, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x68, 0x3d, + 0x2b, 0x6e, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x3d, 0x2b, + 0x74, 0x2c, 0x76, 0x6f, 0x69, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x6c, 0x3d, 0x2b, 0x65, 0x29, 0x29, 0x3a, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3c, 0x32, 0x3f, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, 0x61, 0x74, 0x3f, 0x6e, + 0x65, 0x77, 0x20, 0x61, 0x74, 0x28, 0x6e, 0x2e, 0x68, 0x2c, 0x6e, + 0x2e, 0x73, 0x2c, 0x6e, 0x2e, 0x6c, 0x29, 0x3a, 0x62, 0x74, 0x28, + 0x22, 0x22, 0x2b, 0x6e, 0x2c, 0x5f, 0x74, 0x2c, 0x61, 0x74, 0x29, + 0x3a, 0x6e, 0x65, 0x77, 0x20, 0x61, 0x74, 0x28, 0x6e, 0x2c, 0x74, + 0x2c, 0x65, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x63, 0x74, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, + 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, + 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x3e, 0x33, 0x36, 0x30, 0x3f, 0x6e, 0x2d, 0x3d, 0x33, 0x36, + 0x30, 0x3a, 0x30, 0x3e, 0x6e, 0x26, 0x26, 0x28, 0x6e, 0x2b, 0x3d, + 0x33, 0x36, 0x30, 0x29, 0x2c, 0x36, 0x30, 0x3e, 0x6e, 0x3f, 0x69, + 0x2b, 0x28, 0x6f, 0x2d, 0x69, 0x29, 0x2a, 0x6e, 0x2f, 0x36, 0x30, + 0x3a, 0x31, 0x38, 0x30, 0x3e, 0x6e, 0x3f, 0x6f, 0x3a, 0x32, 0x34, + 0x30, 0x3e, 0x6e, 0x3f, 0x69, 0x2b, 0x28, 0x6f, 0x2d, 0x69, 0x29, + 0x2a, 0x28, 0x32, 0x34, 0x30, 0x2d, 0x6e, 0x29, 0x2f, 0x36, 0x30, + 0x3a, 0x69, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x75, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x28, 0x32, 0x35, 0x35, 0x2a, 0x72, 0x28, 0x6e, 0x29, 0x29, + 0x7d, 0x76, 0x61, 0x72, 0x20, 0x69, 0x2c, 0x6f, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x3d, 0x69, 0x73, 0x4e, 0x61, + 0x4e, 0x28, 0x6e, 0x29, 0x3f, 0x30, 0x3a, 0x28, 0x6e, 0x25, 0x3d, + 0x33, 0x36, 0x30, 0x29, 0x3c, 0x30, 0x3f, 0x6e, 0x2b, 0x33, 0x36, + 0x30, 0x3a, 0x6e, 0x2c, 0x74, 0x3d, 0x69, 0x73, 0x4e, 0x61, 0x4e, + 0x28, 0x74, 0x29, 0x3f, 0x30, 0x3a, 0x30, 0x3e, 0x74, 0x3f, 0x30, + 0x3a, 0x74, 0x3e, 0x31, 0x3f, 0x31, 0x3a, 0x74, 0x2c, 0x65, 0x3d, + 0x30, 0x3e, 0x65, 0x3f, 0x30, 0x3a, 0x65, 0x3e, 0x31, 0x3f, 0x31, + 0x3a, 0x65, 0x2c, 0x6f, 0x3d, 0x2e, 0x35, 0x3e, 0x3d, 0x65, 0x3f, + 0x65, 0x2a, 0x28, 0x31, 0x2b, 0x74, 0x29, 0x3a, 0x65, 0x2b, 0x74, + 0x2d, 0x65, 0x2a, 0x74, 0x2c, 0x69, 0x3d, 0x32, 0x2a, 0x65, 0x2d, + 0x6f, 0x2c, 0x6e, 0x65, 0x77, 0x20, 0x6d, 0x74, 0x28, 0x75, 0x28, + 0x6e, 0x2b, 0x31, 0x32, 0x30, 0x29, 0x2c, 0x75, 0x28, 0x6e, 0x29, + 0x2c, 0x75, 0x28, 0x6e, 0x2d, 0x31, 0x32, 0x30, 0x29, 0x29, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x74, + 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, 0x6c, 0x74, + 0x3f, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x68, 0x3d, 0x2b, 0x6e, + 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x3d, 0x2b, 0x74, 0x2c, + 0x76, 0x6f, 0x69, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, + 0x3d, 0x2b, 0x65, 0x29, 0x29, 0x3a, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3c, 0x32, 0x3f, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x6f, 0x66, 0x20, 0x6c, 0x74, 0x3f, 0x6e, 0x65, 0x77, + 0x20, 0x6c, 0x74, 0x28, 0x6e, 0x2e, 0x68, 0x2c, 0x6e, 0x2e, 0x63, + 0x2c, 0x6e, 0x2e, 0x6c, 0x29, 0x3a, 0x6e, 0x20, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, 0x66, 0x74, 0x3f, + 0x67, 0x74, 0x28, 0x6e, 0x2e, 0x6c, 0x2c, 0x6e, 0x2e, 0x61, 0x2c, + 0x6e, 0x2e, 0x62, 0x29, 0x3a, 0x67, 0x74, 0x28, 0x28, 0x6e, 0x3d, + 0x77, 0x74, 0x28, 0x28, 0x6e, 0x3d, 0x74, 0x61, 0x2e, 0x72, 0x67, + 0x62, 0x28, 0x6e, 0x29, 0x29, 0x2e, 0x72, 0x2c, 0x6e, 0x2e, 0x67, + 0x2c, 0x6e, 0x2e, 0x62, 0x29, 0x29, 0x2e, 0x6c, 0x2c, 0x6e, 0x2e, + 0x61, 0x2c, 0x6e, 0x2e, 0x62, 0x29, 0x3a, 0x6e, 0x65, 0x77, 0x20, + 0x6c, 0x74, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x74, 0x28, + 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x69, 0x73, 0x4e, 0x61, 0x4e, 0x28, 0x6e, 0x29, + 0x26, 0x26, 0x28, 0x6e, 0x3d, 0x30, 0x29, 0x2c, 0x69, 0x73, 0x4e, + 0x61, 0x4e, 0x28, 0x74, 0x29, 0x26, 0x26, 0x28, 0x74, 0x3d, 0x30, + 0x29, 0x2c, 0x6e, 0x65, 0x77, 0x20, 0x66, 0x74, 0x28, 0x65, 0x2c, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x6e, 0x2a, + 0x3d, 0x44, 0x61, 0x29, 0x2a, 0x74, 0x2c, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x6e, 0x29, 0x2a, 0x74, 0x29, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x74, + 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, 0x66, 0x74, + 0x3f, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x3d, 0x2b, 0x6e, + 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x3d, 0x2b, 0x74, 0x2c, + 0x76, 0x6f, 0x69, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x62, + 0x3d, 0x2b, 0x65, 0x29, 0x29, 0x3a, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3c, 0x32, 0x3f, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x6f, 0x66, 0x20, 0x66, 0x74, 0x3f, 0x6e, 0x65, 0x77, + 0x20, 0x66, 0x74, 0x28, 0x6e, 0x2e, 0x6c, 0x2c, 0x6e, 0x2e, 0x61, + 0x2c, 0x6e, 0x2e, 0x62, 0x29, 0x3a, 0x6e, 0x20, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, 0x6c, 0x74, 0x3f, + 0x73, 0x74, 0x28, 0x6e, 0x2e, 0x68, 0x2c, 0x6e, 0x2e, 0x63, 0x2c, + 0x6e, 0x2e, 0x6c, 0x29, 0x3a, 0x77, 0x74, 0x28, 0x28, 0x6e, 0x3d, + 0x6d, 0x74, 0x28, 0x6e, 0x29, 0x29, 0x2e, 0x72, 0x2c, 0x6e, 0x2e, + 0x67, 0x2c, 0x6e, 0x2e, 0x62, 0x29, 0x3a, 0x6e, 0x65, 0x77, 0x20, + 0x66, 0x74, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x74, 0x28, + 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x72, 0x3d, 0x28, 0x6e, 0x2b, 0x31, 0x36, 0x29, 0x2f, 0x31, 0x31, + 0x36, 0x2c, 0x75, 0x3d, 0x72, 0x2b, 0x74, 0x2f, 0x35, 0x30, 0x30, + 0x2c, 0x69, 0x3d, 0x72, 0x2d, 0x65, 0x2f, 0x32, 0x30, 0x30, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x3d, 0x70, 0x74, + 0x28, 0x75, 0x29, 0x2a, 0x58, 0x61, 0x2c, 0x72, 0x3d, 0x70, 0x74, + 0x28, 0x72, 0x29, 0x2a, 0x24, 0x61, 0x2c, 0x69, 0x3d, 0x70, 0x74, + 0x28, 0x69, 0x29, 0x2a, 0x42, 0x61, 0x2c, 0x6e, 0x65, 0x77, 0x20, + 0x6d, 0x74, 0x28, 0x64, 0x74, 0x28, 0x33, 0x2e, 0x32, 0x34, 0x30, + 0x34, 0x35, 0x34, 0x32, 0x2a, 0x75, 0x2d, 0x31, 0x2e, 0x35, 0x33, + 0x37, 0x31, 0x33, 0x38, 0x35, 0x2a, 0x72, 0x2d, 0x2e, 0x34, 0x39, + 0x38, 0x35, 0x33, 0x31, 0x34, 0x2a, 0x69, 0x29, 0x2c, 0x64, 0x74, + 0x28, 0x2d, 0x2e, 0x39, 0x36, 0x39, 0x32, 0x36, 0x36, 0x2a, 0x75, + 0x2b, 0x31, 0x2e, 0x38, 0x37, 0x36, 0x30, 0x31, 0x30, 0x38, 0x2a, + 0x72, 0x2b, 0x2e, 0x30, 0x34, 0x31, 0x35, 0x35, 0x36, 0x2a, 0x69, + 0x29, 0x2c, 0x64, 0x74, 0x28, 0x2e, 0x30, 0x35, 0x35, 0x36, 0x34, + 0x33, 0x34, 0x2a, 0x75, 0x2d, 0x2e, 0x32, 0x30, 0x34, 0x30, 0x32, + 0x35, 0x39, 0x2a, 0x72, 0x2b, 0x31, 0x2e, 0x30, 0x35, 0x37, 0x32, + 0x32, 0x35, 0x32, 0x2a, 0x69, 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x74, 0x28, 0x6e, 0x2c, + 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6e, 0x3e, 0x30, 0x3f, 0x6e, 0x65, 0x77, 0x20, 0x6c, 0x74, + 0x28, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x61, 0x74, 0x61, 0x6e, 0x32, + 0x28, 0x65, 0x2c, 0x74, 0x29, 0x2a, 0x50, 0x61, 0x2c, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x73, 0x71, 0x72, 0x74, 0x28, 0x74, 0x2a, 0x74, + 0x2b, 0x65, 0x2a, 0x65, 0x29, 0x2c, 0x6e, 0x29, 0x3a, 0x6e, 0x65, + 0x77, 0x20, 0x6c, 0x74, 0x28, 0x30, 0x2f, 0x30, 0x2c, 0x30, 0x2f, + 0x30, 0x2c, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x70, 0x74, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x3e, 0x2e, 0x32, 0x30, 0x36, + 0x38, 0x39, 0x33, 0x30, 0x33, 0x34, 0x3f, 0x6e, 0x2a, 0x6e, 0x2a, + 0x6e, 0x3a, 0x28, 0x6e, 0x2d, 0x34, 0x2f, 0x32, 0x39, 0x29, 0x2f, + 0x37, 0x2e, 0x37, 0x38, 0x37, 0x30, 0x33, 0x37, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, 0x74, 0x28, 0x6e, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x3e, + 0x2e, 0x30, 0x30, 0x38, 0x38, 0x35, 0x36, 0x3f, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x70, 0x6f, 0x77, 0x28, 0x6e, 0x2c, 0x31, 0x2f, 0x33, + 0x29, 0x3a, 0x37, 0x2e, 0x37, 0x38, 0x37, 0x30, 0x33, 0x37, 0x2a, + 0x6e, 0x2b, 0x34, 0x2f, 0x32, 0x39, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x74, 0x28, 0x6e, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x28, 0x32, 0x35, 0x35, 0x2a, + 0x28, 0x2e, 0x30, 0x30, 0x33, 0x30, 0x34, 0x3e, 0x3d, 0x6e, 0x3f, + 0x31, 0x32, 0x2e, 0x39, 0x32, 0x2a, 0x6e, 0x3a, 0x31, 0x2e, 0x30, + 0x35, 0x35, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x70, 0x6f, 0x77, + 0x28, 0x6e, 0x2c, 0x31, 0x2f, 0x32, 0x2e, 0x34, 0x29, 0x2d, 0x2e, + 0x30, 0x35, 0x35, 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x74, 0x28, 0x6e, 0x2c, 0x74, 0x2c, + 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x6f, 0x66, 0x20, 0x6d, 0x74, 0x3f, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x72, 0x3d, 0x7e, 0x7e, 0x6e, 0x2c, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x67, 0x3d, 0x7e, 0x7e, 0x74, 0x2c, 0x76, 0x6f, 0x69, + 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x62, 0x3d, 0x7e, 0x7e, + 0x65, 0x29, 0x29, 0x3a, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3c, 0x32, + 0x3f, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x6f, 0x66, 0x20, 0x6d, 0x74, 0x3f, 0x6e, 0x65, 0x77, 0x20, 0x6d, + 0x74, 0x28, 0x6e, 0x2e, 0x72, 0x2c, 0x6e, 0x2e, 0x67, 0x2c, 0x6e, + 0x2e, 0x62, 0x29, 0x3a, 0x62, 0x74, 0x28, 0x22, 0x22, 0x2b, 0x6e, + 0x2c, 0x6d, 0x74, 0x2c, 0x63, 0x74, 0x29, 0x3a, 0x6e, 0x65, 0x77, + 0x20, 0x6d, 0x74, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x79, 0x74, + 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x65, 0x77, 0x20, 0x6d, 0x74, 0x28, 0x6e, 0x3e, 0x3e, 0x31, + 0x36, 0x2c, 0x6e, 0x3e, 0x3e, 0x38, 0x26, 0x32, 0x35, 0x35, 0x2c, + 0x32, 0x35, 0x35, 0x26, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x74, 0x28, 0x6e, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x79, 0x74, 0x28, 0x6e, + 0x29, 0x2b, 0x22, 0x22, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x78, 0x74, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x36, 0x3e, 0x6e, 0x3f, 0x22, + 0x30, 0x22, 0x2b, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, + 0x28, 0x30, 0x2c, 0x6e, 0x29, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x31, 0x36, 0x29, 0x3a, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x32, 0x35, 0x35, 0x2c, 0x6e, + 0x29, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, + 0x31, 0x36, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x62, 0x74, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, + 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x2c, 0x75, 0x2c, 0x69, 0x2c, + 0x6f, 0x3d, 0x30, 0x2c, 0x61, 0x3d, 0x30, 0x2c, 0x63, 0x3d, 0x30, + 0x3b, 0x69, 0x66, 0x28, 0x72, 0x3d, 0x2f, 0x28, 0x5b, 0x61, 0x2d, + 0x7a, 0x5d, 0x2b, 0x29, 0x5c, 0x28, 0x28, 0x2e, 0x2a, 0x29, 0x5c, + 0x29, 0x2f, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x28, 0x6e, 0x3d, 0x6e, + 0x2e, 0x74, 0x6f, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x43, 0x61, 0x73, + 0x65, 0x28, 0x29, 0x29, 0x29, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, + 0x28, 0x75, 0x3d, 0x72, 0x5b, 0x32, 0x5d, 0x2e, 0x73, 0x70, 0x6c, + 0x69, 0x74, 0x28, 0x22, 0x2c, 0x22, 0x29, 0x2c, 0x72, 0x5b, 0x31, + 0x5d, 0x29, 0x7b, 0x63, 0x61, 0x73, 0x65, 0x22, 0x68, 0x73, 0x6c, + 0x22, 0x3a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x28, + 0x70, 0x61, 0x72, 0x73, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x28, + 0x75, 0x5b, 0x30, 0x5d, 0x29, 0x2c, 0x70, 0x61, 0x72, 0x73, 0x65, + 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x75, 0x5b, 0x31, 0x5d, 0x29, + 0x2f, 0x31, 0x30, 0x30, 0x2c, 0x70, 0x61, 0x72, 0x73, 0x65, 0x46, + 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x75, 0x5b, 0x32, 0x5d, 0x29, 0x2f, + 0x31, 0x30, 0x30, 0x29, 0x3b, 0x63, 0x61, 0x73, 0x65, 0x22, 0x72, + 0x67, 0x62, 0x22, 0x3a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x28, 0x6b, 0x74, 0x28, 0x75, 0x5b, 0x30, 0x5d, 0x29, 0x2c, + 0x6b, 0x74, 0x28, 0x75, 0x5b, 0x31, 0x5d, 0x29, 0x2c, 0x6b, 0x74, + 0x28, 0x75, 0x5b, 0x32, 0x5d, 0x29, 0x29, 0x7d, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x28, 0x69, 0x3d, 0x47, 0x61, 0x2e, 0x67, 0x65, + 0x74, 0x28, 0x6e, 0x29, 0x29, 0x3f, 0x74, 0x28, 0x69, 0x2e, 0x72, + 0x2c, 0x69, 0x2e, 0x67, 0x2c, 0x69, 0x2e, 0x62, 0x29, 0x3a, 0x28, + 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x6e, 0x7c, 0x7c, 0x22, 0x23, + 0x22, 0x21, 0x3d, 0x3d, 0x6e, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x41, + 0x74, 0x28, 0x30, 0x29, 0x7c, 0x7c, 0x69, 0x73, 0x4e, 0x61, 0x4e, + 0x28, 0x69, 0x3d, 0x70, 0x61, 0x72, 0x73, 0x65, 0x49, 0x6e, 0x74, + 0x28, 0x6e, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x31, 0x29, + 0x2c, 0x31, 0x36, 0x29, 0x29, 0x7c, 0x7c, 0x28, 0x34, 0x3d, 0x3d, + 0x3d, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, + 0x6f, 0x3d, 0x28, 0x33, 0x38, 0x34, 0x30, 0x26, 0x69, 0x29, 0x3e, + 0x3e, 0x34, 0x2c, 0x6f, 0x3d, 0x6f, 0x3e, 0x3e, 0x34, 0x7c, 0x6f, + 0x2c, 0x61, 0x3d, 0x32, 0x34, 0x30, 0x26, 0x69, 0x2c, 0x61, 0x3d, + 0x61, 0x3e, 0x3e, 0x34, 0x7c, 0x61, 0x2c, 0x63, 0x3d, 0x31, 0x35, + 0x26, 0x69, 0x2c, 0x63, 0x3d, 0x63, 0x3c, 0x3c, 0x34, 0x7c, 0x63, + 0x29, 0x3a, 0x37, 0x3d, 0x3d, 0x3d, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x26, 0x26, 0x28, 0x6f, 0x3d, 0x28, 0x31, 0x36, + 0x37, 0x31, 0x31, 0x36, 0x38, 0x30, 0x26, 0x69, 0x29, 0x3e, 0x3e, + 0x31, 0x36, 0x2c, 0x61, 0x3d, 0x28, 0x36, 0x35, 0x32, 0x38, 0x30, + 0x26, 0x69, 0x29, 0x3e, 0x3e, 0x38, 0x2c, 0x63, 0x3d, 0x32, 0x35, + 0x35, 0x26, 0x69, 0x29, 0x29, 0x2c, 0x74, 0x28, 0x6f, 0x2c, 0x61, + 0x2c, 0x63, 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x5f, 0x74, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x2c, 0x75, 0x2c, 0x69, + 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x6e, + 0x2f, 0x3d, 0x32, 0x35, 0x35, 0x2c, 0x74, 0x2f, 0x3d, 0x32, 0x35, + 0x35, 0x2c, 0x65, 0x2f, 0x3d, 0x32, 0x35, 0x35, 0x29, 0x2c, 0x6f, + 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x6e, + 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x2c, 0x61, 0x3d, 0x6f, 0x2d, 0x69, + 0x2c, 0x63, 0x3d, 0x28, 0x6f, 0x2b, 0x69, 0x29, 0x2f, 0x32, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x3f, 0x28, 0x75, + 0x3d, 0x2e, 0x35, 0x3e, 0x63, 0x3f, 0x61, 0x2f, 0x28, 0x6f, 0x2b, + 0x69, 0x29, 0x3a, 0x61, 0x2f, 0x28, 0x32, 0x2d, 0x6f, 0x2d, 0x69, + 0x29, 0x2c, 0x72, 0x3d, 0x6e, 0x3d, 0x3d, 0x6f, 0x3f, 0x28, 0x74, + 0x2d, 0x65, 0x29, 0x2f, 0x61, 0x2b, 0x28, 0x65, 0x3e, 0x74, 0x3f, + 0x36, 0x3a, 0x30, 0x29, 0x3a, 0x74, 0x3d, 0x3d, 0x6f, 0x3f, 0x28, + 0x65, 0x2d, 0x6e, 0x29, 0x2f, 0x61, 0x2b, 0x32, 0x3a, 0x28, 0x6e, + 0x2d, 0x74, 0x29, 0x2f, 0x61, 0x2b, 0x34, 0x2c, 0x72, 0x2a, 0x3d, + 0x36, 0x30, 0x29, 0x3a, 0x28, 0x72, 0x3d, 0x30, 0x2f, 0x30, 0x2c, + 0x75, 0x3d, 0x63, 0x3e, 0x30, 0x26, 0x26, 0x31, 0x3e, 0x63, 0x3f, + 0x30, 0x3a, 0x72, 0x29, 0x2c, 0x6e, 0x65, 0x77, 0x20, 0x61, 0x74, + 0x28, 0x72, 0x2c, 0x75, 0x2c, 0x63, 0x29, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x74, 0x28, 0x6e, 0x2c, + 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x6e, 0x3d, 0x53, 0x74, 0x28, 0x6e, + 0x29, 0x2c, 0x74, 0x3d, 0x53, 0x74, 0x28, 0x74, 0x29, 0x2c, 0x65, + 0x3d, 0x53, 0x74, 0x28, 0x65, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x72, 0x3d, 0x76, 0x74, 0x28, 0x28, 0x2e, 0x34, 0x31, 0x32, 0x34, + 0x35, 0x36, 0x34, 0x2a, 0x6e, 0x2b, 0x2e, 0x33, 0x35, 0x37, 0x35, + 0x37, 0x36, 0x31, 0x2a, 0x74, 0x2b, 0x2e, 0x31, 0x38, 0x30, 0x34, + 0x33, 0x37, 0x35, 0x2a, 0x65, 0x29, 0x2f, 0x58, 0x61, 0x29, 0x2c, + 0x75, 0x3d, 0x76, 0x74, 0x28, 0x28, 0x2e, 0x32, 0x31, 0x32, 0x36, + 0x37, 0x32, 0x39, 0x2a, 0x6e, 0x2b, 0x2e, 0x37, 0x31, 0x35, 0x31, + 0x35, 0x32, 0x32, 0x2a, 0x74, 0x2b, 0x2e, 0x30, 0x37, 0x32, 0x31, + 0x37, 0x35, 0x2a, 0x65, 0x29, 0x2f, 0x24, 0x61, 0x29, 0x2c, 0x69, + 0x3d, 0x76, 0x74, 0x28, 0x28, 0x2e, 0x30, 0x31, 0x39, 0x33, 0x33, + 0x33, 0x39, 0x2a, 0x6e, 0x2b, 0x2e, 0x31, 0x31, 0x39, 0x31, 0x39, + 0x32, 0x2a, 0x74, 0x2b, 0x2e, 0x39, 0x35, 0x30, 0x33, 0x30, 0x34, + 0x31, 0x2a, 0x65, 0x29, 0x2f, 0x42, 0x61, 0x29, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x74, 0x28, 0x31, 0x31, 0x36, + 0x2a, 0x75, 0x2d, 0x31, 0x36, 0x2c, 0x35, 0x30, 0x30, 0x2a, 0x28, + 0x72, 0x2d, 0x75, 0x29, 0x2c, 0x32, 0x30, 0x30, 0x2a, 0x28, 0x75, + 0x2d, 0x69, 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x53, 0x74, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x28, 0x6e, 0x2f, 0x3d, 0x32, 0x35, 0x35, + 0x29, 0x3c, 0x3d, 0x2e, 0x30, 0x34, 0x30, 0x34, 0x35, 0x3f, 0x6e, + 0x2f, 0x31, 0x32, 0x2e, 0x39, 0x32, 0x3a, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x70, 0x6f, 0x77, 0x28, 0x28, 0x6e, 0x2b, 0x2e, 0x30, 0x35, + 0x35, 0x29, 0x2f, 0x31, 0x2e, 0x30, 0x35, 0x35, 0x2c, 0x32, 0x2e, + 0x34, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6b, 0x74, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x74, 0x3d, 0x70, 0x61, 0x72, 0x73, 0x65, 0x46, 0x6c, 0x6f, 0x61, + 0x74, 0x28, 0x6e, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x22, 0x25, 0x22, 0x3d, 0x3d, 0x3d, 0x6e, 0x2e, 0x63, 0x68, 0x61, + 0x72, 0x41, 0x74, 0x28, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x2d, 0x31, 0x29, 0x3f, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x72, + 0x6f, 0x75, 0x6e, 0x64, 0x28, 0x32, 0x2e, 0x35, 0x35, 0x2a, 0x74, + 0x29, 0x3a, 0x74, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x45, 0x74, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, + 0x6e, 0x3f, 0x6e, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x41, 0x74, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x32, 0x3d, 0x3d, 0x3d, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x26, 0x26, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, + 0x20, 0x65, 0x26, 0x26, 0x28, 0x72, 0x3d, 0x65, 0x2c, 0x65, 0x3d, + 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x2c, 0x4e, 0x74, 0x28, 0x74, 0x2c, + 0x65, 0x2c, 0x6e, 0x2c, 0x72, 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4e, 0x74, 0x28, 0x6e, 0x2c, + 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x28, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x6e, 0x2c, 0x74, 0x3d, 0x63, 0x2e, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x74, 0x26, 0x26, + 0x7a, 0x74, 0x28, 0x63, 0x29, 0x7c, 0x7c, 0x74, 0x3e, 0x3d, 0x32, + 0x30, 0x30, 0x26, 0x26, 0x33, 0x30, 0x30, 0x3e, 0x74, 0x7c, 0x7c, + 0x33, 0x30, 0x34, 0x3d, 0x3d, 0x3d, 0x74, 0x29, 0x7b, 0x74, 0x72, + 0x79, 0x7b, 0x6e, 0x3d, 0x65, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, + 0x69, 0x2c, 0x63, 0x29, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, + 0x72, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, + 0x6f, 0x69, 0x64, 0x20, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x69, 0x2c, 0x72, 0x29, 0x7d, + 0x6f, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x63, 0x61, 0x6c, 0x6c, + 0x28, 0x69, 0x2c, 0x6e, 0x29, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, + 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x63, 0x61, 0x6c, + 0x6c, 0x28, 0x69, 0x2c, 0x63, 0x29, 0x7d, 0x76, 0x61, 0x72, 0x20, + 0x69, 0x3d, 0x7b, 0x7d, 0x2c, 0x6f, 0x3d, 0x74, 0x61, 0x2e, 0x64, + 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x62, 0x65, + 0x66, 0x6f, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x64, 0x22, 0x2c, 0x22, + 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x22, 0x2c, 0x22, + 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x2c, 0x22, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0x29, 0x2c, 0x61, 0x3d, 0x7b, 0x7d, 0x2c, 0x63, 0x3d, + 0x6e, 0x65, 0x77, 0x20, 0x58, 0x4d, 0x4c, 0x48, 0x74, 0x74, 0x70, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2c, 0x6c, 0x3d, 0x6e, + 0x75, 0x6c, 0x6c, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x21, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x58, 0x44, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x7c, 0x7c, 0x22, + 0x77, 0x69, 0x74, 0x68, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x61, 0x6c, 0x73, 0x22, 0x69, 0x6e, 0x20, 0x63, 0x7c, 0x7c, + 0x21, 0x2f, 0x5e, 0x28, 0x68, 0x74, 0x74, 0x70, 0x28, 0x73, 0x29, + 0x3f, 0x3a, 0x29, 0x3f, 0x5c, 0x2f, 0x5c, 0x2f, 0x2f, 0x2e, 0x74, + 0x65, 0x73, 0x74, 0x28, 0x6e, 0x29, 0x7c, 0x7c, 0x28, 0x63, 0x3d, + 0x6e, 0x65, 0x77, 0x20, 0x58, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x29, 0x2c, 0x22, 0x6f, + 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x69, 0x6e, 0x20, 0x63, 0x3f, + 0x63, 0x2e, 0x6f, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x3d, 0x63, 0x2e, + 0x6f, 0x6e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3d, 0x75, 0x3a, 0x63, + 0x2e, 0x6f, 0x6e, 0x72, 0x65, 0x61, 0x64, 0x79, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x63, 0x2e, + 0x72, 0x65, 0x61, 0x64, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x3e, + 0x33, 0x26, 0x26, 0x75, 0x28, 0x29, 0x7d, 0x2c, 0x63, 0x2e, 0x6f, + 0x6e, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x74, 0x61, 0x2e, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3b, 0x74, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x6e, 0x3b, 0x74, 0x72, 0x79, 0x7b, 0x6f, 0x2e, 0x70, + 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x63, 0x61, 0x6c, + 0x6c, 0x28, 0x69, 0x2c, 0x63, 0x29, 0x7d, 0x66, 0x69, 0x6e, 0x61, + 0x6c, 0x6c, 0x79, 0x7b, 0x74, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x74, 0x7d, 0x7d, 0x2c, 0x69, 0x2e, 0x68, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x3d, 0x28, 0x6e, 0x2b, 0x22, 0x22, 0x29, + 0x2e, 0x74, 0x6f, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x43, 0x61, 0x73, + 0x65, 0x28, 0x29, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3c, 0x32, + 0x3f, 0x61, 0x5b, 0x6e, 0x5d, 0x3a, 0x28, 0x6e, 0x75, 0x6c, 0x6c, + 0x3d, 0x3d, 0x74, 0x3f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, + 0x61, 0x5b, 0x6e, 0x5d, 0x3a, 0x61, 0x5b, 0x6e, 0x5d, 0x3d, 0x74, + 0x2b, 0x22, 0x22, 0x2c, 0x69, 0x29, 0x7d, 0x2c, 0x69, 0x2e, 0x6d, + 0x69, 0x6d, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, + 0x28, 0x74, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x6e, 0x3f, + 0x6e, 0x75, 0x6c, 0x6c, 0x3a, 0x6e, 0x2b, 0x22, 0x22, 0x2c, 0x69, + 0x29, 0x3a, 0x74, 0x7d, 0x2c, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3f, 0x28, 0x6c, 0x3d, 0x6e, 0x2c, 0x69, 0x29, 0x3a, 0x6c, 0x7d, + 0x2c, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x3d, + 0x6e, 0x2c, 0x69, 0x7d, 0x2c, 0x5b, 0x22, 0x67, 0x65, 0x74, 0x22, + 0x2c, 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x5d, 0x2e, 0x66, 0x6f, + 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x69, 0x5b, 0x6e, 0x5d, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x2e, 0x73, + 0x65, 0x6e, 0x64, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x69, + 0x2c, 0x5b, 0x6e, 0x5d, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, + 0x28, 0x72, 0x61, 0x28, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x29, 0x29, 0x29, 0x7d, 0x7d, 0x29, 0x2c, 0x69, 0x2e, + 0x73, 0x65, 0x6e, 0x64, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x65, 0x2c, 0x72, 0x2c, 0x75, 0x29, 0x7b, 0x69, + 0x66, 0x28, 0x32, 0x3d, 0x3d, 0x3d, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x26, 0x26, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x72, + 0x26, 0x26, 0x28, 0x75, 0x3d, 0x72, 0x2c, 0x72, 0x3d, 0x6e, 0x75, + 0x6c, 0x6c, 0x29, 0x2c, 0x63, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x28, + 0x65, 0x2c, 0x6e, 0x2c, 0x21, 0x30, 0x29, 0x2c, 0x6e, 0x75, 0x6c, + 0x6c, 0x3d, 0x3d, 0x74, 0x7c, 0x7c, 0x22, 0x61, 0x63, 0x63, 0x65, + 0x70, 0x74, 0x22, 0x69, 0x6e, 0x20, 0x61, 0x7c, 0x7c, 0x28, 0x61, + 0x2e, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x3d, 0x74, 0x2b, 0x22, + 0x2c, 0x2a, 0x2f, 0x2a, 0x22, 0x29, 0x2c, 0x63, 0x2e, 0x73, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x29, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, + 0x20, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x29, 0x63, 0x2e, 0x73, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x28, 0x73, 0x2c, 0x61, 0x5b, 0x73, 0x5d, + 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x75, + 0x6c, 0x6c, 0x21, 0x3d, 0x74, 0x26, 0x26, 0x63, 0x2e, 0x6f, 0x76, + 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x4d, 0x69, 0x6d, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x26, 0x26, 0x63, 0x2e, 0x6f, 0x76, 0x65, 0x72, + 0x72, 0x69, 0x64, 0x65, 0x4d, 0x69, 0x6d, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x28, 0x74, 0x29, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, + 0x6c, 0x26, 0x26, 0x28, 0x63, 0x2e, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3d, 0x6c, 0x29, 0x2c, + 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, 0x75, 0x26, 0x26, 0x69, 0x2e, + 0x6f, 0x6e, 0x28, 0x22, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2c, + 0x75, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x22, 0x6c, 0x6f, 0x61, 0x64, + 0x22, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x29, 0x7b, 0x75, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x6e, + 0x29, 0x7d, 0x29, 0x2c, 0x6f, 0x2e, 0x62, 0x65, 0x66, 0x6f, 0x72, + 0x65, 0x73, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, + 0x69, 0x2c, 0x63, 0x29, 0x2c, 0x63, 0x2e, 0x73, 0x65, 0x6e, 0x64, + 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x72, 0x3f, 0x6e, 0x75, + 0x6c, 0x6c, 0x3a, 0x72, 0x29, 0x2c, 0x69, 0x7d, 0x2c, 0x69, 0x2e, + 0x61, 0x62, 0x6f, 0x72, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x63, 0x2e, 0x61, 0x62, 0x6f, 0x72, 0x74, 0x28, 0x29, + 0x2c, 0x69, 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x72, 0x65, 0x62, 0x69, + 0x6e, 0x64, 0x28, 0x69, 0x2c, 0x6f, 0x2c, 0x22, 0x6f, 0x6e, 0x22, + 0x29, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x72, 0x3f, 0x69, + 0x3a, 0x69, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x43, 0x74, 0x28, 0x72, + 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x43, 0x74, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x31, 0x3d, 0x3d, 0x3d, 0x6e, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x6e, 0x28, 0x6e, + 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x74, 0x3f, 0x65, 0x3a, 0x6e, 0x75, + 0x6c, 0x6c, 0x29, 0x7d, 0x3a, 0x6e, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x7a, 0x74, 0x28, 0x6e, 0x29, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x6e, 0x2e, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x26, 0x26, 0x22, 0x74, + 0x65, 0x78, 0x74, 0x22, 0x21, 0x3d, 0x3d, 0x74, 0x3f, 0x6e, 0x2e, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3a, 0x6e, 0x2e, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x65, 0x78, + 0x74, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x71, 0x74, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6e, 0x3d, + 0x4c, 0x74, 0x28, 0x29, 0x2c, 0x74, 0x3d, 0x54, 0x74, 0x28, 0x29, + 0x2d, 0x6e, 0x3b, 0x74, 0x3e, 0x32, 0x34, 0x3f, 0x28, 0x69, 0x73, + 0x46, 0x69, 0x6e, 0x69, 0x74, 0x65, 0x28, 0x74, 0x29, 0x26, 0x26, + 0x28, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x6f, + 0x75, 0x74, 0x28, 0x74, 0x63, 0x29, 0x2c, 0x74, 0x63, 0x3d, 0x73, + 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x71, + 0x74, 0x2c, 0x74, 0x29, 0x29, 0x2c, 0x6e, 0x63, 0x3d, 0x30, 0x29, + 0x3a, 0x28, 0x6e, 0x63, 0x3d, 0x31, 0x2c, 0x72, 0x63, 0x28, 0x71, + 0x74, 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x4c, 0x74, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x6e, 0x3d, 0x44, 0x61, 0x74, 0x65, 0x2e, 0x6e, 0x6f, 0x77, 0x28, + 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x65, 0x63, 0x3d, 0x4b, 0x61, + 0x3b, 0x65, 0x63, 0x3b, 0x29, 0x6e, 0x3e, 0x3d, 0x65, 0x63, 0x2e, + 0x74, 0x26, 0x26, 0x28, 0x65, 0x63, 0x2e, 0x66, 0x3d, 0x65, 0x63, + 0x2e, 0x63, 0x28, 0x6e, 0x2d, 0x65, 0x63, 0x2e, 0x74, 0x29, 0x29, + 0x2c, 0x65, 0x63, 0x3d, 0x65, 0x63, 0x2e, 0x6e, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x54, 0x74, 0x28, 0x29, 0x7b, 0x66, + 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x6e, 0x2c, 0x74, 0x3d, + 0x4b, 0x61, 0x2c, 0x65, 0x3d, 0x31, 0x2f, 0x30, 0x3b, 0x74, 0x3b, + 0x29, 0x74, 0x2e, 0x66, 0x3f, 0x74, 0x3d, 0x6e, 0x3f, 0x6e, 0x2e, + 0x6e, 0x3d, 0x74, 0x2e, 0x6e, 0x3a, 0x4b, 0x61, 0x3d, 0x74, 0x2e, + 0x6e, 0x3a, 0x28, 0x74, 0x2e, 0x74, 0x3c, 0x65, 0x26, 0x26, 0x28, + 0x65, 0x3d, 0x74, 0x2e, 0x74, 0x29, 0x2c, 0x74, 0x3d, 0x28, 0x6e, + 0x3d, 0x74, 0x29, 0x2e, 0x6e, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x51, 0x61, 0x3d, 0x6e, 0x2c, 0x65, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x52, 0x74, 0x28, + 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x2d, 0x28, 0x6e, 0x3f, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x63, 0x65, 0x69, 0x6c, 0x28, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6c, + 0x6f, 0x67, 0x28, 0x6e, 0x29, 0x2f, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x4c, 0x4e, 0x31, 0x30, 0x29, 0x3a, 0x31, 0x29, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x44, 0x74, 0x28, 0x6e, + 0x2c, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x70, 0x6f, 0x77, 0x28, 0x31, 0x30, 0x2c, + 0x33, 0x2a, 0x67, 0x61, 0x28, 0x38, 0x2d, 0x74, 0x29, 0x29, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7b, 0x73, 0x63, 0x61, 0x6c, + 0x65, 0x3a, 0x74, 0x3e, 0x38, 0x3f, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x2f, 0x65, 0x7d, 0x3a, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2a, 0x65, 0x7d, 0x2c, 0x73, + 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x3a, 0x6e, 0x7d, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x50, 0x74, 0x28, 0x6e, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x6e, 0x2e, 0x64, + 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x2c, 0x65, 0x3d, 0x6e, 0x2e, + 0x74, 0x68, 0x6f, 0x75, 0x73, 0x61, 0x6e, 0x64, 0x73, 0x2c, 0x72, + 0x3d, 0x6e, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x6e, 0x67, + 0x2c, 0x75, 0x3d, 0x6e, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x63, 0x79, 0x2c, 0x69, 0x3d, 0x72, 0x26, 0x26, 0x65, 0x3f, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, + 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x75, + 0x3d, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x69, + 0x3d, 0x5b, 0x5d, 0x2c, 0x6f, 0x3d, 0x30, 0x2c, 0x61, 0x3d, 0x72, + 0x5b, 0x30, 0x5d, 0x2c, 0x63, 0x3d, 0x30, 0x3b, 0x75, 0x3e, 0x30, + 0x26, 0x26, 0x61, 0x3e, 0x30, 0x26, 0x26, 0x28, 0x63, 0x2b, 0x61, + 0x2b, 0x31, 0x3e, 0x74, 0x26, 0x26, 0x28, 0x61, 0x3d, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x31, 0x2c, 0x74, 0x2d, + 0x63, 0x29, 0x29, 0x2c, 0x69, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, + 0x6e, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x75, 0x2d, 0x3d, 0x61, 0x2c, 0x75, 0x2b, 0x61, 0x29, 0x29, + 0x2c, 0x21, 0x28, 0x28, 0x63, 0x2b, 0x3d, 0x61, 0x2b, 0x31, 0x29, + 0x3e, 0x74, 0x29, 0x29, 0x3b, 0x29, 0x61, 0x3d, 0x72, 0x5b, 0x6f, + 0x3d, 0x28, 0x6f, 0x2b, 0x31, 0x29, 0x25, 0x72, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x5d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x69, 0x2e, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, + 0x28, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x65, 0x29, 0x7d, + 0x3a, 0x79, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x69, 0x63, 0x2e, 0x65, 0x78, + 0x65, 0x63, 0x28, 0x6e, 0x29, 0x2c, 0x72, 0x3d, 0x65, 0x5b, 0x31, + 0x5d, 0x7c, 0x7c, 0x22, 0x20, 0x22, 0x2c, 0x6f, 0x3d, 0x65, 0x5b, + 0x32, 0x5d, 0x7c, 0x7c, 0x22, 0x3e, 0x22, 0x2c, 0x61, 0x3d, 0x65, + 0x5b, 0x33, 0x5d, 0x7c, 0x7c, 0x22, 0x2d, 0x22, 0x2c, 0x63, 0x3d, + 0x65, 0x5b, 0x34, 0x5d, 0x7c, 0x7c, 0x22, 0x22, 0x2c, 0x6c, 0x3d, + 0x65, 0x5b, 0x35, 0x5d, 0x2c, 0x73, 0x3d, 0x2b, 0x65, 0x5b, 0x36, + 0x5d, 0x2c, 0x66, 0x3d, 0x65, 0x5b, 0x37, 0x5d, 0x2c, 0x68, 0x3d, + 0x65, 0x5b, 0x38, 0x5d, 0x2c, 0x67, 0x3d, 0x65, 0x5b, 0x39, 0x5d, + 0x2c, 0x70, 0x3d, 0x31, 0x2c, 0x76, 0x3d, 0x22, 0x22, 0x2c, 0x64, + 0x3d, 0x22, 0x22, 0x2c, 0x6d, 0x3d, 0x21, 0x31, 0x2c, 0x79, 0x3d, + 0x21, 0x30, 0x3b, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x28, 0x68, + 0x26, 0x26, 0x28, 0x68, 0x3d, 0x2b, 0x68, 0x2e, 0x73, 0x75, 0x62, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x31, 0x29, 0x29, 0x2c, + 0x28, 0x6c, 0x7c, 0x7c, 0x22, 0x30, 0x22, 0x3d, 0x3d, 0x3d, 0x72, + 0x26, 0x26, 0x22, 0x3d, 0x22, 0x3d, 0x3d, 0x3d, 0x6f, 0x29, 0x26, + 0x26, 0x28, 0x6c, 0x3d, 0x72, 0x3d, 0x22, 0x30, 0x22, 0x2c, 0x6f, + 0x3d, 0x22, 0x3d, 0x22, 0x29, 0x2c, 0x67, 0x29, 0x7b, 0x63, 0x61, + 0x73, 0x65, 0x22, 0x6e, 0x22, 0x3a, 0x66, 0x3d, 0x21, 0x30, 0x2c, + 0x67, 0x3d, 0x22, 0x67, 0x22, 0x3b, 0x62, 0x72, 0x65, 0x61, 0x6b, + 0x3b, 0x63, 0x61, 0x73, 0x65, 0x22, 0x25, 0x22, 0x3a, 0x70, 0x3d, + 0x31, 0x30, 0x30, 0x2c, 0x64, 0x3d, 0x22, 0x25, 0x22, 0x2c, 0x67, + 0x3d, 0x22, 0x66, 0x22, 0x3b, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, + 0x63, 0x61, 0x73, 0x65, 0x22, 0x70, 0x22, 0x3a, 0x70, 0x3d, 0x31, + 0x30, 0x30, 0x2c, 0x64, 0x3d, 0x22, 0x25, 0x22, 0x2c, 0x67, 0x3d, + 0x22, 0x72, 0x22, 0x3b, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x63, + 0x61, 0x73, 0x65, 0x22, 0x62, 0x22, 0x3a, 0x63, 0x61, 0x73, 0x65, + 0x22, 0x6f, 0x22, 0x3a, 0x63, 0x61, 0x73, 0x65, 0x22, 0x78, 0x22, + 0x3a, 0x63, 0x61, 0x73, 0x65, 0x22, 0x58, 0x22, 0x3a, 0x22, 0x23, + 0x22, 0x3d, 0x3d, 0x3d, 0x63, 0x26, 0x26, 0x28, 0x76, 0x3d, 0x22, + 0x30, 0x22, 0x2b, 0x67, 0x2e, 0x74, 0x6f, 0x4c, 0x6f, 0x77, 0x65, + 0x72, 0x43, 0x61, 0x73, 0x65, 0x28, 0x29, 0x29, 0x3b, 0x63, 0x61, + 0x73, 0x65, 0x22, 0x63, 0x22, 0x3a, 0x79, 0x3d, 0x21, 0x31, 0x3b, + 0x63, 0x61, 0x73, 0x65, 0x22, 0x64, 0x22, 0x3a, 0x6d, 0x3d, 0x21, + 0x30, 0x2c, 0x68, 0x3d, 0x30, 0x3b, 0x62, 0x72, 0x65, 0x61, 0x6b, + 0x3b, 0x63, 0x61, 0x73, 0x65, 0x22, 0x73, 0x22, 0x3a, 0x70, 0x3d, + 0x2d, 0x31, 0x2c, 0x67, 0x3d, 0x22, 0x72, 0x22, 0x7d, 0x22, 0x24, + 0x22, 0x3d, 0x3d, 0x3d, 0x63, 0x26, 0x26, 0x28, 0x76, 0x3d, 0x75, + 0x5b, 0x30, 0x5d, 0x2c, 0x64, 0x3d, 0x75, 0x5b, 0x31, 0x5d, 0x29, + 0x2c, 0x22, 0x72, 0x22, 0x21, 0x3d, 0x67, 0x7c, 0x7c, 0x68, 0x7c, + 0x7c, 0x28, 0x67, 0x3d, 0x22, 0x67, 0x22, 0x29, 0x2c, 0x6e, 0x75, + 0x6c, 0x6c, 0x21, 0x3d, 0x68, 0x26, 0x26, 0x28, 0x22, 0x67, 0x22, + 0x3d, 0x3d, 0x67, 0x3f, 0x68, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x6d, 0x61, 0x78, 0x28, 0x31, 0x2c, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x6d, 0x69, 0x6e, 0x28, 0x32, 0x31, 0x2c, 0x68, 0x29, 0x29, 0x3a, + 0x28, 0x22, 0x65, 0x22, 0x3d, 0x3d, 0x67, 0x7c, 0x7c, 0x22, 0x66, + 0x22, 0x3d, 0x3d, 0x67, 0x29, 0x26, 0x26, 0x28, 0x68, 0x3d, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x30, 0x2c, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x32, 0x30, 0x2c, + 0x68, 0x29, 0x29, 0x29, 0x29, 0x2c, 0x67, 0x3d, 0x6f, 0x63, 0x2e, + 0x67, 0x65, 0x74, 0x28, 0x67, 0x29, 0x7c, 0x7c, 0x55, 0x74, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x4d, 0x3d, 0x6c, 0x26, 0x26, 0x66, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x65, 0x3d, 0x64, 0x3b, 0x69, 0x66, 0x28, 0x6d, 0x26, 0x26, + 0x6e, 0x25, 0x31, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, + 0x22, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x75, 0x3d, 0x30, 0x3e, 0x6e, + 0x7c, 0x7c, 0x30, 0x3d, 0x3d, 0x3d, 0x6e, 0x26, 0x26, 0x30, 0x3e, + 0x31, 0x2f, 0x6e, 0x3f, 0x28, 0x6e, 0x3d, 0x2d, 0x6e, 0x2c, 0x22, + 0x2d, 0x22, 0x29, 0x3a, 0x22, 0x2d, 0x22, 0x3d, 0x3d, 0x3d, 0x61, + 0x3f, 0x22, 0x22, 0x3a, 0x61, 0x3b, 0x69, 0x66, 0x28, 0x30, 0x3e, + 0x70, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x63, 0x3d, 0x74, 0x61, + 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x50, 0x72, 0x65, 0x66, + 0x69, 0x78, 0x28, 0x6e, 0x2c, 0x68, 0x29, 0x3b, 0x6e, 0x3d, 0x63, + 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x28, 0x6e, 0x29, 0x2c, 0x65, + 0x3d, 0x63, 0x2e, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2b, 0x64, + 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x6e, 0x2a, 0x3d, 0x70, 0x3b, + 0x6e, 0x3d, 0x67, 0x28, 0x6e, 0x2c, 0x68, 0x29, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x78, 0x2c, 0x62, 0x2c, 0x5f, 0x3d, 0x6e, 0x2e, 0x6c, + 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, + 0x22, 0x2e, 0x22, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x30, 0x3e, 0x5f, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x77, 0x3d, 0x79, 0x3f, 0x6e, + 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, + 0x66, 0x28, 0x22, 0x65, 0x22, 0x29, 0x3a, 0x2d, 0x31, 0x3b, 0x30, + 0x3e, 0x77, 0x3f, 0x28, 0x78, 0x3d, 0x6e, 0x2c, 0x62, 0x3d, 0x22, + 0x22, 0x29, 0x3a, 0x28, 0x78, 0x3d, 0x6e, 0x2e, 0x73, 0x75, 0x62, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x30, 0x2c, 0x77, 0x29, + 0x2c, 0x62, 0x3d, 0x6e, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x77, 0x29, 0x29, 0x7d, 0x65, 0x6c, 0x73, + 0x65, 0x20, 0x78, 0x3d, 0x6e, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x28, 0x30, 0x2c, 0x5f, 0x29, 0x2c, 0x62, + 0x3d, 0x74, 0x2b, 0x6e, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x5f, 0x2b, 0x31, 0x29, 0x3b, 0x21, 0x6c, + 0x26, 0x26, 0x66, 0x26, 0x26, 0x28, 0x78, 0x3d, 0x69, 0x28, 0x78, + 0x2c, 0x31, 0x2f, 0x30, 0x29, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x53, 0x3d, 0x76, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2b, + 0x78, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2b, 0x62, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2b, 0x28, 0x4d, 0x3f, 0x30, + 0x3a, 0x75, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x2c, + 0x6b, 0x3d, 0x73, 0x3e, 0x53, 0x3f, 0x6e, 0x65, 0x77, 0x20, 0x41, + 0x72, 0x72, 0x61, 0x79, 0x28, 0x53, 0x3d, 0x73, 0x2d, 0x53, 0x2b, + 0x31, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x72, 0x29, 0x3a, + 0x22, 0x22, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4d, + 0x26, 0x26, 0x28, 0x78, 0x3d, 0x69, 0x28, 0x6b, 0x2b, 0x78, 0x2c, + 0x6b, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x73, 0x2d, + 0x62, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3a, 0x31, 0x2f, + 0x30, 0x29, 0x29, 0x2c, 0x75, 0x2b, 0x3d, 0x76, 0x2c, 0x6e, 0x3d, + 0x78, 0x2b, 0x62, 0x2c, 0x28, 0x22, 0x3c, 0x22, 0x3d, 0x3d, 0x3d, + 0x6f, 0x3f, 0x75, 0x2b, 0x6e, 0x2b, 0x6b, 0x3a, 0x22, 0x3e, 0x22, + 0x3d, 0x3d, 0x3d, 0x6f, 0x3f, 0x6b, 0x2b, 0x75, 0x2b, 0x6e, 0x3a, + 0x22, 0x5e, 0x22, 0x3d, 0x3d, 0x3d, 0x6f, 0x3f, 0x6b, 0x2e, 0x73, + 0x75, 0x62, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x30, 0x2c, + 0x53, 0x3e, 0x3e, 0x3d, 0x31, 0x29, 0x2b, 0x75, 0x2b, 0x6e, 0x2b, + 0x6b, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x53, 0x29, 0x3a, 0x75, 0x2b, 0x28, 0x4d, 0x3f, 0x6e, 0x3a, + 0x6b, 0x2b, 0x6e, 0x29, 0x29, 0x2b, 0x65, 0x7d, 0x7d, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x55, 0x74, 0x28, + 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x2b, 0x22, 0x22, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6a, 0x74, 0x28, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x5f, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x44, 0x61, 0x74, 0x65, + 0x28, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3e, 0x31, 0x3f, 0x44, 0x61, + 0x74, 0x65, 0x2e, 0x55, 0x54, 0x43, 0x2e, 0x61, 0x70, 0x70, 0x6c, + 0x79, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x3a, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5b, 0x30, 0x5d, 0x29, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x46, 0x74, 0x28, + 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x28, 0x74, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x65, 0x3d, 0x6e, 0x28, 0x74, 0x29, 0x2c, 0x72, + 0x3d, 0x69, 0x28, 0x65, 0x2c, 0x31, 0x29, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x72, 0x2d, 0x74, 0x3e, 0x74, 0x2d, 0x65, + 0x3f, 0x65, 0x3a, 0x72, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x75, 0x28, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x28, 0x65, 0x3d, 0x6e, 0x28, 0x6e, + 0x65, 0x77, 0x20, 0x63, 0x63, 0x28, 0x65, 0x2d, 0x31, 0x29, 0x29, + 0x2c, 0x31, 0x29, 0x2c, 0x65, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x28, 0x6e, 0x2c, 0x65, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x28, 0x6e, 0x3d, + 0x6e, 0x65, 0x77, 0x20, 0x63, 0x63, 0x28, 0x2b, 0x6e, 0x29, 0x2c, + 0x65, 0x29, 0x2c, 0x6e, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6f, 0x28, 0x6e, 0x2c, 0x72, 0x2c, 0x69, 0x29, + 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6f, 0x3d, 0x75, 0x28, 0x6e, 0x29, + 0x2c, 0x61, 0x3d, 0x5b, 0x5d, 0x3b, 0x69, 0x66, 0x28, 0x69, 0x3e, + 0x31, 0x29, 0x66, 0x6f, 0x72, 0x28, 0x3b, 0x72, 0x3e, 0x6f, 0x3b, + 0x29, 0x65, 0x28, 0x6f, 0x29, 0x25, 0x69, 0x7c, 0x7c, 0x61, 0x2e, + 0x70, 0x75, 0x73, 0x68, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x44, 0x61, + 0x74, 0x65, 0x28, 0x2b, 0x6f, 0x29, 0x29, 0x2c, 0x74, 0x28, 0x6f, + 0x2c, 0x31, 0x29, 0x3b, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x66, 0x6f, + 0x72, 0x28, 0x3b, 0x72, 0x3e, 0x6f, 0x3b, 0x29, 0x61, 0x2e, 0x70, + 0x75, 0x73, 0x68, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x44, 0x61, 0x74, + 0x65, 0x28, 0x2b, 0x6f, 0x29, 0x29, 0x2c, 0x74, 0x28, 0x6f, 0x2c, + 0x31, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, + 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x74, 0x72, 0x79, + 0x7b, 0x63, 0x63, 0x3d, 0x6a, 0x74, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x72, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x6a, 0x74, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x2e, 0x5f, 0x3d, 0x6e, 0x2c, + 0x6f, 0x28, 0x72, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7d, 0x66, 0x69, + 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x7b, 0x63, 0x63, 0x3d, 0x44, 0x61, + 0x74, 0x65, 0x7d, 0x7d, 0x6e, 0x2e, 0x66, 0x6c, 0x6f, 0x6f, 0x72, + 0x3d, 0x6e, 0x2c, 0x6e, 0x2e, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3d, + 0x72, 0x2c, 0x6e, 0x2e, 0x63, 0x65, 0x69, 0x6c, 0x3d, 0x75, 0x2c, + 0x6e, 0x2e, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3d, 0x69, 0x2c, + 0x6e, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x3d, 0x6f, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x63, 0x3d, 0x6e, 0x2e, 0x75, 0x74, 0x63, 0x3d, + 0x48, 0x74, 0x28, 0x6e, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x63, 0x2e, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x3d, 0x63, + 0x2c, 0x63, 0x2e, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3d, 0x48, 0x74, + 0x28, 0x72, 0x29, 0x2c, 0x63, 0x2e, 0x63, 0x65, 0x69, 0x6c, 0x3d, + 0x48, 0x74, 0x28, 0x75, 0x29, 0x2c, 0x63, 0x2e, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x3d, 0x48, 0x74, 0x28, 0x69, 0x29, 0x2c, 0x63, + 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x3d, 0x61, 0x2c, 0x6e, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x48, 0x74, + 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x2c, + 0x65, 0x29, 0x7b, 0x74, 0x72, 0x79, 0x7b, 0x63, 0x63, 0x3d, 0x6a, + 0x74, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x6e, 0x65, 0x77, + 0x20, 0x6a, 0x74, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x72, 0x2e, 0x5f, 0x3d, 0x74, 0x2c, 0x6e, 0x28, 0x72, 0x2c, 0x65, + 0x29, 0x2e, 0x5f, 0x7d, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x6c, 0x79, + 0x7b, 0x63, 0x63, 0x3d, 0x44, 0x61, 0x74, 0x65, 0x7d, 0x7d, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4f, 0x74, + 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x74, 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x28, 0x74, 0x29, 0x7b, 0x66, + 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x65, 0x2c, 0x75, 0x2c, + 0x69, 0x2c, 0x6f, 0x3d, 0x5b, 0x5d, 0x2c, 0x61, 0x3d, 0x2d, 0x31, + 0x2c, 0x63, 0x3d, 0x30, 0x3b, 0x2b, 0x2b, 0x61, 0x3c, 0x72, 0x3b, + 0x29, 0x33, 0x37, 0x3d, 0x3d, 0x3d, 0x6e, 0x2e, 0x63, 0x68, 0x61, + 0x72, 0x43, 0x6f, 0x64, 0x65, 0x41, 0x74, 0x28, 0x61, 0x29, 0x26, + 0x26, 0x28, 0x6f, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x6e, 0x2e, + 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x63, 0x2c, 0x61, 0x29, 0x29, + 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, 0x28, 0x75, 0x3d, 0x73, + 0x63, 0x5b, 0x65, 0x3d, 0x6e, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x41, + 0x74, 0x28, 0x2b, 0x2b, 0x61, 0x29, 0x5d, 0x29, 0x26, 0x26, 0x28, + 0x65, 0x3d, 0x6e, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x41, 0x74, 0x28, + 0x2b, 0x2b, 0x61, 0x29, 0x29, 0x2c, 0x28, 0x69, 0x3d, 0x4e, 0x5b, + 0x65, 0x5d, 0x29, 0x26, 0x26, 0x28, 0x65, 0x3d, 0x69, 0x28, 0x74, + 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x75, 0x3f, 0x22, 0x65, + 0x22, 0x3d, 0x3d, 0x3d, 0x65, 0x3f, 0x22, 0x20, 0x22, 0x3a, 0x22, + 0x30, 0x22, 0x3a, 0x75, 0x29, 0x29, 0x2c, 0x6f, 0x2e, 0x70, 0x75, + 0x73, 0x68, 0x28, 0x65, 0x29, 0x2c, 0x63, 0x3d, 0x61, 0x2b, 0x31, + 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x2e, + 0x70, 0x75, 0x73, 0x68, 0x28, 0x6e, 0x2e, 0x73, 0x6c, 0x69, 0x63, + 0x65, 0x28, 0x63, 0x2c, 0x61, 0x29, 0x29, 0x2c, 0x6f, 0x2e, 0x6a, + 0x6f, 0x69, 0x6e, 0x28, 0x22, 0x22, 0x29, 0x7d, 0x76, 0x61, 0x72, + 0x20, 0x72, 0x3d, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, 0x70, + 0x61, 0x72, 0x73, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, + 0x3d, 0x7b, 0x79, 0x3a, 0x31, 0x39, 0x30, 0x30, 0x2c, 0x6d, 0x3a, + 0x30, 0x2c, 0x64, 0x3a, 0x31, 0x2c, 0x48, 0x3a, 0x30, 0x2c, 0x4d, + 0x3a, 0x30, 0x2c, 0x53, 0x3a, 0x30, 0x2c, 0x4c, 0x3a, 0x30, 0x2c, + 0x5a, 0x3a, 0x6e, 0x75, 0x6c, 0x6c, 0x7d, 0x2c, 0x75, 0x3d, 0x65, + 0x28, 0x72, 0x2c, 0x6e, 0x2c, 0x74, 0x2c, 0x30, 0x29, 0x3b, 0x69, + 0x66, 0x28, 0x75, 0x21, 0x3d, 0x74, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x75, 0x6c, 0x6c, 0x3b, 0x22, 0x70, 0x22, 0x69, 0x6e, 0x20, 0x72, + 0x26, 0x26, 0x28, 0x72, 0x2e, 0x48, 0x3d, 0x72, 0x2e, 0x48, 0x25, + 0x31, 0x32, 0x2b, 0x31, 0x32, 0x2a, 0x72, 0x2e, 0x70, 0x29, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x21, + 0x3d, 0x72, 0x2e, 0x5a, 0x26, 0x26, 0x63, 0x63, 0x21, 0x3d, 0x3d, + 0x6a, 0x74, 0x2c, 0x6f, 0x3d, 0x6e, 0x65, 0x77, 0x28, 0x69, 0x3f, + 0x6a, 0x74, 0x3a, 0x63, 0x63, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x22, 0x6a, 0x22, 0x69, 0x6e, 0x20, 0x72, 0x3f, 0x6f, + 0x2e, 0x73, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x59, 0x65, 0x61, + 0x72, 0x28, 0x72, 0x2e, 0x79, 0x2c, 0x30, 0x2c, 0x72, 0x2e, 0x6a, + 0x29, 0x3a, 0x22, 0x77, 0x22, 0x69, 0x6e, 0x20, 0x72, 0x26, 0x26, + 0x28, 0x22, 0x57, 0x22, 0x69, 0x6e, 0x20, 0x72, 0x7c, 0x7c, 0x22, + 0x55, 0x22, 0x69, 0x6e, 0x20, 0x72, 0x29, 0x3f, 0x28, 0x6f, 0x2e, + 0x73, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x59, 0x65, 0x61, 0x72, + 0x28, 0x72, 0x2e, 0x79, 0x2c, 0x30, 0x2c, 0x31, 0x29, 0x2c, 0x6f, + 0x2e, 0x73, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x59, 0x65, 0x61, + 0x72, 0x28, 0x72, 0x2e, 0x79, 0x2c, 0x30, 0x2c, 0x22, 0x57, 0x22, + 0x69, 0x6e, 0x20, 0x72, 0x3f, 0x28, 0x72, 0x2e, 0x77, 0x2b, 0x36, + 0x29, 0x25, 0x37, 0x2b, 0x37, 0x2a, 0x72, 0x2e, 0x57, 0x2d, 0x28, + 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x44, 0x61, 0x79, 0x28, 0x29, 0x2b, + 0x35, 0x29, 0x25, 0x37, 0x3a, 0x72, 0x2e, 0x77, 0x2b, 0x37, 0x2a, + 0x72, 0x2e, 0x55, 0x2d, 0x28, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x44, + 0x61, 0x79, 0x28, 0x29, 0x2b, 0x36, 0x29, 0x25, 0x37, 0x29, 0x29, + 0x3a, 0x6f, 0x2e, 0x73, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x59, + 0x65, 0x61, 0x72, 0x28, 0x72, 0x2e, 0x79, 0x2c, 0x72, 0x2e, 0x6d, + 0x2c, 0x72, 0x2e, 0x64, 0x29, 0x2c, 0x6f, 0x2e, 0x73, 0x65, 0x74, + 0x48, 0x6f, 0x75, 0x72, 0x73, 0x28, 0x72, 0x2e, 0x48, 0x2b, 0x28, + 0x72, 0x2e, 0x5a, 0x2f, 0x31, 0x30, 0x30, 0x7c, 0x30, 0x29, 0x2c, + 0x72, 0x2e, 0x4d, 0x2b, 0x72, 0x2e, 0x5a, 0x25, 0x31, 0x30, 0x30, + 0x2c, 0x72, 0x2e, 0x53, 0x2c, 0x72, 0x2e, 0x4c, 0x29, 0x2c, 0x69, + 0x3f, 0x6f, 0x2e, 0x5f, 0x3a, 0x6f, 0x7d, 0x2c, 0x74, 0x2e, 0x74, + 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x7d, 0x2c, 0x74, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x28, 0x6e, 0x2c, + 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, + 0x76, 0x61, 0x72, 0x20, 0x75, 0x2c, 0x69, 0x2c, 0x6f, 0x2c, 0x61, + 0x3d, 0x30, 0x2c, 0x63, 0x3d, 0x74, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x2c, 0x6c, 0x3d, 0x65, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3b, 0x63, 0x3e, 0x61, 0x3b, 0x29, 0x7b, 0x69, 0x66, + 0x28, 0x72, 0x3e, 0x3d, 0x6c, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x2d, 0x31, 0x3b, 0x69, 0x66, 0x28, 0x75, 0x3d, 0x74, 0x2e, + 0x63, 0x68, 0x61, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x41, 0x74, 0x28, + 0x61, 0x2b, 0x2b, 0x29, 0x2c, 0x33, 0x37, 0x3d, 0x3d, 0x3d, 0x75, + 0x29, 0x7b, 0x69, 0x66, 0x28, 0x6f, 0x3d, 0x74, 0x2e, 0x63, 0x68, + 0x61, 0x72, 0x41, 0x74, 0x28, 0x61, 0x2b, 0x2b, 0x29, 0x2c, 0x69, + 0x3d, 0x43, 0x5b, 0x6f, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x63, 0x3f, + 0x74, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x41, 0x74, 0x28, 0x61, 0x2b, + 0x2b, 0x29, 0x3a, 0x6f, 0x5d, 0x2c, 0x21, 0x69, 0x7c, 0x7c, 0x28, + 0x72, 0x3d, 0x69, 0x28, 0x6e, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x29, + 0x3c, 0x30, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x2d, 0x31, + 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x75, 0x21, + 0x3d, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x43, 0x6f, 0x64, 0x65, + 0x41, 0x74, 0x28, 0x72, 0x2b, 0x2b, 0x29, 0x29, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x2d, 0x31, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x72, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x72, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, + 0x5f, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x3d, 0x30, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x5f, 0x2e, + 0x65, 0x78, 0x65, 0x63, 0x28, 0x74, 0x2e, 0x73, 0x6c, 0x69, 0x63, + 0x65, 0x28, 0x65, 0x29, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x72, 0x3f, 0x28, 0x6e, 0x2e, 0x77, 0x3d, 0x77, 0x2e, + 0x67, 0x65, 0x74, 0x28, 0x72, 0x5b, 0x30, 0x5d, 0x2e, 0x74, 0x6f, + 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x43, 0x61, 0x73, 0x65, 0x28, 0x29, + 0x29, 0x2c, 0x65, 0x2b, 0x72, 0x5b, 0x30, 0x5d, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x29, 0x3a, 0x2d, 0x31, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x28, 0x6e, 0x2c, + 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x78, 0x2e, 0x6c, 0x61, 0x73, 0x74, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x3d, 0x30, 0x3b, 0x76, 0x61, 0x72, + 0x20, 0x72, 0x3d, 0x78, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x28, 0x74, + 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x65, 0x29, 0x29, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x3f, 0x28, 0x6e, + 0x2e, 0x77, 0x3d, 0x62, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x72, 0x5b, + 0x30, 0x5d, 0x2e, 0x74, 0x6f, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x43, + 0x61, 0x73, 0x65, 0x28, 0x29, 0x29, 0x2c, 0x65, 0x2b, 0x72, 0x5b, + 0x30, 0x5d, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x3a, + 0x2d, 0x31, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x69, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x45, + 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x3d, + 0x30, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x45, 0x2e, 0x65, + 0x78, 0x65, 0x63, 0x28, 0x74, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, + 0x28, 0x65, 0x29, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x72, 0x3f, 0x28, 0x6e, 0x2e, 0x6d, 0x3d, 0x41, 0x2e, 0x67, + 0x65, 0x74, 0x28, 0x72, 0x5b, 0x30, 0x5d, 0x2e, 0x74, 0x6f, 0x4c, + 0x6f, 0x77, 0x65, 0x72, 0x43, 0x61, 0x73, 0x65, 0x28, 0x29, 0x29, + 0x2c, 0x65, 0x2b, 0x72, 0x5b, 0x30, 0x5d, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x29, 0x3a, 0x2d, 0x31, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x28, 0x6e, 0x2c, 0x74, + 0x2c, 0x65, 0x29, 0x7b, 0x53, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x3d, 0x30, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x72, 0x3d, 0x53, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x28, 0x74, 0x2e, + 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x65, 0x29, 0x29, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x3f, 0x28, 0x6e, 0x2e, + 0x6d, 0x3d, 0x6b, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x72, 0x5b, 0x30, + 0x5d, 0x2e, 0x74, 0x6f, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x43, 0x61, + 0x73, 0x65, 0x28, 0x29, 0x29, 0x2c, 0x65, 0x2b, 0x72, 0x5b, 0x30, + 0x5d, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x3a, 0x2d, + 0x31, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x61, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x72, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x28, 0x6e, 0x2c, 0x4e, 0x2e, + 0x63, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, + 0x29, 0x2c, 0x74, 0x2c, 0x72, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x28, 0x6e, 0x2c, 0x74, 0x2c, + 0x72, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, + 0x28, 0x6e, 0x2c, 0x4e, 0x2e, 0x78, 0x2e, 0x74, 0x6f, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x2c, 0x74, 0x2c, 0x72, 0x29, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, + 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x72, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x65, 0x28, 0x6e, 0x2c, 0x4e, 0x2e, 0x58, + 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, + 0x2c, 0x74, 0x2c, 0x72, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x4d, 0x2e, 0x67, + 0x65, 0x74, 0x28, 0x74, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, + 0x65, 0x2c, 0x65, 0x2b, 0x3d, 0x32, 0x29, 0x2e, 0x74, 0x6f, 0x4c, + 0x6f, 0x77, 0x65, 0x72, 0x43, 0x61, 0x73, 0x65, 0x28, 0x29, 0x29, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x75, 0x6c, + 0x6c, 0x3d, 0x3d, 0x72, 0x3f, 0x2d, 0x31, 0x3a, 0x28, 0x6e, 0x2e, + 0x70, 0x3d, 0x72, 0x2c, 0x65, 0x29, 0x7d, 0x76, 0x61, 0x72, 0x20, + 0x66, 0x3d, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x2c, 0x68, 0x3d, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x65, 0x2c, + 0x67, 0x3d, 0x6e, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x2c, 0x70, 0x3d, + 0x6e, 0x2e, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x73, 0x2c, 0x76, + 0x3d, 0x6e, 0x2e, 0x64, 0x61, 0x79, 0x73, 0x2c, 0x64, 0x3d, 0x6e, + 0x2e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x44, 0x61, 0x79, 0x73, 0x2c, + 0x6d, 0x3d, 0x6e, 0x2e, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x73, 0x2c, + 0x79, 0x3d, 0x6e, 0x2e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x4d, 0x6f, + 0x6e, 0x74, 0x68, 0x73, 0x3b, 0x74, 0x2e, 0x75, 0x74, 0x63, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, + 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, + 0x28, 0x6e, 0x29, 0x7b, 0x74, 0x72, 0x79, 0x7b, 0x63, 0x63, 0x3d, + 0x6a, 0x74, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x6e, 0x65, + 0x77, 0x20, 0x63, 0x63, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x2e, 0x5f, 0x3d, 0x6e, 0x2c, 0x72, 0x28, 0x74, 0x29, + 0x7d, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x7b, 0x63, 0x63, + 0x3d, 0x44, 0x61, 0x74, 0x65, 0x7d, 0x7d, 0x76, 0x61, 0x72, 0x20, + 0x72, 0x3d, 0x74, 0x28, 0x6e, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x65, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, + 0x7b, 0x74, 0x72, 0x79, 0x7b, 0x63, 0x63, 0x3d, 0x6a, 0x74, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x72, 0x2e, 0x70, 0x61, 0x72, + 0x73, 0x65, 0x28, 0x6e, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x26, 0x26, 0x74, 0x2e, 0x5f, 0x7d, 0x66, 0x69, + 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x7b, 0x63, 0x63, 0x3d, 0x44, 0x61, + 0x74, 0x65, 0x7d, 0x7d, 0x2c, 0x65, 0x2e, 0x74, 0x6f, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x3d, 0x72, 0x2e, 0x74, 0x6f, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x65, 0x7d, 0x2c, 0x74, 0x2e, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x3d, 0x74, 0x2e, 0x75, 0x74, 0x63, 0x2e, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x3d, 0x61, 0x65, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x4d, 0x3d, 0x74, 0x61, 0x2e, 0x6d, 0x61, 0x70, 0x28, + 0x29, 0x2c, 0x78, 0x3d, 0x59, 0x74, 0x28, 0x76, 0x29, 0x2c, 0x62, + 0x3d, 0x5a, 0x74, 0x28, 0x76, 0x29, 0x2c, 0x5f, 0x3d, 0x59, 0x74, + 0x28, 0x64, 0x29, 0x2c, 0x77, 0x3d, 0x5a, 0x74, 0x28, 0x64, 0x29, + 0x2c, 0x53, 0x3d, 0x59, 0x74, 0x28, 0x6d, 0x29, 0x2c, 0x6b, 0x3d, + 0x5a, 0x74, 0x28, 0x6d, 0x29, 0x2c, 0x45, 0x3d, 0x59, 0x74, 0x28, + 0x79, 0x29, 0x2c, 0x41, 0x3d, 0x5a, 0x74, 0x28, 0x79, 0x29, 0x3b, + 0x70, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, + 0x29, 0x7b, 0x4d, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x6e, 0x2e, 0x74, + 0x6f, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x43, 0x61, 0x73, 0x65, 0x28, + 0x29, 0x2c, 0x74, 0x29, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x4e, 0x3d, 0x7b, 0x61, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x64, 0x5b, 0x6e, 0x2e, 0x67, 0x65, 0x74, 0x44, 0x61, + 0x79, 0x28, 0x29, 0x5d, 0x7d, 0x2c, 0x41, 0x3a, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x5b, 0x6e, 0x2e, 0x67, 0x65, + 0x74, 0x44, 0x61, 0x79, 0x28, 0x29, 0x5d, 0x7d, 0x2c, 0x62, 0x3a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x79, 0x5b, 0x6e, + 0x2e, 0x67, 0x65, 0x74, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x28, 0x29, + 0x5d, 0x7d, 0x2c, 0x42, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6d, 0x5b, 0x6e, 0x2e, 0x67, 0x65, 0x74, 0x4d, 0x6f, + 0x6e, 0x74, 0x68, 0x28, 0x29, 0x5d, 0x7d, 0x2c, 0x63, 0x3a, 0x74, + 0x28, 0x66, 0x29, 0x2c, 0x64, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x49, 0x74, 0x28, 0x6e, 0x2e, 0x67, + 0x65, 0x74, 0x44, 0x61, 0x74, 0x65, 0x28, 0x29, 0x2c, 0x74, 0x2c, + 0x32, 0x29, 0x7d, 0x2c, 0x65, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x49, 0x74, 0x28, 0x6e, 0x2e, 0x67, + 0x65, 0x74, 0x44, 0x61, 0x74, 0x65, 0x28, 0x29, 0x2c, 0x74, 0x2c, + 0x32, 0x29, 0x7d, 0x2c, 0x48, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x49, 0x74, 0x28, 0x6e, 0x2e, 0x67, + 0x65, 0x74, 0x48, 0x6f, 0x75, 0x72, 0x73, 0x28, 0x29, 0x2c, 0x74, + 0x2c, 0x32, 0x29, 0x7d, 0x2c, 0x49, 0x3a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x49, 0x74, 0x28, 0x6e, 0x2e, + 0x67, 0x65, 0x74, 0x48, 0x6f, 0x75, 0x72, 0x73, 0x28, 0x29, 0x25, + 0x31, 0x32, 0x7c, 0x7c, 0x31, 0x32, 0x2c, 0x74, 0x2c, 0x32, 0x29, + 0x7d, 0x2c, 0x6a, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x49, 0x74, 0x28, 0x31, 0x2b, 0x61, 0x63, 0x2e, + 0x64, 0x61, 0x79, 0x4f, 0x66, 0x59, 0x65, 0x61, 0x72, 0x28, 0x6e, + 0x29, 0x2c, 0x74, 0x2c, 0x33, 0x29, 0x7d, 0x2c, 0x4c, 0x3a, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x49, 0x74, + 0x28, 0x6e, 0x2e, 0x67, 0x65, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, + 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x28, 0x29, 0x2c, 0x74, + 0x2c, 0x33, 0x29, 0x7d, 0x2c, 0x6d, 0x3a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x49, 0x74, 0x28, 0x6e, 0x2e, + 0x67, 0x65, 0x74, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x28, 0x29, 0x2b, + 0x31, 0x2c, 0x74, 0x2c, 0x32, 0x29, 0x7d, 0x2c, 0x4d, 0x3a, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x49, 0x74, + 0x28, 0x6e, 0x2e, 0x67, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x75, 0x74, + 0x65, 0x73, 0x28, 0x29, 0x2c, 0x74, 0x2c, 0x32, 0x29, 0x7d, 0x2c, + 0x70, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, + 0x5b, 0x2b, 0x28, 0x6e, 0x2e, 0x67, 0x65, 0x74, 0x48, 0x6f, 0x75, + 0x72, 0x73, 0x28, 0x29, 0x3e, 0x3d, 0x31, 0x32, 0x29, 0x5d, 0x7d, + 0x2c, 0x53, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x49, 0x74, 0x28, 0x6e, 0x2e, 0x67, 0x65, 0x74, 0x53, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x28, 0x29, 0x2c, 0x74, 0x2c, + 0x32, 0x29, 0x7d, 0x2c, 0x55, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x49, 0x74, 0x28, 0x61, 0x63, 0x2e, + 0x73, 0x75, 0x6e, 0x64, 0x61, 0x79, 0x4f, 0x66, 0x59, 0x65, 0x61, + 0x72, 0x28, 0x6e, 0x29, 0x2c, 0x74, 0x2c, 0x32, 0x29, 0x7d, 0x2c, + 0x77, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x2e, 0x67, 0x65, 0x74, 0x44, 0x61, 0x79, 0x28, 0x29, 0x7d, 0x2c, + 0x57, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x49, 0x74, 0x28, 0x61, 0x63, 0x2e, 0x6d, 0x6f, 0x6e, 0x64, + 0x61, 0x79, 0x4f, 0x66, 0x59, 0x65, 0x61, 0x72, 0x28, 0x6e, 0x29, + 0x2c, 0x74, 0x2c, 0x32, 0x29, 0x7d, 0x2c, 0x78, 0x3a, 0x74, 0x28, + 0x68, 0x29, 0x2c, 0x58, 0x3a, 0x74, 0x28, 0x67, 0x29, 0x2c, 0x79, + 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x49, 0x74, 0x28, 0x6e, 0x2e, 0x67, 0x65, 0x74, 0x46, 0x75, 0x6c, + 0x6c, 0x59, 0x65, 0x61, 0x72, 0x28, 0x29, 0x25, 0x31, 0x30, 0x30, + 0x2c, 0x74, 0x2c, 0x32, 0x29, 0x7d, 0x2c, 0x59, 0x3a, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x49, 0x74, 0x28, + 0x6e, 0x2e, 0x67, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x59, 0x65, + 0x61, 0x72, 0x28, 0x29, 0x25, 0x31, 0x65, 0x34, 0x2c, 0x74, 0x2c, + 0x34, 0x29, 0x7d, 0x2c, 0x5a, 0x3a, 0x69, 0x65, 0x2c, 0x22, 0x25, + 0x22, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x25, 0x22, + 0x7d, 0x7d, 0x2c, 0x43, 0x3d, 0x7b, 0x61, 0x3a, 0x72, 0x2c, 0x41, + 0x3a, 0x75, 0x2c, 0x62, 0x3a, 0x69, 0x2c, 0x42, 0x3a, 0x6f, 0x2c, + 0x63, 0x3a, 0x61, 0x2c, 0x64, 0x3a, 0x51, 0x74, 0x2c, 0x65, 0x3a, + 0x51, 0x74, 0x2c, 0x48, 0x3a, 0x74, 0x65, 0x2c, 0x49, 0x3a, 0x74, + 0x65, 0x2c, 0x6a, 0x3a, 0x6e, 0x65, 0x2c, 0x4c, 0x3a, 0x75, 0x65, + 0x2c, 0x6d, 0x3a, 0x4b, 0x74, 0x2c, 0x4d, 0x3a, 0x65, 0x65, 0x2c, + 0x70, 0x3a, 0x73, 0x2c, 0x53, 0x3a, 0x72, 0x65, 0x2c, 0x55, 0x3a, + 0x58, 0x74, 0x2c, 0x77, 0x3a, 0x56, 0x74, 0x2c, 0x57, 0x3a, 0x24, + 0x74, 0x2c, 0x78, 0x3a, 0x63, 0x2c, 0x58, 0x3a, 0x6c, 0x2c, 0x79, + 0x3a, 0x57, 0x74, 0x2c, 0x59, 0x3a, 0x42, 0x74, 0x2c, 0x5a, 0x3a, + 0x4a, 0x74, 0x2c, 0x22, 0x25, 0x22, 0x3a, 0x6f, 0x65, 0x7d, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x74, 0x28, 0x6e, + 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, + 0x3d, 0x30, 0x3e, 0x6e, 0x3f, 0x22, 0x2d, 0x22, 0x3a, 0x22, 0x22, + 0x2c, 0x75, 0x3d, 0x28, 0x72, 0x3f, 0x2d, 0x6e, 0x3a, 0x6e, 0x29, + 0x2b, 0x22, 0x22, 0x2c, 0x69, 0x3d, 0x75, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x72, 0x2b, 0x28, 0x65, 0x3e, 0x69, 0x3f, 0x6e, 0x65, 0x77, 0x20, + 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x65, 0x2d, 0x69, 0x2b, 0x31, + 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x74, 0x29, 0x2b, 0x75, + 0x3a, 0x75, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x59, 0x74, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x52, 0x65, 0x67, + 0x45, 0x78, 0x70, 0x28, 0x22, 0x5e, 0x28, 0x3f, 0x3a, 0x22, 0x2b, + 0x6e, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x74, 0x61, 0x2e, 0x72, 0x65, + 0x71, 0x75, 0x6f, 0x74, 0x65, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, + 0x28, 0x22, 0x7c, 0x22, 0x29, 0x2b, 0x22, 0x29, 0x22, 0x2c, 0x22, + 0x69, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x5a, 0x74, 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x6f, 0x72, + 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x6e, 0x65, 0x77, 0x20, + 0x6c, 0x2c, 0x65, 0x3d, 0x2d, 0x31, 0x2c, 0x72, 0x3d, 0x6e, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x2b, 0x2b, 0x65, 0x3c, + 0x72, 0x3b, 0x29, 0x74, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x6e, 0x5b, + 0x65, 0x5d, 0x2e, 0x74, 0x6f, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x43, + 0x61, 0x73, 0x65, 0x28, 0x29, 0x2c, 0x65, 0x29, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x56, 0x74, 0x28, 0x6e, 0x2c, 0x74, + 0x2c, 0x65, 0x29, 0x7b, 0x66, 0x63, 0x2e, 0x6c, 0x61, 0x73, 0x74, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x3d, 0x30, 0x3b, 0x76, 0x61, 0x72, + 0x20, 0x72, 0x3d, 0x66, 0x63, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x28, + 0x74, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x65, 0x2c, 0x65, + 0x2b, 0x31, 0x29, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x72, 0x3f, 0x28, 0x6e, 0x2e, 0x77, 0x3d, 0x2b, 0x72, 0x5b, + 0x30, 0x5d, 0x2c, 0x65, 0x2b, 0x72, 0x5b, 0x30, 0x5d, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x3a, 0x2d, 0x31, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x58, 0x74, 0x28, + 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x66, 0x63, 0x2e, 0x6c, + 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x3d, 0x30, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x66, 0x63, 0x2e, 0x65, 0x78, + 0x65, 0x63, 0x28, 0x74, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, + 0x65, 0x29, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x72, 0x3f, 0x28, 0x6e, 0x2e, 0x55, 0x3d, 0x2b, 0x72, 0x5b, 0x30, + 0x5d, 0x2c, 0x65, 0x2b, 0x72, 0x5b, 0x30, 0x5d, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x29, 0x3a, 0x2d, 0x31, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x24, 0x74, 0x28, 0x6e, + 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x66, 0x63, 0x2e, 0x6c, 0x61, + 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x3d, 0x30, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x72, 0x3d, 0x66, 0x63, 0x2e, 0x65, 0x78, 0x65, + 0x63, 0x28, 0x74, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x65, + 0x29, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, + 0x3f, 0x28, 0x6e, 0x2e, 0x57, 0x3d, 0x2b, 0x72, 0x5b, 0x30, 0x5d, + 0x2c, 0x65, 0x2b, 0x72, 0x5b, 0x30, 0x5d, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x29, 0x3a, 0x2d, 0x31, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x42, 0x74, 0x28, 0x6e, 0x2c, + 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x66, 0x63, 0x2e, 0x6c, 0x61, 0x73, + 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x3d, 0x30, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x72, 0x3d, 0x66, 0x63, 0x2e, 0x65, 0x78, 0x65, 0x63, + 0x28, 0x74, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x65, 0x2c, + 0x65, 0x2b, 0x34, 0x29, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x72, 0x3f, 0x28, 0x6e, 0x2e, 0x79, 0x3d, 0x2b, 0x72, + 0x5b, 0x30, 0x5d, 0x2c, 0x65, 0x2b, 0x72, 0x5b, 0x30, 0x5d, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x3a, 0x2d, 0x31, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x57, 0x74, + 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x66, 0x63, 0x2e, + 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x3d, 0x30, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x66, 0x63, 0x2e, 0x65, + 0x78, 0x65, 0x63, 0x28, 0x74, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, + 0x28, 0x65, 0x2c, 0x65, 0x2b, 0x32, 0x29, 0x29, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x3f, 0x28, 0x6e, 0x2e, 0x79, + 0x3d, 0x47, 0x74, 0x28, 0x2b, 0x72, 0x5b, 0x30, 0x5d, 0x29, 0x2c, + 0x65, 0x2b, 0x72, 0x5b, 0x30, 0x5d, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x29, 0x3a, 0x2d, 0x31, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4a, 0x74, 0x28, 0x6e, 0x2c, 0x74, + 0x2c, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x2f, + 0x5e, 0x5b, 0x2b, 0x2d, 0x5d, 0x5c, 0x64, 0x7b, 0x34, 0x7d, 0x24, + 0x2f, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x28, 0x74, 0x3d, 0x74, 0x2e, + 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x65, 0x2c, 0x65, 0x2b, 0x35, + 0x29, 0x29, 0x3f, 0x28, 0x6e, 0x2e, 0x5a, 0x3d, 0x2d, 0x74, 0x2c, + 0x65, 0x2b, 0x35, 0x29, 0x3a, 0x2d, 0x31, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x47, 0x74, 0x28, 0x6e, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2b, 0x28, + 0x6e, 0x3e, 0x36, 0x38, 0x3f, 0x31, 0x39, 0x30, 0x30, 0x3a, 0x32, + 0x65, 0x33, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x4b, 0x74, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, + 0x7b, 0x66, 0x63, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x3d, 0x30, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, + 0x66, 0x63, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x28, 0x74, 0x2e, 0x73, + 0x6c, 0x69, 0x63, 0x65, 0x28, 0x65, 0x2c, 0x65, 0x2b, 0x32, 0x29, + 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x3f, + 0x28, 0x6e, 0x2e, 0x6d, 0x3d, 0x72, 0x5b, 0x30, 0x5d, 0x2d, 0x31, + 0x2c, 0x65, 0x2b, 0x72, 0x5b, 0x30, 0x5d, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x29, 0x3a, 0x2d, 0x31, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x51, 0x74, 0x28, 0x6e, 0x2c, + 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x66, 0x63, 0x2e, 0x6c, 0x61, 0x73, + 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x3d, 0x30, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x72, 0x3d, 0x66, 0x63, 0x2e, 0x65, 0x78, 0x65, 0x63, + 0x28, 0x74, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x65, 0x2c, + 0x65, 0x2b, 0x32, 0x29, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x72, 0x3f, 0x28, 0x6e, 0x2e, 0x64, 0x3d, 0x2b, 0x72, + 0x5b, 0x30, 0x5d, 0x2c, 0x65, 0x2b, 0x72, 0x5b, 0x30, 0x5d, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x3a, 0x2d, 0x31, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x65, + 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x66, 0x63, 0x2e, + 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x3d, 0x30, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x66, 0x63, 0x2e, 0x65, + 0x78, 0x65, 0x63, 0x28, 0x74, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, + 0x28, 0x65, 0x2c, 0x65, 0x2b, 0x33, 0x29, 0x29, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x3f, 0x28, 0x6e, 0x2e, 0x6a, + 0x3d, 0x2b, 0x72, 0x5b, 0x30, 0x5d, 0x2c, 0x65, 0x2b, 0x72, 0x5b, + 0x30, 0x5d, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x3a, + 0x2d, 0x31, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x74, 0x65, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, + 0x66, 0x63, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x3d, 0x30, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x66, + 0x63, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x28, 0x74, 0x2e, 0x73, 0x6c, + 0x69, 0x63, 0x65, 0x28, 0x65, 0x2c, 0x65, 0x2b, 0x32, 0x29, 0x29, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x3f, 0x28, + 0x6e, 0x2e, 0x48, 0x3d, 0x2b, 0x72, 0x5b, 0x30, 0x5d, 0x2c, 0x65, + 0x2b, 0x72, 0x5b, 0x30, 0x5d, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x29, 0x3a, 0x2d, 0x31, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x65, 0x28, 0x6e, 0x2c, 0x74, 0x2c, + 0x65, 0x29, 0x7b, 0x66, 0x63, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x3d, 0x30, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x72, 0x3d, 0x66, 0x63, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x28, 0x74, + 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x65, 0x2c, 0x65, 0x2b, + 0x32, 0x29, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x72, 0x3f, 0x28, 0x6e, 0x2e, 0x4d, 0x3d, 0x2b, 0x72, 0x5b, 0x30, + 0x5d, 0x2c, 0x65, 0x2b, 0x72, 0x5b, 0x30, 0x5d, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x29, 0x3a, 0x2d, 0x31, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x28, 0x6e, + 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x66, 0x63, 0x2e, 0x6c, 0x61, + 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x3d, 0x30, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x72, 0x3d, 0x66, 0x63, 0x2e, 0x65, 0x78, 0x65, + 0x63, 0x28, 0x74, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x65, + 0x2c, 0x65, 0x2b, 0x32, 0x29, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x72, 0x3f, 0x28, 0x6e, 0x2e, 0x53, 0x3d, 0x2b, + 0x72, 0x5b, 0x30, 0x5d, 0x2c, 0x65, 0x2b, 0x72, 0x5b, 0x30, 0x5d, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x3a, 0x2d, 0x31, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, + 0x65, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x66, 0x63, + 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x3d, + 0x30, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x66, 0x63, 0x2e, + 0x65, 0x78, 0x65, 0x63, 0x28, 0x74, 0x2e, 0x73, 0x6c, 0x69, 0x63, + 0x65, 0x28, 0x65, 0x2c, 0x65, 0x2b, 0x33, 0x29, 0x29, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x3f, 0x28, 0x6e, 0x2e, + 0x4c, 0x3d, 0x2b, 0x72, 0x5b, 0x30, 0x5d, 0x2c, 0x65, 0x2b, 0x72, + 0x5b, 0x30, 0x5d, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, + 0x3a, 0x2d, 0x31, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x69, 0x65, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x74, 0x3d, 0x6e, 0x2e, 0x67, 0x65, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x7a, 0x6f, 0x6e, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x28, 0x29, 0x2c, 0x65, 0x3d, 0x74, 0x3e, 0x30, 0x3f, 0x22, 0x2d, + 0x22, 0x3a, 0x22, 0x2b, 0x22, 0x2c, 0x72, 0x3d, 0x67, 0x61, 0x28, + 0x74, 0x29, 0x2f, 0x36, 0x30, 0x7c, 0x30, 0x2c, 0x75, 0x3d, 0x67, + 0x61, 0x28, 0x74, 0x29, 0x25, 0x36, 0x30, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x65, 0x2b, 0x49, 0x74, 0x28, 0x72, 0x2c, + 0x22, 0x30, 0x22, 0x2c, 0x32, 0x29, 0x2b, 0x49, 0x74, 0x28, 0x75, + 0x2c, 0x22, 0x30, 0x22, 0x2c, 0x32, 0x29, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x65, 0x28, 0x6e, 0x2c, + 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x68, 0x63, 0x2e, 0x6c, 0x61, 0x73, + 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x3d, 0x30, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x72, 0x3d, 0x68, 0x63, 0x2e, 0x65, 0x78, 0x65, 0x63, + 0x28, 0x74, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x65, 0x2c, + 0x65, 0x2b, 0x31, 0x29, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x72, 0x3f, 0x65, 0x2b, 0x72, 0x5b, 0x30, 0x5d, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3a, 0x2d, 0x31, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x65, 0x28, + 0x6e, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, + 0x74, 0x3d, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, + 0x65, 0x3d, 0x2d, 0x31, 0x3b, 0x2b, 0x2b, 0x65, 0x3c, 0x74, 0x3b, + 0x29, 0x6e, 0x5b, 0x65, 0x5d, 0x5b, 0x30, 0x5d, 0x3d, 0x74, 0x68, + 0x69, 0x73, 0x28, 0x6e, 0x5b, 0x65, 0x5d, 0x5b, 0x30, 0x5d, 0x29, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x66, 0x6f, + 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x30, 0x2c, 0x72, + 0x3d, 0x6e, 0x5b, 0x65, 0x5d, 0x3b, 0x21, 0x72, 0x5b, 0x31, 0x5d, + 0x28, 0x74, 0x29, 0x3b, 0x29, 0x72, 0x3d, 0x6e, 0x5b, 0x2b, 0x2b, + 0x65, 0x5d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, + 0x5b, 0x30, 0x5d, 0x28, 0x74, 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x65, 0x28, 0x29, 0x7b, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, + 0x65, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x72, 0x3d, 0x65, 0x2e, 0x73, 0x3d, 0x6e, 0x2b, 0x74, + 0x2c, 0x75, 0x3d, 0x72, 0x2d, 0x6e, 0x2c, 0x69, 0x3d, 0x72, 0x2d, + 0x75, 0x3b, 0x65, 0x2e, 0x74, 0x3d, 0x6e, 0x2d, 0x69, 0x2b, 0x28, + 0x74, 0x2d, 0x75, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, + 0x6e, 0x26, 0x26, 0x64, 0x63, 0x2e, 0x68, 0x61, 0x73, 0x4f, 0x77, + 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x6e, + 0x2e, 0x74, 0x79, 0x70, 0x65, 0x29, 0x26, 0x26, 0x64, 0x63, 0x5b, + 0x6e, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x5d, 0x28, 0x6e, 0x2c, 0x74, + 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x66, 0x65, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x72, 0x2c, 0x75, 0x3d, 0x2d, 0x31, 0x2c, 0x69, + 0x3d, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x65, + 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x74, 0x2e, 0x6c, 0x69, 0x6e, 0x65, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, 0x29, 0x3b, 0x2b, 0x2b, 0x75, + 0x3c, 0x69, 0x3b, 0x29, 0x72, 0x3d, 0x6e, 0x5b, 0x75, 0x5d, 0x2c, + 0x74, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x72, 0x5b, 0x30, + 0x5d, 0x2c, 0x72, 0x5b, 0x31, 0x5d, 0x2c, 0x72, 0x5b, 0x32, 0x5d, + 0x29, 0x3b, 0x74, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, + 0x28, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x68, 0x65, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x65, 0x3d, 0x2d, 0x31, 0x2c, 0x72, 0x3d, 0x6e, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x66, 0x6f, 0x72, 0x28, + 0x74, 0x2e, 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x28, 0x29, 0x3b, 0x2b, 0x2b, 0x65, 0x3c, 0x72, + 0x3b, 0x29, 0x66, 0x65, 0x28, 0x6e, 0x5b, 0x65, 0x5d, 0x2c, 0x74, + 0x2c, 0x31, 0x29, 0x3b, 0x74, 0x2e, 0x70, 0x6f, 0x6c, 0x79, 0x67, + 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x28, 0x29, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x28, 0x29, 0x7b, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x28, + 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x6e, 0x2a, 0x3d, 0x44, 0x61, 0x2c, + 0x74, 0x3d, 0x74, 0x2a, 0x44, 0x61, 0x2f, 0x32, 0x2b, 0x71, 0x61, + 0x2f, 0x34, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x6e, 0x2d, + 0x72, 0x2c, 0x6f, 0x3d, 0x65, 0x3e, 0x3d, 0x30, 0x3f, 0x31, 0x3a, + 0x2d, 0x31, 0x2c, 0x61, 0x3d, 0x6f, 0x2a, 0x65, 0x2c, 0x63, 0x3d, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x74, 0x29, + 0x2c, 0x6c, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, + 0x28, 0x74, 0x29, 0x2c, 0x73, 0x3d, 0x69, 0x2a, 0x6c, 0x2c, 0x66, + 0x3d, 0x75, 0x2a, 0x63, 0x2b, 0x73, 0x2a, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x61, 0x29, 0x2c, 0x68, 0x3d, 0x73, + 0x2a, 0x6f, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, + 0x28, 0x61, 0x29, 0x3b, 0x79, 0x63, 0x2e, 0x61, 0x64, 0x64, 0x28, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x61, 0x74, 0x61, 0x6e, 0x32, 0x28, + 0x68, 0x2c, 0x66, 0x29, 0x29, 0x2c, 0x72, 0x3d, 0x6e, 0x2c, 0x75, + 0x3d, 0x63, 0x2c, 0x69, 0x3d, 0x6c, 0x7d, 0x76, 0x61, 0x72, 0x20, + 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x75, 0x2c, 0x69, 0x3b, 0x4d, + 0x63, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6f, 0x2c, 0x61, 0x29, 0x7b, + 0x4d, 0x63, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3d, 0x6e, 0x2c, + 0x72, 0x3d, 0x28, 0x74, 0x3d, 0x6f, 0x29, 0x2a, 0x44, 0x61, 0x2c, + 0x75, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, + 0x61, 0x3d, 0x28, 0x65, 0x3d, 0x61, 0x29, 0x2a, 0x44, 0x61, 0x2f, + 0x32, 0x2b, 0x71, 0x61, 0x2f, 0x34, 0x29, 0x2c, 0x69, 0x3d, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x61, 0x29, 0x7d, + 0x2c, 0x4d, 0x63, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x7b, 0x6e, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7d, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x65, 0x28, 0x6e, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x6e, 0x5b, 0x30, + 0x5d, 0x2c, 0x65, 0x3d, 0x6e, 0x5b, 0x31, 0x5d, 0x2c, 0x72, 0x3d, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x65, 0x29, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, 0x72, 0x2a, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x74, 0x29, 0x2c, + 0x72, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, + 0x74, 0x29, 0x2c, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, + 0x28, 0x65, 0x29, 0x5d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x76, 0x65, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x5b, 0x30, 0x5d, + 0x2a, 0x74, 0x5b, 0x30, 0x5d, 0x2b, 0x6e, 0x5b, 0x31, 0x5d, 0x2a, + 0x74, 0x5b, 0x31, 0x5d, 0x2b, 0x6e, 0x5b, 0x32, 0x5d, 0x2a, 0x74, + 0x5b, 0x32, 0x5d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x64, 0x65, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, 0x6e, 0x5b, 0x31, 0x5d, 0x2a, + 0x74, 0x5b, 0x32, 0x5d, 0x2d, 0x6e, 0x5b, 0x32, 0x5d, 0x2a, 0x74, + 0x5b, 0x31, 0x5d, 0x2c, 0x6e, 0x5b, 0x32, 0x5d, 0x2a, 0x74, 0x5b, + 0x30, 0x5d, 0x2d, 0x6e, 0x5b, 0x30, 0x5d, 0x2a, 0x74, 0x5b, 0x32, + 0x5d, 0x2c, 0x6e, 0x5b, 0x30, 0x5d, 0x2a, 0x74, 0x5b, 0x31, 0x5d, + 0x2d, 0x6e, 0x5b, 0x31, 0x5d, 0x2a, 0x74, 0x5b, 0x30, 0x5d, 0x5d, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, + 0x65, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x6e, 0x5b, 0x30, 0x5d, + 0x2b, 0x3d, 0x74, 0x5b, 0x30, 0x5d, 0x2c, 0x6e, 0x5b, 0x31, 0x5d, + 0x2b, 0x3d, 0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x6e, 0x5b, 0x32, 0x5d, + 0x2b, 0x3d, 0x74, 0x5b, 0x32, 0x5d, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x79, 0x65, 0x28, 0x6e, 0x2c, 0x74, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, 0x6e, 0x5b, + 0x30, 0x5d, 0x2a, 0x74, 0x2c, 0x6e, 0x5b, 0x31, 0x5d, 0x2a, 0x74, + 0x2c, 0x6e, 0x5b, 0x32, 0x5d, 0x2a, 0x74, 0x5d, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x65, 0x28, 0x6e, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x73, 0x71, 0x72, 0x74, 0x28, 0x6e, 0x5b, 0x30, 0x5d, + 0x2a, 0x6e, 0x5b, 0x30, 0x5d, 0x2b, 0x6e, 0x5b, 0x31, 0x5d, 0x2a, + 0x6e, 0x5b, 0x31, 0x5d, 0x2b, 0x6e, 0x5b, 0x32, 0x5d, 0x2a, 0x6e, + 0x5b, 0x32, 0x5d, 0x29, 0x3b, 0x6e, 0x5b, 0x30, 0x5d, 0x2f, 0x3d, + 0x74, 0x2c, 0x6e, 0x5b, 0x31, 0x5d, 0x2f, 0x3d, 0x74, 0x2c, 0x6e, + 0x5b, 0x32, 0x5d, 0x2f, 0x3d, 0x74, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x78, 0x65, 0x28, 0x6e, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x61, 0x74, 0x61, 0x6e, 0x32, 0x28, 0x6e, 0x5b, 0x31, 0x5d, + 0x2c, 0x6e, 0x5b, 0x30, 0x5d, 0x29, 0x2c, 0x74, 0x74, 0x28, 0x6e, + 0x5b, 0x32, 0x5d, 0x29, 0x5d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x65, 0x28, 0x6e, 0x2c, 0x74, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x67, 0x61, 0x28, + 0x6e, 0x5b, 0x30, 0x5d, 0x2d, 0x74, 0x5b, 0x30, 0x5d, 0x29, 0x3c, + 0x43, 0x61, 0x26, 0x26, 0x67, 0x61, 0x28, 0x6e, 0x5b, 0x31, 0x5d, + 0x2d, 0x74, 0x5b, 0x31, 0x5d, 0x29, 0x3c, 0x43, 0x61, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x65, 0x28, + 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x6e, 0x2a, 0x3d, 0x44, 0x61, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x63, 0x6f, 0x73, 0x28, 0x74, 0x2a, 0x3d, 0x44, 0x61, 0x29, 0x3b, + 0x77, 0x65, 0x28, 0x65, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, + 0x6f, 0x73, 0x28, 0x6e, 0x29, 0x2c, 0x65, 0x2a, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x6e, 0x29, 0x2c, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x74, 0x29, 0x29, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x65, + 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x2b, 0x2b, 0x78, + 0x63, 0x2c, 0x5f, 0x63, 0x2b, 0x3d, 0x28, 0x6e, 0x2d, 0x5f, 0x63, + 0x29, 0x2f, 0x78, 0x63, 0x2c, 0x77, 0x63, 0x2b, 0x3d, 0x28, 0x74, + 0x2d, 0x77, 0x63, 0x29, 0x2f, 0x78, 0x63, 0x2c, 0x53, 0x63, 0x2b, + 0x3d, 0x28, 0x65, 0x2d, 0x53, 0x63, 0x29, 0x2f, 0x78, 0x63, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x53, 0x65, + 0x28, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6e, 0x28, 0x6e, 0x2c, 0x75, 0x29, 0x7b, 0x6e, 0x2a, 0x3d, + 0x44, 0x61, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x75, 0x2a, 0x3d, 0x44, + 0x61, 0x29, 0x2c, 0x6f, 0x3d, 0x69, 0x2a, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x6e, 0x29, 0x2c, 0x61, 0x3d, 0x69, + 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x6e, + 0x29, 0x2c, 0x63, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, + 0x6e, 0x28, 0x75, 0x29, 0x2c, 0x6c, 0x3d, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x61, 0x74, 0x61, 0x6e, 0x32, 0x28, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x73, 0x71, 0x72, 0x74, 0x28, 0x28, 0x6c, 0x3d, 0x65, 0x2a, + 0x63, 0x2d, 0x72, 0x2a, 0x61, 0x29, 0x2a, 0x6c, 0x2b, 0x28, 0x6c, + 0x3d, 0x72, 0x2a, 0x6f, 0x2d, 0x74, 0x2a, 0x63, 0x29, 0x2a, 0x6c, + 0x2b, 0x28, 0x6c, 0x3d, 0x74, 0x2a, 0x61, 0x2d, 0x65, 0x2a, 0x6f, + 0x29, 0x2a, 0x6c, 0x29, 0x2c, 0x74, 0x2a, 0x6f, 0x2b, 0x65, 0x2a, + 0x61, 0x2b, 0x72, 0x2a, 0x63, 0x29, 0x3b, 0x62, 0x63, 0x2b, 0x3d, + 0x6c, 0x2c, 0x6b, 0x63, 0x2b, 0x3d, 0x6c, 0x2a, 0x28, 0x74, 0x2b, + 0x28, 0x74, 0x3d, 0x6f, 0x29, 0x29, 0x2c, 0x45, 0x63, 0x2b, 0x3d, + 0x6c, 0x2a, 0x28, 0x65, 0x2b, 0x28, 0x65, 0x3d, 0x61, 0x29, 0x29, + 0x2c, 0x41, 0x63, 0x2b, 0x3d, 0x6c, 0x2a, 0x28, 0x72, 0x2b, 0x28, + 0x72, 0x3d, 0x63, 0x29, 0x29, 0x2c, 0x77, 0x65, 0x28, 0x74, 0x2c, + 0x65, 0x2c, 0x72, 0x29, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x74, 0x2c, + 0x65, 0x2c, 0x72, 0x3b, 0x71, 0x63, 0x2e, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x75, 0x2c, 0x69, 0x29, 0x7b, 0x75, 0x2a, 0x3d, 0x44, 0x61, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x6f, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x63, 0x6f, 0x73, 0x28, 0x69, 0x2a, 0x3d, 0x44, 0x61, 0x29, 0x3b, + 0x74, 0x3d, 0x6f, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, + 0x73, 0x28, 0x75, 0x29, 0x2c, 0x65, 0x3d, 0x6f, 0x2a, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x75, 0x29, 0x2c, 0x72, + 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x69, + 0x29, 0x2c, 0x71, 0x63, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3d, + 0x6e, 0x2c, 0x77, 0x65, 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, + 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6b, 0x65, 0x28, 0x29, 0x7b, 0x71, 0x63, 0x2e, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x3d, 0x5f, 0x65, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x45, 0x65, 0x28, 0x29, 0x7b, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x28, 0x6e, 0x2c, + 0x74, 0x29, 0x7b, 0x6e, 0x2a, 0x3d, 0x44, 0x61, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x65, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, + 0x73, 0x28, 0x74, 0x2a, 0x3d, 0x44, 0x61, 0x29, 0x2c, 0x6f, 0x3d, + 0x65, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, + 0x6e, 0x29, 0x2c, 0x61, 0x3d, 0x65, 0x2a, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x6e, 0x29, 0x2c, 0x63, 0x3d, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x74, 0x29, 0x2c, + 0x6c, 0x3d, 0x75, 0x2a, 0x63, 0x2d, 0x69, 0x2a, 0x61, 0x2c, 0x73, + 0x3d, 0x69, 0x2a, 0x6f, 0x2d, 0x72, 0x2a, 0x63, 0x2c, 0x66, 0x3d, + 0x72, 0x2a, 0x61, 0x2d, 0x75, 0x2a, 0x6f, 0x2c, 0x68, 0x3d, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x73, 0x71, 0x72, 0x74, 0x28, 0x6c, 0x2a, + 0x6c, 0x2b, 0x73, 0x2a, 0x73, 0x2b, 0x66, 0x2a, 0x66, 0x29, 0x2c, + 0x67, 0x3d, 0x72, 0x2a, 0x6f, 0x2b, 0x75, 0x2a, 0x61, 0x2b, 0x69, + 0x2a, 0x63, 0x2c, 0x70, 0x3d, 0x68, 0x26, 0x26, 0x2d, 0x6e, 0x74, + 0x28, 0x67, 0x29, 0x2f, 0x68, 0x2c, 0x76, 0x3d, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x61, 0x74, 0x61, 0x6e, 0x32, 0x28, 0x68, 0x2c, 0x67, + 0x29, 0x3b, 0x4e, 0x63, 0x2b, 0x3d, 0x70, 0x2a, 0x6c, 0x2c, 0x43, + 0x63, 0x2b, 0x3d, 0x70, 0x2a, 0x73, 0x2c, 0x7a, 0x63, 0x2b, 0x3d, + 0x70, 0x2a, 0x66, 0x2c, 0x62, 0x63, 0x2b, 0x3d, 0x76, 0x2c, 0x6b, + 0x63, 0x2b, 0x3d, 0x76, 0x2a, 0x28, 0x72, 0x2b, 0x28, 0x72, 0x3d, + 0x6f, 0x29, 0x29, 0x2c, 0x45, 0x63, 0x2b, 0x3d, 0x76, 0x2a, 0x28, + 0x75, 0x2b, 0x28, 0x75, 0x3d, 0x61, 0x29, 0x29, 0x2c, 0x41, 0x63, + 0x2b, 0x3d, 0x76, 0x2a, 0x28, 0x69, 0x2b, 0x28, 0x69, 0x3d, 0x63, + 0x29, 0x29, 0x2c, 0x77, 0x65, 0x28, 0x72, 0x2c, 0x75, 0x2c, 0x69, + 0x29, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x74, 0x2c, 0x65, 0x2c, 0x72, + 0x2c, 0x75, 0x2c, 0x69, 0x3b, 0x71, 0x63, 0x2e, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6f, 0x2c, 0x61, 0x29, 0x7b, 0x74, 0x3d, 0x6f, 0x2c, 0x65, + 0x3d, 0x61, 0x2c, 0x71, 0x63, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x3d, 0x6e, 0x2c, 0x6f, 0x2a, 0x3d, 0x44, 0x61, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x63, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, + 0x73, 0x28, 0x61, 0x2a, 0x3d, 0x44, 0x61, 0x29, 0x3b, 0x72, 0x3d, + 0x63, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, + 0x6f, 0x29, 0x2c, 0x75, 0x3d, 0x63, 0x2a, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x6f, 0x29, 0x2c, 0x69, 0x3d, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x61, 0x29, 0x2c, + 0x77, 0x65, 0x28, 0x72, 0x2c, 0x75, 0x2c, 0x69, 0x29, 0x7d, 0x2c, + 0x71, 0x63, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, + 0x6e, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x2c, 0x71, 0x63, 0x2e, 0x6c, + 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, 0x3d, 0x6b, 0x65, 0x2c, 0x71, + 0x63, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3d, 0x5f, 0x65, 0x7d, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, + 0x65, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x28, 0x65, 0x2c, 0x72, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x3d, 0x6e, + 0x28, 0x65, 0x2c, 0x72, 0x29, 0x2c, 0x74, 0x28, 0x65, 0x5b, 0x30, + 0x5d, 0x2c, 0x65, 0x5b, 0x31, 0x5d, 0x29, 0x7d, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x72, + 0x74, 0x26, 0x26, 0x74, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x72, 0x74, + 0x26, 0x26, 0x28, 0x65, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x72, 0x74, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, + 0x2c, 0x72, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x65, 0x3d, 0x74, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x28, + 0x65, 0x2c, 0x72, 0x29, 0x2c, 0x65, 0x26, 0x26, 0x6e, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x72, 0x74, 0x28, 0x65, 0x5b, 0x30, 0x5d, 0x2c, + 0x65, 0x5b, 0x31, 0x5d, 0x29, 0x7d, 0x29, 0x2c, 0x65, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4e, 0x65, 0x28, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x21, 0x30, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x43, 0x65, + 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x75, 0x29, + 0x7b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, 0x5b, 0x5d, 0x2c, 0x6f, + 0x3d, 0x5b, 0x5d, 0x3b, 0x69, 0x66, 0x28, 0x6e, 0x2e, 0x66, 0x6f, + 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x21, + 0x28, 0x28, 0x74, 0x3d, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x2d, 0x31, 0x29, 0x3c, 0x3d, 0x30, 0x29, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x74, 0x2c, 0x65, 0x3d, 0x6e, 0x5b, 0x30, 0x5d, + 0x2c, 0x72, 0x3d, 0x6e, 0x5b, 0x74, 0x5d, 0x3b, 0x69, 0x66, 0x28, + 0x62, 0x65, 0x28, 0x65, 0x2c, 0x72, 0x29, 0x29, 0x7b, 0x75, 0x2e, + 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, 0x29, + 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x61, 0x3d, + 0x30, 0x3b, 0x74, 0x3e, 0x61, 0x3b, 0x2b, 0x2b, 0x61, 0x29, 0x75, + 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x65, 0x3d, 0x6e, + 0x5b, 0x61, 0x5d, 0x29, 0x5b, 0x30, 0x5d, 0x2c, 0x65, 0x5b, 0x31, + 0x5d, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, + 0x6f, 0x69, 0x64, 0x20, 0x75, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x45, + 0x6e, 0x64, 0x28, 0x29, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x63, 0x3d, + 0x6e, 0x65, 0x77, 0x20, 0x71, 0x65, 0x28, 0x65, 0x2c, 0x6e, 0x2c, + 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x21, 0x30, 0x29, 0x2c, 0x6c, 0x3d, + 0x6e, 0x65, 0x77, 0x20, 0x71, 0x65, 0x28, 0x65, 0x2c, 0x6e, 0x75, + 0x6c, 0x6c, 0x2c, 0x63, 0x2c, 0x21, 0x31, 0x29, 0x3b, 0x63, 0x2e, + 0x6f, 0x3d, 0x6c, 0x2c, 0x69, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, + 0x63, 0x29, 0x2c, 0x6f, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x6c, + 0x29, 0x2c, 0x63, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x71, 0x65, 0x28, + 0x72, 0x2c, 0x6e, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x21, 0x31, + 0x29, 0x2c, 0x6c, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x71, 0x65, 0x28, + 0x72, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x63, 0x2c, 0x21, 0x30, + 0x29, 0x2c, 0x63, 0x2e, 0x6f, 0x3d, 0x6c, 0x2c, 0x69, 0x2e, 0x70, + 0x75, 0x73, 0x68, 0x28, 0x63, 0x29, 0x2c, 0x6f, 0x2e, 0x70, 0x75, + 0x73, 0x68, 0x28, 0x6c, 0x29, 0x7d, 0x7d, 0x29, 0x2c, 0x6f, 0x2e, + 0x73, 0x6f, 0x72, 0x74, 0x28, 0x74, 0x29, 0x2c, 0x7a, 0x65, 0x28, + 0x69, 0x29, 0x2c, 0x7a, 0x65, 0x28, 0x6f, 0x29, 0x2c, 0x69, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x7b, 0x66, 0x6f, 0x72, + 0x28, 0x76, 0x61, 0x72, 0x20, 0x61, 0x3d, 0x30, 0x2c, 0x63, 0x3d, + 0x65, 0x2c, 0x6c, 0x3d, 0x6f, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3b, 0x6c, 0x3e, 0x61, 0x3b, 0x2b, 0x2b, 0x61, 0x29, 0x6f, + 0x5b, 0x61, 0x5d, 0x2e, 0x65, 0x3d, 0x63, 0x3d, 0x21, 0x63, 0x3b, + 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x73, 0x2c, 0x66, + 0x2c, 0x68, 0x3d, 0x69, 0x5b, 0x30, 0x5d, 0x3b, 0x3b, 0x29, 0x7b, + 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x67, 0x3d, 0x68, + 0x2c, 0x70, 0x3d, 0x21, 0x30, 0x3b, 0x67, 0x2e, 0x76, 0x3b, 0x29, + 0x69, 0x66, 0x28, 0x28, 0x67, 0x3d, 0x67, 0x2e, 0x6e, 0x29, 0x3d, + 0x3d, 0x3d, 0x68, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, + 0x73, 0x3d, 0x67, 0x2e, 0x7a, 0x2c, 0x75, 0x2e, 0x6c, 0x69, 0x6e, + 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, 0x29, 0x3b, 0x64, 0x6f, + 0x7b, 0x69, 0x66, 0x28, 0x67, 0x2e, 0x76, 0x3d, 0x67, 0x2e, 0x6f, + 0x2e, 0x76, 0x3d, 0x21, 0x30, 0x2c, 0x67, 0x2e, 0x65, 0x29, 0x7b, + 0x69, 0x66, 0x28, 0x70, 0x29, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, + 0x72, 0x20, 0x61, 0x3d, 0x30, 0x2c, 0x6c, 0x3d, 0x73, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x6c, 0x3e, 0x61, 0x3b, 0x2b, + 0x2b, 0x61, 0x29, 0x75, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, + 0x28, 0x66, 0x3d, 0x73, 0x5b, 0x61, 0x5d, 0x29, 0x5b, 0x30, 0x5d, + 0x2c, 0x66, 0x5b, 0x31, 0x5d, 0x29, 0x3b, 0x65, 0x6c, 0x73, 0x65, + 0x20, 0x72, 0x28, 0x67, 0x2e, 0x78, 0x2c, 0x67, 0x2e, 0x6e, 0x2e, + 0x78, 0x2c, 0x31, 0x2c, 0x75, 0x29, 0x3b, 0x67, 0x3d, 0x67, 0x2e, + 0x6e, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x69, 0x66, 0x28, 0x70, + 0x29, 0x7b, 0x73, 0x3d, 0x67, 0x2e, 0x70, 0x2e, 0x7a, 0x3b, 0x66, + 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x61, 0x3d, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, 0x3b, 0x61, 0x3e, + 0x3d, 0x30, 0x3b, 0x2d, 0x2d, 0x61, 0x29, 0x75, 0x2e, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x28, 0x28, 0x66, 0x3d, 0x73, 0x5b, 0x61, 0x5d, + 0x29, 0x5b, 0x30, 0x5d, 0x2c, 0x66, 0x5b, 0x31, 0x5d, 0x29, 0x7d, + 0x65, 0x6c, 0x73, 0x65, 0x20, 0x72, 0x28, 0x67, 0x2e, 0x78, 0x2c, + 0x67, 0x2e, 0x70, 0x2e, 0x78, 0x2c, 0x2d, 0x31, 0x2c, 0x75, 0x29, + 0x3b, 0x67, 0x3d, 0x67, 0x2e, 0x70, 0x7d, 0x67, 0x3d, 0x67, 0x2e, + 0x6f, 0x2c, 0x73, 0x3d, 0x67, 0x2e, 0x7a, 0x2c, 0x70, 0x3d, 0x21, + 0x70, 0x7d, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x21, 0x67, 0x2e, + 0x76, 0x29, 0x3b, 0x75, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, + 0x64, 0x28, 0x29, 0x7d, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x7a, 0x65, 0x28, 0x6e, 0x29, 0x7b, 0x69, + 0x66, 0x28, 0x74, 0x3d, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, + 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x3d, 0x30, 0x2c, 0x75, 0x3d, 0x6e, + 0x5b, 0x30, 0x5d, 0x3b, 0x2b, 0x2b, 0x72, 0x3c, 0x74, 0x3b, 0x29, + 0x75, 0x2e, 0x6e, 0x3d, 0x65, 0x3d, 0x6e, 0x5b, 0x72, 0x5d, 0x2c, + 0x65, 0x2e, 0x70, 0x3d, 0x75, 0x2c, 0x75, 0x3d, 0x65, 0x3b, 0x75, + 0x2e, 0x6e, 0x3d, 0x65, 0x3d, 0x6e, 0x5b, 0x30, 0x5d, 0x2c, 0x65, + 0x2e, 0x70, 0x3d, 0x75, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x71, 0x65, 0x28, 0x6e, 0x2c, 0x74, 0x2c, + 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x78, + 0x3d, 0x6e, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x7a, 0x3d, 0x74, + 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x3d, 0x65, 0x2c, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x65, 0x3d, 0x72, 0x2c, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x76, 0x3d, 0x21, 0x31, 0x2c, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x6e, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x70, 0x3d, 0x6e, + 0x75, 0x6c, 0x6c, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x4c, 0x65, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x2c, + 0x72, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x75, 0x2c, 0x69, + 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6f, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x72, 0x3d, 0x75, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x3b, 0x6e, 0x28, + 0x74, 0x3d, 0x72, 0x5b, 0x30, 0x5d, 0x2c, 0x65, 0x3d, 0x72, 0x5b, + 0x31, 0x5d, 0x29, 0x26, 0x26, 0x69, 0x2e, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x28, 0x6e, 0x2c, 0x74, 0x29, + 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x75, 0x28, 0x6e, 0x2c, + 0x74, 0x29, 0x3b, 0x64, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, + 0x65, 0x5b, 0x30, 0x5d, 0x2c, 0x65, 0x5b, 0x31, 0x5d, 0x29, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x28, + 0x29, 0x7b, 0x79, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3d, 0x61, + 0x2c, 0x64, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x28, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6c, 0x28, 0x29, 0x7b, 0x79, 0x2e, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x3d, 0x6f, 0x2c, 0x64, 0x2e, 0x6c, 0x69, 0x6e, 0x65, + 0x45, 0x6e, 0x64, 0x28, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, + 0x76, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x5b, 0x6e, 0x2c, 0x74, + 0x5d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x75, 0x28, + 0x6e, 0x2c, 0x74, 0x29, 0x3b, 0x78, 0x2e, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x28, 0x65, 0x5b, 0x30, 0x5d, 0x2c, 0x65, 0x5b, 0x31, 0x5d, + 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x66, 0x28, 0x29, 0x7b, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x28, 0x29, 0x2c, 0x76, 0x3d, 0x5b, 0x5d, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, + 0x28, 0x29, 0x7b, 0x73, 0x28, 0x76, 0x5b, 0x30, 0x5d, 0x5b, 0x30, + 0x5d, 0x2c, 0x76, 0x5b, 0x30, 0x5d, 0x5b, 0x31, 0x5d, 0x29, 0x2c, + 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, 0x28, 0x29, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x6e, 0x2c, 0x74, 0x3d, 0x78, 0x2e, + 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x28, 0x29, 0x2c, 0x65, 0x3d, 0x4d, + 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x29, 0x2c, 0x72, + 0x3d, 0x65, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x69, + 0x66, 0x28, 0x76, 0x2e, 0x70, 0x6f, 0x70, 0x28, 0x29, 0x2c, 0x70, + 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x76, 0x29, 0x2c, 0x76, 0x3d, + 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x72, 0x29, 0x69, 0x66, 0x28, 0x31, + 0x26, 0x74, 0x29, 0x7b, 0x6e, 0x3d, 0x65, 0x5b, 0x30, 0x5d, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x75, 0x2c, 0x72, 0x3d, 0x6e, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, 0x2c, 0x6f, 0x3d, 0x2d, + 0x31, 0x3b, 0x69, 0x66, 0x28, 0x72, 0x3e, 0x30, 0x29, 0x7b, 0x66, + 0x6f, 0x72, 0x28, 0x62, 0x7c, 0x7c, 0x28, 0x69, 0x2e, 0x70, 0x6f, + 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, + 0x29, 0x2c, 0x62, 0x3d, 0x21, 0x30, 0x29, 0x2c, 0x69, 0x2e, 0x6c, + 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, 0x29, 0x3b, + 0x2b, 0x2b, 0x6f, 0x3c, 0x72, 0x3b, 0x29, 0x69, 0x2e, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x28, 0x28, 0x75, 0x3d, 0x6e, 0x5b, 0x6f, 0x5d, + 0x29, 0x5b, 0x30, 0x5d, 0x2c, 0x75, 0x5b, 0x31, 0x5d, 0x29, 0x3b, + 0x69, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, 0x28, 0x29, + 0x7d, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x72, 0x3e, 0x31, 0x26, + 0x26, 0x32, 0x26, 0x74, 0x26, 0x26, 0x65, 0x2e, 0x70, 0x75, 0x73, + 0x68, 0x28, 0x65, 0x2e, 0x70, 0x6f, 0x70, 0x28, 0x29, 0x2e, 0x63, + 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x65, 0x2e, 0x73, 0x68, 0x69, + 0x66, 0x74, 0x28, 0x29, 0x29, 0x29, 0x2c, 0x67, 0x2e, 0x70, 0x75, + 0x73, 0x68, 0x28, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x28, 0x54, 0x65, 0x29, 0x29, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x67, + 0x2c, 0x70, 0x2c, 0x76, 0x2c, 0x64, 0x3d, 0x74, 0x28, 0x69, 0x29, + 0x2c, 0x6d, 0x3d, 0x75, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x72, 0x74, + 0x28, 0x72, 0x5b, 0x30, 0x5d, 0x2c, 0x72, 0x5b, 0x31, 0x5d, 0x29, + 0x2c, 0x79, 0x3d, 0x7b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3a, 0x6f, + 0x2c, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3a, + 0x63, 0x2c, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, 0x3a, 0x6c, + 0x2c, 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x7b, 0x79, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3d, + 0x73, 0x2c, 0x79, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x3d, 0x66, 0x2c, 0x79, 0x2e, 0x6c, 0x69, 0x6e, 0x65, + 0x45, 0x6e, 0x64, 0x3d, 0x68, 0x2c, 0x67, 0x3d, 0x5b, 0x5d, 0x2c, + 0x70, 0x3d, 0x5b, 0x5d, 0x7d, 0x2c, 0x70, 0x6f, 0x6c, 0x79, 0x67, + 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x79, 0x2e, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x3d, 0x6f, 0x2c, 0x79, 0x2e, 0x6c, 0x69, 0x6e, 0x65, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x3d, 0x63, 0x2c, 0x79, 0x2e, 0x6c, + 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, 0x3d, 0x6c, 0x2c, 0x67, 0x3d, + 0x74, 0x61, 0x2e, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x28, 0x67, 0x29, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x6e, 0x3d, 0x46, 0x65, 0x28, 0x6d, + 0x2c, 0x70, 0x29, 0x3b, 0x67, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3f, 0x28, 0x62, 0x7c, 0x7c, 0x28, 0x69, 0x2e, 0x70, 0x6f, + 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, + 0x29, 0x2c, 0x62, 0x3d, 0x21, 0x30, 0x29, 0x2c, 0x43, 0x65, 0x28, + 0x67, 0x2c, 0x44, 0x65, 0x2c, 0x6e, 0x2c, 0x65, 0x2c, 0x69, 0x29, + 0x29, 0x3a, 0x6e, 0x26, 0x26, 0x28, 0x62, 0x7c, 0x7c, 0x28, 0x69, + 0x2e, 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x28, 0x29, 0x2c, 0x62, 0x3d, 0x21, 0x30, 0x29, 0x2c, + 0x69, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x28, 0x29, 0x2c, 0x65, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x6e, + 0x75, 0x6c, 0x6c, 0x2c, 0x31, 0x2c, 0x69, 0x29, 0x2c, 0x69, 0x2e, + 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, 0x28, 0x29, 0x29, 0x2c, + 0x62, 0x26, 0x26, 0x28, 0x69, 0x2e, 0x70, 0x6f, 0x6c, 0x79, 0x67, + 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x28, 0x29, 0x2c, 0x62, 0x3d, 0x21, + 0x31, 0x29, 0x2c, 0x67, 0x3d, 0x70, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, + 0x7d, 0x2c, 0x73, 0x70, 0x68, 0x65, 0x72, 0x65, 0x3a, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x69, 0x2e, + 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x28, 0x29, 0x2c, 0x69, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x28, 0x29, 0x2c, 0x65, 0x28, 0x6e, 0x75, + 0x6c, 0x6c, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x31, 0x2c, 0x69, + 0x29, 0x2c, 0x69, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, + 0x28, 0x29, 0x2c, 0x69, 0x2e, 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, + 0x6e, 0x45, 0x6e, 0x64, 0x28, 0x29, 0x7d, 0x7d, 0x2c, 0x4d, 0x3d, + 0x52, 0x65, 0x28, 0x29, 0x2c, 0x78, 0x3d, 0x74, 0x28, 0x4d, 0x29, + 0x2c, 0x62, 0x3d, 0x21, 0x31, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x79, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x54, 0x65, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3e, 0x31, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x52, 0x65, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x6e, 0x2c, 0x74, 0x3d, 0x5b, 0x5d, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x7b, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x7b, 0x74, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x6e, + 0x3d, 0x5b, 0x5d, 0x29, 0x7d, 0x2c, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, + 0x2c, 0x65, 0x29, 0x7b, 0x6e, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, + 0x5b, 0x74, 0x2c, 0x65, 0x5d, 0x29, 0x7d, 0x2c, 0x6c, 0x69, 0x6e, + 0x65, 0x45, 0x6e, 0x64, 0x3a, 0x62, 0x2c, 0x62, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x74, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x3d, 0x5b, 0x5d, + 0x2c, 0x6e, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x65, 0x7d, 0x2c, + 0x72, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x3a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x74, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3e, 0x31, 0x26, 0x26, 0x74, 0x2e, 0x70, + 0x75, 0x73, 0x68, 0x28, 0x74, 0x2e, 0x70, 0x6f, 0x70, 0x28, 0x29, + 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x74, 0x2e, 0x73, + 0x68, 0x69, 0x66, 0x74, 0x28, 0x29, 0x29, 0x29, 0x7d, 0x7d, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x44, 0x65, + 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x28, 0x28, 0x6e, 0x3d, 0x6e, 0x2e, 0x78, 0x29, 0x5b, 0x30, + 0x5d, 0x3c, 0x30, 0x3f, 0x6e, 0x5b, 0x31, 0x5d, 0x2d, 0x52, 0x61, + 0x2d, 0x43, 0x61, 0x3a, 0x52, 0x61, 0x2d, 0x6e, 0x5b, 0x31, 0x5d, + 0x29, 0x2d, 0x28, 0x28, 0x74, 0x3d, 0x74, 0x2e, 0x78, 0x29, 0x5b, + 0x30, 0x5d, 0x3c, 0x30, 0x3f, 0x74, 0x5b, 0x31, 0x5d, 0x2d, 0x52, + 0x61, 0x2d, 0x43, 0x61, 0x3a, 0x52, 0x61, 0x2d, 0x74, 0x5b, 0x31, + 0x5d, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x50, 0x65, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x74, 0x2c, 0x65, 0x3d, 0x30, 0x2f, 0x30, 0x2c, 0x72, 0x3d, 0x30, + 0x2f, 0x30, 0x2c, 0x75, 0x3d, 0x30, 0x2f, 0x30, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x7b, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x7b, 0x6e, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x28, 0x29, 0x2c, 0x74, 0x3d, 0x31, 0x7d, + 0x2c, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x69, 0x2c, 0x6f, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x61, 0x3d, 0x69, 0x3e, 0x30, 0x3f, 0x71, 0x61, + 0x3a, 0x2d, 0x71, 0x61, 0x2c, 0x63, 0x3d, 0x67, 0x61, 0x28, 0x69, + 0x2d, 0x65, 0x29, 0x3b, 0x67, 0x61, 0x28, 0x63, 0x2d, 0x71, 0x61, + 0x29, 0x3c, 0x43, 0x61, 0x3f, 0x28, 0x6e, 0x2e, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x28, 0x65, 0x2c, 0x72, 0x3d, 0x28, 0x72, 0x2b, 0x6f, + 0x29, 0x2f, 0x32, 0x3e, 0x30, 0x3f, 0x52, 0x61, 0x3a, 0x2d, 0x52, + 0x61, 0x29, 0x2c, 0x6e, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, + 0x75, 0x2c, 0x72, 0x29, 0x2c, 0x6e, 0x2e, 0x6c, 0x69, 0x6e, 0x65, + 0x45, 0x6e, 0x64, 0x28, 0x29, 0x2c, 0x6e, 0x2e, 0x6c, 0x69, 0x6e, + 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, 0x29, 0x2c, 0x6e, 0x2e, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x61, 0x2c, 0x72, 0x29, 0x2c, + 0x6e, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x69, 0x2c, 0x72, + 0x29, 0x2c, 0x74, 0x3d, 0x30, 0x29, 0x3a, 0x75, 0x21, 0x3d, 0x3d, + 0x61, 0x26, 0x26, 0x63, 0x3e, 0x3d, 0x71, 0x61, 0x26, 0x26, 0x28, + 0x67, 0x61, 0x28, 0x65, 0x2d, 0x75, 0x29, 0x3c, 0x43, 0x61, 0x26, + 0x26, 0x28, 0x65, 0x2d, 0x3d, 0x75, 0x2a, 0x43, 0x61, 0x29, 0x2c, + 0x67, 0x61, 0x28, 0x69, 0x2d, 0x61, 0x29, 0x3c, 0x43, 0x61, 0x26, + 0x26, 0x28, 0x69, 0x2d, 0x3d, 0x61, 0x2a, 0x43, 0x61, 0x29, 0x2c, + 0x72, 0x3d, 0x55, 0x65, 0x28, 0x65, 0x2c, 0x72, 0x2c, 0x69, 0x2c, + 0x6f, 0x29, 0x2c, 0x6e, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, + 0x75, 0x2c, 0x72, 0x29, 0x2c, 0x6e, 0x2e, 0x6c, 0x69, 0x6e, 0x65, + 0x45, 0x6e, 0x64, 0x28, 0x29, 0x2c, 0x6e, 0x2e, 0x6c, 0x69, 0x6e, + 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, 0x29, 0x2c, 0x6e, 0x2e, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x61, 0x2c, 0x72, 0x29, 0x2c, + 0x74, 0x3d, 0x30, 0x29, 0x2c, 0x6e, 0x2e, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x28, 0x65, 0x3d, 0x69, 0x2c, 0x72, 0x3d, 0x6f, 0x29, 0x2c, + 0x75, 0x3d, 0x61, 0x7d, 0x2c, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, + 0x64, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x29, 0x7b, 0x6e, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, + 0x28, 0x29, 0x2c, 0x65, 0x3d, 0x72, 0x3d, 0x30, 0x2f, 0x30, 0x7d, + 0x2c, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x3a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x32, 0x2d, 0x74, 0x7d, 0x7d, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x55, 0x65, 0x28, 0x6e, + 0x2c, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x75, 0x2c, 0x69, 0x2c, 0x6f, 0x3d, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x6e, 0x2d, 0x65, 0x29, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x67, 0x61, 0x28, 0x6f, 0x29, + 0x3e, 0x43, 0x61, 0x3f, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x61, 0x74, + 0x61, 0x6e, 0x28, 0x28, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, + 0x6e, 0x28, 0x74, 0x29, 0x2a, 0x28, 0x69, 0x3d, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x72, 0x29, 0x29, 0x2a, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x65, 0x29, 0x2d, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x72, 0x29, + 0x2a, 0x28, 0x75, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, + 0x73, 0x28, 0x74, 0x29, 0x29, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x73, 0x69, 0x6e, 0x28, 0x6e, 0x29, 0x29, 0x2f, 0x28, 0x75, 0x2a, + 0x69, 0x2a, 0x6f, 0x29, 0x29, 0x3a, 0x28, 0x74, 0x2b, 0x72, 0x29, + 0x2f, 0x32, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6a, 0x65, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x2c, 0x72, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x75, 0x3b, 0x69, 0x66, 0x28, + 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x6e, 0x29, 0x75, 0x3d, 0x65, + 0x2a, 0x52, 0x61, 0x2c, 0x72, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x28, 0x2d, 0x71, 0x61, 0x2c, 0x75, 0x29, 0x2c, 0x72, 0x2e, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x30, 0x2c, 0x75, 0x29, 0x2c, 0x72, + 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x71, 0x61, 0x2c, 0x75, + 0x29, 0x2c, 0x72, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x71, + 0x61, 0x2c, 0x30, 0x29, 0x2c, 0x72, 0x2e, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x28, 0x71, 0x61, 0x2c, 0x2d, 0x75, 0x29, 0x2c, 0x72, 0x2e, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x30, 0x2c, 0x2d, 0x75, 0x29, + 0x2c, 0x72, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x2d, 0x71, + 0x61, 0x2c, 0x2d, 0x75, 0x29, 0x2c, 0x72, 0x2e, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x28, 0x2d, 0x71, 0x61, 0x2c, 0x30, 0x29, 0x2c, 0x72, + 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x2d, 0x71, 0x61, 0x2c, + 0x75, 0x29, 0x3b, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, + 0x67, 0x61, 0x28, 0x6e, 0x5b, 0x30, 0x5d, 0x2d, 0x74, 0x5b, 0x30, + 0x5d, 0x29, 0x3e, 0x43, 0x61, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x69, 0x3d, 0x6e, 0x5b, 0x30, 0x5d, 0x3c, 0x74, 0x5b, 0x30, 0x5d, + 0x3f, 0x71, 0x61, 0x3a, 0x2d, 0x71, 0x61, 0x3b, 0x75, 0x3d, 0x65, + 0x2a, 0x69, 0x2f, 0x32, 0x2c, 0x72, 0x2e, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x28, 0x2d, 0x69, 0x2c, 0x75, 0x29, 0x2c, 0x72, 0x2e, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x30, 0x2c, 0x75, 0x29, 0x2c, 0x72, + 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x69, 0x2c, 0x75, 0x29, + 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x72, 0x2e, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x28, 0x74, 0x5b, 0x30, 0x5d, 0x2c, 0x74, 0x5b, 0x31, + 0x5d, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x46, 0x65, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x65, 0x3d, 0x6e, 0x5b, 0x30, 0x5d, 0x2c, 0x72, 0x3d, + 0x6e, 0x5b, 0x31, 0x5d, 0x2c, 0x75, 0x3d, 0x5b, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x65, 0x29, 0x2c, 0x2d, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x65, 0x29, 0x2c, + 0x30, 0x5d, 0x2c, 0x69, 0x3d, 0x30, 0x2c, 0x6f, 0x3d, 0x30, 0x3b, + 0x79, 0x63, 0x2e, 0x72, 0x65, 0x73, 0x65, 0x74, 0x28, 0x29, 0x3b, + 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x61, 0x3d, 0x30, + 0x2c, 0x63, 0x3d, 0x74, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3b, 0x63, 0x3e, 0x61, 0x3b, 0x2b, 0x2b, 0x61, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x6c, 0x3d, 0x74, 0x5b, 0x61, 0x5d, 0x2c, 0x73, + 0x3d, 0x6c, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x69, + 0x66, 0x28, 0x73, 0x29, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, + 0x20, 0x66, 0x3d, 0x6c, 0x5b, 0x30, 0x5d, 0x2c, 0x68, 0x3d, 0x66, + 0x5b, 0x30, 0x5d, 0x2c, 0x67, 0x3d, 0x66, 0x5b, 0x31, 0x5d, 0x2f, + 0x32, 0x2b, 0x71, 0x61, 0x2f, 0x34, 0x2c, 0x70, 0x3d, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x67, 0x29, 0x2c, 0x76, + 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x67, + 0x29, 0x2c, 0x64, 0x3d, 0x31, 0x3b, 0x3b, 0x29, 0x7b, 0x64, 0x3d, + 0x3d, 0x3d, 0x73, 0x26, 0x26, 0x28, 0x64, 0x3d, 0x30, 0x29, 0x2c, + 0x6e, 0x3d, 0x6c, 0x5b, 0x64, 0x5d, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x6d, 0x3d, 0x6e, 0x5b, 0x30, 0x5d, 0x2c, 0x79, 0x3d, 0x6e, 0x5b, + 0x31, 0x5d, 0x2f, 0x32, 0x2b, 0x71, 0x61, 0x2f, 0x34, 0x2c, 0x4d, + 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x79, + 0x29, 0x2c, 0x78, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, + 0x73, 0x28, 0x79, 0x29, 0x2c, 0x62, 0x3d, 0x6d, 0x2d, 0x68, 0x2c, + 0x5f, 0x3d, 0x62, 0x3e, 0x3d, 0x30, 0x3f, 0x31, 0x3a, 0x2d, 0x31, + 0x2c, 0x77, 0x3d, 0x5f, 0x2a, 0x62, 0x2c, 0x53, 0x3d, 0x77, 0x3e, + 0x71, 0x61, 0x2c, 0x6b, 0x3d, 0x70, 0x2a, 0x4d, 0x3b, 0x69, 0x66, + 0x28, 0x79, 0x63, 0x2e, 0x61, 0x64, 0x64, 0x28, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x61, 0x74, 0x61, 0x6e, 0x32, 0x28, 0x6b, 0x2a, 0x5f, + 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x77, + 0x29, 0x2c, 0x76, 0x2a, 0x78, 0x2b, 0x6b, 0x2a, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x77, 0x29, 0x29, 0x29, 0x2c, + 0x69, 0x2b, 0x3d, 0x53, 0x3f, 0x62, 0x2b, 0x5f, 0x2a, 0x4c, 0x61, + 0x3a, 0x62, 0x2c, 0x53, 0x5e, 0x68, 0x3e, 0x3d, 0x65, 0x5e, 0x6d, + 0x3e, 0x3d, 0x65, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x45, 0x3d, + 0x64, 0x65, 0x28, 0x70, 0x65, 0x28, 0x66, 0x29, 0x2c, 0x70, 0x65, + 0x28, 0x6e, 0x29, 0x29, 0x3b, 0x4d, 0x65, 0x28, 0x45, 0x29, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x41, 0x3d, 0x64, 0x65, 0x28, 0x75, 0x2c, + 0x45, 0x29, 0x3b, 0x4d, 0x65, 0x28, 0x41, 0x29, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x4e, 0x3d, 0x28, 0x53, 0x5e, 0x62, 0x3e, 0x3d, 0x30, + 0x3f, 0x2d, 0x31, 0x3a, 0x31, 0x29, 0x2a, 0x74, 0x74, 0x28, 0x41, + 0x5b, 0x32, 0x5d, 0x29, 0x3b, 0x28, 0x72, 0x3e, 0x4e, 0x7c, 0x7c, + 0x72, 0x3d, 0x3d, 0x3d, 0x4e, 0x26, 0x26, 0x28, 0x45, 0x5b, 0x30, + 0x5d, 0x7c, 0x7c, 0x45, 0x5b, 0x31, 0x5d, 0x29, 0x29, 0x26, 0x26, + 0x28, 0x6f, 0x2b, 0x3d, 0x53, 0x5e, 0x62, 0x3e, 0x3d, 0x30, 0x3f, + 0x31, 0x3a, 0x2d, 0x31, 0x29, 0x7d, 0x69, 0x66, 0x28, 0x21, 0x64, + 0x2b, 0x2b, 0x29, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x68, 0x3d, + 0x6d, 0x2c, 0x70, 0x3d, 0x4d, 0x2c, 0x76, 0x3d, 0x78, 0x2c, 0x66, + 0x3d, 0x6e, 0x7d, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, + 0x2d, 0x43, 0x61, 0x3e, 0x69, 0x7c, 0x7c, 0x43, 0x61, 0x3e, 0x69, + 0x26, 0x26, 0x30, 0x3e, 0x79, 0x63, 0x29, 0x5e, 0x31, 0x26, 0x6f, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x48, + 0x65, 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x74, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x63, 0x6f, 0x73, 0x28, 0x6e, 0x29, 0x2a, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x74, 0x29, 0x3e, 0x69, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x28, 0x6e, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x2c, 0x69, 0x2c, 0x63, + 0x2c, 0x6c, 0x2c, 0x73, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x7b, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, + 0x6c, 0x3d, 0x63, 0x3d, 0x21, 0x31, 0x2c, 0x73, 0x3d, 0x31, 0x7d, + 0x2c, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x66, 0x2c, 0x68, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x67, 0x2c, 0x70, 0x3d, 0x5b, 0x66, 0x2c, 0x68, + 0x5d, 0x2c, 0x76, 0x3d, 0x74, 0x28, 0x66, 0x2c, 0x68, 0x29, 0x2c, + 0x64, 0x3d, 0x6f, 0x3f, 0x76, 0x3f, 0x30, 0x3a, 0x75, 0x28, 0x66, + 0x2c, 0x68, 0x29, 0x3a, 0x76, 0x3f, 0x75, 0x28, 0x66, 0x2b, 0x28, + 0x30, 0x3e, 0x66, 0x3f, 0x71, 0x61, 0x3a, 0x2d, 0x71, 0x61, 0x29, + 0x2c, 0x68, 0x29, 0x3a, 0x30, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x65, + 0x26, 0x26, 0x28, 0x6c, 0x3d, 0x63, 0x3d, 0x76, 0x29, 0x26, 0x26, + 0x6e, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x28, 0x29, 0x2c, 0x76, 0x21, 0x3d, 0x3d, 0x63, 0x26, 0x26, 0x28, + 0x67, 0x3d, 0x72, 0x28, 0x65, 0x2c, 0x70, 0x29, 0x2c, 0x28, 0x62, + 0x65, 0x28, 0x65, 0x2c, 0x67, 0x29, 0x7c, 0x7c, 0x62, 0x65, 0x28, + 0x70, 0x2c, 0x67, 0x29, 0x29, 0x26, 0x26, 0x28, 0x70, 0x5b, 0x30, + 0x5d, 0x2b, 0x3d, 0x43, 0x61, 0x2c, 0x70, 0x5b, 0x31, 0x5d, 0x2b, + 0x3d, 0x43, 0x61, 0x2c, 0x76, 0x3d, 0x74, 0x28, 0x70, 0x5b, 0x30, + 0x5d, 0x2c, 0x70, 0x5b, 0x31, 0x5d, 0x29, 0x29, 0x29, 0x2c, 0x76, + 0x21, 0x3d, 0x3d, 0x63, 0x29, 0x73, 0x3d, 0x30, 0x2c, 0x76, 0x3f, + 0x28, 0x6e, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x28, 0x29, 0x2c, 0x67, 0x3d, 0x72, 0x28, 0x70, 0x2c, 0x65, + 0x29, 0x2c, 0x6e, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x67, + 0x5b, 0x30, 0x5d, 0x2c, 0x67, 0x5b, 0x31, 0x5d, 0x29, 0x29, 0x3a, + 0x28, 0x67, 0x3d, 0x72, 0x28, 0x65, 0x2c, 0x70, 0x29, 0x2c, 0x6e, + 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x67, 0x5b, 0x30, 0x5d, + 0x2c, 0x67, 0x5b, 0x31, 0x5d, 0x29, 0x2c, 0x6e, 0x2e, 0x6c, 0x69, + 0x6e, 0x65, 0x45, 0x6e, 0x64, 0x28, 0x29, 0x29, 0x2c, 0x65, 0x3d, + 0x67, 0x3b, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x61, + 0x26, 0x26, 0x65, 0x26, 0x26, 0x6f, 0x5e, 0x76, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x6d, 0x3b, 0x64, 0x26, 0x69, 0x7c, 0x7c, 0x21, + 0x28, 0x6d, 0x3d, 0x72, 0x28, 0x70, 0x2c, 0x65, 0x2c, 0x21, 0x30, + 0x29, 0x29, 0x7c, 0x7c, 0x28, 0x73, 0x3d, 0x30, 0x2c, 0x6f, 0x3f, + 0x28, 0x6e, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x28, 0x29, 0x2c, 0x6e, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x28, 0x6d, 0x5b, 0x30, 0x5d, 0x5b, 0x30, 0x5d, 0x2c, 0x6d, 0x5b, + 0x30, 0x5d, 0x5b, 0x31, 0x5d, 0x29, 0x2c, 0x6e, 0x2e, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x28, 0x6d, 0x5b, 0x31, 0x5d, 0x5b, 0x30, 0x5d, + 0x2c, 0x6d, 0x5b, 0x31, 0x5d, 0x5b, 0x31, 0x5d, 0x29, 0x2c, 0x6e, + 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, 0x28, 0x29, 0x29, + 0x3a, 0x28, 0x6e, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x6d, + 0x5b, 0x31, 0x5d, 0x5b, 0x30, 0x5d, 0x2c, 0x6d, 0x5b, 0x31, 0x5d, + 0x5b, 0x31, 0x5d, 0x29, 0x2c, 0x6e, 0x2e, 0x6c, 0x69, 0x6e, 0x65, + 0x45, 0x6e, 0x64, 0x28, 0x29, 0x2c, 0x6e, 0x2e, 0x6c, 0x69, 0x6e, + 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, 0x29, 0x2c, 0x6e, 0x2e, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x6d, 0x5b, 0x30, 0x5d, 0x5b, + 0x30, 0x5d, 0x2c, 0x6d, 0x5b, 0x30, 0x5d, 0x5b, 0x31, 0x5d, 0x29, + 0x29, 0x29, 0x7d, 0x21, 0x76, 0x7c, 0x7c, 0x65, 0x26, 0x26, 0x62, + 0x65, 0x28, 0x65, 0x2c, 0x70, 0x29, 0x7c, 0x7c, 0x6e, 0x2e, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x70, 0x5b, 0x30, 0x5d, 0x2c, 0x70, + 0x5b, 0x31, 0x5d, 0x29, 0x2c, 0x65, 0x3d, 0x70, 0x2c, 0x63, 0x3d, + 0x76, 0x2c, 0x69, 0x3d, 0x64, 0x7d, 0x2c, 0x6c, 0x69, 0x6e, 0x65, + 0x45, 0x6e, 0x64, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x7b, 0x63, 0x26, 0x26, 0x6e, 0x2e, 0x6c, 0x69, + 0x6e, 0x65, 0x45, 0x6e, 0x64, 0x28, 0x29, 0x2c, 0x65, 0x3d, 0x6e, + 0x75, 0x6c, 0x6c, 0x7d, 0x2c, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x3a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x7c, 0x28, 0x6c, + 0x26, 0x26, 0x63, 0x29, 0x3c, 0x3c, 0x31, 0x7d, 0x7d, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x28, 0x6e, + 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, + 0x3d, 0x70, 0x65, 0x28, 0x6e, 0x29, 0x2c, 0x75, 0x3d, 0x70, 0x65, + 0x28, 0x74, 0x29, 0x2c, 0x6f, 0x3d, 0x5b, 0x31, 0x2c, 0x30, 0x2c, + 0x30, 0x5d, 0x2c, 0x61, 0x3d, 0x64, 0x65, 0x28, 0x72, 0x2c, 0x75, + 0x29, 0x2c, 0x63, 0x3d, 0x76, 0x65, 0x28, 0x61, 0x2c, 0x61, 0x29, + 0x2c, 0x6c, 0x3d, 0x61, 0x5b, 0x30, 0x5d, 0x2c, 0x73, 0x3d, 0x63, + 0x2d, 0x6c, 0x2a, 0x6c, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x73, 0x29, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x21, 0x65, 0x26, 0x26, 0x6e, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x66, 0x3d, 0x69, 0x2a, 0x63, 0x2f, + 0x73, 0x2c, 0x68, 0x3d, 0x2d, 0x69, 0x2a, 0x6c, 0x2f, 0x73, 0x2c, + 0x67, 0x3d, 0x64, 0x65, 0x28, 0x6f, 0x2c, 0x61, 0x29, 0x2c, 0x70, + 0x3d, 0x79, 0x65, 0x28, 0x6f, 0x2c, 0x66, 0x29, 0x2c, 0x76, 0x3d, + 0x79, 0x65, 0x28, 0x61, 0x2c, 0x68, 0x29, 0x3b, 0x6d, 0x65, 0x28, + 0x70, 0x2c, 0x76, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x64, 0x3d, + 0x67, 0x2c, 0x6d, 0x3d, 0x76, 0x65, 0x28, 0x70, 0x2c, 0x64, 0x29, + 0x2c, 0x79, 0x3d, 0x76, 0x65, 0x28, 0x64, 0x2c, 0x64, 0x29, 0x2c, + 0x4d, 0x3d, 0x6d, 0x2a, 0x6d, 0x2d, 0x79, 0x2a, 0x28, 0x76, 0x65, + 0x28, 0x70, 0x2c, 0x70, 0x29, 0x2d, 0x31, 0x29, 0x3b, 0x69, 0x66, + 0x28, 0x21, 0x28, 0x30, 0x3e, 0x4d, 0x29, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x78, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x71, + 0x72, 0x74, 0x28, 0x4d, 0x29, 0x2c, 0x62, 0x3d, 0x79, 0x65, 0x28, + 0x64, 0x2c, 0x28, 0x2d, 0x6d, 0x2d, 0x78, 0x29, 0x2f, 0x79, 0x29, + 0x3b, 0x69, 0x66, 0x28, 0x6d, 0x65, 0x28, 0x62, 0x2c, 0x70, 0x29, + 0x2c, 0x62, 0x3d, 0x78, 0x65, 0x28, 0x62, 0x29, 0x2c, 0x21, 0x65, + 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x5f, 0x2c, 0x77, 0x3d, 0x6e, 0x5b, 0x30, 0x5d, + 0x2c, 0x53, 0x3d, 0x74, 0x5b, 0x30, 0x5d, 0x2c, 0x6b, 0x3d, 0x6e, + 0x5b, 0x31, 0x5d, 0x2c, 0x45, 0x3d, 0x74, 0x5b, 0x31, 0x5d, 0x3b, + 0x77, 0x3e, 0x53, 0x26, 0x26, 0x28, 0x5f, 0x3d, 0x77, 0x2c, 0x77, + 0x3d, 0x53, 0x2c, 0x53, 0x3d, 0x5f, 0x29, 0x3b, 0x76, 0x61, 0x72, + 0x20, 0x41, 0x3d, 0x53, 0x2d, 0x77, 0x2c, 0x4e, 0x3d, 0x67, 0x61, + 0x28, 0x41, 0x2d, 0x71, 0x61, 0x29, 0x3c, 0x43, 0x61, 0x2c, 0x43, + 0x3d, 0x4e, 0x7c, 0x7c, 0x43, 0x61, 0x3e, 0x41, 0x3b, 0x69, 0x66, + 0x28, 0x21, 0x4e, 0x26, 0x26, 0x6b, 0x3e, 0x45, 0x26, 0x26, 0x28, + 0x5f, 0x3d, 0x6b, 0x2c, 0x6b, 0x3d, 0x45, 0x2c, 0x45, 0x3d, 0x5f, + 0x29, 0x2c, 0x43, 0x3f, 0x4e, 0x3f, 0x6b, 0x2b, 0x45, 0x3e, 0x30, + 0x5e, 0x62, 0x5b, 0x31, 0x5d, 0x3c, 0x28, 0x67, 0x61, 0x28, 0x62, + 0x5b, 0x30, 0x5d, 0x2d, 0x77, 0x29, 0x3c, 0x43, 0x61, 0x3f, 0x6b, + 0x3a, 0x45, 0x29, 0x3a, 0x6b, 0x3c, 0x3d, 0x62, 0x5b, 0x31, 0x5d, + 0x26, 0x26, 0x62, 0x5b, 0x31, 0x5d, 0x3c, 0x3d, 0x45, 0x3a, 0x41, + 0x3e, 0x71, 0x61, 0x5e, 0x28, 0x77, 0x3c, 0x3d, 0x62, 0x5b, 0x30, + 0x5d, 0x26, 0x26, 0x62, 0x5b, 0x30, 0x5d, 0x3c, 0x3d, 0x53, 0x29, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x7a, 0x3d, 0x79, 0x65, 0x28, + 0x64, 0x2c, 0x28, 0x2d, 0x6d, 0x2b, 0x78, 0x29, 0x2f, 0x79, 0x29, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x65, 0x28, + 0x7a, 0x2c, 0x70, 0x29, 0x2c, 0x5b, 0x62, 0x2c, 0x78, 0x65, 0x28, + 0x7a, 0x29, 0x5d, 0x7d, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x6f, 0x3f, 0x6e, 0x3a, 0x71, + 0x61, 0x2d, 0x6e, 0x2c, 0x75, 0x3d, 0x30, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x2d, 0x72, 0x3e, 0x74, 0x3f, 0x75, 0x7c, 0x3d, + 0x31, 0x3a, 0x74, 0x3e, 0x72, 0x26, 0x26, 0x28, 0x75, 0x7c, 0x3d, + 0x32, 0x29, 0x2c, 0x2d, 0x72, 0x3e, 0x65, 0x3f, 0x75, 0x7c, 0x3d, + 0x34, 0x3a, 0x65, 0x3e, 0x72, 0x26, 0x26, 0x28, 0x75, 0x7c, 0x3d, + 0x38, 0x29, 0x2c, 0x75, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x6e, 0x29, + 0x2c, 0x6f, 0x3d, 0x69, 0x3e, 0x30, 0x2c, 0x61, 0x3d, 0x67, 0x61, + 0x28, 0x69, 0x29, 0x3e, 0x43, 0x61, 0x2c, 0x63, 0x3d, 0x67, 0x72, + 0x28, 0x6e, 0x2c, 0x36, 0x2a, 0x44, 0x61, 0x29, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4c, 0x65, 0x28, 0x74, 0x2c, 0x65, + 0x2c, 0x63, 0x2c, 0x6f, 0x3f, 0x5b, 0x30, 0x2c, 0x2d, 0x6e, 0x5d, + 0x3a, 0x5b, 0x2d, 0x71, 0x61, 0x2c, 0x6e, 0x2d, 0x71, 0x61, 0x5d, + 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x4f, 0x65, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x75, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x69, 0x2c, 0x6f, 0x3d, 0x75, 0x2e, 0x61, 0x2c, 0x61, + 0x3d, 0x75, 0x2e, 0x62, 0x2c, 0x63, 0x3d, 0x6f, 0x2e, 0x78, 0x2c, + 0x6c, 0x3d, 0x6f, 0x2e, 0x79, 0x2c, 0x73, 0x3d, 0x61, 0x2e, 0x78, + 0x2c, 0x66, 0x3d, 0x61, 0x2e, 0x79, 0x2c, 0x68, 0x3d, 0x30, 0x2c, + 0x67, 0x3d, 0x31, 0x2c, 0x70, 0x3d, 0x73, 0x2d, 0x63, 0x2c, 0x76, + 0x3d, 0x66, 0x2d, 0x6c, 0x3b, 0x69, 0x66, 0x28, 0x69, 0x3d, 0x6e, + 0x2d, 0x63, 0x2c, 0x70, 0x7c, 0x7c, 0x21, 0x28, 0x69, 0x3e, 0x30, + 0x29, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x69, 0x2f, 0x3d, 0x70, 0x2c, + 0x30, 0x3e, 0x70, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x68, 0x3e, 0x69, + 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x67, 0x3e, 0x69, + 0x26, 0x26, 0x28, 0x67, 0x3d, 0x69, 0x29, 0x7d, 0x65, 0x6c, 0x73, + 0x65, 0x20, 0x69, 0x66, 0x28, 0x70, 0x3e, 0x30, 0x29, 0x7b, 0x69, + 0x66, 0x28, 0x69, 0x3e, 0x67, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x3b, 0x69, 0x3e, 0x68, 0x26, 0x26, 0x28, 0x68, 0x3d, 0x69, + 0x29, 0x7d, 0x69, 0x66, 0x28, 0x69, 0x3d, 0x65, 0x2d, 0x63, 0x2c, + 0x70, 0x7c, 0x7c, 0x21, 0x28, 0x30, 0x3e, 0x69, 0x29, 0x29, 0x7b, + 0x69, 0x66, 0x28, 0x69, 0x2f, 0x3d, 0x70, 0x2c, 0x30, 0x3e, 0x70, + 0x29, 0x7b, 0x69, 0x66, 0x28, 0x69, 0x3e, 0x67, 0x29, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x69, 0x3e, 0x68, 0x26, 0x26, 0x28, + 0x68, 0x3d, 0x69, 0x29, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, + 0x66, 0x28, 0x70, 0x3e, 0x30, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x68, + 0x3e, 0x69, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x67, + 0x3e, 0x69, 0x26, 0x26, 0x28, 0x67, 0x3d, 0x69, 0x29, 0x7d, 0x69, + 0x66, 0x28, 0x69, 0x3d, 0x74, 0x2d, 0x6c, 0x2c, 0x76, 0x7c, 0x7c, + 0x21, 0x28, 0x69, 0x3e, 0x30, 0x29, 0x29, 0x7b, 0x69, 0x66, 0x28, + 0x69, 0x2f, 0x3d, 0x76, 0x2c, 0x30, 0x3e, 0x76, 0x29, 0x7b, 0x69, + 0x66, 0x28, 0x68, 0x3e, 0x69, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x3b, 0x67, 0x3e, 0x69, 0x26, 0x26, 0x28, 0x67, 0x3d, 0x69, + 0x29, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x76, + 0x3e, 0x30, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x69, 0x3e, 0x67, 0x29, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x69, 0x3e, 0x68, 0x26, + 0x26, 0x28, 0x68, 0x3d, 0x69, 0x29, 0x7d, 0x69, 0x66, 0x28, 0x69, + 0x3d, 0x72, 0x2d, 0x6c, 0x2c, 0x76, 0x7c, 0x7c, 0x21, 0x28, 0x30, + 0x3e, 0x69, 0x29, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x69, 0x2f, 0x3d, + 0x76, 0x2c, 0x30, 0x3e, 0x76, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x69, + 0x3e, 0x67, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x69, + 0x3e, 0x68, 0x26, 0x26, 0x28, 0x68, 0x3d, 0x69, 0x29, 0x7d, 0x65, + 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x76, 0x3e, 0x30, 0x29, + 0x7b, 0x69, 0x66, 0x28, 0x68, 0x3e, 0x69, 0x29, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x3b, 0x67, 0x3e, 0x69, 0x26, 0x26, 0x28, 0x67, + 0x3d, 0x69, 0x29, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x68, 0x3e, 0x30, 0x26, 0x26, 0x28, 0x75, 0x2e, 0x61, 0x3d, 0x7b, + 0x78, 0x3a, 0x63, 0x2b, 0x68, 0x2a, 0x70, 0x2c, 0x79, 0x3a, 0x6c, + 0x2b, 0x68, 0x2a, 0x76, 0x7d, 0x29, 0x2c, 0x31, 0x3e, 0x67, 0x26, + 0x26, 0x28, 0x75, 0x2e, 0x62, 0x3d, 0x7b, 0x78, 0x3a, 0x63, 0x2b, + 0x67, 0x2a, 0x70, 0x2c, 0x79, 0x3a, 0x6c, 0x2b, 0x67, 0x2a, 0x76, + 0x7d, 0x29, 0x2c, 0x75, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x65, 0x28, + 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x28, 0x72, 0x2c, + 0x75, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x67, + 0x61, 0x28, 0x72, 0x5b, 0x30, 0x5d, 0x2d, 0x6e, 0x29, 0x3c, 0x43, + 0x61, 0x3f, 0x75, 0x3e, 0x30, 0x3f, 0x30, 0x3a, 0x33, 0x3a, 0x67, + 0x61, 0x28, 0x72, 0x5b, 0x30, 0x5d, 0x2d, 0x65, 0x29, 0x3c, 0x43, + 0x61, 0x3f, 0x75, 0x3e, 0x30, 0x3f, 0x32, 0x3a, 0x31, 0x3a, 0x67, + 0x61, 0x28, 0x72, 0x5b, 0x31, 0x5d, 0x2d, 0x74, 0x29, 0x3c, 0x43, + 0x61, 0x3f, 0x75, 0x3e, 0x30, 0x3f, 0x31, 0x3a, 0x30, 0x3a, 0x75, + 0x3e, 0x30, 0x3f, 0x33, 0x3a, 0x32, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x28, 0x6e, 0x2c, 0x74, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x28, 0x6e, + 0x2e, 0x78, 0x2c, 0x74, 0x2e, 0x78, 0x29, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x28, 0x6e, 0x2c, 0x74, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x75, 0x28, 0x6e, + 0x2c, 0x31, 0x29, 0x2c, 0x72, 0x3d, 0x75, 0x28, 0x74, 0x2c, 0x31, + 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x21, + 0x3d, 0x3d, 0x72, 0x3f, 0x65, 0x2d, 0x72, 0x3a, 0x30, 0x3d, 0x3d, + 0x3d, 0x65, 0x3f, 0x74, 0x5b, 0x31, 0x5d, 0x2d, 0x6e, 0x5b, 0x31, + 0x5d, 0x3a, 0x31, 0x3d, 0x3d, 0x3d, 0x65, 0x3f, 0x6e, 0x5b, 0x30, + 0x5d, 0x2d, 0x74, 0x5b, 0x30, 0x5d, 0x3a, 0x32, 0x3d, 0x3d, 0x3d, + 0x65, 0x3f, 0x6e, 0x5b, 0x31, 0x5d, 0x2d, 0x74, 0x5b, 0x31, 0x5d, + 0x3a, 0x74, 0x5b, 0x30, 0x5d, 0x2d, 0x6e, 0x5b, 0x30, 0x5d, 0x7d, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x29, 0x7b, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x28, 0x6e, 0x29, 0x7b, + 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x30, + 0x2c, 0x65, 0x3d, 0x64, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x2c, 0x72, 0x3d, 0x6e, 0x5b, 0x31, 0x5d, 0x2c, 0x75, 0x3d, 0x30, + 0x3b, 0x65, 0x3e, 0x75, 0x3b, 0x2b, 0x2b, 0x75, 0x29, 0x66, 0x6f, + 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x69, 0x2c, 0x6f, 0x3d, 0x31, + 0x2c, 0x61, 0x3d, 0x64, 0x5b, 0x75, 0x5d, 0x2c, 0x63, 0x3d, 0x61, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x6c, 0x3d, 0x61, + 0x5b, 0x30, 0x5d, 0x3b, 0x63, 0x3e, 0x6f, 0x3b, 0x2b, 0x2b, 0x6f, + 0x29, 0x69, 0x3d, 0x61, 0x5b, 0x6f, 0x5d, 0x2c, 0x6c, 0x5b, 0x31, + 0x5d, 0x3c, 0x3d, 0x72, 0x3f, 0x69, 0x5b, 0x31, 0x5d, 0x3e, 0x72, + 0x26, 0x26, 0x51, 0x28, 0x6c, 0x2c, 0x69, 0x2c, 0x6e, 0x29, 0x3e, + 0x30, 0x26, 0x26, 0x2b, 0x2b, 0x74, 0x3a, 0x69, 0x5b, 0x31, 0x5d, + 0x3c, 0x3d, 0x72, 0x26, 0x26, 0x51, 0x28, 0x6c, 0x2c, 0x69, 0x2c, + 0x6e, 0x29, 0x3c, 0x30, 0x26, 0x26, 0x2d, 0x2d, 0x74, 0x2c, 0x6c, + 0x3d, 0x69, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x30, + 0x21, 0x3d, 0x3d, 0x74, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6c, 0x28, 0x69, 0x2c, 0x61, 0x2c, 0x63, 0x2c, + 0x6c, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x73, 0x3d, 0x30, 0x2c, + 0x66, 0x3d, 0x30, 0x3b, 0x69, 0x66, 0x28, 0x6e, 0x75, 0x6c, 0x6c, + 0x3d, 0x3d, 0x69, 0x7c, 0x7c, 0x28, 0x73, 0x3d, 0x75, 0x28, 0x69, + 0x2c, 0x63, 0x29, 0x29, 0x21, 0x3d, 0x3d, 0x28, 0x66, 0x3d, 0x75, + 0x28, 0x61, 0x2c, 0x63, 0x29, 0x29, 0x7c, 0x7c, 0x6f, 0x28, 0x69, + 0x2c, 0x61, 0x29, 0x3c, 0x30, 0x5e, 0x63, 0x3e, 0x30, 0x29, 0x7b, + 0x64, 0x6f, 0x20, 0x6c, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, + 0x30, 0x3d, 0x3d, 0x3d, 0x73, 0x7c, 0x7c, 0x33, 0x3d, 0x3d, 0x3d, + 0x73, 0x3f, 0x6e, 0x3a, 0x65, 0x2c, 0x73, 0x3e, 0x31, 0x3f, 0x72, + 0x3a, 0x74, 0x29, 0x3b, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x28, + 0x73, 0x3d, 0x28, 0x73, 0x2b, 0x63, 0x2b, 0x34, 0x29, 0x25, 0x34, + 0x29, 0x21, 0x3d, 0x3d, 0x66, 0x29, 0x7d, 0x65, 0x6c, 0x73, 0x65, + 0x20, 0x6c, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x61, 0x5b, + 0x30, 0x5d, 0x2c, 0x61, 0x5b, 0x31, 0x5d, 0x29, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x28, 0x75, 0x2c, + 0x69, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, + 0x3e, 0x3d, 0x6e, 0x26, 0x26, 0x65, 0x3e, 0x3d, 0x75, 0x26, 0x26, + 0x69, 0x3e, 0x3d, 0x74, 0x26, 0x26, 0x72, 0x3e, 0x3d, 0x69, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x28, + 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x73, 0x28, 0x6e, 0x2c, 0x74, 0x29, + 0x26, 0x26, 0x61, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x6e, + 0x2c, 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x68, 0x28, 0x29, 0x7b, 0x43, 0x2e, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x3d, 0x70, 0x2c, 0x64, 0x26, 0x26, 0x64, 0x2e, 0x70, + 0x75, 0x73, 0x68, 0x28, 0x6d, 0x3d, 0x5b, 0x5d, 0x29, 0x2c, 0x53, + 0x3d, 0x21, 0x30, 0x2c, 0x77, 0x3d, 0x21, 0x31, 0x2c, 0x62, 0x3d, + 0x5f, 0x3d, 0x30, 0x2f, 0x30, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x28, 0x29, 0x7b, 0x76, 0x26, 0x26, + 0x28, 0x70, 0x28, 0x79, 0x2c, 0x4d, 0x29, 0x2c, 0x78, 0x26, 0x26, + 0x77, 0x26, 0x26, 0x41, 0x2e, 0x72, 0x65, 0x6a, 0x6f, 0x69, 0x6e, + 0x28, 0x29, 0x2c, 0x76, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x41, + 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x29, 0x29, 0x29, + 0x2c, 0x43, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3d, 0x66, 0x2c, + 0x77, 0x26, 0x26, 0x61, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, + 0x64, 0x28, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x70, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x6e, 0x3d, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x2d, 0x54, + 0x63, 0x2c, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x69, 0x6e, 0x28, + 0x54, 0x63, 0x2c, 0x6e, 0x29, 0x29, 0x2c, 0x74, 0x3d, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x2d, 0x54, 0x63, 0x2c, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x54, 0x63, + 0x2c, 0x74, 0x29, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, + 0x73, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x64, + 0x26, 0x26, 0x6d, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x5b, 0x6e, + 0x2c, 0x74, 0x5d, 0x29, 0x2c, 0x53, 0x29, 0x79, 0x3d, 0x6e, 0x2c, + 0x4d, 0x3d, 0x74, 0x2c, 0x78, 0x3d, 0x65, 0x2c, 0x53, 0x3d, 0x21, + 0x31, 0x2c, 0x65, 0x26, 0x26, 0x28, 0x61, 0x2e, 0x6c, 0x69, 0x6e, + 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, 0x29, 0x2c, 0x61, 0x2e, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x29, + 0x3b, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x65, 0x26, + 0x26, 0x77, 0x29, 0x61, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, + 0x6e, 0x2c, 0x74, 0x29, 0x3b, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x72, 0x3d, 0x7b, 0x61, 0x3a, 0x7b, 0x78, 0x3a, + 0x62, 0x2c, 0x79, 0x3a, 0x5f, 0x7d, 0x2c, 0x62, 0x3a, 0x7b, 0x78, + 0x3a, 0x6e, 0x2c, 0x79, 0x3a, 0x74, 0x7d, 0x7d, 0x3b, 0x4e, 0x28, + 0x72, 0x29, 0x3f, 0x28, 0x77, 0x7c, 0x7c, 0x28, 0x61, 0x2e, 0x6c, + 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, 0x29, 0x2c, + 0x61, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x72, 0x2e, 0x61, + 0x2e, 0x78, 0x2c, 0x72, 0x2e, 0x61, 0x2e, 0x79, 0x29, 0x29, 0x2c, + 0x61, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x72, 0x2e, 0x62, + 0x2e, 0x78, 0x2c, 0x72, 0x2e, 0x62, 0x2e, 0x79, 0x29, 0x2c, 0x65, + 0x7c, 0x7c, 0x61, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, + 0x28, 0x29, 0x2c, 0x6b, 0x3d, 0x21, 0x31, 0x29, 0x3a, 0x65, 0x26, + 0x26, 0x28, 0x61, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x28, 0x29, 0x2c, 0x61, 0x2e, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x2c, 0x6b, 0x3d, 0x21, 0x31, + 0x29, 0x7d, 0x62, 0x3d, 0x6e, 0x2c, 0x5f, 0x3d, 0x74, 0x2c, 0x77, + 0x3d, 0x65, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x76, 0x2c, 0x64, 0x2c, + 0x6d, 0x2c, 0x79, 0x2c, 0x4d, 0x2c, 0x78, 0x2c, 0x62, 0x2c, 0x5f, + 0x2c, 0x77, 0x2c, 0x53, 0x2c, 0x6b, 0x2c, 0x45, 0x3d, 0x61, 0x2c, + 0x41, 0x3d, 0x52, 0x65, 0x28, 0x29, 0x2c, 0x4e, 0x3d, 0x4f, 0x65, + 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x2c, 0x43, + 0x3d, 0x7b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3a, 0x66, 0x2c, 0x6c, + 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3a, 0x68, 0x2c, + 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, 0x3a, 0x67, 0x2c, 0x70, + 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x7b, 0x61, 0x3d, 0x41, 0x2c, 0x76, 0x3d, 0x5b, 0x5d, 0x2c, 0x64, + 0x3d, 0x5b, 0x5d, 0x2c, 0x6b, 0x3d, 0x21, 0x30, 0x7d, 0x2c, 0x70, + 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x3a, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x61, + 0x3d, 0x45, 0x2c, 0x76, 0x3d, 0x74, 0x61, 0x2e, 0x6d, 0x65, 0x72, + 0x67, 0x65, 0x28, 0x76, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x74, + 0x3d, 0x63, 0x28, 0x5b, 0x6e, 0x2c, 0x72, 0x5d, 0x29, 0x2c, 0x65, + 0x3d, 0x6b, 0x26, 0x26, 0x74, 0x2c, 0x75, 0x3d, 0x76, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x28, 0x65, 0x7c, 0x7c, 0x75, + 0x29, 0x26, 0x26, 0x28, 0x61, 0x2e, 0x70, 0x6f, 0x6c, 0x79, 0x67, + 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, 0x29, 0x2c, 0x65, + 0x26, 0x26, 0x28, 0x61, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x28, 0x29, 0x2c, 0x6c, 0x28, 0x6e, 0x75, 0x6c, + 0x6c, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x31, 0x2c, 0x61, 0x29, + 0x2c, 0x61, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, 0x28, + 0x29, 0x29, 0x2c, 0x75, 0x26, 0x26, 0x43, 0x65, 0x28, 0x76, 0x2c, + 0x69, 0x2c, 0x74, 0x2c, 0x6c, 0x2c, 0x61, 0x29, 0x2c, 0x61, 0x2e, + 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x28, + 0x29, 0x29, 0x2c, 0x76, 0x3d, 0x64, 0x3d, 0x6d, 0x3d, 0x6e, 0x75, + 0x6c, 0x6c, 0x7d, 0x7d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x43, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x59, 0x65, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x74, 0x3d, 0x30, 0x2c, 0x65, 0x3d, 0x71, 0x61, 0x2f, 0x33, + 0x2c, 0x72, 0x3d, 0x69, 0x72, 0x28, 0x6e, 0x29, 0x2c, 0x75, 0x3d, + 0x72, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x75, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, + 0x65, 0x6c, 0x73, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x72, 0x28, 0x74, 0x3d, + 0x6e, 0x5b, 0x30, 0x5d, 0x2a, 0x71, 0x61, 0x2f, 0x31, 0x38, 0x30, + 0x2c, 0x65, 0x3d, 0x6e, 0x5b, 0x31, 0x5d, 0x2a, 0x71, 0x61, 0x2f, + 0x31, 0x38, 0x30, 0x29, 0x3a, 0x5b, 0x74, 0x2f, 0x71, 0x61, 0x2a, + 0x31, 0x38, 0x30, 0x2c, 0x65, 0x2f, 0x71, 0x61, 0x2a, 0x31, 0x38, + 0x30, 0x5d, 0x7d, 0x2c, 0x75, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x5a, 0x65, 0x28, 0x6e, 0x2c, 0x74, 0x29, + 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, + 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, + 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x71, 0x72, 0x74, 0x28, + 0x69, 0x2d, 0x32, 0x2a, 0x75, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x73, 0x69, 0x6e, 0x28, 0x74, 0x29, 0x29, 0x2f, 0x75, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, 0x65, 0x2a, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x6e, 0x2a, 0x3d, 0x75, 0x29, + 0x2c, 0x6f, 0x2d, 0x65, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, + 0x6f, 0x73, 0x28, 0x6e, 0x29, 0x5d, 0x7d, 0x76, 0x61, 0x72, 0x20, + 0x72, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, + 0x6e, 0x29, 0x2c, 0x75, 0x3d, 0x28, 0x72, 0x2b, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x74, 0x29, 0x29, 0x2f, 0x32, + 0x2c, 0x69, 0x3d, 0x31, 0x2b, 0x72, 0x2a, 0x28, 0x32, 0x2a, 0x75, + 0x2d, 0x72, 0x29, 0x2c, 0x6f, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x73, 0x71, 0x72, 0x74, 0x28, 0x69, 0x29, 0x2f, 0x75, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x72, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x65, 0x3d, 0x6f, 0x2d, 0x74, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x5b, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x61, 0x74, 0x61, 0x6e, + 0x32, 0x28, 0x6e, 0x2c, 0x65, 0x29, 0x2f, 0x75, 0x2c, 0x74, 0x74, + 0x28, 0x28, 0x69, 0x2d, 0x28, 0x6e, 0x2a, 0x6e, 0x2b, 0x65, 0x2a, + 0x65, 0x29, 0x2a, 0x75, 0x2a, 0x75, 0x29, 0x2f, 0x28, 0x32, 0x2a, + 0x75, 0x29, 0x29, 0x5d, 0x7d, 0x2c, 0x65, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x56, 0x65, 0x28, 0x29, 0x7b, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x28, + 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x44, 0x63, 0x2b, 0x3d, 0x75, 0x2a, + 0x6e, 0x2d, 0x72, 0x2a, 0x74, 0x2c, 0x72, 0x3d, 0x6e, 0x2c, 0x75, + 0x3d, 0x74, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x74, 0x2c, 0x65, 0x2c, + 0x72, 0x2c, 0x75, 0x3b, 0x48, 0x63, 0x2e, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x69, 0x2c, 0x6f, 0x29, 0x7b, 0x48, 0x63, 0x2e, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x3d, 0x6e, 0x2c, 0x74, 0x3d, 0x72, 0x3d, 0x69, 0x2c, + 0x65, 0x3d, 0x75, 0x3d, 0x6f, 0x7d, 0x2c, 0x48, 0x63, 0x2e, 0x6c, + 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x6e, 0x28, 0x74, 0x2c, + 0x65, 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x58, 0x65, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x50, + 0x63, 0x3e, 0x6e, 0x26, 0x26, 0x28, 0x50, 0x63, 0x3d, 0x6e, 0x29, + 0x2c, 0x6e, 0x3e, 0x6a, 0x63, 0x26, 0x26, 0x28, 0x6a, 0x63, 0x3d, + 0x6e, 0x29, 0x2c, 0x55, 0x63, 0x3e, 0x74, 0x26, 0x26, 0x28, 0x55, + 0x63, 0x3d, 0x74, 0x29, 0x2c, 0x74, 0x3e, 0x46, 0x63, 0x26, 0x26, + 0x28, 0x46, 0x63, 0x3d, 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x24, 0x65, 0x28, 0x29, 0x7b, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x28, 0x6e, + 0x2c, 0x74, 0x29, 0x7b, 0x6f, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, + 0x22, 0x4d, 0x22, 0x2c, 0x6e, 0x2c, 0x22, 0x2c, 0x22, 0x2c, 0x74, + 0x2c, 0x69, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x74, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x6f, 0x2e, + 0x70, 0x75, 0x73, 0x68, 0x28, 0x22, 0x4d, 0x22, 0x2c, 0x6e, 0x2c, + 0x22, 0x2c, 0x22, 0x2c, 0x74, 0x29, 0x2c, 0x61, 0x2e, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x3d, 0x65, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, + 0x6f, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x22, 0x4c, 0x22, 0x2c, + 0x6e, 0x2c, 0x22, 0x2c, 0x22, 0x2c, 0x74, 0x29, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x28, 0x29, 0x7b, + 0x61, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3d, 0x6e, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x28, 0x29, + 0x7b, 0x6f, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x22, 0x5a, 0x22, + 0x29, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, 0x42, 0x65, 0x28, + 0x34, 0x2e, 0x35, 0x29, 0x2c, 0x6f, 0x3d, 0x5b, 0x5d, 0x2c, 0x61, + 0x3d, 0x7b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3a, 0x6e, 0x2c, 0x6c, + 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3a, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x61, 0x2e, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3d, 0x74, 0x7d, 0x2c, 0x6c, 0x69, + 0x6e, 0x65, 0x45, 0x6e, 0x64, 0x3a, 0x72, 0x2c, 0x70, 0x6f, 0x6c, + 0x79, 0x67, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3a, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x61, + 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, 0x3d, 0x75, 0x7d, + 0x2c, 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x45, 0x6e, 0x64, + 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x7b, 0x61, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, 0x3d, + 0x72, 0x2c, 0x61, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3d, 0x6e, + 0x7d, 0x2c, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x61, 0x64, 0x69, + 0x75, 0x73, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x69, 0x3d, 0x42, 0x65, 0x28, 0x6e, 0x29, 0x2c, 0x61, 0x7d, 0x2c, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x6f, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x6e, 0x3d, 0x6f, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, + 0x22, 0x22, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6f, 0x3d, 0x5b, 0x5d, 0x2c, 0x6e, 0x7d, 0x7d, 0x7d, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x42, 0x65, 0x28, 0x6e, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x6d, 0x30, 0x2c, + 0x22, 0x2b, 0x6e, 0x2b, 0x22, 0x61, 0x22, 0x2b, 0x6e, 0x2b, 0x22, + 0x2c, 0x22, 0x2b, 0x6e, 0x2b, 0x22, 0x20, 0x30, 0x20, 0x31, 0x2c, + 0x31, 0x20, 0x30, 0x2c, 0x22, 0x2b, 0x2d, 0x32, 0x2a, 0x6e, 0x2b, + 0x22, 0x61, 0x22, 0x2b, 0x6e, 0x2b, 0x22, 0x2c, 0x22, 0x2b, 0x6e, + 0x2b, 0x22, 0x20, 0x30, 0x20, 0x31, 0x2c, 0x31, 0x20, 0x30, 0x2c, + 0x22, 0x2b, 0x32, 0x2a, 0x6e, 0x2b, 0x22, 0x7a, 0x22, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x57, 0x65, 0x28, + 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x5f, 0x63, 0x2b, 0x3d, 0x6e, 0x2c, + 0x77, 0x63, 0x2b, 0x3d, 0x74, 0x2c, 0x2b, 0x2b, 0x53, 0x63, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4a, 0x65, + 0x28, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6e, 0x28, 0x6e, 0x2c, 0x72, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x75, 0x3d, 0x6e, 0x2d, 0x74, 0x2c, 0x69, 0x3d, 0x72, 0x2d, + 0x65, 0x2c, 0x6f, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x71, + 0x72, 0x74, 0x28, 0x75, 0x2a, 0x75, 0x2b, 0x69, 0x2a, 0x69, 0x29, + 0x3b, 0x6b, 0x63, 0x2b, 0x3d, 0x6f, 0x2a, 0x28, 0x74, 0x2b, 0x6e, + 0x29, 0x2f, 0x32, 0x2c, 0x45, 0x63, 0x2b, 0x3d, 0x6f, 0x2a, 0x28, + 0x65, 0x2b, 0x72, 0x29, 0x2f, 0x32, 0x2c, 0x41, 0x63, 0x2b, 0x3d, + 0x6f, 0x2c, 0x57, 0x65, 0x28, 0x74, 0x3d, 0x6e, 0x2c, 0x65, 0x3d, + 0x72, 0x29, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x74, 0x2c, 0x65, 0x3b, + 0x49, 0x63, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x72, 0x2c, 0x75, 0x29, + 0x7b, 0x49, 0x63, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3d, 0x6e, + 0x2c, 0x57, 0x65, 0x28, 0x74, 0x3d, 0x72, 0x2c, 0x65, 0x3d, 0x75, + 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x47, 0x65, 0x28, 0x29, 0x7b, 0x49, 0x63, 0x2e, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x3d, 0x57, 0x65, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4b, 0x65, 0x28, 0x29, 0x7b, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x28, 0x6e, + 0x2c, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x6e, + 0x2d, 0x72, 0x2c, 0x69, 0x3d, 0x74, 0x2d, 0x75, 0x2c, 0x6f, 0x3d, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x71, 0x72, 0x74, 0x28, 0x65, + 0x2a, 0x65, 0x2b, 0x69, 0x2a, 0x69, 0x29, 0x3b, 0x6b, 0x63, 0x2b, + 0x3d, 0x6f, 0x2a, 0x28, 0x72, 0x2b, 0x6e, 0x29, 0x2f, 0x32, 0x2c, + 0x45, 0x63, 0x2b, 0x3d, 0x6f, 0x2a, 0x28, 0x75, 0x2b, 0x74, 0x29, + 0x2f, 0x32, 0x2c, 0x41, 0x63, 0x2b, 0x3d, 0x6f, 0x2c, 0x6f, 0x3d, + 0x75, 0x2a, 0x6e, 0x2d, 0x72, 0x2a, 0x74, 0x2c, 0x4e, 0x63, 0x2b, + 0x3d, 0x6f, 0x2a, 0x28, 0x72, 0x2b, 0x6e, 0x29, 0x2c, 0x43, 0x63, + 0x2b, 0x3d, 0x6f, 0x2a, 0x28, 0x75, 0x2b, 0x74, 0x29, 0x2c, 0x7a, + 0x63, 0x2b, 0x3d, 0x33, 0x2a, 0x6f, 0x2c, 0x57, 0x65, 0x28, 0x72, + 0x3d, 0x6e, 0x2c, 0x75, 0x3d, 0x74, 0x29, 0x7d, 0x76, 0x61, 0x72, + 0x20, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x75, 0x3b, 0x49, 0x63, + 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x69, 0x2c, 0x6f, 0x29, 0x7b, 0x49, + 0x63, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3d, 0x6e, 0x2c, 0x57, + 0x65, 0x28, 0x74, 0x3d, 0x72, 0x3d, 0x69, 0x2c, 0x65, 0x3d, 0x75, + 0x3d, 0x6f, 0x29, 0x7d, 0x2c, 0x49, 0x63, 0x2e, 0x6c, 0x69, 0x6e, + 0x65, 0x45, 0x6e, 0x64, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x6e, 0x28, 0x74, 0x2c, 0x65, 0x29, + 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x51, 0x65, 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, + 0x6e, 0x2e, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x6f, 0x28, 0x74, 0x2b, + 0x6f, 0x2c, 0x65, 0x29, 0x2c, 0x6e, 0x2e, 0x61, 0x72, 0x63, 0x28, + 0x74, 0x2c, 0x65, 0x2c, 0x6f, 0x2c, 0x30, 0x2c, 0x4c, 0x61, 0x29, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, + 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x6e, 0x2e, 0x6d, 0x6f, 0x76, + 0x65, 0x54, 0x6f, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x2c, 0x61, 0x2e, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3d, 0x72, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x28, 0x74, 0x2c, 0x65, + 0x29, 0x7b, 0x6e, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, + 0x74, 0x2c, 0x65, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x75, 0x28, 0x29, 0x7b, 0x61, 0x2e, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x3d, 0x74, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x28, 0x29, 0x7b, 0x6e, 0x2e, 0x63, + 0x6c, 0x6f, 0x73, 0x65, 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, 0x7d, + 0x76, 0x61, 0x72, 0x20, 0x6f, 0x3d, 0x34, 0x2e, 0x35, 0x2c, 0x61, + 0x3d, 0x7b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3a, 0x74, 0x2c, 0x6c, + 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3a, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x61, 0x2e, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3d, 0x65, 0x7d, 0x2c, 0x6c, 0x69, + 0x6e, 0x65, 0x45, 0x6e, 0x64, 0x3a, 0x75, 0x2c, 0x70, 0x6f, 0x6c, + 0x79, 0x67, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3a, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x61, + 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, 0x3d, 0x69, 0x7d, + 0x2c, 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x45, 0x6e, 0x64, + 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x7b, 0x61, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, 0x3d, + 0x75, 0x2c, 0x61, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3d, 0x74, + 0x7d, 0x2c, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x61, 0x64, 0x69, + 0x75, 0x73, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6f, 0x3d, 0x6e, 0x2c, 0x61, 0x7d, 0x2c, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x3a, 0x62, 0x7d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x61, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6e, 0x72, 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x28, 0x6e, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x61, 0x3f, 0x72, 0x3a, + 0x65, 0x29, 0x28, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x72, 0x28, 0x74, 0x2c, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x2c, 0x72, + 0x29, 0x7b, 0x65, 0x3d, 0x6e, 0x28, 0x65, 0x2c, 0x72, 0x29, 0x2c, + 0x74, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x65, 0x5b, 0x30, + 0x5d, 0x2c, 0x65, 0x5b, 0x31, 0x5d, 0x29, 0x7d, 0x29, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x28, 0x74, + 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x65, 0x28, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x65, 0x3d, 0x6e, 0x28, + 0x65, 0x2c, 0x72, 0x29, 0x2c, 0x74, 0x2e, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x28, 0x65, 0x5b, 0x30, 0x5d, 0x2c, 0x65, 0x5b, 0x31, 0x5d, + 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x72, 0x28, 0x29, 0x7b, 0x4d, 0x3d, 0x30, 0x2f, 0x30, 0x2c, 0x53, + 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3d, 0x69, 0x2c, 0x74, 0x2e, + 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, 0x29, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, + 0x28, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x69, + 0x3d, 0x70, 0x65, 0x28, 0x5b, 0x65, 0x2c, 0x72, 0x5d, 0x29, 0x2c, + 0x6f, 0x3d, 0x6e, 0x28, 0x65, 0x2c, 0x72, 0x29, 0x3b, 0x75, 0x28, + 0x4d, 0x2c, 0x78, 0x2c, 0x79, 0x2c, 0x62, 0x2c, 0x5f, 0x2c, 0x77, + 0x2c, 0x4d, 0x3d, 0x6f, 0x5b, 0x30, 0x5d, 0x2c, 0x78, 0x3d, 0x6f, + 0x5b, 0x31, 0x5d, 0x2c, 0x79, 0x3d, 0x65, 0x2c, 0x62, 0x3d, 0x69, + 0x5b, 0x30, 0x5d, 0x2c, 0x5f, 0x3d, 0x69, 0x5b, 0x31, 0x5d, 0x2c, + 0x77, 0x3d, 0x69, 0x5b, 0x32, 0x5d, 0x2c, 0x61, 0x2c, 0x74, 0x29, + 0x2c, 0x74, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x4d, 0x2c, + 0x78, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6f, 0x28, 0x29, 0x7b, 0x53, 0x2e, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x3d, 0x65, 0x2c, 0x74, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x45, + 0x6e, 0x64, 0x28, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x63, 0x28, 0x29, 0x7b, 0x72, 0x28, 0x29, 0x2c, + 0x53, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3d, 0x6c, 0x2c, 0x53, + 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, 0x3d, 0x73, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x28, + 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x69, 0x28, 0x66, 0x3d, 0x6e, 0x2c, + 0x68, 0x3d, 0x74, 0x29, 0x2c, 0x67, 0x3d, 0x4d, 0x2c, 0x70, 0x3d, + 0x78, 0x2c, 0x76, 0x3d, 0x62, 0x2c, 0x64, 0x3d, 0x5f, 0x2c, 0x6d, + 0x3d, 0x77, 0x2c, 0x53, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3d, + 0x69, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x73, 0x28, 0x29, 0x7b, 0x75, 0x28, 0x4d, 0x2c, 0x78, 0x2c, 0x79, + 0x2c, 0x62, 0x2c, 0x5f, 0x2c, 0x77, 0x2c, 0x67, 0x2c, 0x70, 0x2c, + 0x66, 0x2c, 0x76, 0x2c, 0x64, 0x2c, 0x6d, 0x2c, 0x61, 0x2c, 0x74, + 0x29, 0x2c, 0x53, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, + 0x3d, 0x6f, 0x2c, 0x6f, 0x28, 0x29, 0x7d, 0x76, 0x61, 0x72, 0x20, + 0x66, 0x2c, 0x68, 0x2c, 0x67, 0x2c, 0x70, 0x2c, 0x76, 0x2c, 0x64, + 0x2c, 0x6d, 0x2c, 0x79, 0x2c, 0x4d, 0x2c, 0x78, 0x2c, 0x62, 0x2c, + 0x5f, 0x2c, 0x77, 0x2c, 0x53, 0x3d, 0x7b, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x3a, 0x65, 0x2c, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x3a, 0x72, 0x2c, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, + 0x64, 0x3a, 0x6f, 0x2c, 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x74, 0x2e, 0x70, 0x6f, 0x6c, + 0x79, 0x67, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, 0x29, + 0x2c, 0x53, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x3d, 0x63, 0x7d, 0x2c, 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, + 0x6e, 0x45, 0x6e, 0x64, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x74, 0x2e, 0x70, 0x6f, 0x6c, 0x79, + 0x67, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x28, 0x29, 0x2c, 0x53, 0x2e, + 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3d, 0x72, + 0x7d, 0x7d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x53, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, + 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x61, 0x2c, 0x63, 0x2c, + 0x6c, 0x2c, 0x73, 0x2c, 0x66, 0x2c, 0x68, 0x2c, 0x67, 0x2c, 0x70, + 0x2c, 0x76, 0x2c, 0x64, 0x2c, 0x6d, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x79, 0x3d, 0x73, 0x2d, 0x74, 0x2c, 0x4d, 0x3d, 0x66, 0x2d, + 0x65, 0x2c, 0x78, 0x3d, 0x79, 0x2a, 0x79, 0x2b, 0x4d, 0x2a, 0x4d, + 0x3b, 0x69, 0x66, 0x28, 0x78, 0x3e, 0x34, 0x2a, 0x69, 0x26, 0x26, + 0x64, 0x2d, 0x2d, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x62, 0x3d, + 0x61, 0x2b, 0x67, 0x2c, 0x5f, 0x3d, 0x63, 0x2b, 0x70, 0x2c, 0x77, + 0x3d, 0x6c, 0x2b, 0x76, 0x2c, 0x53, 0x3d, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x73, 0x71, 0x72, 0x74, 0x28, 0x62, 0x2a, 0x62, 0x2b, 0x5f, + 0x2a, 0x5f, 0x2b, 0x77, 0x2a, 0x77, 0x29, 0x2c, 0x6b, 0x3d, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x61, 0x73, 0x69, 0x6e, 0x28, 0x77, 0x2f, + 0x3d, 0x53, 0x29, 0x2c, 0x45, 0x3d, 0x67, 0x61, 0x28, 0x67, 0x61, + 0x28, 0x77, 0x29, 0x2d, 0x31, 0x29, 0x3c, 0x43, 0x61, 0x7c, 0x7c, + 0x67, 0x61, 0x28, 0x72, 0x2d, 0x68, 0x29, 0x3c, 0x43, 0x61, 0x3f, + 0x28, 0x72, 0x2b, 0x68, 0x29, 0x2f, 0x32, 0x3a, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x61, 0x74, 0x61, 0x6e, 0x32, 0x28, 0x5f, 0x2c, 0x62, + 0x29, 0x2c, 0x41, 0x3d, 0x6e, 0x28, 0x45, 0x2c, 0x6b, 0x29, 0x2c, + 0x4e, 0x3d, 0x41, 0x5b, 0x30, 0x5d, 0x2c, 0x43, 0x3d, 0x41, 0x5b, + 0x31, 0x5d, 0x2c, 0x7a, 0x3d, 0x4e, 0x2d, 0x74, 0x2c, 0x71, 0x3d, + 0x43, 0x2d, 0x65, 0x2c, 0x4c, 0x3d, 0x4d, 0x2a, 0x7a, 0x2d, 0x79, + 0x2a, 0x71, 0x3b, 0x28, 0x4c, 0x2a, 0x4c, 0x2f, 0x78, 0x3e, 0x69, + 0x7c, 0x7c, 0x67, 0x61, 0x28, 0x28, 0x79, 0x2a, 0x7a, 0x2b, 0x4d, + 0x2a, 0x71, 0x29, 0x2f, 0x78, 0x2d, 0x2e, 0x35, 0x29, 0x3e, 0x2e, + 0x33, 0x7c, 0x7c, 0x6f, 0x3e, 0x61, 0x2a, 0x67, 0x2b, 0x63, 0x2a, + 0x70, 0x2b, 0x6c, 0x2a, 0x76, 0x29, 0x26, 0x26, 0x28, 0x75, 0x28, + 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x61, 0x2c, 0x63, 0x2c, 0x6c, + 0x2c, 0x4e, 0x2c, 0x43, 0x2c, 0x45, 0x2c, 0x62, 0x2f, 0x3d, 0x53, + 0x2c, 0x5f, 0x2f, 0x3d, 0x53, 0x2c, 0x77, 0x2c, 0x64, 0x2c, 0x6d, + 0x29, 0x2c, 0x6d, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x4e, + 0x2c, 0x43, 0x29, 0x2c, 0x75, 0x28, 0x4e, 0x2c, 0x43, 0x2c, 0x45, + 0x2c, 0x62, 0x2c, 0x5f, 0x2c, 0x77, 0x2c, 0x73, 0x2c, 0x66, 0x2c, + 0x68, 0x2c, 0x67, 0x2c, 0x70, 0x2c, 0x76, 0x2c, 0x64, 0x2c, 0x6d, + 0x29, 0x29, 0x7d, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, 0x2e, + 0x35, 0x2c, 0x6f, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, + 0x73, 0x28, 0x33, 0x30, 0x2a, 0x44, 0x61, 0x29, 0x2c, 0x61, 0x3d, + 0x31, 0x36, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x2e, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3f, 0x28, 0x61, 0x3d, 0x28, 0x69, 0x3d, 0x6e, 0x2a, + 0x6e, 0x29, 0x3e, 0x30, 0x26, 0x26, 0x31, 0x36, 0x2c, 0x74, 0x29, + 0x3a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x71, 0x72, 0x74, 0x28, + 0x69, 0x29, 0x7d, 0x2c, 0x74, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x72, 0x28, 0x6e, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x74, 0x3d, 0x6e, 0x72, 0x28, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x28, 0x5b, 0x74, + 0x2a, 0x50, 0x61, 0x2c, 0x65, 0x2a, 0x50, 0x61, 0x5d, 0x29, 0x7d, + 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x72, 0x28, 0x74, 0x28, + 0x6e, 0x29, 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x65, 0x72, 0x28, 0x6e, 0x29, 0x7b, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x3d, 0x6e, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, + 0x72, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x7b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3a, 0x74, 0x2c, + 0x73, 0x70, 0x68, 0x65, 0x72, 0x65, 0x3a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x6e, 0x2e, 0x73, 0x70, + 0x68, 0x65, 0x72, 0x65, 0x28, 0x29, 0x7d, 0x2c, 0x6c, 0x69, 0x6e, + 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x6e, 0x2e, 0x6c, 0x69, + 0x6e, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, 0x29, 0x7d, 0x2c, + 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, 0x3a, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x6e, 0x2e, 0x6c, + 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, 0x28, 0x29, 0x7d, 0x2c, 0x70, + 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x7b, 0x6e, 0x2e, 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x28, 0x29, 0x7d, 0x2c, 0x70, 0x6f, 0x6c, + 0x79, 0x67, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x3a, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x6e, 0x2e, 0x70, + 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x28, 0x29, + 0x7d, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x75, 0x72, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x69, 0x72, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x7d, 0x29, 0x28, 0x29, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x72, 0x28, 0x6e, 0x29, + 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, + 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x3d, 0x61, 0x28, 0x6e, 0x5b, 0x30, 0x5d, 0x2a, 0x44, 0x61, + 0x2c, 0x6e, 0x5b, 0x31, 0x5d, 0x2a, 0x44, 0x61, 0x29, 0x2c, 0x5b, + 0x6e, 0x5b, 0x30, 0x5d, 0x2a, 0x68, 0x2b, 0x63, 0x2c, 0x6c, 0x2d, + 0x6e, 0x5b, 0x31, 0x5d, 0x2a, 0x68, 0x5d, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x28, 0x6e, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x3d, 0x61, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x28, 0x28, 0x6e, 0x5b, 0x30, + 0x5d, 0x2d, 0x63, 0x29, 0x2f, 0x68, 0x2c, 0x28, 0x6c, 0x2d, 0x6e, + 0x5b, 0x31, 0x5d, 0x29, 0x2f, 0x68, 0x29, 0x2c, 0x6e, 0x26, 0x26, + 0x5b, 0x6e, 0x5b, 0x30, 0x5d, 0x2a, 0x50, 0x61, 0x2c, 0x6e, 0x5b, + 0x31, 0x5d, 0x2a, 0x50, 0x61, 0x5d, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x28, 0x29, 0x7b, 0x61, 0x3d, + 0x41, 0x65, 0x28, 0x6f, 0x3d, 0x6c, 0x72, 0x28, 0x6d, 0x2c, 0x4d, + 0x2c, 0x78, 0x29, 0x2c, 0x69, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x6e, 0x3d, 0x69, 0x28, 0x76, 0x2c, 0x64, 0x29, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x3d, 0x67, 0x2d, 0x6e, 0x5b, + 0x30, 0x5d, 0x2a, 0x68, 0x2c, 0x6c, 0x3d, 0x70, 0x2b, 0x6e, 0x5b, + 0x31, 0x5d, 0x2a, 0x68, 0x2c, 0x75, 0x28, 0x29, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x28, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x26, 0x26, 0x28, + 0x73, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x3d, 0x21, 0x31, 0x2c, + 0x73, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x2c, 0x74, 0x7d, 0x76, + 0x61, 0x72, 0x20, 0x69, 0x2c, 0x6f, 0x2c, 0x61, 0x2c, 0x63, 0x2c, + 0x6c, 0x2c, 0x73, 0x2c, 0x66, 0x3d, 0x6e, 0x72, 0x28, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x3d, 0x69, + 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x2c, 0x5b, 0x6e, 0x5b, 0x30, 0x5d, + 0x2a, 0x68, 0x2b, 0x63, 0x2c, 0x6c, 0x2d, 0x6e, 0x5b, 0x31, 0x5d, + 0x2a, 0x68, 0x5d, 0x7d, 0x29, 0x2c, 0x68, 0x3d, 0x31, 0x35, 0x30, + 0x2c, 0x67, 0x3d, 0x34, 0x38, 0x30, 0x2c, 0x70, 0x3d, 0x32, 0x35, + 0x30, 0x2c, 0x76, 0x3d, 0x30, 0x2c, 0x64, 0x3d, 0x30, 0x2c, 0x6d, + 0x3d, 0x30, 0x2c, 0x4d, 0x3d, 0x30, 0x2c, 0x78, 0x3d, 0x30, 0x2c, + 0x62, 0x3d, 0x4c, 0x63, 0x2c, 0x5f, 0x3d, 0x79, 0x2c, 0x77, 0x3d, + 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x53, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x73, 0x26, 0x26, 0x28, 0x73, 0x2e, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x3d, 0x21, 0x31, 0x29, 0x2c, 0x73, 0x3d, 0x6f, + 0x72, 0x28, 0x62, 0x28, 0x6f, 0x2c, 0x66, 0x28, 0x5f, 0x28, 0x6e, + 0x29, 0x29, 0x29, 0x29, 0x2c, 0x73, 0x2e, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x3d, 0x21, 0x30, 0x2c, 0x73, 0x7d, 0x2c, 0x74, 0x2e, 0x63, + 0x6c, 0x69, 0x70, 0x41, 0x6e, 0x67, 0x6c, 0x65, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3f, 0x28, 0x62, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x6e, + 0x3f, 0x28, 0x77, 0x3d, 0x6e, 0x2c, 0x4c, 0x63, 0x29, 0x3a, 0x48, + 0x65, 0x28, 0x28, 0x77, 0x3d, 0x2b, 0x6e, 0x29, 0x2a, 0x44, 0x61, + 0x29, 0x2c, 0x75, 0x28, 0x29, 0x29, 0x3a, 0x77, 0x7d, 0x2c, 0x74, + 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x74, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3f, 0x28, 0x53, 0x3d, 0x6e, 0x2c, 0x5f, 0x3d, + 0x6e, 0x3f, 0x49, 0x65, 0x28, 0x6e, 0x5b, 0x30, 0x5d, 0x5b, 0x30, + 0x5d, 0x2c, 0x6e, 0x5b, 0x30, 0x5d, 0x5b, 0x31, 0x5d, 0x2c, 0x6e, + 0x5b, 0x31, 0x5d, 0x5b, 0x30, 0x5d, 0x2c, 0x6e, 0x5b, 0x31, 0x5d, + 0x5b, 0x31, 0x5d, 0x29, 0x3a, 0x79, 0x2c, 0x75, 0x28, 0x29, 0x29, + 0x3a, 0x53, 0x7d, 0x2c, 0x74, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3f, 0x28, 0x68, 0x3d, 0x2b, 0x6e, 0x2c, 0x72, + 0x28, 0x29, 0x29, 0x3a, 0x68, 0x7d, 0x2c, 0x74, 0x2e, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, + 0x28, 0x67, 0x3d, 0x2b, 0x6e, 0x5b, 0x30, 0x5d, 0x2c, 0x70, 0x3d, + 0x2b, 0x6e, 0x5b, 0x31, 0x5d, 0x2c, 0x72, 0x28, 0x29, 0x29, 0x3a, + 0x5b, 0x67, 0x2c, 0x70, 0x5d, 0x7d, 0x2c, 0x74, 0x2e, 0x63, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x76, 0x3d, + 0x6e, 0x5b, 0x30, 0x5d, 0x25, 0x33, 0x36, 0x30, 0x2a, 0x44, 0x61, + 0x2c, 0x64, 0x3d, 0x6e, 0x5b, 0x31, 0x5d, 0x25, 0x33, 0x36, 0x30, + 0x2a, 0x44, 0x61, 0x2c, 0x72, 0x28, 0x29, 0x29, 0x3a, 0x5b, 0x76, + 0x2a, 0x50, 0x61, 0x2c, 0x64, 0x2a, 0x50, 0x61, 0x5d, 0x7d, 0x2c, + 0x74, 0x2e, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3f, 0x28, 0x6d, 0x3d, 0x6e, 0x5b, 0x30, 0x5d, 0x25, 0x33, 0x36, + 0x30, 0x2a, 0x44, 0x61, 0x2c, 0x4d, 0x3d, 0x6e, 0x5b, 0x31, 0x5d, + 0x25, 0x33, 0x36, 0x30, 0x2a, 0x44, 0x61, 0x2c, 0x78, 0x3d, 0x6e, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3e, 0x32, 0x3f, 0x6e, + 0x5b, 0x32, 0x5d, 0x25, 0x33, 0x36, 0x30, 0x2a, 0x44, 0x61, 0x3a, + 0x30, 0x2c, 0x72, 0x28, 0x29, 0x29, 0x3a, 0x5b, 0x6d, 0x2a, 0x50, + 0x61, 0x2c, 0x4d, 0x2a, 0x50, 0x61, 0x2c, 0x78, 0x2a, 0x50, 0x61, + 0x5d, 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x72, 0x65, 0x62, 0x69, 0x6e, + 0x64, 0x28, 0x74, 0x2c, 0x66, 0x2c, 0x22, 0x70, 0x72, 0x65, 0x63, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x2c, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x69, 0x3d, 0x6e, 0x2e, 0x61, 0x70, 0x70, + 0x6c, 0x79, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x2c, 0x74, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x72, 0x74, 0x3d, 0x69, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x72, 0x74, 0x26, 0x26, 0x65, 0x2c, 0x72, 0x28, 0x29, 0x7d, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, + 0x72, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x72, 0x72, 0x28, 0x6e, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x6e, 0x2e, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x2a, 0x44, 0x61, 0x2c, + 0x65, 0x2a, 0x44, 0x61, 0x29, 0x7d, 0x29, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x72, 0x28, 0x6e, 0x2c, + 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, 0x6e, + 0x2c, 0x74, 0x5d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x63, 0x72, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, 0x6e, 0x3e, 0x71, 0x61, 0x3f, + 0x6e, 0x2d, 0x4c, 0x61, 0x3a, 0x2d, 0x71, 0x61, 0x3e, 0x6e, 0x3f, + 0x6e, 0x2b, 0x4c, 0x61, 0x3a, 0x6e, 0x2c, 0x74, 0x5d, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x72, 0x28, + 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x3f, 0x74, 0x7c, 0x7c, 0x65, 0x3f, 0x41, + 0x65, 0x28, 0x66, 0x72, 0x28, 0x6e, 0x29, 0x2c, 0x68, 0x72, 0x28, + 0x74, 0x2c, 0x65, 0x29, 0x29, 0x3a, 0x66, 0x72, 0x28, 0x6e, 0x29, + 0x3a, 0x74, 0x7c, 0x7c, 0x65, 0x3f, 0x68, 0x72, 0x28, 0x74, 0x2c, + 0x65, 0x29, 0x3a, 0x63, 0x72, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x72, 0x28, 0x6e, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2b, 0x3d, 0x6e, 0x2c, 0x5b, + 0x74, 0x3e, 0x71, 0x61, 0x3f, 0x74, 0x2d, 0x4c, 0x61, 0x3a, 0x2d, + 0x71, 0x61, 0x3e, 0x74, 0x3f, 0x74, 0x2b, 0x4c, 0x61, 0x3a, 0x74, + 0x2c, 0x65, 0x5d, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x66, 0x72, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x74, 0x3d, 0x73, 0x72, 0x28, 0x6e, 0x29, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x72, 0x74, 0x3d, 0x73, 0x72, 0x28, 0x2d, 0x6e, 0x29, 0x2c, + 0x74, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x68, 0x72, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x28, 0x6e, 0x2c, 0x74, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x74, 0x29, 0x2c, 0x61, 0x3d, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x6e, 0x29, + 0x2a, 0x65, 0x2c, 0x63, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, + 0x69, 0x6e, 0x28, 0x6e, 0x29, 0x2a, 0x65, 0x2c, 0x6c, 0x3d, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x74, 0x29, 0x2c, + 0x73, 0x3d, 0x6c, 0x2a, 0x72, 0x2b, 0x61, 0x2a, 0x75, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x61, 0x74, 0x61, 0x6e, 0x32, 0x28, 0x63, 0x2a, 0x69, 0x2d, 0x73, + 0x2a, 0x6f, 0x2c, 0x61, 0x2a, 0x72, 0x2d, 0x6c, 0x2a, 0x75, 0x29, + 0x2c, 0x74, 0x74, 0x28, 0x73, 0x2a, 0x69, 0x2b, 0x63, 0x2a, 0x6f, + 0x29, 0x5d, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x6e, 0x29, 0x2c, 0x75, + 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x6e, + 0x29, 0x2c, 0x69, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, + 0x73, 0x28, 0x74, 0x29, 0x2c, 0x6f, 0x3d, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x74, 0x29, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x65, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x72, + 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x74, 0x29, + 0x2c, 0x61, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, 0x73, + 0x28, 0x6e, 0x29, 0x2a, 0x65, 0x2c, 0x63, 0x3d, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x6e, 0x29, 0x2a, 0x65, 0x2c, + 0x6c, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, + 0x74, 0x29, 0x2c, 0x73, 0x3d, 0x6c, 0x2a, 0x69, 0x2d, 0x63, 0x2a, + 0x6f, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x61, 0x74, 0x61, 0x6e, 0x32, 0x28, 0x63, 0x2a, + 0x69, 0x2b, 0x6c, 0x2a, 0x6f, 0x2c, 0x61, 0x2a, 0x72, 0x2b, 0x73, + 0x2a, 0x75, 0x29, 0x2c, 0x74, 0x74, 0x28, 0x73, 0x2a, 0x72, 0x2d, + 0x61, 0x2a, 0x75, 0x29, 0x5d, 0x7d, 0x2c, 0x65, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x72, 0x28, 0x6e, + 0x2c, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x6e, 0x29, 0x2c, + 0x72, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, + 0x6e, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x75, 0x2c, 0x69, + 0x2c, 0x6f, 0x2c, 0x61, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x63, + 0x3d, 0x6f, 0x2a, 0x74, 0x3b, 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, + 0x75, 0x3f, 0x28, 0x75, 0x3d, 0x70, 0x72, 0x28, 0x65, 0x2c, 0x75, + 0x29, 0x2c, 0x69, 0x3d, 0x70, 0x72, 0x28, 0x65, 0x2c, 0x69, 0x29, + 0x2c, 0x28, 0x6f, 0x3e, 0x30, 0x3f, 0x69, 0x3e, 0x75, 0x3a, 0x75, + 0x3e, 0x69, 0x29, 0x26, 0x26, 0x28, 0x75, 0x2b, 0x3d, 0x6f, 0x2a, + 0x4c, 0x61, 0x29, 0x29, 0x3a, 0x28, 0x75, 0x3d, 0x6e, 0x2b, 0x6f, + 0x2a, 0x4c, 0x61, 0x2c, 0x69, 0x3d, 0x6e, 0x2d, 0x2e, 0x35, 0x2a, + 0x63, 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, + 0x6c, 0x2c, 0x73, 0x3d, 0x75, 0x3b, 0x6f, 0x3e, 0x30, 0x3f, 0x73, + 0x3e, 0x69, 0x3a, 0x69, 0x3e, 0x73, 0x3b, 0x73, 0x2d, 0x3d, 0x63, + 0x29, 0x61, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x6c, + 0x3d, 0x78, 0x65, 0x28, 0x5b, 0x65, 0x2c, 0x2d, 0x72, 0x2a, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x73, 0x29, 0x2c, + 0x2d, 0x72, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, + 0x28, 0x73, 0x29, 0x5d, 0x29, 0x29, 0x5b, 0x30, 0x5d, 0x2c, 0x6c, + 0x5b, 0x31, 0x5d, 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x72, 0x28, 0x6e, 0x2c, 0x74, 0x29, + 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x70, 0x65, 0x28, 0x74, + 0x29, 0x3b, 0x65, 0x5b, 0x30, 0x5d, 0x2d, 0x3d, 0x6e, 0x2c, 0x4d, + 0x65, 0x28, 0x65, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, + 0x6e, 0x74, 0x28, 0x2d, 0x65, 0x5b, 0x31, 0x5d, 0x29, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x28, 0x2d, 0x65, 0x5b, 0x32, + 0x5d, 0x3c, 0x30, 0x3f, 0x2d, 0x72, 0x3a, 0x72, 0x29, 0x2b, 0x32, + 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x50, 0x49, 0x2d, 0x43, 0x61, + 0x29, 0x25, 0x28, 0x32, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x50, + 0x49, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x76, 0x72, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x74, 0x61, 0x2e, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x28, 0x6e, 0x2c, 0x74, 0x2d, 0x43, 0x61, 0x2c, + 0x65, 0x29, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x74, + 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x2e, 0x6d, 0x61, 0x70, + 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, 0x6e, 0x2c, + 0x74, 0x5d, 0x7d, 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x72, 0x28, 0x6e, 0x2c, 0x74, 0x2c, + 0x65, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x74, 0x61, + 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x28, 0x6e, 0x2c, 0x74, 0x2d, + 0x43, 0x61, 0x2c, 0x65, 0x29, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, + 0x74, 0x28, 0x74, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x2e, + 0x6d, 0x61, 0x70, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x5b, 0x74, 0x2c, 0x6e, 0x5d, 0x7d, 0x29, 0x7d, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x72, 0x28, 0x6e, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x79, 0x72, 0x28, 0x6e, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x4d, 0x72, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, + 0x2c, 0x72, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x75, 0x3d, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x74, 0x29, 0x2c, + 0x69, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, + 0x74, 0x29, 0x2c, 0x6f, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, + 0x6f, 0x73, 0x28, 0x72, 0x29, 0x2c, 0x61, 0x3d, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x72, 0x29, 0x2c, 0x63, 0x3d, + 0x75, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, + 0x6e, 0x29, 0x2c, 0x6c, 0x3d, 0x75, 0x2a, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x6e, 0x29, 0x2c, 0x73, 0x3d, 0x6f, + 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x65, + 0x29, 0x2c, 0x66, 0x3d, 0x6f, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x73, 0x69, 0x6e, 0x28, 0x65, 0x29, 0x2c, 0x68, 0x3d, 0x32, 0x2a, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x61, 0x73, 0x69, 0x6e, 0x28, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x73, 0x71, 0x72, 0x74, 0x28, 0x69, 0x74, + 0x28, 0x72, 0x2d, 0x74, 0x29, 0x2b, 0x75, 0x2a, 0x6f, 0x2a, 0x69, + 0x74, 0x28, 0x65, 0x2d, 0x6e, 0x29, 0x29, 0x29, 0x2c, 0x67, 0x3d, + 0x31, 0x2f, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, + 0x68, 0x29, 0x2c, 0x70, 0x3d, 0x68, 0x3f, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x74, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, + 0x28, 0x6e, 0x2a, 0x3d, 0x68, 0x29, 0x2a, 0x67, 0x2c, 0x65, 0x3d, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x68, 0x2d, + 0x6e, 0x29, 0x2a, 0x67, 0x2c, 0x72, 0x3d, 0x65, 0x2a, 0x63, 0x2b, + 0x74, 0x2a, 0x73, 0x2c, 0x75, 0x3d, 0x65, 0x2a, 0x6c, 0x2b, 0x74, + 0x2a, 0x66, 0x2c, 0x6f, 0x3d, 0x65, 0x2a, 0x69, 0x2b, 0x74, 0x2a, + 0x61, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x61, 0x74, 0x61, 0x6e, 0x32, 0x28, 0x75, 0x2c, + 0x72, 0x29, 0x2a, 0x50, 0x61, 0x2c, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x61, 0x74, 0x61, 0x6e, 0x32, 0x28, 0x6f, 0x2c, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x73, 0x71, 0x72, 0x74, 0x28, 0x72, 0x2a, 0x72, 0x2b, + 0x75, 0x2a, 0x75, 0x29, 0x29, 0x2a, 0x50, 0x61, 0x5d, 0x7d, 0x3a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, 0x6e, 0x2a, 0x50, 0x61, + 0x2c, 0x74, 0x2a, 0x50, 0x61, 0x5d, 0x7d, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x70, 0x2e, 0x64, 0x69, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x3d, 0x68, 0x2c, 0x70, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x78, 0x72, 0x28, 0x29, 0x7b, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x28, + 0x6e, 0x2c, 0x75, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x75, 0x2a, + 0x3d, 0x44, 0x61, 0x29, 0x2c, 0x6f, 0x3d, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x75, 0x29, 0x2c, 0x61, 0x3d, 0x67, + 0x61, 0x28, 0x28, 0x6e, 0x2a, 0x3d, 0x44, 0x61, 0x29, 0x2d, 0x74, + 0x29, 0x2c, 0x63, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, + 0x73, 0x28, 0x61, 0x29, 0x3b, 0x59, 0x63, 0x2b, 0x3d, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x61, 0x74, 0x61, 0x6e, 0x32, 0x28, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x73, 0x71, 0x72, 0x74, 0x28, 0x28, 0x61, 0x3d, + 0x6f, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, + 0x61, 0x29, 0x29, 0x2a, 0x61, 0x2b, 0x28, 0x61, 0x3d, 0x72, 0x2a, + 0x69, 0x2d, 0x65, 0x2a, 0x6f, 0x2a, 0x63, 0x29, 0x2a, 0x61, 0x29, + 0x2c, 0x65, 0x2a, 0x69, 0x2b, 0x72, 0x2a, 0x6f, 0x2a, 0x63, 0x29, + 0x2c, 0x74, 0x3d, 0x6e, 0x2c, 0x65, 0x3d, 0x69, 0x2c, 0x72, 0x3d, + 0x6f, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x74, 0x2c, 0x65, 0x2c, 0x72, + 0x3b, 0x5a, 0x63, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x75, 0x2c, 0x69, + 0x29, 0x7b, 0x74, 0x3d, 0x75, 0x2a, 0x44, 0x61, 0x2c, 0x65, 0x3d, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x69, 0x2a, + 0x3d, 0x44, 0x61, 0x29, 0x2c, 0x72, 0x3d, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x69, 0x29, 0x2c, 0x5a, 0x63, 0x2e, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3d, 0x6e, 0x7d, 0x2c, 0x5a, 0x63, + 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x5a, 0x63, + 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3d, 0x5a, 0x63, 0x2e, 0x6c, + 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, 0x3d, 0x62, 0x7d, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x72, 0x28, + 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x65, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x72, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, + 0x6f, 0x73, 0x28, 0x74, 0x29, 0x2c, 0x75, 0x3d, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x65, 0x29, 0x2c, 0x69, 0x3d, + 0x6e, 0x28, 0x72, 0x2a, 0x75, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x5b, 0x69, 0x2a, 0x75, 0x2a, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x74, 0x29, 0x2c, 0x69, 0x2a, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x65, 0x29, 0x5d, + 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x72, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x65, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x72, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x71, + 0x72, 0x74, 0x28, 0x6e, 0x2a, 0x6e, 0x2b, 0x65, 0x2a, 0x65, 0x29, + 0x2c, 0x75, 0x3d, 0x74, 0x28, 0x72, 0x29, 0x2c, 0x69, 0x3d, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x75, 0x29, 0x2c, + 0x6f, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, + 0x75, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x61, 0x74, 0x61, 0x6e, 0x32, 0x28, 0x6e, + 0x2a, 0x69, 0x2c, 0x72, 0x2a, 0x6f, 0x29, 0x2c, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x61, 0x73, 0x69, 0x6e, 0x28, 0x72, 0x26, 0x26, 0x65, + 0x2a, 0x69, 0x2f, 0x72, 0x29, 0x5d, 0x7d, 0x2c, 0x65, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x72, 0x28, + 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x65, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x6f, + 0x3e, 0x30, 0x3f, 0x2d, 0x52, 0x61, 0x2b, 0x43, 0x61, 0x3e, 0x74, + 0x26, 0x26, 0x28, 0x74, 0x3d, 0x2d, 0x52, 0x61, 0x2b, 0x43, 0x61, + 0x29, 0x3a, 0x74, 0x3e, 0x52, 0x61, 0x2d, 0x43, 0x61, 0x26, 0x26, + 0x28, 0x74, 0x3d, 0x52, 0x61, 0x2d, 0x43, 0x61, 0x29, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x65, 0x3d, 0x6f, 0x2f, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x70, 0x6f, 0x77, 0x28, 0x75, 0x28, 0x74, 0x29, 0x2c, 0x69, + 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, 0x65, 0x2a, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x69, 0x2a, + 0x6e, 0x29, 0x2c, 0x6f, 0x2d, 0x65, 0x2a, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x69, 0x2a, 0x6e, 0x29, 0x5d, 0x7d, + 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x63, 0x6f, 0x73, 0x28, 0x6e, 0x29, 0x2c, 0x75, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x74, 0x61, 0x6e, 0x28, 0x71, 0x61, 0x2f, 0x34, 0x2b, 0x6e, 0x2f, + 0x32, 0x29, 0x7d, 0x2c, 0x69, 0x3d, 0x6e, 0x3d, 0x3d, 0x3d, 0x74, + 0x3f, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x6e, + 0x29, 0x3a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x6f, 0x67, 0x28, + 0x72, 0x2f, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, + 0x74, 0x29, 0x29, 0x2f, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x6f, + 0x67, 0x28, 0x75, 0x28, 0x74, 0x29, 0x2f, 0x75, 0x28, 0x6e, 0x29, + 0x29, 0x2c, 0x6f, 0x3d, 0x72, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x70, 0x6f, 0x77, 0x28, 0x75, 0x28, 0x6e, 0x29, 0x2c, 0x69, 0x29, + 0x2f, 0x69, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, + 0x3f, 0x28, 0x65, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, + 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x6f, 0x2d, + 0x74, 0x2c, 0x72, 0x3d, 0x4b, 0x28, 0x69, 0x29, 0x2a, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x73, 0x71, 0x72, 0x74, 0x28, 0x6e, 0x2a, 0x6e, + 0x2b, 0x65, 0x2a, 0x65, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x5b, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x61, 0x74, 0x61, 0x6e, + 0x32, 0x28, 0x6e, 0x2c, 0x65, 0x29, 0x2f, 0x69, 0x2c, 0x32, 0x2a, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x61, 0x74, 0x61, 0x6e, 0x28, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x70, 0x6f, 0x77, 0x28, 0x6f, 0x2f, 0x72, + 0x2c, 0x31, 0x2f, 0x69, 0x29, 0x29, 0x2d, 0x52, 0x61, 0x5d, 0x7d, + 0x2c, 0x65, 0x29, 0x3a, 0x53, 0x72, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x72, 0x28, 0x6e, 0x2c, 0x74, + 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x65, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x65, 0x3d, 0x69, 0x2d, 0x74, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x5b, 0x65, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, + 0x6e, 0x28, 0x75, 0x2a, 0x6e, 0x29, 0x2c, 0x69, 0x2d, 0x65, 0x2a, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x75, 0x2a, + 0x6e, 0x29, 0x5d, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x6e, 0x29, 0x2c, + 0x75, 0x3d, 0x6e, 0x3d, 0x3d, 0x3d, 0x74, 0x3f, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x6e, 0x29, 0x3a, 0x28, 0x72, + 0x2d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x74, + 0x29, 0x29, 0x2f, 0x28, 0x74, 0x2d, 0x6e, 0x29, 0x2c, 0x69, 0x3d, + 0x72, 0x2f, 0x75, 0x2b, 0x6e, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x67, 0x61, 0x28, 0x75, 0x29, 0x3c, 0x43, 0x61, 0x3f, + 0x61, 0x72, 0x3a, 0x28, 0x65, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x72, + 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, + 0x69, 0x2d, 0x74, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x61, 0x74, 0x61, 0x6e, 0x32, 0x28, + 0x6e, 0x2c, 0x65, 0x29, 0x2f, 0x75, 0x2c, 0x69, 0x2d, 0x4b, 0x28, + 0x75, 0x29, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x71, 0x72, + 0x74, 0x28, 0x6e, 0x2a, 0x6e, 0x2b, 0x65, 0x2a, 0x65, 0x29, 0x5d, + 0x7d, 0x2c, 0x65, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x53, 0x72, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, 0x6e, 0x2c, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x74, 0x61, 0x6e, 0x28, 0x71, 0x61, 0x2f, 0x34, 0x2b, 0x74, + 0x2f, 0x32, 0x29, 0x29, 0x5d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6b, 0x72, 0x28, 0x6e, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x74, 0x2c, 0x65, 0x3d, 0x75, 0x72, 0x28, 0x6e, + 0x29, 0x2c, 0x72, 0x3d, 0x65, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, + 0x2c, 0x75, 0x3d, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, + 0x61, 0x74, 0x65, 0x2c, 0x69, 0x3d, 0x65, 0x2e, 0x63, 0x6c, 0x69, + 0x70, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x65, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6e, 0x3d, 0x72, 0x2e, 0x61, 0x70, + 0x70, 0x6c, 0x79, 0x28, 0x65, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x3d, 0x3d, 0x3d, 0x65, 0x3f, 0x74, 0x3f, 0x65, + 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x74, + 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3a, 0x65, 0x3a, 0x6e, 0x7d, + 0x2c, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, + 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6e, 0x3d, 0x75, 0x2e, 0x61, + 0x70, 0x70, 0x6c, 0x79, 0x28, 0x65, 0x2c, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x3d, 0x3d, 0x3d, 0x65, 0x3f, 0x74, 0x3f, + 0x65, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x74, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3a, 0x65, 0x3a, 0x6e, + 0x7d, 0x2c, 0x65, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6f, 0x3d, + 0x69, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x65, 0x2c, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x3b, 0x69, + 0x66, 0x28, 0x6f, 0x3d, 0x3d, 0x3d, 0x65, 0x29, 0x7b, 0x69, 0x66, + 0x28, 0x74, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x6e, 0x29, + 0x7b, 0x76, 0x61, 0x72, 0x20, 0x61, 0x3d, 0x71, 0x61, 0x2a, 0x72, + 0x28, 0x29, 0x2c, 0x63, 0x3d, 0x75, 0x28, 0x29, 0x3b, 0x69, 0x28, + 0x5b, 0x5b, 0x63, 0x5b, 0x30, 0x5d, 0x2d, 0x61, 0x2c, 0x63, 0x5b, + 0x31, 0x5d, 0x2d, 0x61, 0x5d, 0x2c, 0x5b, 0x63, 0x5b, 0x30, 0x5d, + 0x2b, 0x61, 0x2c, 0x63, 0x5b, 0x31, 0x5d, 0x2b, 0x61, 0x5d, 0x5d, + 0x29, 0x7d, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x74, 0x26, 0x26, + 0x28, 0x6f, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x7d, 0x2c, 0x65, 0x2e, 0x63, + 0x6c, 0x69, 0x70, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x28, 0x6e, + 0x75, 0x6c, 0x6c, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x45, 0x72, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x74, + 0x61, 0x6e, 0x28, 0x71, 0x61, 0x2f, 0x34, 0x2b, 0x74, 0x2f, 0x32, + 0x29, 0x29, 0x2c, 0x2d, 0x6e, 0x5d, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x72, 0x28, 0x6e, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x5b, 0x30, 0x5d, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4e, + 0x72, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6e, 0x5b, 0x31, 0x5d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x43, 0x72, 0x28, 0x6e, 0x29, 0x7b, 0x66, + 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x6e, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x65, 0x3d, 0x5b, 0x30, + 0x2c, 0x31, 0x5d, 0x2c, 0x72, 0x3d, 0x32, 0x2c, 0x75, 0x3d, 0x32, + 0x3b, 0x74, 0x3e, 0x75, 0x3b, 0x75, 0x2b, 0x2b, 0x29, 0x7b, 0x66, + 0x6f, 0x72, 0x28, 0x3b, 0x72, 0x3e, 0x31, 0x26, 0x26, 0x51, 0x28, + 0x6e, 0x5b, 0x65, 0x5b, 0x72, 0x2d, 0x32, 0x5d, 0x5d, 0x2c, 0x6e, + 0x5b, 0x65, 0x5b, 0x72, 0x2d, 0x31, 0x5d, 0x5d, 0x2c, 0x6e, 0x5b, + 0x75, 0x5d, 0x29, 0x3c, 0x3d, 0x30, 0x3b, 0x29, 0x2d, 0x2d, 0x72, + 0x3b, 0x65, 0x5b, 0x72, 0x2b, 0x2b, 0x5d, 0x3d, 0x75, 0x7d, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x2e, 0x73, 0x6c, 0x69, + 0x63, 0x65, 0x28, 0x30, 0x2c, 0x72, 0x29, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x7a, 0x72, 0x28, 0x6e, 0x2c, + 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x5b, 0x30, 0x5d, 0x2d, 0x74, 0x5b, 0x30, 0x5d, 0x7c, 0x7c, 0x6e, + 0x5b, 0x31, 0x5d, 0x2d, 0x74, 0x5b, 0x31, 0x5d, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x71, 0x72, 0x28, 0x6e, + 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x28, 0x65, 0x5b, 0x30, 0x5d, 0x2d, 0x74, 0x5b, 0x30, 0x5d, + 0x29, 0x2a, 0x28, 0x6e, 0x5b, 0x31, 0x5d, 0x2d, 0x74, 0x5b, 0x31, + 0x5d, 0x29, 0x3c, 0x28, 0x65, 0x5b, 0x31, 0x5d, 0x2d, 0x74, 0x5b, + 0x31, 0x5d, 0x29, 0x2a, 0x28, 0x6e, 0x5b, 0x30, 0x5d, 0x2d, 0x74, + 0x5b, 0x30, 0x5d, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x4c, 0x72, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, + 0x2c, 0x72, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x75, 0x3d, 0x6e, + 0x5b, 0x30, 0x5d, 0x2c, 0x69, 0x3d, 0x65, 0x5b, 0x30, 0x5d, 0x2c, + 0x6f, 0x3d, 0x74, 0x5b, 0x30, 0x5d, 0x2d, 0x75, 0x2c, 0x61, 0x3d, + 0x72, 0x5b, 0x30, 0x5d, 0x2d, 0x69, 0x2c, 0x63, 0x3d, 0x6e, 0x5b, + 0x31, 0x5d, 0x2c, 0x6c, 0x3d, 0x65, 0x5b, 0x31, 0x5d, 0x2c, 0x73, + 0x3d, 0x74, 0x5b, 0x31, 0x5d, 0x2d, 0x63, 0x2c, 0x66, 0x3d, 0x72, + 0x5b, 0x31, 0x5d, 0x2d, 0x6c, 0x2c, 0x68, 0x3d, 0x28, 0x61, 0x2a, + 0x28, 0x63, 0x2d, 0x6c, 0x29, 0x2d, 0x66, 0x2a, 0x28, 0x75, 0x2d, + 0x69, 0x29, 0x29, 0x2f, 0x28, 0x66, 0x2a, 0x6f, 0x2d, 0x61, 0x2a, + 0x73, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, 0x75, + 0x2b, 0x68, 0x2a, 0x6f, 0x2c, 0x63, 0x2b, 0x68, 0x2a, 0x73, 0x5d, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x54, + 0x72, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, + 0x6e, 0x5b, 0x30, 0x5d, 0x2c, 0x65, 0x3d, 0x6e, 0x5b, 0x6e, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, 0x5d, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x21, 0x28, 0x74, 0x5b, 0x30, 0x5d, + 0x2d, 0x65, 0x5b, 0x30, 0x5d, 0x7c, 0x7c, 0x74, 0x5b, 0x31, 0x5d, + 0x2d, 0x65, 0x5b, 0x31, 0x5d, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x52, 0x72, 0x28, 0x29, 0x7b, 0x74, + 0x75, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x2c, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x73, 0x69, 0x74, 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x44, + 0x72, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, + 0x65, 0x6c, 0x2e, 0x70, 0x6f, 0x70, 0x28, 0x29, 0x7c, 0x7c, 0x6e, + 0x65, 0x77, 0x20, 0x52, 0x72, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x2e, 0x73, 0x69, 0x74, 0x65, 0x3d, 0x6e, 0x2c, + 0x74, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x50, 0x72, 0x28, 0x6e, 0x29, 0x7b, 0x58, 0x72, 0x28, 0x6e, 0x29, + 0x2c, 0x51, 0x63, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, + 0x6e, 0x29, 0x2c, 0x65, 0x6c, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, + 0x6e, 0x29, 0x2c, 0x74, 0x75, 0x28, 0x6e, 0x29, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x55, 0x72, 0x28, 0x6e, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x6e, 0x2e, 0x63, + 0x69, 0x72, 0x63, 0x6c, 0x65, 0x2c, 0x65, 0x3d, 0x74, 0x2e, 0x78, + 0x2c, 0x72, 0x3d, 0x74, 0x2e, 0x63, 0x79, 0x2c, 0x75, 0x3d, 0x7b, + 0x78, 0x3a, 0x65, 0x2c, 0x79, 0x3a, 0x72, 0x7d, 0x2c, 0x69, 0x3d, + 0x6e, 0x2e, 0x50, 0x2c, 0x6f, 0x3d, 0x6e, 0x2e, 0x4e, 0x2c, 0x61, + 0x3d, 0x5b, 0x6e, 0x5d, 0x3b, 0x50, 0x72, 0x28, 0x6e, 0x29, 0x3b, + 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x63, 0x3d, 0x69, + 0x3b, 0x63, 0x2e, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x26, 0x26, + 0x67, 0x61, 0x28, 0x65, 0x2d, 0x63, 0x2e, 0x63, 0x69, 0x72, 0x63, + 0x6c, 0x65, 0x2e, 0x78, 0x29, 0x3c, 0x43, 0x61, 0x26, 0x26, 0x67, + 0x61, 0x28, 0x72, 0x2d, 0x63, 0x2e, 0x63, 0x69, 0x72, 0x63, 0x6c, + 0x65, 0x2e, 0x63, 0x79, 0x29, 0x3c, 0x43, 0x61, 0x3b, 0x29, 0x69, + 0x3d, 0x63, 0x2e, 0x50, 0x2c, 0x61, 0x2e, 0x75, 0x6e, 0x73, 0x68, + 0x69, 0x66, 0x74, 0x28, 0x63, 0x29, 0x2c, 0x50, 0x72, 0x28, 0x63, + 0x29, 0x2c, 0x63, 0x3d, 0x69, 0x3b, 0x61, 0x2e, 0x75, 0x6e, 0x73, + 0x68, 0x69, 0x66, 0x74, 0x28, 0x63, 0x29, 0x2c, 0x58, 0x72, 0x28, + 0x63, 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, + 0x6c, 0x3d, 0x6f, 0x3b, 0x6c, 0x2e, 0x63, 0x69, 0x72, 0x63, 0x6c, + 0x65, 0x26, 0x26, 0x67, 0x61, 0x28, 0x65, 0x2d, 0x6c, 0x2e, 0x63, + 0x69, 0x72, 0x63, 0x6c, 0x65, 0x2e, 0x78, 0x29, 0x3c, 0x43, 0x61, + 0x26, 0x26, 0x67, 0x61, 0x28, 0x72, 0x2d, 0x6c, 0x2e, 0x63, 0x69, + 0x72, 0x63, 0x6c, 0x65, 0x2e, 0x63, 0x79, 0x29, 0x3c, 0x43, 0x61, + 0x3b, 0x29, 0x6f, 0x3d, 0x6c, 0x2e, 0x4e, 0x2c, 0x61, 0x2e, 0x70, + 0x75, 0x73, 0x68, 0x28, 0x6c, 0x29, 0x2c, 0x50, 0x72, 0x28, 0x6c, + 0x29, 0x2c, 0x6c, 0x3d, 0x6f, 0x3b, 0x61, 0x2e, 0x70, 0x75, 0x73, + 0x68, 0x28, 0x6c, 0x29, 0x2c, 0x58, 0x72, 0x28, 0x6c, 0x29, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x73, 0x2c, 0x66, 0x3d, 0x61, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x73, + 0x3d, 0x31, 0x3b, 0x66, 0x3e, 0x73, 0x3b, 0x2b, 0x2b, 0x73, 0x29, + 0x6c, 0x3d, 0x61, 0x5b, 0x73, 0x5d, 0x2c, 0x63, 0x3d, 0x61, 0x5b, + 0x73, 0x2d, 0x31, 0x5d, 0x2c, 0x4b, 0x72, 0x28, 0x6c, 0x2e, 0x65, + 0x64, 0x67, 0x65, 0x2c, 0x63, 0x2e, 0x73, 0x69, 0x74, 0x65, 0x2c, + 0x6c, 0x2e, 0x73, 0x69, 0x74, 0x65, 0x2c, 0x75, 0x29, 0x3b, 0x63, + 0x3d, 0x61, 0x5b, 0x30, 0x5d, 0x2c, 0x6c, 0x3d, 0x61, 0x5b, 0x66, + 0x2d, 0x31, 0x5d, 0x2c, 0x6c, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x3d, + 0x4a, 0x72, 0x28, 0x63, 0x2e, 0x73, 0x69, 0x74, 0x65, 0x2c, 0x6c, + 0x2e, 0x73, 0x69, 0x74, 0x65, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, + 0x75, 0x29, 0x2c, 0x56, 0x72, 0x28, 0x63, 0x29, 0x2c, 0x56, 0x72, + 0x28, 0x6c, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6a, 0x72, 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x6f, 0x72, + 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, + 0x75, 0x2c, 0x69, 0x3d, 0x6e, 0x2e, 0x78, 0x2c, 0x6f, 0x3d, 0x6e, + 0x2e, 0x79, 0x2c, 0x61, 0x3d, 0x51, 0x63, 0x2e, 0x5f, 0x3b, 0x61, + 0x3b, 0x29, 0x69, 0x66, 0x28, 0x72, 0x3d, 0x46, 0x72, 0x28, 0x61, + 0x2c, 0x6f, 0x29, 0x2d, 0x69, 0x2c, 0x72, 0x3e, 0x43, 0x61, 0x29, + 0x61, 0x3d, 0x61, 0x2e, 0x4c, 0x3b, 0x65, 0x6c, 0x73, 0x65, 0x7b, + 0x69, 0x66, 0x28, 0x75, 0x3d, 0x69, 0x2d, 0x48, 0x72, 0x28, 0x61, + 0x2c, 0x6f, 0x29, 0x2c, 0x21, 0x28, 0x75, 0x3e, 0x43, 0x61, 0x29, + 0x29, 0x7b, 0x72, 0x3e, 0x2d, 0x43, 0x61, 0x3f, 0x28, 0x74, 0x3d, + 0x61, 0x2e, 0x50, 0x2c, 0x65, 0x3d, 0x61, 0x29, 0x3a, 0x75, 0x3e, + 0x2d, 0x43, 0x61, 0x3f, 0x28, 0x74, 0x3d, 0x61, 0x2c, 0x65, 0x3d, + 0x61, 0x2e, 0x4e, 0x29, 0x3a, 0x74, 0x3d, 0x65, 0x3d, 0x61, 0x3b, + 0x62, 0x72, 0x65, 0x61, 0x6b, 0x7d, 0x69, 0x66, 0x28, 0x21, 0x61, + 0x2e, 0x52, 0x29, 0x7b, 0x74, 0x3d, 0x61, 0x3b, 0x62, 0x72, 0x65, + 0x61, 0x6b, 0x7d, 0x61, 0x3d, 0x61, 0x2e, 0x52, 0x7d, 0x76, 0x61, + 0x72, 0x20, 0x63, 0x3d, 0x44, 0x72, 0x28, 0x6e, 0x29, 0x3b, 0x69, + 0x66, 0x28, 0x51, 0x63, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x28, 0x74, 0x2c, 0x63, 0x29, 0x2c, 0x74, 0x7c, 0x7c, 0x65, 0x29, + 0x7b, 0x69, 0x66, 0x28, 0x74, 0x3d, 0x3d, 0x3d, 0x65, 0x29, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x58, 0x72, 0x28, 0x74, 0x29, + 0x2c, 0x65, 0x3d, 0x44, 0x72, 0x28, 0x74, 0x2e, 0x73, 0x69, 0x74, + 0x65, 0x29, 0x2c, 0x51, 0x63, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x28, 0x63, 0x2c, 0x65, 0x29, 0x2c, 0x63, 0x2e, 0x65, 0x64, + 0x67, 0x65, 0x3d, 0x65, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x3d, 0x4a, + 0x72, 0x28, 0x74, 0x2e, 0x73, 0x69, 0x74, 0x65, 0x2c, 0x63, 0x2e, + 0x73, 0x69, 0x74, 0x65, 0x29, 0x2c, 0x56, 0x72, 0x28, 0x74, 0x29, + 0x2c, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x56, 0x72, 0x28, 0x65, 0x29, + 0x3b, 0x69, 0x66, 0x28, 0x21, 0x65, 0x29, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x28, 0x63, 0x2e, 0x65, + 0x64, 0x67, 0x65, 0x3d, 0x4a, 0x72, 0x28, 0x74, 0x2e, 0x73, 0x69, + 0x74, 0x65, 0x2c, 0x63, 0x2e, 0x73, 0x69, 0x74, 0x65, 0x29, 0x29, + 0x3b, 0x58, 0x72, 0x28, 0x74, 0x29, 0x2c, 0x58, 0x72, 0x28, 0x65, + 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x6c, 0x3d, 0x74, 0x2e, 0x73, + 0x69, 0x74, 0x65, 0x2c, 0x73, 0x3d, 0x6c, 0x2e, 0x78, 0x2c, 0x66, + 0x3d, 0x6c, 0x2e, 0x79, 0x2c, 0x68, 0x3d, 0x6e, 0x2e, 0x78, 0x2d, + 0x73, 0x2c, 0x67, 0x3d, 0x6e, 0x2e, 0x79, 0x2d, 0x66, 0x2c, 0x70, + 0x3d, 0x65, 0x2e, 0x73, 0x69, 0x74, 0x65, 0x2c, 0x76, 0x3d, 0x70, + 0x2e, 0x78, 0x2d, 0x73, 0x2c, 0x64, 0x3d, 0x70, 0x2e, 0x79, 0x2d, + 0x66, 0x2c, 0x6d, 0x3d, 0x32, 0x2a, 0x28, 0x68, 0x2a, 0x64, 0x2d, + 0x67, 0x2a, 0x76, 0x29, 0x2c, 0x79, 0x3d, 0x68, 0x2a, 0x68, 0x2b, + 0x67, 0x2a, 0x67, 0x2c, 0x4d, 0x3d, 0x76, 0x2a, 0x76, 0x2b, 0x64, + 0x2a, 0x64, 0x2c, 0x78, 0x3d, 0x7b, 0x78, 0x3a, 0x28, 0x64, 0x2a, + 0x79, 0x2d, 0x67, 0x2a, 0x4d, 0x29, 0x2f, 0x6d, 0x2b, 0x73, 0x2c, + 0x79, 0x3a, 0x28, 0x68, 0x2a, 0x4d, 0x2d, 0x76, 0x2a, 0x79, 0x29, + 0x2f, 0x6d, 0x2b, 0x66, 0x7d, 0x3b, 0x4b, 0x72, 0x28, 0x65, 0x2e, + 0x65, 0x64, 0x67, 0x65, 0x2c, 0x6c, 0x2c, 0x70, 0x2c, 0x78, 0x29, + 0x2c, 0x63, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x3d, 0x4a, 0x72, 0x28, + 0x6c, 0x2c, 0x6e, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x78, 0x29, + 0x2c, 0x65, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x3d, 0x4a, 0x72, 0x28, + 0x6e, 0x2c, 0x70, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x78, 0x29, + 0x2c, 0x56, 0x72, 0x28, 0x74, 0x29, 0x2c, 0x56, 0x72, 0x28, 0x65, + 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x46, 0x72, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x65, 0x3d, 0x6e, 0x2e, 0x73, 0x69, 0x74, 0x65, 0x2c, + 0x72, 0x3d, 0x65, 0x2e, 0x78, 0x2c, 0x75, 0x3d, 0x65, 0x2e, 0x79, + 0x2c, 0x69, 0x3d, 0x75, 0x2d, 0x74, 0x3b, 0x69, 0x66, 0x28, 0x21, + 0x69, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x6f, 0x3d, 0x6e, 0x2e, 0x50, 0x3b, 0x69, + 0x66, 0x28, 0x21, 0x6f, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x2d, 0x31, 0x2f, 0x30, 0x3b, 0x65, 0x3d, 0x6f, 0x2e, 0x73, 0x69, + 0x74, 0x65, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x61, 0x3d, 0x65, 0x2e, + 0x78, 0x2c, 0x63, 0x3d, 0x65, 0x2e, 0x79, 0x2c, 0x6c, 0x3d, 0x63, + 0x2d, 0x74, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x6c, 0x29, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x73, 0x3d, 0x61, 0x2d, 0x72, 0x2c, 0x66, 0x3d, 0x31, 0x2f, 0x69, + 0x2d, 0x31, 0x2f, 0x6c, 0x2c, 0x68, 0x3d, 0x73, 0x2f, 0x6c, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x3f, 0x28, 0x2d, + 0x68, 0x2b, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x71, 0x72, 0x74, + 0x28, 0x68, 0x2a, 0x68, 0x2d, 0x32, 0x2a, 0x66, 0x2a, 0x28, 0x73, + 0x2a, 0x73, 0x2f, 0x28, 0x2d, 0x32, 0x2a, 0x6c, 0x29, 0x2d, 0x63, + 0x2b, 0x6c, 0x2f, 0x32, 0x2b, 0x75, 0x2d, 0x69, 0x2f, 0x32, 0x29, + 0x29, 0x29, 0x2f, 0x66, 0x2b, 0x72, 0x3a, 0x28, 0x72, 0x2b, 0x61, + 0x29, 0x2f, 0x32, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x48, 0x72, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x65, 0x3d, 0x6e, 0x2e, 0x4e, 0x3b, 0x69, 0x66, + 0x28, 0x65, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x46, + 0x72, 0x28, 0x65, 0x2c, 0x74, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x72, 0x3d, 0x6e, 0x2e, 0x73, 0x69, 0x74, 0x65, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x2e, 0x79, 0x3d, 0x3d, 0x3d, + 0x74, 0x3f, 0x72, 0x2e, 0x78, 0x3a, 0x31, 0x2f, 0x30, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4f, 0x72, 0x28, + 0x6e, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x69, 0x74, + 0x65, 0x3d, 0x6e, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x64, + 0x67, 0x65, 0x73, 0x3d, 0x5b, 0x5d, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x72, 0x28, 0x6e, 0x29, 0x7b, + 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x2c, 0x65, + 0x2c, 0x72, 0x2c, 0x75, 0x2c, 0x69, 0x2c, 0x6f, 0x2c, 0x61, 0x2c, + 0x63, 0x2c, 0x6c, 0x2c, 0x73, 0x2c, 0x66, 0x3d, 0x6e, 0x5b, 0x30, + 0x5d, 0x5b, 0x30, 0x5d, 0x2c, 0x68, 0x3d, 0x6e, 0x5b, 0x31, 0x5d, + 0x5b, 0x30, 0x5d, 0x2c, 0x67, 0x3d, 0x6e, 0x5b, 0x30, 0x5d, 0x5b, + 0x31, 0x5d, 0x2c, 0x70, 0x3d, 0x6e, 0x5b, 0x31, 0x5d, 0x5b, 0x31, + 0x5d, 0x2c, 0x76, 0x3d, 0x4b, 0x63, 0x2c, 0x64, 0x3d, 0x76, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x64, 0x2d, 0x2d, 0x3b, + 0x29, 0x69, 0x66, 0x28, 0x69, 0x3d, 0x76, 0x5b, 0x64, 0x5d, 0x2c, + 0x69, 0x26, 0x26, 0x69, 0x2e, 0x70, 0x72, 0x65, 0x70, 0x61, 0x72, + 0x65, 0x28, 0x29, 0x29, 0x66, 0x6f, 0x72, 0x28, 0x61, 0x3d, 0x69, + 0x2e, 0x65, 0x64, 0x67, 0x65, 0x73, 0x2c, 0x63, 0x3d, 0x61, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x6f, 0x3d, 0x30, 0x3b, + 0x63, 0x3e, 0x6f, 0x3b, 0x29, 0x73, 0x3d, 0x61, 0x5b, 0x6f, 0x5d, + 0x2e, 0x65, 0x6e, 0x64, 0x28, 0x29, 0x2c, 0x72, 0x3d, 0x73, 0x2e, + 0x78, 0x2c, 0x75, 0x3d, 0x73, 0x2e, 0x79, 0x2c, 0x6c, 0x3d, 0x61, + 0x5b, 0x2b, 0x2b, 0x6f, 0x25, 0x63, 0x5d, 0x2e, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x28, 0x29, 0x2c, 0x74, 0x3d, 0x6c, 0x2e, 0x78, 0x2c, + 0x65, 0x3d, 0x6c, 0x2e, 0x79, 0x2c, 0x28, 0x67, 0x61, 0x28, 0x72, + 0x2d, 0x74, 0x29, 0x3e, 0x43, 0x61, 0x7c, 0x7c, 0x67, 0x61, 0x28, + 0x75, 0x2d, 0x65, 0x29, 0x3e, 0x43, 0x61, 0x29, 0x26, 0x26, 0x28, + 0x61, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x6f, 0x2c, + 0x30, 0x2c, 0x6e, 0x65, 0x77, 0x20, 0x51, 0x72, 0x28, 0x47, 0x72, + 0x28, 0x69, 0x2e, 0x73, 0x69, 0x74, 0x65, 0x2c, 0x73, 0x2c, 0x67, + 0x61, 0x28, 0x72, 0x2d, 0x66, 0x29, 0x3c, 0x43, 0x61, 0x26, 0x26, + 0x70, 0x2d, 0x75, 0x3e, 0x43, 0x61, 0x3f, 0x7b, 0x78, 0x3a, 0x66, + 0x2c, 0x79, 0x3a, 0x67, 0x61, 0x28, 0x74, 0x2d, 0x66, 0x29, 0x3c, + 0x43, 0x61, 0x3f, 0x65, 0x3a, 0x70, 0x7d, 0x3a, 0x67, 0x61, 0x28, + 0x75, 0x2d, 0x70, 0x29, 0x3c, 0x43, 0x61, 0x26, 0x26, 0x68, 0x2d, + 0x72, 0x3e, 0x43, 0x61, 0x3f, 0x7b, 0x78, 0x3a, 0x67, 0x61, 0x28, + 0x65, 0x2d, 0x70, 0x29, 0x3c, 0x43, 0x61, 0x3f, 0x74, 0x3a, 0x68, + 0x2c, 0x79, 0x3a, 0x70, 0x7d, 0x3a, 0x67, 0x61, 0x28, 0x72, 0x2d, + 0x68, 0x29, 0x3c, 0x43, 0x61, 0x26, 0x26, 0x75, 0x2d, 0x67, 0x3e, + 0x43, 0x61, 0x3f, 0x7b, 0x78, 0x3a, 0x68, 0x2c, 0x79, 0x3a, 0x67, + 0x61, 0x28, 0x74, 0x2d, 0x68, 0x29, 0x3c, 0x43, 0x61, 0x3f, 0x65, + 0x3a, 0x67, 0x7d, 0x3a, 0x67, 0x61, 0x28, 0x75, 0x2d, 0x67, 0x29, + 0x3c, 0x43, 0x61, 0x26, 0x26, 0x72, 0x2d, 0x66, 0x3e, 0x43, 0x61, + 0x3f, 0x7b, 0x78, 0x3a, 0x67, 0x61, 0x28, 0x65, 0x2d, 0x67, 0x29, + 0x3c, 0x43, 0x61, 0x3f, 0x74, 0x3a, 0x66, 0x2c, 0x79, 0x3a, 0x67, + 0x7d, 0x3a, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x2c, 0x69, 0x2e, 0x73, + 0x69, 0x74, 0x65, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x29, 0x2c, + 0x2b, 0x2b, 0x63, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x59, 0x72, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, 0x61, 0x6e, + 0x67, 0x6c, 0x65, 0x2d, 0x6e, 0x2e, 0x61, 0x6e, 0x67, 0x6c, 0x65, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5a, + 0x72, 0x28, 0x29, 0x7b, 0x74, 0x75, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x78, 0x3d, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x79, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, + 0x72, 0x63, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x69, 0x74, + 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x79, 0x3d, 0x6e, + 0x75, 0x6c, 0x6c, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x56, 0x72, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x74, 0x3d, 0x6e, 0x2e, 0x50, 0x2c, 0x65, 0x3d, 0x6e, 0x2e, + 0x4e, 0x3b, 0x69, 0x66, 0x28, 0x74, 0x26, 0x26, 0x65, 0x29, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x74, 0x2e, 0x73, 0x69, 0x74, + 0x65, 0x2c, 0x75, 0x3d, 0x6e, 0x2e, 0x73, 0x69, 0x74, 0x65, 0x2c, + 0x69, 0x3d, 0x65, 0x2e, 0x73, 0x69, 0x74, 0x65, 0x3b, 0x69, 0x66, + 0x28, 0x72, 0x21, 0x3d, 0x3d, 0x69, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x6f, 0x3d, 0x75, 0x2e, 0x78, 0x2c, 0x61, 0x3d, 0x75, 0x2e, + 0x79, 0x2c, 0x63, 0x3d, 0x72, 0x2e, 0x78, 0x2d, 0x6f, 0x2c, 0x6c, + 0x3d, 0x72, 0x2e, 0x79, 0x2d, 0x61, 0x2c, 0x73, 0x3d, 0x69, 0x2e, + 0x78, 0x2d, 0x6f, 0x2c, 0x66, 0x3d, 0x69, 0x2e, 0x79, 0x2d, 0x61, + 0x2c, 0x68, 0x3d, 0x32, 0x2a, 0x28, 0x63, 0x2a, 0x66, 0x2d, 0x6c, + 0x2a, 0x73, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x28, 0x68, 0x3e, + 0x3d, 0x2d, 0x7a, 0x61, 0x29, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x67, 0x3d, 0x63, 0x2a, 0x63, 0x2b, 0x6c, 0x2a, 0x6c, 0x2c, 0x70, + 0x3d, 0x73, 0x2a, 0x73, 0x2b, 0x66, 0x2a, 0x66, 0x2c, 0x76, 0x3d, + 0x28, 0x66, 0x2a, 0x67, 0x2d, 0x6c, 0x2a, 0x70, 0x29, 0x2f, 0x68, + 0x2c, 0x64, 0x3d, 0x28, 0x63, 0x2a, 0x70, 0x2d, 0x73, 0x2a, 0x67, + 0x29, 0x2f, 0x68, 0x2c, 0x66, 0x3d, 0x64, 0x2b, 0x61, 0x2c, 0x6d, + 0x3d, 0x72, 0x6c, 0x2e, 0x70, 0x6f, 0x70, 0x28, 0x29, 0x7c, 0x7c, + 0x6e, 0x65, 0x77, 0x20, 0x5a, 0x72, 0x3b, 0x6d, 0x2e, 0x61, 0x72, + 0x63, 0x3d, 0x6e, 0x2c, 0x6d, 0x2e, 0x73, 0x69, 0x74, 0x65, 0x3d, + 0x75, 0x2c, 0x6d, 0x2e, 0x78, 0x3d, 0x76, 0x2b, 0x6f, 0x2c, 0x6d, + 0x2e, 0x79, 0x3d, 0x66, 0x2b, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, + 0x71, 0x72, 0x74, 0x28, 0x76, 0x2a, 0x76, 0x2b, 0x64, 0x2a, 0x64, + 0x29, 0x2c, 0x6d, 0x2e, 0x63, 0x79, 0x3d, 0x66, 0x2c, 0x6e, 0x2e, + 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x3d, 0x6d, 0x3b, 0x66, 0x6f, + 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x79, 0x3d, 0x6e, 0x75, 0x6c, + 0x6c, 0x2c, 0x4d, 0x3d, 0x74, 0x6c, 0x2e, 0x5f, 0x3b, 0x4d, 0x3b, + 0x29, 0x69, 0x66, 0x28, 0x6d, 0x2e, 0x79, 0x3c, 0x4d, 0x2e, 0x79, + 0x7c, 0x7c, 0x6d, 0x2e, 0x79, 0x3d, 0x3d, 0x3d, 0x4d, 0x2e, 0x79, + 0x26, 0x26, 0x6d, 0x2e, 0x78, 0x3c, 0x3d, 0x4d, 0x2e, 0x78, 0x29, + 0x7b, 0x69, 0x66, 0x28, 0x21, 0x4d, 0x2e, 0x4c, 0x29, 0x7b, 0x79, + 0x3d, 0x4d, 0x2e, 0x50, 0x3b, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x7d, + 0x4d, 0x3d, 0x4d, 0x2e, 0x4c, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, + 0x69, 0x66, 0x28, 0x21, 0x4d, 0x2e, 0x52, 0x29, 0x7b, 0x79, 0x3d, + 0x4d, 0x3b, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x7d, 0x4d, 0x3d, 0x4d, + 0x2e, 0x52, 0x7d, 0x74, 0x6c, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x28, 0x79, 0x2c, 0x6d, 0x29, 0x2c, 0x79, 0x7c, 0x7c, 0x28, + 0x6e, 0x6c, 0x3d, 0x6d, 0x29, 0x7d, 0x7d, 0x7d, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x58, 0x72, 0x28, 0x6e, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x6e, 0x2e, 0x63, + 0x69, 0x72, 0x63, 0x6c, 0x65, 0x3b, 0x74, 0x26, 0x26, 0x28, 0x74, + 0x2e, 0x50, 0x7c, 0x7c, 0x28, 0x6e, 0x6c, 0x3d, 0x74, 0x2e, 0x4e, + 0x29, 0x2c, 0x74, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x28, 0x74, 0x29, 0x2c, 0x72, 0x6c, 0x2e, 0x70, 0x75, 0x73, 0x68, + 0x28, 0x74, 0x29, 0x2c, 0x74, 0x75, 0x28, 0x74, 0x29, 0x2c, 0x6e, + 0x2e, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x3d, 0x6e, 0x75, 0x6c, + 0x6c, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x24, 0x72, 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, + 0x76, 0x61, 0x72, 0x20, 0x74, 0x2c, 0x65, 0x3d, 0x47, 0x63, 0x2c, + 0x72, 0x3d, 0x4f, 0x65, 0x28, 0x6e, 0x5b, 0x30, 0x5d, 0x5b, 0x30, + 0x5d, 0x2c, 0x6e, 0x5b, 0x30, 0x5d, 0x5b, 0x31, 0x5d, 0x2c, 0x6e, + 0x5b, 0x31, 0x5d, 0x5b, 0x30, 0x5d, 0x2c, 0x6e, 0x5b, 0x31, 0x5d, + 0x5b, 0x31, 0x5d, 0x29, 0x2c, 0x75, 0x3d, 0x65, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x75, 0x2d, 0x2d, 0x3b, 0x29, 0x74, + 0x3d, 0x65, 0x5b, 0x75, 0x5d, 0x2c, 0x28, 0x21, 0x42, 0x72, 0x28, + 0x74, 0x2c, 0x6e, 0x29, 0x7c, 0x7c, 0x21, 0x72, 0x28, 0x74, 0x29, + 0x7c, 0x7c, 0x67, 0x61, 0x28, 0x74, 0x2e, 0x61, 0x2e, 0x78, 0x2d, + 0x74, 0x2e, 0x62, 0x2e, 0x78, 0x29, 0x3c, 0x43, 0x61, 0x26, 0x26, + 0x67, 0x61, 0x28, 0x74, 0x2e, 0x61, 0x2e, 0x79, 0x2d, 0x74, 0x2e, + 0x62, 0x2e, 0x79, 0x29, 0x3c, 0x43, 0x61, 0x29, 0x26, 0x26, 0x28, + 0x74, 0x2e, 0x61, 0x3d, 0x74, 0x2e, 0x62, 0x3d, 0x6e, 0x75, 0x6c, + 0x6c, 0x2c, 0x65, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x28, + 0x75, 0x2c, 0x31, 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x42, 0x72, 0x28, 0x6e, 0x2c, 0x74, 0x29, + 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x6e, 0x2e, 0x62, 0x3b, + 0x69, 0x66, 0x28, 0x65, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x21, 0x30, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x2c, 0x75, 0x2c, + 0x69, 0x3d, 0x6e, 0x2e, 0x61, 0x2c, 0x6f, 0x3d, 0x74, 0x5b, 0x30, + 0x5d, 0x5b, 0x30, 0x5d, 0x2c, 0x61, 0x3d, 0x74, 0x5b, 0x31, 0x5d, + 0x5b, 0x30, 0x5d, 0x2c, 0x63, 0x3d, 0x74, 0x5b, 0x30, 0x5d, 0x5b, + 0x31, 0x5d, 0x2c, 0x6c, 0x3d, 0x74, 0x5b, 0x31, 0x5d, 0x5b, 0x31, + 0x5d, 0x2c, 0x73, 0x3d, 0x6e, 0x2e, 0x6c, 0x2c, 0x66, 0x3d, 0x6e, + 0x2e, 0x72, 0x2c, 0x68, 0x3d, 0x73, 0x2e, 0x78, 0x2c, 0x67, 0x3d, + 0x73, 0x2e, 0x79, 0x2c, 0x70, 0x3d, 0x66, 0x2e, 0x78, 0x2c, 0x76, + 0x3d, 0x66, 0x2e, 0x79, 0x2c, 0x64, 0x3d, 0x28, 0x68, 0x2b, 0x70, + 0x29, 0x2f, 0x32, 0x2c, 0x6d, 0x3d, 0x28, 0x67, 0x2b, 0x76, 0x29, + 0x2f, 0x32, 0x3b, 0x69, 0x66, 0x28, 0x76, 0x3d, 0x3d, 0x3d, 0x67, + 0x29, 0x7b, 0x69, 0x66, 0x28, 0x6f, 0x3e, 0x64, 0x7c, 0x7c, 0x64, + 0x3e, 0x3d, 0x61, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, + 0x69, 0x66, 0x28, 0x68, 0x3e, 0x70, 0x29, 0x7b, 0x69, 0x66, 0x28, + 0x69, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x69, 0x2e, 0x79, 0x3e, 0x3d, + 0x6c, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7d, 0x65, 0x6c, + 0x73, 0x65, 0x20, 0x69, 0x3d, 0x7b, 0x78, 0x3a, 0x64, 0x2c, 0x79, + 0x3a, 0x63, 0x7d, 0x3b, 0x65, 0x3d, 0x7b, 0x78, 0x3a, 0x64, 0x2c, + 0x79, 0x3a, 0x6c, 0x7d, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x69, + 0x66, 0x28, 0x69, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x69, 0x2e, 0x79, + 0x3c, 0x63, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7d, 0x65, + 0x6c, 0x73, 0x65, 0x20, 0x69, 0x3d, 0x7b, 0x78, 0x3a, 0x64, 0x2c, + 0x79, 0x3a, 0x6c, 0x7d, 0x3b, 0x65, 0x3d, 0x7b, 0x78, 0x3a, 0x64, + 0x2c, 0x79, 0x3a, 0x63, 0x7d, 0x7d, 0x7d, 0x65, 0x6c, 0x73, 0x65, + 0x20, 0x69, 0x66, 0x28, 0x72, 0x3d, 0x28, 0x68, 0x2d, 0x70, 0x29, + 0x2f, 0x28, 0x76, 0x2d, 0x67, 0x29, 0x2c, 0x75, 0x3d, 0x6d, 0x2d, + 0x72, 0x2a, 0x64, 0x2c, 0x2d, 0x31, 0x3e, 0x72, 0x7c, 0x7c, 0x72, + 0x3e, 0x31, 0x29, 0x69, 0x66, 0x28, 0x68, 0x3e, 0x70, 0x29, 0x7b, + 0x69, 0x66, 0x28, 0x69, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x69, 0x2e, + 0x79, 0x3e, 0x3d, 0x6c, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x3d, 0x7b, 0x78, 0x3a, + 0x28, 0x63, 0x2d, 0x75, 0x29, 0x2f, 0x72, 0x2c, 0x79, 0x3a, 0x63, + 0x7d, 0x3b, 0x65, 0x3d, 0x7b, 0x78, 0x3a, 0x28, 0x6c, 0x2d, 0x75, + 0x29, 0x2f, 0x72, 0x2c, 0x79, 0x3a, 0x6c, 0x7d, 0x7d, 0x65, 0x6c, + 0x73, 0x65, 0x7b, 0x69, 0x66, 0x28, 0x69, 0x29, 0x7b, 0x69, 0x66, + 0x28, 0x69, 0x2e, 0x79, 0x3c, 0x63, 0x29, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x3d, 0x7b, + 0x78, 0x3a, 0x28, 0x6c, 0x2d, 0x75, 0x29, 0x2f, 0x72, 0x2c, 0x79, + 0x3a, 0x6c, 0x7d, 0x3b, 0x65, 0x3d, 0x7b, 0x78, 0x3a, 0x28, 0x63, + 0x2d, 0x75, 0x29, 0x2f, 0x72, 0x2c, 0x79, 0x3a, 0x63, 0x7d, 0x7d, + 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x76, 0x3e, 0x67, + 0x29, 0x7b, 0x69, 0x66, 0x28, 0x69, 0x29, 0x7b, 0x69, 0x66, 0x28, + 0x69, 0x2e, 0x78, 0x3e, 0x3d, 0x61, 0x29, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x3d, 0x7b, + 0x78, 0x3a, 0x6f, 0x2c, 0x79, 0x3a, 0x72, 0x2a, 0x6f, 0x2b, 0x75, + 0x7d, 0x3b, 0x65, 0x3d, 0x7b, 0x78, 0x3a, 0x61, 0x2c, 0x79, 0x3a, + 0x72, 0x2a, 0x61, 0x2b, 0x75, 0x7d, 0x7d, 0x65, 0x6c, 0x73, 0x65, + 0x7b, 0x69, 0x66, 0x28, 0x69, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x69, + 0x2e, 0x78, 0x3c, 0x6f, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x3d, 0x7b, 0x78, 0x3a, + 0x61, 0x2c, 0x79, 0x3a, 0x72, 0x2a, 0x61, 0x2b, 0x75, 0x7d, 0x3b, + 0x65, 0x3d, 0x7b, 0x78, 0x3a, 0x6f, 0x2c, 0x79, 0x3a, 0x72, 0x2a, + 0x6f, 0x2b, 0x75, 0x7d, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6e, 0x2e, 0x61, 0x3d, 0x69, 0x2c, 0x6e, 0x2e, 0x62, 0x3d, + 0x65, 0x2c, 0x21, 0x30, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x57, 0x72, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x3d, 0x6e, 0x2c, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x72, 0x3d, 0x74, 0x2c, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x61, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x62, 0x3d, 0x6e, + 0x75, 0x6c, 0x6c, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x4a, 0x72, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x2c, + 0x72, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x75, 0x3d, 0x6e, 0x65, + 0x77, 0x20, 0x57, 0x72, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x47, 0x63, 0x2e, 0x70, 0x75, + 0x73, 0x68, 0x28, 0x75, 0x29, 0x2c, 0x65, 0x26, 0x26, 0x4b, 0x72, + 0x28, 0x75, 0x2c, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x2c, 0x72, + 0x26, 0x26, 0x4b, 0x72, 0x28, 0x75, 0x2c, 0x74, 0x2c, 0x6e, 0x2c, + 0x72, 0x29, 0x2c, 0x4b, 0x63, 0x5b, 0x6e, 0x2e, 0x69, 0x5d, 0x2e, + 0x65, 0x64, 0x67, 0x65, 0x73, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, + 0x6e, 0x65, 0x77, 0x20, 0x51, 0x72, 0x28, 0x75, 0x2c, 0x6e, 0x2c, + 0x74, 0x29, 0x29, 0x2c, 0x4b, 0x63, 0x5b, 0x74, 0x2e, 0x69, 0x5d, + 0x2e, 0x65, 0x64, 0x67, 0x65, 0x73, 0x2e, 0x70, 0x75, 0x73, 0x68, + 0x28, 0x6e, 0x65, 0x77, 0x20, 0x51, 0x72, 0x28, 0x75, 0x2c, 0x74, + 0x2c, 0x6e, 0x29, 0x29, 0x2c, 0x75, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x47, 0x72, 0x28, 0x6e, 0x2c, 0x74, + 0x2c, 0x65, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x6e, + 0x65, 0x77, 0x20, 0x57, 0x72, 0x28, 0x6e, 0x2c, 0x6e, 0x75, 0x6c, + 0x6c, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, + 0x2e, 0x61, 0x3d, 0x74, 0x2c, 0x72, 0x2e, 0x62, 0x3d, 0x65, 0x2c, + 0x47, 0x63, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x72, 0x29, 0x2c, + 0x72, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x4b, 0x72, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, + 0x7b, 0x6e, 0x2e, 0x61, 0x7c, 0x7c, 0x6e, 0x2e, 0x62, 0x3f, 0x6e, + 0x2e, 0x6c, 0x3d, 0x3d, 0x3d, 0x65, 0x3f, 0x6e, 0x2e, 0x62, 0x3d, + 0x72, 0x3a, 0x6e, 0x2e, 0x61, 0x3d, 0x72, 0x3a, 0x28, 0x6e, 0x2e, + 0x61, 0x3d, 0x72, 0x2c, 0x6e, 0x2e, 0x6c, 0x3d, 0x74, 0x2c, 0x6e, + 0x2e, 0x72, 0x3d, 0x65, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x51, 0x72, 0x28, 0x6e, 0x2c, 0x74, 0x2c, + 0x65, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x6e, 0x2e, + 0x61, 0x2c, 0x75, 0x3d, 0x6e, 0x2e, 0x62, 0x3b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x3d, 0x6e, 0x2c, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x73, 0x69, 0x74, 0x65, 0x3d, 0x74, 0x2c, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x3d, 0x65, + 0x3f, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x61, 0x74, 0x61, 0x6e, 0x32, + 0x28, 0x65, 0x2e, 0x79, 0x2d, 0x74, 0x2e, 0x79, 0x2c, 0x65, 0x2e, + 0x78, 0x2d, 0x74, 0x2e, 0x78, 0x29, 0x3a, 0x6e, 0x2e, 0x6c, 0x3d, + 0x3d, 0x3d, 0x74, 0x3f, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x61, 0x74, + 0x61, 0x6e, 0x32, 0x28, 0x75, 0x2e, 0x78, 0x2d, 0x72, 0x2e, 0x78, + 0x2c, 0x72, 0x2e, 0x79, 0x2d, 0x75, 0x2e, 0x79, 0x29, 0x3a, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x61, 0x74, 0x61, 0x6e, 0x32, 0x28, 0x72, + 0x2e, 0x78, 0x2d, 0x75, 0x2e, 0x78, 0x2c, 0x75, 0x2e, 0x79, 0x2d, + 0x72, 0x2e, 0x79, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6e, 0x75, 0x28, 0x29, 0x7b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x5f, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x75, 0x28, 0x6e, + 0x29, 0x7b, 0x6e, 0x2e, 0x55, 0x3d, 0x6e, 0x2e, 0x43, 0x3d, 0x6e, + 0x2e, 0x4c, 0x3d, 0x6e, 0x2e, 0x52, 0x3d, 0x6e, 0x2e, 0x50, 0x3d, + 0x6e, 0x2e, 0x4e, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x75, 0x28, 0x6e, + 0x2c, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x74, + 0x2c, 0x72, 0x3d, 0x74, 0x2e, 0x52, 0x2c, 0x75, 0x3d, 0x65, 0x2e, + 0x55, 0x3b, 0x75, 0x3f, 0x75, 0x2e, 0x4c, 0x3d, 0x3d, 0x3d, 0x65, + 0x3f, 0x75, 0x2e, 0x4c, 0x3d, 0x72, 0x3a, 0x75, 0x2e, 0x52, 0x3d, + 0x72, 0x3a, 0x6e, 0x2e, 0x5f, 0x3d, 0x72, 0x2c, 0x72, 0x2e, 0x55, + 0x3d, 0x75, 0x2c, 0x65, 0x2e, 0x55, 0x3d, 0x72, 0x2c, 0x65, 0x2e, + 0x52, 0x3d, 0x72, 0x2e, 0x4c, 0x2c, 0x65, 0x2e, 0x52, 0x26, 0x26, + 0x28, 0x65, 0x2e, 0x52, 0x2e, 0x55, 0x3d, 0x65, 0x29, 0x2c, 0x72, + 0x2e, 0x4c, 0x3d, 0x65, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x72, 0x75, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x74, 0x2c, 0x72, 0x3d, 0x74, + 0x2e, 0x4c, 0x2c, 0x75, 0x3d, 0x65, 0x2e, 0x55, 0x3b, 0x75, 0x3f, + 0x75, 0x2e, 0x4c, 0x3d, 0x3d, 0x3d, 0x65, 0x3f, 0x75, 0x2e, 0x4c, + 0x3d, 0x72, 0x3a, 0x75, 0x2e, 0x52, 0x3d, 0x72, 0x3a, 0x6e, 0x2e, + 0x5f, 0x3d, 0x72, 0x2c, 0x72, 0x2e, 0x55, 0x3d, 0x75, 0x2c, 0x65, + 0x2e, 0x55, 0x3d, 0x72, 0x2c, 0x65, 0x2e, 0x4c, 0x3d, 0x72, 0x2e, + 0x52, 0x2c, 0x65, 0x2e, 0x4c, 0x26, 0x26, 0x28, 0x65, 0x2e, 0x4c, + 0x2e, 0x55, 0x3d, 0x65, 0x29, 0x2c, 0x72, 0x2e, 0x52, 0x3d, 0x65, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, + 0x75, 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x3b, 0x6e, + 0x2e, 0x4c, 0x3b, 0x29, 0x6e, 0x3d, 0x6e, 0x2e, 0x4c, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x75, 0x28, 0x6e, 0x2c, + 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x2c, 0x72, 0x2c, + 0x75, 0x2c, 0x69, 0x3d, 0x6e, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x28, + 0x6f, 0x75, 0x29, 0x2e, 0x70, 0x6f, 0x70, 0x28, 0x29, 0x3b, 0x66, + 0x6f, 0x72, 0x28, 0x47, 0x63, 0x3d, 0x5b, 0x5d, 0x2c, 0x4b, 0x63, + 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, + 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x2c, 0x51, + 0x63, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x6e, 0x75, 0x2c, 0x74, 0x6c, + 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x6e, 0x75, 0x3b, 0x3b, 0x29, 0x69, + 0x66, 0x28, 0x75, 0x3d, 0x6e, 0x6c, 0x2c, 0x69, 0x26, 0x26, 0x28, + 0x21, 0x75, 0x7c, 0x7c, 0x69, 0x2e, 0x79, 0x3c, 0x75, 0x2e, 0x79, + 0x7c, 0x7c, 0x69, 0x2e, 0x79, 0x3d, 0x3d, 0x3d, 0x75, 0x2e, 0x79, + 0x26, 0x26, 0x69, 0x2e, 0x78, 0x3c, 0x75, 0x2e, 0x78, 0x29, 0x29, + 0x28, 0x69, 0x2e, 0x78, 0x21, 0x3d, 0x3d, 0x65, 0x7c, 0x7c, 0x69, + 0x2e, 0x79, 0x21, 0x3d, 0x3d, 0x72, 0x29, 0x26, 0x26, 0x28, 0x4b, + 0x63, 0x5b, 0x69, 0x2e, 0x69, 0x5d, 0x3d, 0x6e, 0x65, 0x77, 0x20, + 0x4f, 0x72, 0x28, 0x69, 0x29, 0x2c, 0x6a, 0x72, 0x28, 0x69, 0x29, + 0x2c, 0x65, 0x3d, 0x69, 0x2e, 0x78, 0x2c, 0x72, 0x3d, 0x69, 0x2e, + 0x79, 0x29, 0x2c, 0x69, 0x3d, 0x6e, 0x2e, 0x70, 0x6f, 0x70, 0x28, + 0x29, 0x3b, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x69, 0x66, 0x28, 0x21, + 0x75, 0x29, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x55, 0x72, 0x28, + 0x75, 0x2e, 0x61, 0x72, 0x63, 0x29, 0x7d, 0x74, 0x26, 0x26, 0x28, + 0x24, 0x72, 0x28, 0x74, 0x29, 0x2c, 0x49, 0x72, 0x28, 0x74, 0x29, + 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x6f, 0x3d, 0x7b, 0x63, 0x65, + 0x6c, 0x6c, 0x73, 0x3a, 0x4b, 0x63, 0x2c, 0x65, 0x64, 0x67, 0x65, + 0x73, 0x3a, 0x47, 0x63, 0x7d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x51, 0x63, 0x3d, 0x74, 0x6c, 0x3d, 0x47, 0x63, 0x3d, + 0x4b, 0x63, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x6f, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x75, 0x28, + 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x2e, 0x79, 0x2d, 0x6e, 0x2e, 0x79, 0x7c, 0x7c, 0x74, + 0x2e, 0x78, 0x2d, 0x6e, 0x2e, 0x78, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x75, 0x28, 0x6e, 0x2c, 0x74, + 0x2c, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, + 0x6e, 0x2e, 0x78, 0x2d, 0x65, 0x2e, 0x78, 0x29, 0x2a, 0x28, 0x74, + 0x2e, 0x79, 0x2d, 0x6e, 0x2e, 0x79, 0x29, 0x2d, 0x28, 0x6e, 0x2e, + 0x78, 0x2d, 0x74, 0x2e, 0x78, 0x29, 0x2a, 0x28, 0x65, 0x2e, 0x79, + 0x2d, 0x6e, 0x2e, 0x79, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x75, 0x28, 0x6e, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x78, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x75, 0x28, + 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x2e, 0x79, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x73, 0x75, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x7b, 0x6c, 0x65, 0x61, 0x66, 0x3a, 0x21, 0x30, 0x2c, 0x6e, + 0x6f, 0x64, 0x65, 0x73, 0x3a, 0x5b, 0x5d, 0x2c, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x3a, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x78, 0x3a, 0x6e, + 0x75, 0x6c, 0x6c, 0x2c, 0x79, 0x3a, 0x6e, 0x75, 0x6c, 0x6c, 0x7d, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, + 0x75, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x75, + 0x2c, 0x69, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x21, 0x6e, 0x28, 0x74, + 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x75, 0x2c, 0x69, 0x29, 0x29, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x6f, 0x3d, 0x2e, 0x35, 0x2a, 0x28, 0x65, + 0x2b, 0x75, 0x29, 0x2c, 0x61, 0x3d, 0x2e, 0x35, 0x2a, 0x28, 0x72, + 0x2b, 0x69, 0x29, 0x2c, 0x63, 0x3d, 0x74, 0x2e, 0x6e, 0x6f, 0x64, + 0x65, 0x73, 0x3b, 0x63, 0x5b, 0x30, 0x5d, 0x26, 0x26, 0x66, 0x75, + 0x28, 0x6e, 0x2c, 0x63, 0x5b, 0x30, 0x5d, 0x2c, 0x65, 0x2c, 0x72, + 0x2c, 0x6f, 0x2c, 0x61, 0x29, 0x2c, 0x63, 0x5b, 0x31, 0x5d, 0x26, + 0x26, 0x66, 0x75, 0x28, 0x6e, 0x2c, 0x63, 0x5b, 0x31, 0x5d, 0x2c, + 0x6f, 0x2c, 0x72, 0x2c, 0x75, 0x2c, 0x61, 0x29, 0x2c, 0x63, 0x5b, + 0x32, 0x5d, 0x26, 0x26, 0x66, 0x75, 0x28, 0x6e, 0x2c, 0x63, 0x5b, + 0x32, 0x5d, 0x2c, 0x65, 0x2c, 0x61, 0x2c, 0x6f, 0x2c, 0x69, 0x29, + 0x2c, 0x63, 0x5b, 0x33, 0x5d, 0x26, 0x26, 0x66, 0x75, 0x28, 0x6e, + 0x2c, 0x63, 0x5b, 0x33, 0x5d, 0x2c, 0x6f, 0x2c, 0x61, 0x2c, 0x75, + 0x2c, 0x69, 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x68, 0x75, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, + 0x2c, 0x72, 0x2c, 0x75, 0x2c, 0x69, 0x2c, 0x6f, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x61, 0x2c, 0x63, 0x3d, 0x31, 0x2f, 0x30, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x28, 0x6e, 0x2c, 0x73, 0x2c, + 0x66, 0x2c, 0x68, 0x2c, 0x67, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x21, + 0x28, 0x73, 0x3e, 0x69, 0x7c, 0x7c, 0x66, 0x3e, 0x6f, 0x7c, 0x7c, + 0x72, 0x3e, 0x68, 0x7c, 0x7c, 0x75, 0x3e, 0x67, 0x29, 0x29, 0x7b, + 0x69, 0x66, 0x28, 0x70, 0x3d, 0x6e, 0x2e, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x70, 0x2c, 0x76, 0x3d, + 0x74, 0x2d, 0x6e, 0x2e, 0x78, 0x2c, 0x64, 0x3d, 0x65, 0x2d, 0x6e, + 0x2e, 0x79, 0x2c, 0x6d, 0x3d, 0x76, 0x2a, 0x76, 0x2b, 0x64, 0x2a, + 0x64, 0x3b, 0x69, 0x66, 0x28, 0x63, 0x3e, 0x6d, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x79, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, + 0x71, 0x72, 0x74, 0x28, 0x63, 0x3d, 0x6d, 0x29, 0x3b, 0x72, 0x3d, + 0x74, 0x2d, 0x79, 0x2c, 0x75, 0x3d, 0x65, 0x2d, 0x79, 0x2c, 0x69, + 0x3d, 0x74, 0x2b, 0x79, 0x2c, 0x6f, 0x3d, 0x65, 0x2b, 0x79, 0x2c, + 0x61, 0x3d, 0x70, 0x7d, 0x7d, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, + 0x72, 0x20, 0x4d, 0x3d, 0x6e, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x73, + 0x2c, 0x78, 0x3d, 0x2e, 0x35, 0x2a, 0x28, 0x73, 0x2b, 0x68, 0x29, + 0x2c, 0x62, 0x3d, 0x2e, 0x35, 0x2a, 0x28, 0x66, 0x2b, 0x67, 0x29, + 0x2c, 0x5f, 0x3d, 0x74, 0x3e, 0x3d, 0x78, 0x2c, 0x77, 0x3d, 0x65, + 0x3e, 0x3d, 0x62, 0x2c, 0x53, 0x3d, 0x77, 0x3c, 0x3c, 0x31, 0x7c, + 0x5f, 0x2c, 0x6b, 0x3d, 0x53, 0x2b, 0x34, 0x3b, 0x6b, 0x3e, 0x53, + 0x3b, 0x2b, 0x2b, 0x53, 0x29, 0x69, 0x66, 0x28, 0x6e, 0x3d, 0x4d, + 0x5b, 0x33, 0x26, 0x53, 0x5d, 0x29, 0x73, 0x77, 0x69, 0x74, 0x63, + 0x68, 0x28, 0x33, 0x26, 0x53, 0x29, 0x7b, 0x63, 0x61, 0x73, 0x65, + 0x20, 0x30, 0x3a, 0x6c, 0x28, 0x6e, 0x2c, 0x73, 0x2c, 0x66, 0x2c, + 0x78, 0x2c, 0x62, 0x29, 0x3b, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, + 0x63, 0x61, 0x73, 0x65, 0x20, 0x31, 0x3a, 0x6c, 0x28, 0x6e, 0x2c, + 0x78, 0x2c, 0x66, 0x2c, 0x68, 0x2c, 0x62, 0x29, 0x3b, 0x62, 0x72, + 0x65, 0x61, 0x6b, 0x3b, 0x63, 0x61, 0x73, 0x65, 0x20, 0x32, 0x3a, + 0x6c, 0x28, 0x6e, 0x2c, 0x73, 0x2c, 0x62, 0x2c, 0x78, 0x2c, 0x67, + 0x29, 0x3b, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x63, 0x61, 0x73, + 0x65, 0x20, 0x33, 0x3a, 0x6c, 0x28, 0x6e, 0x2c, 0x78, 0x2c, 0x62, + 0x2c, 0x68, 0x2c, 0x67, 0x29, 0x7d, 0x7d, 0x7d, 0x28, 0x6e, 0x2c, + 0x72, 0x2c, 0x75, 0x2c, 0x69, 0x2c, 0x6f, 0x29, 0x2c, 0x61, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x75, + 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x6e, 0x3d, 0x74, 0x61, 0x2e, + 0x72, 0x67, 0x62, 0x28, 0x6e, 0x29, 0x2c, 0x74, 0x3d, 0x74, 0x61, + 0x2e, 0x72, 0x67, 0x62, 0x28, 0x74, 0x29, 0x3b, 0x76, 0x61, 0x72, + 0x20, 0x65, 0x3d, 0x6e, 0x2e, 0x72, 0x2c, 0x72, 0x3d, 0x6e, 0x2e, + 0x67, 0x2c, 0x75, 0x3d, 0x6e, 0x2e, 0x62, 0x2c, 0x69, 0x3d, 0x74, + 0x2e, 0x72, 0x2d, 0x65, 0x2c, 0x6f, 0x3d, 0x74, 0x2e, 0x67, 0x2d, + 0x72, 0x2c, 0x61, 0x3d, 0x74, 0x2e, 0x62, 0x2d, 0x75, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x22, 0x23, 0x22, 0x2b, 0x78, 0x74, 0x28, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x28, 0x65, 0x2b, + 0x69, 0x2a, 0x6e, 0x29, 0x29, 0x2b, 0x78, 0x74, 0x28, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x28, 0x72, 0x2b, + 0x6f, 0x2a, 0x6e, 0x29, 0x29, 0x2b, 0x78, 0x74, 0x28, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x28, 0x75, 0x2b, + 0x61, 0x2a, 0x6e, 0x29, 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x75, 0x28, 0x6e, 0x2c, 0x74, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x2c, 0x72, 0x3d, 0x7b, + 0x7d, 0x2c, 0x75, 0x3d, 0x7b, 0x7d, 0x3b, 0x66, 0x6f, 0x72, 0x28, + 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6e, 0x29, 0x65, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x3f, 0x72, 0x5b, 0x65, 0x5d, 0x3d, 0x6d, 0x75, 0x28, + 0x6e, 0x5b, 0x65, 0x5d, 0x2c, 0x74, 0x5b, 0x65, 0x5d, 0x29, 0x3a, + 0x75, 0x5b, 0x65, 0x5d, 0x3d, 0x6e, 0x5b, 0x65, 0x5d, 0x3b, 0x66, + 0x6f, 0x72, 0x28, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x29, 0x65, + 0x20, 0x69, 0x6e, 0x20, 0x6e, 0x7c, 0x7c, 0x28, 0x75, 0x5b, 0x65, + 0x5d, 0x3d, 0x74, 0x5b, 0x65, 0x5d, 0x29, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x65, 0x20, + 0x69, 0x6e, 0x20, 0x72, 0x29, 0x75, 0x5b, 0x65, 0x5d, 0x3d, 0x72, + 0x5b, 0x65, 0x5d, 0x28, 0x6e, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x75, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x76, 0x75, 0x28, 0x6e, 0x2c, 0x74, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x3d, 0x2b, + 0x6e, 0x2c, 0x74, 0x3d, 0x2b, 0x74, 0x2c, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2a, 0x28, 0x31, 0x2d, 0x65, 0x29, + 0x2b, 0x74, 0x2a, 0x65, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x75, 0x28, 0x6e, 0x2c, 0x74, 0x29, + 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x2c, 0x72, 0x2c, 0x75, 0x2c, + 0x69, 0x3d, 0x69, 0x6c, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x3d, 0x6f, 0x6c, 0x2e, 0x6c, 0x61, 0x73, 0x74, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x3d, 0x30, 0x2c, 0x6f, 0x3d, 0x2d, + 0x31, 0x2c, 0x61, 0x3d, 0x5b, 0x5d, 0x2c, 0x63, 0x3d, 0x5b, 0x5d, + 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x6e, 0x2b, 0x3d, 0x22, 0x22, 0x2c, + 0x74, 0x2b, 0x3d, 0x22, 0x22, 0x3b, 0x28, 0x65, 0x3d, 0x69, 0x6c, + 0x2e, 0x65, 0x78, 0x65, 0x63, 0x28, 0x6e, 0x29, 0x29, 0x26, 0x26, + 0x28, 0x72, 0x3d, 0x6f, 0x6c, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x28, + 0x74, 0x29, 0x29, 0x3b, 0x29, 0x28, 0x75, 0x3d, 0x72, 0x2e, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x29, 0x3e, 0x69, 0x26, 0x26, 0x28, 0x75, + 0x3d, 0x74, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x69, 0x2c, + 0x75, 0x29, 0x2c, 0x61, 0x5b, 0x6f, 0x5d, 0x3f, 0x61, 0x5b, 0x6f, + 0x5d, 0x2b, 0x3d, 0x75, 0x3a, 0x61, 0x5b, 0x2b, 0x2b, 0x6f, 0x5d, + 0x3d, 0x75, 0x29, 0x2c, 0x28, 0x65, 0x3d, 0x65, 0x5b, 0x30, 0x5d, + 0x29, 0x3d, 0x3d, 0x3d, 0x28, 0x72, 0x3d, 0x72, 0x5b, 0x30, 0x5d, + 0x29, 0x3f, 0x61, 0x5b, 0x6f, 0x5d, 0x3f, 0x61, 0x5b, 0x6f, 0x5d, + 0x2b, 0x3d, 0x72, 0x3a, 0x61, 0x5b, 0x2b, 0x2b, 0x6f, 0x5d, 0x3d, + 0x72, 0x3a, 0x28, 0x61, 0x5b, 0x2b, 0x2b, 0x6f, 0x5d, 0x3d, 0x6e, + 0x75, 0x6c, 0x6c, 0x2c, 0x63, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, + 0x7b, 0x69, 0x3a, 0x6f, 0x2c, 0x78, 0x3a, 0x76, 0x75, 0x28, 0x65, + 0x2c, 0x72, 0x29, 0x7d, 0x29, 0x29, 0x2c, 0x69, 0x3d, 0x6f, 0x6c, + 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x3c, 0x74, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x26, 0x26, 0x28, 0x75, 0x3d, + 0x74, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x69, 0x29, 0x2c, + 0x61, 0x5b, 0x6f, 0x5d, 0x3f, 0x61, 0x5b, 0x6f, 0x5d, 0x2b, 0x3d, + 0x75, 0x3a, 0x61, 0x5b, 0x2b, 0x2b, 0x6f, 0x5d, 0x3d, 0x75, 0x29, + 0x2c, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3c, 0x32, + 0x3f, 0x63, 0x5b, 0x30, 0x5d, 0x3f, 0x28, 0x74, 0x3d, 0x63, 0x5b, + 0x30, 0x5d, 0x2e, 0x78, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x28, 0x6e, 0x29, 0x2b, 0x22, 0x22, 0x7d, 0x29, + 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x7d, 0x3a, + 0x28, 0x74, 0x3d, 0x63, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x65, + 0x2c, 0x72, 0x3d, 0x30, 0x3b, 0x74, 0x3e, 0x72, 0x3b, 0x2b, 0x2b, + 0x72, 0x29, 0x61, 0x5b, 0x28, 0x65, 0x3d, 0x63, 0x5b, 0x72, 0x5d, + 0x29, 0x2e, 0x69, 0x5d, 0x3d, 0x65, 0x2e, 0x78, 0x28, 0x6e, 0x29, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x2e, 0x6a, + 0x6f, 0x69, 0x6e, 0x28, 0x22, 0x22, 0x29, 0x7d, 0x29, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x75, 0x28, + 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, + 0x72, 0x20, 0x65, 0x2c, 0x72, 0x3d, 0x74, 0x61, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x70, 0x6f, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x73, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x2d, 0x2d, 0x72, + 0x3e, 0x3d, 0x30, 0x26, 0x26, 0x21, 0x28, 0x65, 0x3d, 0x74, 0x61, + 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x6f, 0x6c, 0x61, 0x74, + 0x6f, 0x72, 0x73, 0x5b, 0x72, 0x5d, 0x28, 0x6e, 0x2c, 0x74, 0x29, + 0x29, 0x3b, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x65, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x79, 0x75, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x65, 0x2c, 0x72, 0x3d, 0x5b, 0x5d, 0x2c, 0x75, 0x3d, 0x5b, + 0x5d, 0x2c, 0x69, 0x3d, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x2c, 0x6f, 0x3d, 0x74, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x2c, 0x61, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x69, + 0x6e, 0x28, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, + 0x74, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x3b, 0x66, + 0x6f, 0x72, 0x28, 0x65, 0x3d, 0x30, 0x3b, 0x61, 0x3e, 0x65, 0x3b, + 0x2b, 0x2b, 0x65, 0x29, 0x72, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, + 0x6d, 0x75, 0x28, 0x6e, 0x5b, 0x65, 0x5d, 0x2c, 0x74, 0x5b, 0x65, + 0x5d, 0x29, 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x3b, 0x69, 0x3e, + 0x65, 0x3b, 0x2b, 0x2b, 0x65, 0x29, 0x75, 0x5b, 0x65, 0x5d, 0x3d, + 0x6e, 0x5b, 0x65, 0x5d, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x3b, 0x6f, + 0x3e, 0x65, 0x3b, 0x2b, 0x2b, 0x65, 0x29, 0x75, 0x5b, 0x65, 0x5d, + 0x3d, 0x74, 0x5b, 0x65, 0x5d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x65, 0x3d, 0x30, 0x3b, + 0x61, 0x3e, 0x65, 0x3b, 0x2b, 0x2b, 0x65, 0x29, 0x75, 0x5b, 0x65, + 0x5d, 0x3d, 0x72, 0x5b, 0x65, 0x5d, 0x28, 0x6e, 0x29, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x7d, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x75, 0x28, 0x6e, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x30, 0x3e, 0x3d, 0x74, 0x3f, + 0x30, 0x3a, 0x74, 0x3e, 0x3d, 0x31, 0x3f, 0x31, 0x3a, 0x6e, 0x28, + 0x74, 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x78, 0x75, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x31, 0x2d, 0x6e, 0x28, 0x31, 0x2d, 0x74, 0x29, 0x7d, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x75, + 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x2e, 0x35, 0x2a, 0x28, + 0x2e, 0x35, 0x3e, 0x74, 0x3f, 0x6e, 0x28, 0x32, 0x2a, 0x74, 0x29, + 0x3a, 0x32, 0x2d, 0x6e, 0x28, 0x32, 0x2d, 0x32, 0x2a, 0x74, 0x29, + 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x5f, 0x75, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x2a, 0x6e, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x75, 0x28, 0x6e, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2a, 0x6e, 0x2a, + 0x6e, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x53, 0x75, 0x28, 0x6e, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x30, 0x3e, + 0x3d, 0x6e, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x30, + 0x3b, 0x69, 0x66, 0x28, 0x6e, 0x3e, 0x3d, 0x31, 0x29, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x74, 0x3d, 0x6e, 0x2a, 0x6e, 0x2c, 0x65, 0x3d, 0x74, 0x2a, 0x6e, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x34, 0x2a, 0x28, + 0x2e, 0x35, 0x3e, 0x6e, 0x3f, 0x65, 0x3a, 0x33, 0x2a, 0x28, 0x6e, + 0x2d, 0x74, 0x29, 0x2b, 0x65, 0x2d, 0x2e, 0x37, 0x35, 0x29, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6b, 0x75, + 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x70, 0x6f, 0x77, 0x28, 0x74, 0x2c, 0x6e, 0x29, 0x7d, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x45, + 0x75, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x31, 0x2d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, 0x73, + 0x28, 0x6e, 0x2a, 0x52, 0x61, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x28, 0x6e, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x70, 0x6f, 0x77, 0x28, 0x32, 0x2c, 0x31, 0x30, 0x2a, 0x28, + 0x6e, 0x2d, 0x31, 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x4e, 0x75, 0x28, 0x6e, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x2d, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x73, 0x71, 0x72, 0x74, 0x28, 0x31, 0x2d, 0x6e, 0x2a, + 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x43, 0x75, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x65, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3c, 0x32, 0x26, 0x26, 0x28, 0x74, + 0x3d, 0x2e, 0x34, 0x35, 0x29, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3f, 0x65, 0x3d, 0x74, 0x2f, 0x4c, 0x61, 0x2a, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x61, 0x73, 0x69, 0x6e, 0x28, 0x31, 0x2f, 0x6e, 0x29, + 0x3a, 0x28, 0x6e, 0x3d, 0x31, 0x2c, 0x65, 0x3d, 0x74, 0x2f, 0x34, + 0x29, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x72, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, + 0x2b, 0x6e, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x70, 0x6f, 0x77, + 0x28, 0x32, 0x2c, 0x2d, 0x31, 0x30, 0x2a, 0x72, 0x29, 0x2a, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x28, 0x72, 0x2d, + 0x65, 0x29, 0x2a, 0x4c, 0x61, 0x2f, 0x74, 0x29, 0x7d, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x7a, 0x75, 0x28, + 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x7c, 0x7c, 0x28, 0x6e, 0x3d, 0x31, 0x2e, 0x37, 0x30, 0x31, 0x35, + 0x38, 0x29, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x2a, 0x74, 0x2a, 0x28, 0x28, 0x6e, 0x2b, 0x31, 0x29, 0x2a, + 0x74, 0x2d, 0x6e, 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x71, 0x75, 0x28, 0x6e, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x2f, 0x32, 0x2e, 0x37, + 0x35, 0x3e, 0x6e, 0x3f, 0x37, 0x2e, 0x35, 0x36, 0x32, 0x35, 0x2a, + 0x6e, 0x2a, 0x6e, 0x3a, 0x32, 0x2f, 0x32, 0x2e, 0x37, 0x35, 0x3e, + 0x6e, 0x3f, 0x37, 0x2e, 0x35, 0x36, 0x32, 0x35, 0x2a, 0x28, 0x6e, + 0x2d, 0x3d, 0x31, 0x2e, 0x35, 0x2f, 0x32, 0x2e, 0x37, 0x35, 0x29, + 0x2a, 0x6e, 0x2b, 0x2e, 0x37, 0x35, 0x3a, 0x32, 0x2e, 0x35, 0x2f, + 0x32, 0x2e, 0x37, 0x35, 0x3e, 0x6e, 0x3f, 0x37, 0x2e, 0x35, 0x36, + 0x32, 0x35, 0x2a, 0x28, 0x6e, 0x2d, 0x3d, 0x32, 0x2e, 0x32, 0x35, + 0x2f, 0x32, 0x2e, 0x37, 0x35, 0x29, 0x2a, 0x6e, 0x2b, 0x2e, 0x39, + 0x33, 0x37, 0x35, 0x3a, 0x37, 0x2e, 0x35, 0x36, 0x32, 0x35, 0x2a, + 0x28, 0x6e, 0x2d, 0x3d, 0x32, 0x2e, 0x36, 0x32, 0x35, 0x2f, 0x32, + 0x2e, 0x37, 0x35, 0x29, 0x2a, 0x6e, 0x2b, 0x2e, 0x39, 0x38, 0x34, + 0x33, 0x37, 0x35, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x4c, 0x75, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x6e, + 0x3d, 0x74, 0x61, 0x2e, 0x68, 0x63, 0x6c, 0x28, 0x6e, 0x29, 0x2c, + 0x74, 0x3d, 0x74, 0x61, 0x2e, 0x68, 0x63, 0x6c, 0x28, 0x74, 0x29, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x6e, 0x2e, 0x68, 0x2c, + 0x72, 0x3d, 0x6e, 0x2e, 0x63, 0x2c, 0x75, 0x3d, 0x6e, 0x2e, 0x6c, + 0x2c, 0x69, 0x3d, 0x74, 0x2e, 0x68, 0x2d, 0x65, 0x2c, 0x6f, 0x3d, + 0x74, 0x2e, 0x63, 0x2d, 0x72, 0x2c, 0x61, 0x3d, 0x74, 0x2e, 0x6c, + 0x2d, 0x75, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, + 0x73, 0x4e, 0x61, 0x4e, 0x28, 0x6f, 0x29, 0x26, 0x26, 0x28, 0x6f, + 0x3d, 0x30, 0x2c, 0x72, 0x3d, 0x69, 0x73, 0x4e, 0x61, 0x4e, 0x28, + 0x72, 0x29, 0x3f, 0x74, 0x2e, 0x63, 0x3a, 0x72, 0x29, 0x2c, 0x69, + 0x73, 0x4e, 0x61, 0x4e, 0x28, 0x69, 0x29, 0x3f, 0x28, 0x69, 0x3d, + 0x30, 0x2c, 0x65, 0x3d, 0x69, 0x73, 0x4e, 0x61, 0x4e, 0x28, 0x65, + 0x29, 0x3f, 0x74, 0x2e, 0x68, 0x3a, 0x65, 0x29, 0x3a, 0x69, 0x3e, + 0x31, 0x38, 0x30, 0x3f, 0x69, 0x2d, 0x3d, 0x33, 0x36, 0x30, 0x3a, + 0x2d, 0x31, 0x38, 0x30, 0x3e, 0x69, 0x26, 0x26, 0x28, 0x69, 0x2b, + 0x3d, 0x33, 0x36, 0x30, 0x29, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x73, 0x74, 0x28, 0x65, 0x2b, 0x69, 0x2a, 0x6e, + 0x2c, 0x72, 0x2b, 0x6f, 0x2a, 0x6e, 0x2c, 0x75, 0x2b, 0x61, 0x2a, + 0x6e, 0x29, 0x2b, 0x22, 0x22, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x54, 0x75, 0x28, 0x6e, 0x2c, 0x74, + 0x29, 0x7b, 0x6e, 0x3d, 0x74, 0x61, 0x2e, 0x68, 0x73, 0x6c, 0x28, + 0x6e, 0x29, 0x2c, 0x74, 0x3d, 0x74, 0x61, 0x2e, 0x68, 0x73, 0x6c, + 0x28, 0x74, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x6e, + 0x2e, 0x68, 0x2c, 0x72, 0x3d, 0x6e, 0x2e, 0x73, 0x2c, 0x75, 0x3d, + 0x6e, 0x2e, 0x6c, 0x2c, 0x69, 0x3d, 0x74, 0x2e, 0x68, 0x2d, 0x65, + 0x2c, 0x6f, 0x3d, 0x74, 0x2e, 0x73, 0x2d, 0x72, 0x2c, 0x61, 0x3d, + 0x74, 0x2e, 0x6c, 0x2d, 0x75, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x69, 0x73, 0x4e, 0x61, 0x4e, 0x28, 0x6f, 0x29, 0x26, + 0x26, 0x28, 0x6f, 0x3d, 0x30, 0x2c, 0x72, 0x3d, 0x69, 0x73, 0x4e, + 0x61, 0x4e, 0x28, 0x72, 0x29, 0x3f, 0x74, 0x2e, 0x73, 0x3a, 0x72, + 0x29, 0x2c, 0x69, 0x73, 0x4e, 0x61, 0x4e, 0x28, 0x69, 0x29, 0x3f, + 0x28, 0x69, 0x3d, 0x30, 0x2c, 0x65, 0x3d, 0x69, 0x73, 0x4e, 0x61, + 0x4e, 0x28, 0x65, 0x29, 0x3f, 0x74, 0x2e, 0x68, 0x3a, 0x65, 0x29, + 0x3a, 0x69, 0x3e, 0x31, 0x38, 0x30, 0x3f, 0x69, 0x2d, 0x3d, 0x33, + 0x36, 0x30, 0x3a, 0x2d, 0x31, 0x38, 0x30, 0x3e, 0x69, 0x26, 0x26, + 0x28, 0x69, 0x2b, 0x3d, 0x33, 0x36, 0x30, 0x29, 0x2c, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x74, 0x28, 0x65, 0x2b, + 0x69, 0x2a, 0x6e, 0x2c, 0x72, 0x2b, 0x6f, 0x2a, 0x6e, 0x2c, 0x75, + 0x2b, 0x61, 0x2a, 0x6e, 0x29, 0x2b, 0x22, 0x22, 0x7d, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x52, 0x75, 0x28, + 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x6e, 0x3d, 0x74, 0x61, 0x2e, 0x6c, + 0x61, 0x62, 0x28, 0x6e, 0x29, 0x2c, 0x74, 0x3d, 0x74, 0x61, 0x2e, + 0x6c, 0x61, 0x62, 0x28, 0x74, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x65, 0x3d, 0x6e, 0x2e, 0x6c, 0x2c, 0x72, 0x3d, 0x6e, 0x2e, 0x61, + 0x2c, 0x75, 0x3d, 0x6e, 0x2e, 0x62, 0x2c, 0x69, 0x3d, 0x74, 0x2e, + 0x6c, 0x2d, 0x65, 0x2c, 0x6f, 0x3d, 0x74, 0x2e, 0x61, 0x2d, 0x72, + 0x2c, 0x61, 0x3d, 0x74, 0x2e, 0x62, 0x2d, 0x75, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x68, 0x74, 0x28, 0x65, 0x2b, 0x69, 0x2a, 0x6e, 0x2c, + 0x72, 0x2b, 0x6f, 0x2a, 0x6e, 0x2c, 0x75, 0x2b, 0x61, 0x2a, 0x6e, + 0x29, 0x2b, 0x22, 0x22, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x44, 0x75, 0x28, 0x6e, 0x2c, 0x74, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2d, 0x3d, + 0x6e, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x28, 0x6e, + 0x2b, 0x74, 0x2a, 0x65, 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x50, 0x75, 0x28, 0x6e, 0x29, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x5b, 0x6e, 0x2e, 0x61, 0x2c, + 0x6e, 0x2e, 0x62, 0x5d, 0x2c, 0x65, 0x3d, 0x5b, 0x6e, 0x2e, 0x63, + 0x2c, 0x6e, 0x2e, 0x64, 0x5d, 0x2c, 0x72, 0x3d, 0x6a, 0x75, 0x28, + 0x74, 0x29, 0x2c, 0x75, 0x3d, 0x55, 0x75, 0x28, 0x74, 0x2c, 0x65, + 0x29, 0x2c, 0x69, 0x3d, 0x6a, 0x75, 0x28, 0x46, 0x75, 0x28, 0x65, + 0x2c, 0x74, 0x2c, 0x2d, 0x75, 0x29, 0x29, 0x7c, 0x7c, 0x30, 0x3b, + 0x74, 0x5b, 0x30, 0x5d, 0x2a, 0x65, 0x5b, 0x31, 0x5d, 0x3c, 0x65, + 0x5b, 0x30, 0x5d, 0x2a, 0x74, 0x5b, 0x31, 0x5d, 0x26, 0x26, 0x28, + 0x74, 0x5b, 0x30, 0x5d, 0x2a, 0x3d, 0x2d, 0x31, 0x2c, 0x74, 0x5b, + 0x31, 0x5d, 0x2a, 0x3d, 0x2d, 0x31, 0x2c, 0x72, 0x2a, 0x3d, 0x2d, + 0x31, 0x2c, 0x75, 0x2a, 0x3d, 0x2d, 0x31, 0x29, 0x2c, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x3d, 0x28, + 0x72, 0x3f, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x61, 0x74, 0x61, 0x6e, + 0x32, 0x28, 0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x74, 0x5b, 0x30, 0x5d, + 0x29, 0x3a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x61, 0x74, 0x61, 0x6e, + 0x32, 0x28, 0x2d, 0x65, 0x5b, 0x30, 0x5d, 0x2c, 0x65, 0x5b, 0x31, + 0x5d, 0x29, 0x29, 0x2a, 0x50, 0x61, 0x2c, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, 0x3d, + 0x5b, 0x6e, 0x2e, 0x65, 0x2c, 0x6e, 0x2e, 0x66, 0x5d, 0x2c, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x3d, 0x5b, + 0x72, 0x2c, 0x69, 0x5d, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, + 0x6b, 0x65, 0x77, 0x3d, 0x69, 0x3f, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x61, 0x74, 0x61, 0x6e, 0x32, 0x28, 0x75, 0x2c, 0x69, 0x29, 0x2a, + 0x50, 0x61, 0x3a, 0x30, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x55, 0x75, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x5b, 0x30, 0x5d, + 0x2a, 0x74, 0x5b, 0x30, 0x5d, 0x2b, 0x6e, 0x5b, 0x31, 0x5d, 0x2a, + 0x74, 0x5b, 0x31, 0x5d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6a, 0x75, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x74, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x71, + 0x72, 0x74, 0x28, 0x55, 0x75, 0x28, 0x6e, 0x2c, 0x6e, 0x29, 0x29, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x26, 0x26, + 0x28, 0x6e, 0x5b, 0x30, 0x5d, 0x2f, 0x3d, 0x74, 0x2c, 0x6e, 0x5b, + 0x31, 0x5d, 0x2f, 0x3d, 0x74, 0x29, 0x2c, 0x74, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x46, 0x75, 0x28, 0x6e, + 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x5b, 0x30, 0x5d, 0x2b, 0x3d, 0x65, 0x2a, 0x74, + 0x5b, 0x30, 0x5d, 0x2c, 0x6e, 0x5b, 0x31, 0x5d, 0x2b, 0x3d, 0x65, + 0x2a, 0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x6e, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x48, 0x75, 0x28, 0x6e, 0x2c, + 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x2c, 0x72, 0x3d, + 0x5b, 0x5d, 0x2c, 0x75, 0x3d, 0x5b, 0x5d, 0x2c, 0x69, 0x3d, 0x74, + 0x61, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x28, 0x6e, 0x29, 0x2c, 0x6f, 0x3d, 0x74, 0x61, 0x2e, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x74, 0x29, 0x2c, + 0x61, 0x3d, 0x69, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, + 0x74, 0x65, 0x2c, 0x63, 0x3d, 0x6f, 0x2e, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x6c, 0x3d, 0x69, 0x2e, 0x72, + 0x6f, 0x74, 0x61, 0x74, 0x65, 0x2c, 0x73, 0x3d, 0x6f, 0x2e, 0x72, + 0x6f, 0x74, 0x61, 0x74, 0x65, 0x2c, 0x66, 0x3d, 0x69, 0x2e, 0x73, + 0x6b, 0x65, 0x77, 0x2c, 0x68, 0x3d, 0x6f, 0x2e, 0x73, 0x6b, 0x65, + 0x77, 0x2c, 0x67, 0x3d, 0x69, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, + 0x2c, 0x70, 0x3d, 0x6f, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x5b, 0x30, 0x5d, + 0x21, 0x3d, 0x63, 0x5b, 0x30, 0x5d, 0x7c, 0x7c, 0x61, 0x5b, 0x31, + 0x5d, 0x21, 0x3d, 0x63, 0x5b, 0x31, 0x5d, 0x3f, 0x28, 0x72, 0x2e, + 0x70, 0x75, 0x73, 0x68, 0x28, 0x22, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x6c, 0x61, 0x74, 0x65, 0x28, 0x22, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, + 0x2c, 0x22, 0x2c, 0x22, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x22, + 0x29, 0x22, 0x29, 0x2c, 0x75, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, + 0x7b, 0x69, 0x3a, 0x31, 0x2c, 0x78, 0x3a, 0x76, 0x75, 0x28, 0x61, + 0x5b, 0x30, 0x5d, 0x2c, 0x63, 0x5b, 0x30, 0x5d, 0x29, 0x7d, 0x2c, + 0x7b, 0x69, 0x3a, 0x33, 0x2c, 0x78, 0x3a, 0x76, 0x75, 0x28, 0x61, + 0x5b, 0x31, 0x5d, 0x2c, 0x63, 0x5b, 0x31, 0x5d, 0x29, 0x7d, 0x29, + 0x29, 0x3a, 0x72, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x63, 0x5b, + 0x30, 0x5d, 0x7c, 0x7c, 0x63, 0x5b, 0x31, 0x5d, 0x3f, 0x22, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, 0x28, 0x22, 0x2b, + 0x63, 0x2b, 0x22, 0x29, 0x22, 0x3a, 0x22, 0x22, 0x29, 0x2c, 0x6c, + 0x21, 0x3d, 0x73, 0x3f, 0x28, 0x6c, 0x2d, 0x73, 0x3e, 0x31, 0x38, + 0x30, 0x3f, 0x73, 0x2b, 0x3d, 0x33, 0x36, 0x30, 0x3a, 0x73, 0x2d, + 0x6c, 0x3e, 0x31, 0x38, 0x30, 0x26, 0x26, 0x28, 0x6c, 0x2b, 0x3d, + 0x33, 0x36, 0x30, 0x29, 0x2c, 0x75, 0x2e, 0x70, 0x75, 0x73, 0x68, + 0x28, 0x7b, 0x69, 0x3a, 0x72, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, + 0x72, 0x2e, 0x70, 0x6f, 0x70, 0x28, 0x29, 0x2b, 0x22, 0x72, 0x6f, + 0x74, 0x61, 0x74, 0x65, 0x28, 0x22, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, + 0x2c, 0x22, 0x29, 0x22, 0x29, 0x2d, 0x32, 0x2c, 0x78, 0x3a, 0x76, + 0x75, 0x28, 0x6c, 0x2c, 0x73, 0x29, 0x7d, 0x29, 0x29, 0x3a, 0x73, + 0x26, 0x26, 0x72, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x72, 0x2e, + 0x70, 0x6f, 0x70, 0x28, 0x29, 0x2b, 0x22, 0x72, 0x6f, 0x74, 0x61, + 0x74, 0x65, 0x28, 0x22, 0x2b, 0x73, 0x2b, 0x22, 0x29, 0x22, 0x29, + 0x2c, 0x66, 0x21, 0x3d, 0x68, 0x3f, 0x75, 0x2e, 0x70, 0x75, 0x73, + 0x68, 0x28, 0x7b, 0x69, 0x3a, 0x72, 0x2e, 0x70, 0x75, 0x73, 0x68, + 0x28, 0x72, 0x2e, 0x70, 0x6f, 0x70, 0x28, 0x29, 0x2b, 0x22, 0x73, + 0x6b, 0x65, 0x77, 0x58, 0x28, 0x22, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, + 0x2c, 0x22, 0x29, 0x22, 0x29, 0x2d, 0x32, 0x2c, 0x78, 0x3a, 0x76, + 0x75, 0x28, 0x66, 0x2c, 0x68, 0x29, 0x7d, 0x29, 0x3a, 0x68, 0x26, + 0x26, 0x72, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x72, 0x2e, 0x70, + 0x6f, 0x70, 0x28, 0x29, 0x2b, 0x22, 0x73, 0x6b, 0x65, 0x77, 0x58, + 0x28, 0x22, 0x2b, 0x68, 0x2b, 0x22, 0x29, 0x22, 0x29, 0x2c, 0x67, + 0x5b, 0x30, 0x5d, 0x21, 0x3d, 0x70, 0x5b, 0x30, 0x5d, 0x7c, 0x7c, + 0x67, 0x5b, 0x31, 0x5d, 0x21, 0x3d, 0x70, 0x5b, 0x31, 0x5d, 0x3f, + 0x28, 0x65, 0x3d, 0x72, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x72, + 0x2e, 0x70, 0x6f, 0x70, 0x28, 0x29, 0x2b, 0x22, 0x73, 0x63, 0x61, + 0x6c, 0x65, 0x28, 0x22, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x22, + 0x2c, 0x22, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x22, 0x29, 0x22, + 0x29, 0x2c, 0x75, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x7b, 0x69, + 0x3a, 0x65, 0x2d, 0x34, 0x2c, 0x78, 0x3a, 0x76, 0x75, 0x28, 0x67, + 0x5b, 0x30, 0x5d, 0x2c, 0x70, 0x5b, 0x30, 0x5d, 0x29, 0x7d, 0x2c, + 0x7b, 0x69, 0x3a, 0x65, 0x2d, 0x32, 0x2c, 0x78, 0x3a, 0x76, 0x75, + 0x28, 0x67, 0x5b, 0x31, 0x5d, 0x2c, 0x70, 0x5b, 0x31, 0x5d, 0x29, + 0x7d, 0x29, 0x29, 0x3a, 0x28, 0x31, 0x21, 0x3d, 0x70, 0x5b, 0x30, + 0x5d, 0x7c, 0x7c, 0x31, 0x21, 0x3d, 0x70, 0x5b, 0x31, 0x5d, 0x29, + 0x26, 0x26, 0x72, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x72, 0x2e, + 0x70, 0x6f, 0x70, 0x28, 0x29, 0x2b, 0x22, 0x73, 0x63, 0x61, 0x6c, + 0x65, 0x28, 0x22, 0x2b, 0x70, 0x2b, 0x22, 0x29, 0x22, 0x29, 0x2c, + 0x65, 0x3d, 0x75, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, + 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x2c, + 0x69, 0x3d, 0x2d, 0x31, 0x3b, 0x2b, 0x2b, 0x69, 0x3c, 0x65, 0x3b, + 0x29, 0x72, 0x5b, 0x28, 0x74, 0x3d, 0x75, 0x5b, 0x69, 0x5d, 0x29, + 0x2e, 0x69, 0x5d, 0x3d, 0x74, 0x2e, 0x78, 0x28, 0x6e, 0x29, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x2e, 0x6a, 0x6f, + 0x69, 0x6e, 0x28, 0x22, 0x22, 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4f, 0x75, 0x28, 0x6e, 0x2c, + 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x3d, 0x28, 0x74, 0x2d, 0x3d, 0x6e, 0x3d, 0x2b, 0x6e, 0x29, 0x7c, + 0x7c, 0x31, 0x2f, 0x74, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x28, 0x65, 0x2d, 0x6e, 0x29, 0x2f, 0x74, 0x7d, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x75, 0x28, + 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x3d, 0x28, 0x74, 0x2d, 0x3d, 0x6e, 0x3d, 0x2b, 0x6e, + 0x29, 0x7c, 0x7c, 0x31, 0x2f, 0x74, 0x2c, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, + 0x78, 0x28, 0x30, 0x2c, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x69, + 0x6e, 0x28, 0x31, 0x2c, 0x28, 0x65, 0x2d, 0x6e, 0x29, 0x2f, 0x74, + 0x29, 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x59, 0x75, 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x6f, 0x72, + 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x6e, 0x2e, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x2c, 0x65, 0x3d, 0x6e, 0x2e, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x2c, 0x72, 0x3d, 0x56, 0x75, 0x28, 0x74, + 0x2c, 0x65, 0x29, 0x2c, 0x75, 0x3d, 0x5b, 0x74, 0x5d, 0x3b, 0x74, + 0x21, 0x3d, 0x3d, 0x72, 0x3b, 0x29, 0x74, 0x3d, 0x74, 0x2e, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x75, 0x2e, 0x70, 0x75, 0x73, + 0x68, 0x28, 0x74, 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, + 0x72, 0x20, 0x69, 0x3d, 0x75, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3b, 0x65, 0x21, 0x3d, 0x3d, 0x72, 0x3b, 0x29, 0x75, 0x2e, + 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x69, 0x2c, 0x30, 0x2c, + 0x65, 0x29, 0x2c, 0x65, 0x3d, 0x65, 0x2e, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5a, + 0x75, 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, + 0x72, 0x20, 0x74, 0x3d, 0x5b, 0x5d, 0x2c, 0x65, 0x3d, 0x6e, 0x2e, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3b, 0x6e, 0x75, 0x6c, 0x6c, + 0x21, 0x3d, 0x65, 0x3b, 0x29, 0x74, 0x2e, 0x70, 0x75, 0x73, 0x68, + 0x28, 0x6e, 0x29, 0x2c, 0x6e, 0x3d, 0x65, 0x2c, 0x65, 0x3d, 0x65, + 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, + 0x6e, 0x29, 0x2c, 0x74, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x56, 0x75, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, + 0x69, 0x66, 0x28, 0x6e, 0x3d, 0x3d, 0x3d, 0x74, 0x29, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x3b, 0x66, 0x6f, 0x72, 0x28, + 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x5a, 0x75, 0x28, 0x6e, 0x29, + 0x2c, 0x72, 0x3d, 0x5a, 0x75, 0x28, 0x74, 0x29, 0x2c, 0x75, 0x3d, + 0x65, 0x2e, 0x70, 0x6f, 0x70, 0x28, 0x29, 0x2c, 0x69, 0x3d, 0x72, + 0x2e, 0x70, 0x6f, 0x70, 0x28, 0x29, 0x2c, 0x6f, 0x3d, 0x6e, 0x75, + 0x6c, 0x6c, 0x3b, 0x75, 0x3d, 0x3d, 0x3d, 0x69, 0x3b, 0x29, 0x6f, + 0x3d, 0x75, 0x2c, 0x75, 0x3d, 0x65, 0x2e, 0x70, 0x6f, 0x70, 0x28, + 0x29, 0x2c, 0x69, 0x3d, 0x72, 0x2e, 0x70, 0x6f, 0x70, 0x28, 0x29, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x58, 0x75, 0x28, + 0x6e, 0x29, 0x7b, 0x6e, 0x2e, 0x66, 0x69, 0x78, 0x65, 0x64, 0x7c, + 0x3d, 0x32, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x24, 0x75, 0x28, 0x6e, 0x29, 0x7b, 0x6e, 0x2e, 0x66, 0x69, + 0x78, 0x65, 0x64, 0x26, 0x3d, 0x2d, 0x37, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x42, 0x75, 0x28, 0x6e, 0x29, + 0x7b, 0x6e, 0x2e, 0x66, 0x69, 0x78, 0x65, 0x64, 0x7c, 0x3d, 0x34, + 0x2c, 0x6e, 0x2e, 0x70, 0x78, 0x3d, 0x6e, 0x2e, 0x78, 0x2c, 0x6e, + 0x2e, 0x70, 0x79, 0x3d, 0x6e, 0x2e, 0x79, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x57, 0x75, 0x28, 0x6e, 0x29, + 0x7b, 0x6e, 0x2e, 0x66, 0x69, 0x78, 0x65, 0x64, 0x26, 0x3d, 0x2d, + 0x35, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x4a, 0x75, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x72, 0x3d, 0x30, 0x2c, 0x75, 0x3d, 0x30, 0x3b, + 0x69, 0x66, 0x28, 0x6e, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, + 0x3d, 0x30, 0x2c, 0x21, 0x6e, 0x2e, 0x6c, 0x65, 0x61, 0x66, 0x29, + 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x69, 0x2c, 0x6f, + 0x3d, 0x6e, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x2c, 0x61, 0x3d, + 0x6f, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x63, 0x3d, + 0x2d, 0x31, 0x3b, 0x2b, 0x2b, 0x63, 0x3c, 0x61, 0x3b, 0x29, 0x69, + 0x3d, 0x6f, 0x5b, 0x63, 0x5d, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x21, + 0x3d, 0x69, 0x26, 0x26, 0x28, 0x4a, 0x75, 0x28, 0x69, 0x2c, 0x74, + 0x2c, 0x65, 0x29, 0x2c, 0x6e, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x67, + 0x65, 0x2b, 0x3d, 0x69, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, + 0x2c, 0x72, 0x2b, 0x3d, 0x69, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x67, + 0x65, 0x2a, 0x69, 0x2e, 0x63, 0x78, 0x2c, 0x75, 0x2b, 0x3d, 0x69, + 0x2e, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x2a, 0x69, 0x2e, 0x63, + 0x79, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x6e, 0x2e, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x29, 0x7b, 0x6e, 0x2e, 0x6c, 0x65, 0x61, 0x66, 0x7c, + 0x7c, 0x28, 0x6e, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x78, + 0x2b, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x61, 0x6e, 0x64, + 0x6f, 0x6d, 0x28, 0x29, 0x2d, 0x2e, 0x35, 0x2c, 0x6e, 0x2e, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x79, 0x2b, 0x3d, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x28, 0x29, 0x2d, + 0x2e, 0x35, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x6c, 0x3d, 0x74, + 0x2a, 0x65, 0x5b, 0x6e, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x3b, 0x6e, 0x2e, 0x63, 0x68, + 0x61, 0x72, 0x67, 0x65, 0x2b, 0x3d, 0x6e, 0x2e, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x3d, 0x6c, 0x2c, + 0x72, 0x2b, 0x3d, 0x6c, 0x2a, 0x6e, 0x2e, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x2e, 0x78, 0x2c, 0x75, 0x2b, 0x3d, 0x6c, 0x2a, 0x6e, 0x2e, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x79, 0x7d, 0x6e, 0x2e, 0x63, + 0x78, 0x3d, 0x72, 0x2f, 0x6e, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x67, + 0x65, 0x2c, 0x6e, 0x2e, 0x63, 0x79, 0x3d, 0x75, 0x2f, 0x6e, 0x2e, + 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x47, 0x75, 0x28, 0x6e, 0x2c, 0x74, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, + 0x2e, 0x72, 0x65, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x6e, 0x2c, 0x74, + 0x2c, 0x22, 0x73, 0x6f, 0x72, 0x74, 0x22, 0x2c, 0x22, 0x63, 0x68, + 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x2c, 0x22, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0x29, 0x2c, 0x6e, 0x2e, 0x6e, 0x6f, 0x64, + 0x65, 0x73, 0x3d, 0x6e, 0x2c, 0x6e, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, + 0x73, 0x3d, 0x72, 0x69, 0x2c, 0x6e, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4b, 0x75, 0x28, 0x6e, 0x2c, 0x74, + 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x65, + 0x3d, 0x5b, 0x6e, 0x5d, 0x3b, 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, + 0x28, 0x6e, 0x3d, 0x65, 0x2e, 0x70, 0x6f, 0x70, 0x28, 0x29, 0x29, + 0x3b, 0x29, 0x69, 0x66, 0x28, 0x74, 0x28, 0x6e, 0x29, 0x2c, 0x28, + 0x75, 0x3d, 0x6e, 0x2e, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, + 0x6e, 0x29, 0x26, 0x26, 0x28, 0x72, 0x3d, 0x75, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x29, 0x29, 0x66, 0x6f, 0x72, 0x28, 0x76, + 0x61, 0x72, 0x20, 0x72, 0x2c, 0x75, 0x3b, 0x2d, 0x2d, 0x72, 0x3e, + 0x3d, 0x30, 0x3b, 0x29, 0x65, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, + 0x75, 0x5b, 0x72, 0x5d, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x51, 0x75, 0x28, 0x6e, 0x2c, 0x74, 0x29, + 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, + 0x5b, 0x6e, 0x5d, 0x2c, 0x72, 0x3d, 0x5b, 0x5d, 0x3b, 0x6e, 0x75, + 0x6c, 0x6c, 0x21, 0x3d, 0x28, 0x6e, 0x3d, 0x65, 0x2e, 0x70, 0x6f, + 0x70, 0x28, 0x29, 0x29, 0x3b, 0x29, 0x69, 0x66, 0x28, 0x72, 0x2e, + 0x70, 0x75, 0x73, 0x68, 0x28, 0x6e, 0x29, 0x2c, 0x28, 0x69, 0x3d, + 0x6e, 0x2e, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x29, + 0x26, 0x26, 0x28, 0x75, 0x3d, 0x69, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x29, 0x29, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, + 0x20, 0x75, 0x2c, 0x69, 0x2c, 0x6f, 0x3d, 0x2d, 0x31, 0x3b, 0x2b, + 0x2b, 0x6f, 0x3c, 0x75, 0x3b, 0x29, 0x65, 0x2e, 0x70, 0x75, 0x73, + 0x68, 0x28, 0x69, 0x5b, 0x6f, 0x5d, 0x29, 0x3b, 0x66, 0x6f, 0x72, + 0x28, 0x3b, 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, 0x28, 0x6e, 0x3d, + 0x72, 0x2e, 0x70, 0x6f, 0x70, 0x28, 0x29, 0x29, 0x3b, 0x29, 0x74, + 0x28, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6e, 0x69, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x63, 0x68, 0x69, 0x6c, 0x64, + 0x72, 0x65, 0x6e, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x74, 0x69, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, + 0x69, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x74, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2d, + 0x6e, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x69, 0x28, 0x6e, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x2e, + 0x6d, 0x65, 0x72, 0x67, 0x65, 0x28, 0x6e, 0x2e, 0x6d, 0x61, 0x70, + 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x6e, 0x2e, + 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x7c, 0x7c, 0x5b, + 0x5d, 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x7b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3a, + 0x6e, 0x2c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3a, 0x74, 0x7d, + 0x7d, 0x29, 0x7d, 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x69, 0x28, 0x6e, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x78, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x69, 0x28, + 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x2e, 0x79, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6f, 0x69, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, + 0x6e, 0x2e, 0x79, 0x30, 0x3d, 0x74, 0x2c, 0x6e, 0x2e, 0x79, 0x3d, + 0x65, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x61, 0x69, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x61, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x28, + 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x69, 0x28, + 0x6e, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, + 0x74, 0x3d, 0x2d, 0x31, 0x2c, 0x65, 0x3d, 0x6e, 0x5b, 0x30, 0x5d, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x72, 0x3d, 0x5b, + 0x5d, 0x3b, 0x2b, 0x2b, 0x74, 0x3c, 0x65, 0x3b, 0x29, 0x72, 0x5b, + 0x74, 0x5d, 0x3d, 0x30, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x72, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6c, 0x69, 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, + 0x76, 0x61, 0x72, 0x20, 0x74, 0x2c, 0x65, 0x3d, 0x31, 0x2c, 0x72, + 0x3d, 0x30, 0x2c, 0x75, 0x3d, 0x6e, 0x5b, 0x30, 0x5d, 0x5b, 0x31, + 0x5d, 0x2c, 0x69, 0x3d, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3b, 0x69, 0x3e, 0x65, 0x3b, 0x2b, 0x2b, 0x65, 0x29, 0x28, + 0x74, 0x3d, 0x6e, 0x5b, 0x65, 0x5d, 0x5b, 0x31, 0x5d, 0x29, 0x3e, + 0x75, 0x26, 0x26, 0x28, 0x72, 0x3d, 0x65, 0x2c, 0x75, 0x3d, 0x74, + 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x69, + 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x2e, 0x72, 0x65, 0x64, 0x75, 0x63, 0x65, 0x28, 0x66, 0x69, + 0x2c, 0x30, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x66, 0x69, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2b, 0x74, 0x5b, 0x31, + 0x5d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x68, 0x69, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x67, 0x69, 0x28, 0x6e, 0x2c, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x63, 0x65, 0x69, 0x6c, 0x28, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x74, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x29, 0x2f, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x4c, + 0x4e, 0x32, 0x2b, 0x31, 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x69, 0x28, 0x6e, 0x2c, 0x74, + 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x65, + 0x3d, 0x2d, 0x31, 0x2c, 0x72, 0x3d, 0x2b, 0x6e, 0x5b, 0x30, 0x5d, + 0x2c, 0x75, 0x3d, 0x28, 0x6e, 0x5b, 0x31, 0x5d, 0x2d, 0x72, 0x29, + 0x2f, 0x74, 0x2c, 0x69, 0x3d, 0x5b, 0x5d, 0x3b, 0x2b, 0x2b, 0x65, + 0x3c, 0x3d, 0x74, 0x3b, 0x29, 0x69, 0x5b, 0x65, 0x5d, 0x3d, 0x75, + 0x2a, 0x65, 0x2b, 0x72, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x69, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x70, 0x69, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x5b, 0x74, 0x61, 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x6e, + 0x29, 0x2c, 0x74, 0x61, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x6e, 0x29, + 0x5d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x76, 0x69, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x2d, 0x74, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x69, 0x28, 0x6e, + 0x2c, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x6e, + 0x2e, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x6e, 0x65, 0x78, 0x74, + 0x3b, 0x6e, 0x2e, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x6e, 0x65, + 0x78, 0x74, 0x3d, 0x74, 0x2c, 0x74, 0x2e, 0x5f, 0x70, 0x61, 0x63, + 0x6b, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x3d, 0x6e, 0x2c, 0x74, 0x2e, + 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x3d, + 0x65, 0x2c, 0x65, 0x2e, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x70, + 0x72, 0x65, 0x76, 0x3d, 0x74, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x69, 0x28, 0x6e, 0x2c, 0x74, 0x29, + 0x7b, 0x6e, 0x2e, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x6e, 0x65, + 0x78, 0x74, 0x3d, 0x74, 0x2c, 0x74, 0x2e, 0x5f, 0x70, 0x61, 0x63, + 0x6b, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x3d, 0x6e, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x79, 0x69, 0x28, 0x6e, + 0x2c, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x74, + 0x2e, 0x78, 0x2d, 0x6e, 0x2e, 0x78, 0x2c, 0x72, 0x3d, 0x74, 0x2e, + 0x79, 0x2d, 0x6e, 0x2e, 0x79, 0x2c, 0x75, 0x3d, 0x6e, 0x2e, 0x72, + 0x2b, 0x74, 0x2e, 0x72, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x2e, 0x39, 0x39, 0x39, 0x2a, 0x75, 0x2a, 0x75, 0x3e, 0x65, 0x2a, + 0x65, 0x2b, 0x72, 0x2a, 0x72, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x69, 0x28, 0x6e, 0x29, 0x7b, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x28, 0x6e, + 0x29, 0x7b, 0x73, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x69, + 0x6e, 0x28, 0x6e, 0x2e, 0x78, 0x2d, 0x6e, 0x2e, 0x72, 0x2c, 0x73, + 0x29, 0x2c, 0x66, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, + 0x78, 0x28, 0x6e, 0x2e, 0x78, 0x2b, 0x6e, 0x2e, 0x72, 0x2c, 0x66, + 0x29, 0x2c, 0x68, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x69, + 0x6e, 0x28, 0x6e, 0x2e, 0x79, 0x2d, 0x6e, 0x2e, 0x72, 0x2c, 0x68, + 0x29, 0x2c, 0x67, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, + 0x78, 0x28, 0x6e, 0x2e, 0x79, 0x2b, 0x6e, 0x2e, 0x72, 0x2c, 0x67, + 0x29, 0x7d, 0x69, 0x66, 0x28, 0x28, 0x65, 0x3d, 0x6e, 0x2e, 0x63, + 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x29, 0x26, 0x26, 0x28, + 0x6c, 0x3d, 0x65, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x2c, 0x72, 0x2c, 0x75, + 0x2c, 0x69, 0x2c, 0x6f, 0x2c, 0x61, 0x2c, 0x63, 0x2c, 0x6c, 0x2c, + 0x73, 0x3d, 0x31, 0x2f, 0x30, 0x2c, 0x66, 0x3d, 0x2d, 0x31, 0x2f, + 0x30, 0x2c, 0x68, 0x3d, 0x31, 0x2f, 0x30, 0x2c, 0x67, 0x3d, 0x2d, + 0x31, 0x2f, 0x30, 0x3b, 0x69, 0x66, 0x28, 0x65, 0x2e, 0x66, 0x6f, + 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x78, 0x69, 0x29, 0x2c, 0x72, + 0x3d, 0x65, 0x5b, 0x30, 0x5d, 0x2c, 0x72, 0x2e, 0x78, 0x3d, 0x2d, + 0x72, 0x2e, 0x72, 0x2c, 0x72, 0x2e, 0x79, 0x3d, 0x30, 0x2c, 0x74, + 0x28, 0x72, 0x29, 0x2c, 0x6c, 0x3e, 0x31, 0x26, 0x26, 0x28, 0x75, + 0x3d, 0x65, 0x5b, 0x31, 0x5d, 0x2c, 0x75, 0x2e, 0x78, 0x3d, 0x75, + 0x2e, 0x72, 0x2c, 0x75, 0x2e, 0x79, 0x3d, 0x30, 0x2c, 0x74, 0x28, + 0x75, 0x29, 0x2c, 0x6c, 0x3e, 0x32, 0x29, 0x29, 0x66, 0x6f, 0x72, + 0x28, 0x69, 0x3d, 0x65, 0x5b, 0x32, 0x5d, 0x2c, 0x77, 0x69, 0x28, + 0x72, 0x2c, 0x75, 0x2c, 0x69, 0x29, 0x2c, 0x74, 0x28, 0x69, 0x29, + 0x2c, 0x64, 0x69, 0x28, 0x72, 0x2c, 0x69, 0x29, 0x2c, 0x72, 0x2e, + 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x3d, + 0x69, 0x2c, 0x64, 0x69, 0x28, 0x69, 0x2c, 0x75, 0x29, 0x2c, 0x75, + 0x3d, 0x72, 0x2e, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x6e, 0x65, + 0x78, 0x74, 0x2c, 0x6f, 0x3d, 0x33, 0x3b, 0x6c, 0x3e, 0x6f, 0x3b, + 0x6f, 0x2b, 0x2b, 0x29, 0x7b, 0x77, 0x69, 0x28, 0x72, 0x2c, 0x75, + 0x2c, 0x69, 0x3d, 0x65, 0x5b, 0x6f, 0x5d, 0x29, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x70, 0x3d, 0x30, 0x2c, 0x76, 0x3d, 0x31, 0x2c, 0x64, + 0x3d, 0x31, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x61, 0x3d, 0x75, 0x2e, + 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x3b, + 0x61, 0x21, 0x3d, 0x3d, 0x75, 0x3b, 0x61, 0x3d, 0x61, 0x2e, 0x5f, + 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x2c, 0x76, + 0x2b, 0x2b, 0x29, 0x69, 0x66, 0x28, 0x79, 0x69, 0x28, 0x61, 0x2c, + 0x69, 0x29, 0x29, 0x7b, 0x70, 0x3d, 0x31, 0x3b, 0x62, 0x72, 0x65, + 0x61, 0x6b, 0x7d, 0x69, 0x66, 0x28, 0x31, 0x3d, 0x3d, 0x70, 0x29, + 0x66, 0x6f, 0x72, 0x28, 0x63, 0x3d, 0x72, 0x2e, 0x5f, 0x70, 0x61, + 0x63, 0x6b, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x3b, 0x63, 0x21, 0x3d, + 0x3d, 0x61, 0x2e, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x72, + 0x65, 0x76, 0x26, 0x26, 0x21, 0x79, 0x69, 0x28, 0x63, 0x2c, 0x69, + 0x29, 0x3b, 0x63, 0x3d, 0x63, 0x2e, 0x5f, 0x70, 0x61, 0x63, 0x6b, + 0x5f, 0x70, 0x72, 0x65, 0x76, 0x2c, 0x64, 0x2b, 0x2b, 0x29, 0x3b, + 0x70, 0x3f, 0x28, 0x64, 0x3e, 0x76, 0x7c, 0x7c, 0x76, 0x3d, 0x3d, + 0x64, 0x26, 0x26, 0x75, 0x2e, 0x72, 0x3c, 0x72, 0x2e, 0x72, 0x3f, + 0x6d, 0x69, 0x28, 0x72, 0x2c, 0x75, 0x3d, 0x61, 0x29, 0x3a, 0x6d, + 0x69, 0x28, 0x72, 0x3d, 0x63, 0x2c, 0x75, 0x29, 0x2c, 0x6f, 0x2d, + 0x2d, 0x29, 0x3a, 0x28, 0x64, 0x69, 0x28, 0x72, 0x2c, 0x69, 0x29, + 0x2c, 0x75, 0x3d, 0x69, 0x2c, 0x74, 0x28, 0x69, 0x29, 0x29, 0x7d, + 0x76, 0x61, 0x72, 0x20, 0x6d, 0x3d, 0x28, 0x73, 0x2b, 0x66, 0x29, + 0x2f, 0x32, 0x2c, 0x79, 0x3d, 0x28, 0x68, 0x2b, 0x67, 0x29, 0x2f, + 0x32, 0x2c, 0x4d, 0x3d, 0x30, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x6f, + 0x3d, 0x30, 0x3b, 0x6c, 0x3e, 0x6f, 0x3b, 0x6f, 0x2b, 0x2b, 0x29, + 0x69, 0x3d, 0x65, 0x5b, 0x6f, 0x5d, 0x2c, 0x69, 0x2e, 0x78, 0x2d, + 0x3d, 0x6d, 0x2c, 0x69, 0x2e, 0x79, 0x2d, 0x3d, 0x79, 0x2c, 0x4d, + 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x4d, + 0x2c, 0x69, 0x2e, 0x72, 0x2b, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, + 0x71, 0x72, 0x74, 0x28, 0x69, 0x2e, 0x78, 0x2a, 0x69, 0x2e, 0x78, + 0x2b, 0x69, 0x2e, 0x79, 0x2a, 0x69, 0x2e, 0x79, 0x29, 0x29, 0x3b, + 0x6e, 0x2e, 0x72, 0x3d, 0x4d, 0x2c, 0x65, 0x2e, 0x66, 0x6f, 0x72, + 0x45, 0x61, 0x63, 0x68, 0x28, 0x62, 0x69, 0x29, 0x7d, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x78, 0x69, 0x28, + 0x6e, 0x29, 0x7b, 0x6e, 0x2e, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x5f, + 0x6e, 0x65, 0x78, 0x74, 0x3d, 0x6e, 0x2e, 0x5f, 0x70, 0x61, 0x63, + 0x6b, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x3d, 0x6e, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x69, 0x28, 0x6e, + 0x29, 0x7b, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6e, 0x2e, + 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x2c, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6e, 0x2e, 0x5f, 0x70, + 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x69, 0x28, 0x6e, + 0x2c, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x75, 0x3d, 0x6e, 0x2e, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, + 0x65, 0x6e, 0x3b, 0x69, 0x66, 0x28, 0x6e, 0x2e, 0x78, 0x3d, 0x74, + 0x2b, 0x3d, 0x72, 0x2a, 0x6e, 0x2e, 0x78, 0x2c, 0x6e, 0x2e, 0x79, + 0x3d, 0x65, 0x2b, 0x3d, 0x72, 0x2a, 0x6e, 0x2e, 0x79, 0x2c, 0x6e, + 0x2e, 0x72, 0x2a, 0x3d, 0x72, 0x2c, 0x75, 0x29, 0x66, 0x6f, 0x72, + 0x28, 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, 0x2d, 0x31, 0x2c, 0x6f, + 0x3d, 0x75, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x2b, + 0x2b, 0x69, 0x3c, 0x6f, 0x3b, 0x29, 0x5f, 0x69, 0x28, 0x75, 0x5b, + 0x69, 0x5d, 0x2c, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x69, 0x28, + 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x72, 0x3d, 0x6e, 0x2e, 0x72, 0x2b, 0x65, 0x2e, 0x72, 0x2c, 0x75, + 0x3d, 0x74, 0x2e, 0x78, 0x2d, 0x6e, 0x2e, 0x78, 0x2c, 0x69, 0x3d, + 0x74, 0x2e, 0x79, 0x2d, 0x6e, 0x2e, 0x79, 0x3b, 0x69, 0x66, 0x28, + 0x72, 0x26, 0x26, 0x28, 0x75, 0x7c, 0x7c, 0x69, 0x29, 0x29, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x6f, 0x3d, 0x74, 0x2e, 0x72, 0x2b, 0x65, + 0x2e, 0x72, 0x2c, 0x61, 0x3d, 0x75, 0x2a, 0x75, 0x2b, 0x69, 0x2a, + 0x69, 0x3b, 0x6f, 0x2a, 0x3d, 0x6f, 0x2c, 0x72, 0x2a, 0x3d, 0x72, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x63, 0x3d, 0x2e, 0x35, 0x2b, 0x28, + 0x72, 0x2d, 0x6f, 0x29, 0x2f, 0x28, 0x32, 0x2a, 0x61, 0x29, 0x2c, + 0x6c, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x71, 0x72, 0x74, + 0x28, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x30, + 0x2c, 0x32, 0x2a, 0x6f, 0x2a, 0x28, 0x72, 0x2b, 0x61, 0x29, 0x2d, + 0x28, 0x72, 0x2d, 0x3d, 0x61, 0x29, 0x2a, 0x72, 0x2d, 0x6f, 0x2a, + 0x6f, 0x29, 0x29, 0x2f, 0x28, 0x32, 0x2a, 0x61, 0x29, 0x3b, 0x65, + 0x2e, 0x78, 0x3d, 0x6e, 0x2e, 0x78, 0x2b, 0x63, 0x2a, 0x75, 0x2b, + 0x6c, 0x2a, 0x69, 0x2c, 0x65, 0x2e, 0x79, 0x3d, 0x6e, 0x2e, 0x79, + 0x2b, 0x63, 0x2a, 0x69, 0x2d, 0x6c, 0x2a, 0x75, 0x7d, 0x65, 0x6c, + 0x73, 0x65, 0x20, 0x65, 0x2e, 0x78, 0x3d, 0x6e, 0x2e, 0x78, 0x2b, + 0x72, 0x2c, 0x65, 0x2e, 0x79, 0x3d, 0x6e, 0x2e, 0x79, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x53, 0x69, 0x28, + 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6e, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x3d, + 0x74, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3f, 0x31, 0x3a, + 0x32, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6b, 0x69, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, + 0x3d, 0x6e, 0x2e, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x74, 0x5b, 0x30, 0x5d, 0x3a, + 0x6e, 0x2e, 0x74, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x45, 0x69, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x74, 0x2c, 0x65, 0x3d, 0x6e, 0x2e, 0x63, 0x68, 0x69, 0x6c, + 0x64, 0x72, 0x65, 0x6e, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x28, 0x74, 0x3d, 0x65, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x29, 0x3f, 0x65, 0x5b, 0x74, 0x2d, 0x31, 0x5d, 0x3a, 0x6e, 0x2e, + 0x74, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x41, 0x69, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x72, 0x3d, 0x65, 0x2f, 0x28, 0x74, 0x2e, 0x69, + 0x2d, 0x6e, 0x2e, 0x69, 0x29, 0x3b, 0x74, 0x2e, 0x63, 0x2d, 0x3d, + 0x72, 0x2c, 0x74, 0x2e, 0x73, 0x2b, 0x3d, 0x65, 0x2c, 0x6e, 0x2e, + 0x63, 0x2b, 0x3d, 0x72, 0x2c, 0x74, 0x2e, 0x7a, 0x2b, 0x3d, 0x65, + 0x2c, 0x74, 0x2e, 0x6d, 0x2b, 0x3d, 0x65, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4e, 0x69, 0x28, 0x6e, 0x29, + 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x2c, + 0x65, 0x3d, 0x30, 0x2c, 0x72, 0x3d, 0x30, 0x2c, 0x75, 0x3d, 0x6e, + 0x2e, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x2c, 0x69, + 0x3d, 0x75, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x2d, + 0x2d, 0x69, 0x3e, 0x3d, 0x30, 0x3b, 0x29, 0x74, 0x3d, 0x75, 0x5b, + 0x69, 0x5d, 0x2c, 0x74, 0x2e, 0x7a, 0x2b, 0x3d, 0x65, 0x2c, 0x74, + 0x2e, 0x6d, 0x2b, 0x3d, 0x65, 0x2c, 0x65, 0x2b, 0x3d, 0x74, 0x2e, + 0x73, 0x2b, 0x28, 0x72, 0x2b, 0x3d, 0x74, 0x2e, 0x63, 0x29, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x43, 0x69, + 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x61, 0x2e, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x3d, 0x3d, 0x3d, 0x74, 0x2e, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x3f, 0x6e, 0x2e, 0x61, 0x3a, 0x65, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x7a, 0x69, 0x28, + 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, + 0x2b, 0x74, 0x61, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x6e, 0x2c, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x79, 0x7d, + 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x71, 0x69, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x2e, 0x72, 0x65, 0x64, 0x75, 0x63, 0x65, 0x28, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, + 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x2b, 0x74, 0x2e, 0x78, 0x7d, 0x2c, 0x30, 0x29, 0x2f, 0x6e, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4c, 0x69, 0x28, 0x6e, 0x29, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x6e, 0x2e, 0x63, 0x68, 0x69, + 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x26, 0x26, 0x74, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3f, 0x4c, 0x69, 0x28, 0x74, 0x5b, 0x30, 0x5d, 0x29, + 0x3a, 0x6e, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x54, 0x69, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x74, 0x2c, 0x65, 0x3d, 0x6e, 0x2e, 0x63, 0x68, 0x69, 0x6c, 0x64, + 0x72, 0x65, 0x6e, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x65, 0x26, 0x26, 0x28, 0x74, 0x3d, 0x65, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x29, 0x3f, 0x54, 0x69, 0x28, 0x65, 0x5b, 0x74, + 0x2d, 0x31, 0x5d, 0x29, 0x3a, 0x6e, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x52, 0x69, 0x28, 0x6e, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7b, 0x78, 0x3a, 0x6e, 0x2e, + 0x78, 0x2c, 0x79, 0x3a, 0x6e, 0x2e, 0x79, 0x2c, 0x64, 0x78, 0x3a, + 0x6e, 0x2e, 0x64, 0x78, 0x2c, 0x64, 0x79, 0x3a, 0x6e, 0x2e, 0x64, + 0x79, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x44, 0x69, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x65, 0x3d, 0x6e, 0x2e, 0x78, 0x2b, 0x74, 0x5b, 0x33, + 0x5d, 0x2c, 0x72, 0x3d, 0x6e, 0x2e, 0x79, 0x2b, 0x74, 0x5b, 0x30, + 0x5d, 0x2c, 0x75, 0x3d, 0x6e, 0x2e, 0x64, 0x78, 0x2d, 0x74, 0x5b, + 0x31, 0x5d, 0x2d, 0x74, 0x5b, 0x33, 0x5d, 0x2c, 0x69, 0x3d, 0x6e, + 0x2e, 0x64, 0x79, 0x2d, 0x74, 0x5b, 0x30, 0x5d, 0x2d, 0x74, 0x5b, + 0x32, 0x5d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x30, + 0x3e, 0x75, 0x26, 0x26, 0x28, 0x65, 0x2b, 0x3d, 0x75, 0x2f, 0x32, + 0x2c, 0x75, 0x3d, 0x30, 0x29, 0x2c, 0x30, 0x3e, 0x69, 0x26, 0x26, + 0x28, 0x72, 0x2b, 0x3d, 0x69, 0x2f, 0x32, 0x2c, 0x69, 0x3d, 0x30, + 0x29, 0x2c, 0x7b, 0x78, 0x3a, 0x65, 0x2c, 0x79, 0x3a, 0x72, 0x2c, + 0x64, 0x78, 0x3a, 0x75, 0x2c, 0x64, 0x79, 0x3a, 0x69, 0x7d, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x50, 0x69, + 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x6e, + 0x5b, 0x30, 0x5d, 0x2c, 0x65, 0x3d, 0x6e, 0x5b, 0x6e, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, 0x5d, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x3e, 0x74, 0x3f, 0x5b, 0x74, + 0x2c, 0x65, 0x5d, 0x3a, 0x5b, 0x65, 0x2c, 0x74, 0x5d, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x55, 0x69, 0x28, + 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x74, 0x3f, 0x6e, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x74, 0x28, 0x29, 0x3a, 0x50, 0x69, 0x28, 0x6e, + 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x28, 0x29, 0x29, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6a, 0x69, 0x28, + 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x75, 0x3d, 0x65, 0x28, 0x6e, 0x5b, 0x30, 0x5d, 0x2c, + 0x6e, 0x5b, 0x31, 0x5d, 0x29, 0x2c, 0x69, 0x3d, 0x72, 0x28, 0x74, + 0x5b, 0x30, 0x5d, 0x2c, 0x74, 0x5b, 0x31, 0x5d, 0x29, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x69, 0x28, 0x75, 0x28, 0x6e, 0x29, 0x29, 0x7d, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x46, + 0x69, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x65, 0x2c, 0x72, 0x3d, 0x30, 0x2c, 0x75, 0x3d, 0x6e, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, 0x2c, 0x69, 0x3d, 0x6e, + 0x5b, 0x72, 0x5d, 0x2c, 0x6f, 0x3d, 0x6e, 0x5b, 0x75, 0x5d, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x3e, 0x6f, 0x26, + 0x26, 0x28, 0x65, 0x3d, 0x72, 0x2c, 0x72, 0x3d, 0x75, 0x2c, 0x75, + 0x3d, 0x65, 0x2c, 0x65, 0x3d, 0x69, 0x2c, 0x69, 0x3d, 0x6f, 0x2c, + 0x6f, 0x3d, 0x65, 0x29, 0x2c, 0x6e, 0x5b, 0x72, 0x5d, 0x3d, 0x74, + 0x2e, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x69, 0x29, 0x2c, 0x6e, + 0x5b, 0x75, 0x5d, 0x3d, 0x74, 0x2e, 0x63, 0x65, 0x69, 0x6c, 0x28, + 0x6f, 0x29, 0x2c, 0x6e, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x48, 0x69, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x3f, 0x7b, 0x66, 0x6c, 0x6f, + 0x6f, 0x72, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, + 0x74, 0x2f, 0x6e, 0x29, 0x2a, 0x6e, 0x7d, 0x2c, 0x63, 0x65, 0x69, + 0x6c, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x63, 0x65, 0x69, 0x6c, 0x28, 0x74, 0x2f, + 0x6e, 0x29, 0x2a, 0x6e, 0x7d, 0x7d, 0x3a, 0x6d, 0x6c, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4f, 0x69, 0x28, + 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x75, 0x3d, 0x5b, 0x5d, 0x2c, 0x69, 0x3d, 0x5b, 0x5d, + 0x2c, 0x6f, 0x3d, 0x30, 0x2c, 0x61, 0x3d, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x2c, 0x74, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x29, 0x2d, 0x31, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x6e, 0x5b, 0x61, + 0x5d, 0x3c, 0x6e, 0x5b, 0x30, 0x5d, 0x26, 0x26, 0x28, 0x6e, 0x3d, + 0x6e, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x29, 0x2e, 0x72, + 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x28, 0x29, 0x2c, 0x74, 0x3d, + 0x74, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x29, 0x2e, 0x72, + 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x28, 0x29, 0x29, 0x3b, 0x2b, + 0x2b, 0x6f, 0x3c, 0x3d, 0x61, 0x3b, 0x29, 0x75, 0x2e, 0x70, 0x75, + 0x73, 0x68, 0x28, 0x65, 0x28, 0x6e, 0x5b, 0x6f, 0x2d, 0x31, 0x5d, + 0x2c, 0x6e, 0x5b, 0x6f, 0x5d, 0x29, 0x29, 0x2c, 0x69, 0x2e, 0x70, + 0x75, 0x73, 0x68, 0x28, 0x72, 0x28, 0x74, 0x5b, 0x6f, 0x2d, 0x31, + 0x5d, 0x2c, 0x74, 0x5b, 0x6f, 0x5d, 0x29, 0x29, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, + 0x3d, 0x74, 0x61, 0x2e, 0x62, 0x69, 0x73, 0x65, 0x63, 0x74, 0x28, + 0x6e, 0x2c, 0x74, 0x2c, 0x31, 0x2c, 0x61, 0x29, 0x2d, 0x31, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x5b, 0x65, 0x5d, + 0x28, 0x75, 0x5b, 0x65, 0x5d, 0x28, 0x74, 0x29, 0x29, 0x7d, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x69, + 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x28, 0x29, + 0x7b, 0x76, 0x61, 0x72, 0x20, 0x75, 0x3d, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x2c, 0x74, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x29, 0x3e, 0x32, 0x3f, 0x4f, 0x69, 0x3a, 0x6a, 0x69, 0x2c, 0x63, + 0x3d, 0x72, 0x3f, 0x49, 0x75, 0x3a, 0x4f, 0x75, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x3d, 0x75, 0x28, 0x6e, 0x2c, + 0x74, 0x2c, 0x63, 0x2c, 0x65, 0x29, 0x2c, 0x61, 0x3d, 0x75, 0x28, + 0x74, 0x2c, 0x6e, 0x2c, 0x63, 0x2c, 0x6d, 0x75, 0x29, 0x2c, 0x69, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, + 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6f, 0x28, 0x6e, 0x29, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x6f, 0x2c, + 0x61, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x61, 0x28, 0x6e, 0x29, 0x7d, 0x2c, 0x69, + 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, + 0x28, 0x6e, 0x3d, 0x74, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x29, 0x2c, 0x75, 0x28, 0x29, 0x29, 0x3a, + 0x6e, 0x7d, 0x2c, 0x69, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3f, 0x28, 0x74, 0x3d, 0x6e, 0x2c, 0x75, 0x28, 0x29, + 0x29, 0x3a, 0x74, 0x7d, 0x2c, 0x69, 0x2e, 0x72, 0x61, 0x6e, 0x67, + 0x65, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x69, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, + 0x28, 0x6e, 0x29, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x6f, + 0x6c, 0x61, 0x74, 0x65, 0x28, 0x44, 0x75, 0x29, 0x7d, 0x2c, 0x69, + 0x2e, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, + 0x72, 0x3d, 0x6e, 0x2c, 0x75, 0x28, 0x29, 0x29, 0x3a, 0x72, 0x7d, + 0x2c, 0x69, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x6f, 0x6c, + 0x61, 0x74, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x65, 0x3d, 0x6e, + 0x2c, 0x75, 0x28, 0x29, 0x29, 0x3a, 0x65, 0x7d, 0x2c, 0x69, 0x2e, + 0x74, 0x69, 0x63, 0x6b, 0x73, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x58, 0x69, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7d, + 0x2c, 0x69, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x46, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x24, 0x69, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, + 0x7d, 0x2c, 0x69, 0x2e, 0x6e, 0x69, 0x63, 0x65, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5a, 0x69, 0x28, 0x6e, 0x2c, + 0x74, 0x29, 0x2c, 0x75, 0x28, 0x29, 0x7d, 0x2c, 0x69, 0x2e, 0x63, + 0x6f, 0x70, 0x79, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x49, 0x69, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, + 0x7d, 0x2c, 0x75, 0x28, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x59, 0x69, 0x28, 0x6e, 0x2c, 0x74, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x2e, + 0x72, 0x65, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x6e, 0x2c, 0x74, 0x2c, + 0x22, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x2c, 0x22, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x22, 0x2c, 0x22, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x6f, 0x6c, 0x61, 0x74, 0x65, + 0x22, 0x2c, 0x22, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x22, 0x29, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5a, 0x69, + 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x46, 0x69, 0x28, 0x6e, 0x2c, 0x48, 0x69, 0x28, 0x56, + 0x69, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x5b, 0x32, 0x5d, 0x29, 0x29, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x56, + 0x69, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x6e, 0x75, 0x6c, 0x6c, + 0x3d, 0x3d, 0x74, 0x26, 0x26, 0x28, 0x74, 0x3d, 0x31, 0x30, 0x29, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x50, 0x69, 0x28, 0x6e, + 0x29, 0x2c, 0x72, 0x3d, 0x65, 0x5b, 0x31, 0x5d, 0x2d, 0x65, 0x5b, + 0x30, 0x5d, 0x2c, 0x75, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x70, + 0x6f, 0x77, 0x28, 0x31, 0x30, 0x2c, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x6c, 0x6f, 0x67, 0x28, 0x72, 0x2f, 0x74, 0x29, 0x2f, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x4c, 0x4e, 0x31, 0x30, 0x29, 0x29, 0x2c, 0x69, + 0x3d, 0x74, 0x2f, 0x72, 0x2a, 0x75, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x2e, 0x31, 0x35, 0x3e, 0x3d, 0x69, 0x3f, 0x75, 0x2a, + 0x3d, 0x31, 0x30, 0x3a, 0x2e, 0x33, 0x35, 0x3e, 0x3d, 0x69, 0x3f, + 0x75, 0x2a, 0x3d, 0x35, 0x3a, 0x2e, 0x37, 0x35, 0x3e, 0x3d, 0x69, + 0x26, 0x26, 0x28, 0x75, 0x2a, 0x3d, 0x32, 0x29, 0x2c, 0x65, 0x5b, + 0x30, 0x5d, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x65, 0x69, + 0x6c, 0x28, 0x65, 0x5b, 0x30, 0x5d, 0x2f, 0x75, 0x29, 0x2a, 0x75, + 0x2c, 0x65, 0x5b, 0x31, 0x5d, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x65, 0x5b, 0x31, 0x5d, 0x2f, + 0x75, 0x29, 0x2a, 0x75, 0x2b, 0x2e, 0x35, 0x2a, 0x75, 0x2c, 0x65, + 0x5b, 0x32, 0x5d, 0x3d, 0x75, 0x2c, 0x65, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x58, 0x69, 0x28, 0x6e, 0x2c, + 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x61, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x61, 0x70, 0x70, + 0x6c, 0x79, 0x28, 0x74, 0x61, 0x2c, 0x56, 0x69, 0x28, 0x6e, 0x2c, + 0x74, 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x24, 0x69, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, + 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x56, 0x69, 0x28, 0x6e, + 0x2c, 0x74, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x65, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x75, 0x3d, 0x69, 0x63, 0x2e, 0x65, 0x78, 0x65, + 0x63, 0x28, 0x65, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x75, 0x2e, 0x73, + 0x68, 0x69, 0x66, 0x74, 0x28, 0x29, 0x2c, 0x22, 0x73, 0x22, 0x3d, + 0x3d, 0x3d, 0x75, 0x5b, 0x38, 0x5d, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x69, 0x3d, 0x74, 0x61, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x28, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x67, 0x61, 0x28, 0x72, 0x5b, + 0x30, 0x5d, 0x29, 0x2c, 0x67, 0x61, 0x28, 0x72, 0x5b, 0x31, 0x5d, + 0x29, 0x29, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x75, 0x5b, 0x37, 0x5d, 0x7c, 0x7c, 0x28, 0x75, 0x5b, 0x37, 0x5d, + 0x3d, 0x22, 0x2e, 0x22, 0x2b, 0x42, 0x69, 0x28, 0x69, 0x2e, 0x73, + 0x63, 0x61, 0x6c, 0x65, 0x28, 0x72, 0x5b, 0x32, 0x5d, 0x29, 0x29, + 0x29, 0x2c, 0x75, 0x5b, 0x38, 0x5d, 0x3d, 0x22, 0x66, 0x22, 0x2c, + 0x65, 0x3d, 0x74, 0x61, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x28, 0x75, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x22, 0x22, 0x29, + 0x29, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, + 0x28, 0x69, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x28, 0x6e, 0x29, + 0x29, 0x2b, 0x69, 0x2e, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x7d, + 0x7d, 0x75, 0x5b, 0x37, 0x5d, 0x7c, 0x7c, 0x28, 0x75, 0x5b, 0x37, + 0x5d, 0x3d, 0x22, 0x2e, 0x22, 0x2b, 0x57, 0x69, 0x28, 0x75, 0x5b, + 0x38, 0x5d, 0x2c, 0x72, 0x29, 0x29, 0x2c, 0x65, 0x3d, 0x75, 0x2e, + 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x22, 0x22, 0x29, 0x7d, 0x65, 0x6c, + 0x73, 0x65, 0x20, 0x65, 0x3d, 0x22, 0x2c, 0x2e, 0x22, 0x2b, 0x42, + 0x69, 0x28, 0x72, 0x5b, 0x32, 0x5d, 0x29, 0x2b, 0x22, 0x66, 0x22, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x2e, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x65, 0x29, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x42, 0x69, 0x28, + 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x2d, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x6e, 0x29, 0x2f, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x4c, 0x4e, 0x31, 0x30, 0x2b, 0x2e, + 0x30, 0x31, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x57, 0x69, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x65, 0x3d, 0x42, 0x69, 0x28, 0x74, 0x5b, 0x32, + 0x5d, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x20, 0x69, 0x6e, 0x20, 0x79, 0x6c, 0x3f, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x61, 0x62, 0x73, 0x28, 0x65, 0x2d, 0x42, 0x69, 0x28, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x67, 0x61, 0x28, + 0x74, 0x5b, 0x30, 0x5d, 0x29, 0x2c, 0x67, 0x61, 0x28, 0x74, 0x5b, + 0x31, 0x5d, 0x29, 0x29, 0x29, 0x29, 0x2b, 0x20, 0x2b, 0x28, 0x22, + 0x65, 0x22, 0x21, 0x3d, 0x3d, 0x6e, 0x29, 0x3a, 0x65, 0x2d, 0x32, + 0x2a, 0x28, 0x22, 0x25, 0x22, 0x3d, 0x3d, 0x3d, 0x6e, 0x29, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4a, 0x69, + 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x28, 0x6e, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x65, 0x3f, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x30, 0x3e, + 0x6e, 0x3f, 0x30, 0x3a, 0x6e, 0x29, 0x3a, 0x2d, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x6e, 0x3e, 0x30, 0x3f, 0x30, + 0x3a, 0x2d, 0x6e, 0x29, 0x29, 0x2f, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x6c, 0x6f, 0x67, 0x28, 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x28, 0x6e, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x3f, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x70, 0x6f, 0x77, 0x28, 0x74, 0x2c, 0x6e, 0x29, 0x3a, + 0x2d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x70, 0x6f, 0x77, 0x28, 0x74, + 0x2c, 0x2d, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6f, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x28, 0x75, 0x28, 0x74, 0x29, 0x29, + 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x72, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x69, 0x28, 0x6e, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x72, 0x74, 0x28, 0x74, 0x29, 0x29, 0x7d, 0x2c, 0x6f, 0x2e, 0x64, + 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x65, + 0x3d, 0x74, 0x5b, 0x30, 0x5d, 0x3e, 0x3d, 0x30, 0x2c, 0x6e, 0x2e, + 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x28, 0x72, 0x3d, 0x74, + 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x29, 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x75, 0x29, 0x29, 0x2c, + 0x6f, 0x29, 0x3a, 0x72, 0x7d, 0x2c, 0x6f, 0x2e, 0x62, 0x61, 0x73, + 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x74, 0x3d, 0x2b, 0x65, 0x2c, + 0x6e, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x72, 0x2e, + 0x6d, 0x61, 0x70, 0x28, 0x75, 0x29, 0x29, 0x2c, 0x6f, 0x29, 0x3a, + 0x74, 0x7d, 0x2c, 0x6f, 0x2e, 0x6e, 0x69, 0x63, 0x65, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x74, 0x3d, 0x46, 0x69, 0x28, 0x72, 0x2e, 0x6d, + 0x61, 0x70, 0x28, 0x75, 0x29, 0x2c, 0x65, 0x3f, 0x4d, 0x61, 0x74, + 0x68, 0x3a, 0x78, 0x6c, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x28, + 0x74, 0x29, 0x2c, 0x72, 0x3d, 0x74, 0x2e, 0x6d, 0x61, 0x70, 0x28, + 0x69, 0x29, 0x2c, 0x6f, 0x7d, 0x2c, 0x6f, 0x2e, 0x74, 0x69, 0x63, + 0x6b, 0x73, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6e, 0x3d, 0x50, 0x69, + 0x28, 0x72, 0x29, 0x2c, 0x6f, 0x3d, 0x5b, 0x5d, 0x2c, 0x61, 0x3d, + 0x6e, 0x5b, 0x30, 0x5d, 0x2c, 0x63, 0x3d, 0x6e, 0x5b, 0x31, 0x5d, + 0x2c, 0x6c, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6c, 0x6f, + 0x6f, 0x72, 0x28, 0x75, 0x28, 0x61, 0x29, 0x29, 0x2c, 0x73, 0x3d, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x65, 0x69, 0x6c, 0x28, 0x75, + 0x28, 0x63, 0x29, 0x29, 0x2c, 0x66, 0x3d, 0x74, 0x25, 0x31, 0x3f, + 0x32, 0x3a, 0x74, 0x3b, 0x69, 0x66, 0x28, 0x69, 0x73, 0x46, 0x69, + 0x6e, 0x69, 0x74, 0x65, 0x28, 0x73, 0x2d, 0x6c, 0x29, 0x29, 0x7b, + 0x69, 0x66, 0x28, 0x65, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x3b, + 0x73, 0x3e, 0x6c, 0x3b, 0x6c, 0x2b, 0x2b, 0x29, 0x66, 0x6f, 0x72, + 0x28, 0x76, 0x61, 0x72, 0x20, 0x68, 0x3d, 0x31, 0x3b, 0x66, 0x3e, + 0x68, 0x3b, 0x68, 0x2b, 0x2b, 0x29, 0x6f, 0x2e, 0x70, 0x75, 0x73, + 0x68, 0x28, 0x69, 0x28, 0x6c, 0x29, 0x2a, 0x68, 0x29, 0x3b, 0x6f, + 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x69, 0x28, 0x6c, 0x29, 0x29, + 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x28, 0x6f, + 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x69, 0x28, 0x6c, 0x29, 0x29, + 0x3b, 0x6c, 0x2b, 0x2b, 0x3c, 0x73, 0x3b, 0x29, 0x66, 0x6f, 0x72, + 0x28, 0x76, 0x61, 0x72, 0x20, 0x68, 0x3d, 0x66, 0x2d, 0x31, 0x3b, + 0x68, 0x3e, 0x30, 0x3b, 0x68, 0x2d, 0x2d, 0x29, 0x6f, 0x2e, 0x70, + 0x75, 0x73, 0x68, 0x28, 0x69, 0x28, 0x6c, 0x29, 0x2a, 0x68, 0x29, + 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x3d, 0x30, 0x3b, 0x6f, 0x5b, + 0x6c, 0x5d, 0x3c, 0x61, 0x3b, 0x6c, 0x2b, 0x2b, 0x29, 0x3b, 0x66, + 0x6f, 0x72, 0x28, 0x73, 0x3d, 0x6f, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3b, 0x6f, 0x5b, 0x73, 0x2d, 0x31, 0x5d, 0x3e, 0x63, + 0x3b, 0x73, 0x2d, 0x2d, 0x29, 0x3b, 0x6f, 0x3d, 0x6f, 0x2e, 0x73, + 0x6c, 0x69, 0x63, 0x65, 0x28, 0x6c, 0x2c, 0x73, 0x29, 0x7d, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x7d, 0x2c, 0x6f, 0x2e, + 0x74, 0x69, 0x63, 0x6b, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, + 0x74, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x21, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4d, 0x6c, + 0x3b, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3c, 0x32, 0x3f, 0x74, 0x3d, + 0x4d, 0x6c, 0x3a, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x21, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, + 0x74, 0x26, 0x26, 0x28, 0x74, 0x3d, 0x74, 0x61, 0x2e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x28, 0x74, 0x29, 0x29, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x72, 0x2c, 0x61, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x6d, 0x61, 0x78, 0x28, 0x2e, 0x31, 0x2c, 0x6e, 0x2f, 0x6f, 0x2e, + 0x74, 0x69, 0x63, 0x6b, 0x73, 0x28, 0x29, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x29, 0x2c, 0x63, 0x3d, 0x65, 0x3f, 0x28, 0x72, + 0x3d, 0x31, 0x65, 0x2d, 0x31, 0x32, 0x2c, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x63, 0x65, 0x69, 0x6c, 0x29, 0x3a, 0x28, 0x72, 0x3d, 0x2d, + 0x31, 0x65, 0x2d, 0x31, 0x32, 0x2c, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x2f, 0x69, 0x28, 0x63, 0x28, 0x75, 0x28, 0x6e, 0x29, 0x2b, + 0x72, 0x29, 0x29, 0x3c, 0x3d, 0x61, 0x3f, 0x74, 0x28, 0x6e, 0x29, + 0x3a, 0x22, 0x22, 0x7d, 0x7d, 0x2c, 0x6f, 0x2e, 0x63, 0x6f, 0x70, + 0x79, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4a, 0x69, + 0x28, 0x6e, 0x2e, 0x63, 0x6f, 0x70, 0x79, 0x28, 0x29, 0x2c, 0x74, + 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x7d, 0x2c, 0x59, 0x69, 0x28, 0x6f, + 0x2c, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x47, 0x69, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, + 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, + 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x28, 0x75, 0x28, 0x74, 0x29, 0x29, 0x7d, 0x76, 0x61, 0x72, + 0x20, 0x75, 0x3d, 0x4b, 0x69, 0x28, 0x74, 0x29, 0x2c, 0x69, 0x3d, + 0x4b, 0x69, 0x28, 0x31, 0x2f, 0x74, 0x29, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x72, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x72, + 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, + 0x28, 0x6e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x28, 0x74, + 0x29, 0x29, 0x7d, 0x2c, 0x72, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x6e, 0x2e, 0x64, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x28, 0x28, 0x65, 0x3d, 0x74, 0x2e, 0x6d, 0x61, + 0x70, 0x28, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x29, 0x29, 0x2e, + 0x6d, 0x61, 0x70, 0x28, 0x75, 0x29, 0x29, 0x2c, 0x72, 0x29, 0x3a, + 0x65, 0x7d, 0x2c, 0x72, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x73, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x58, 0x69, 0x28, + 0x65, 0x2c, 0x6e, 0x29, 0x7d, 0x2c, 0x72, 0x2e, 0x74, 0x69, 0x63, + 0x6b, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x24, 0x69, 0x28, 0x65, + 0x2c, 0x6e, 0x2c, 0x74, 0x29, 0x7d, 0x2c, 0x72, 0x2e, 0x6e, 0x69, + 0x63, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x72, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x5a, 0x69, + 0x28, 0x65, 0x2c, 0x6e, 0x29, 0x29, 0x7d, 0x2c, 0x72, 0x2e, 0x65, + 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6f, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, + 0x28, 0x75, 0x3d, 0x4b, 0x69, 0x28, 0x74, 0x3d, 0x6f, 0x29, 0x2c, + 0x69, 0x3d, 0x4b, 0x69, 0x28, 0x31, 0x2f, 0x74, 0x29, 0x2c, 0x6e, + 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x65, 0x2e, 0x6d, + 0x61, 0x70, 0x28, 0x75, 0x29, 0x29, 0x2c, 0x72, 0x29, 0x3a, 0x74, + 0x7d, 0x2c, 0x72, 0x2e, 0x63, 0x6f, 0x70, 0x79, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x47, 0x69, 0x28, 0x6e, 0x2e, 0x63, + 0x6f, 0x70, 0x79, 0x28, 0x29, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7d, + 0x2c, 0x59, 0x69, 0x28, 0x72, 0x2c, 0x6e, 0x29, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4b, 0x69, 0x28, 0x6e, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x30, 0x3e, 0x74, 0x3f, 0x2d, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x70, 0x6f, 0x77, 0x28, 0x2d, 0x74, + 0x2c, 0x6e, 0x29, 0x3a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x70, 0x6f, + 0x77, 0x28, 0x74, 0x2c, 0x6e, 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x51, 0x69, 0x28, 0x6e, 0x2c, + 0x74, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x65, 0x28, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x69, 0x5b, 0x28, 0x28, 0x75, 0x2e, 0x67, 0x65, 0x74, + 0x28, 0x65, 0x29, 0x7c, 0x7c, 0x28, 0x22, 0x72, 0x61, 0x6e, 0x67, + 0x65, 0x22, 0x3d, 0x3d, 0x3d, 0x74, 0x2e, 0x74, 0x3f, 0x75, 0x2e, + 0x73, 0x65, 0x74, 0x28, 0x65, 0x2c, 0x6e, 0x2e, 0x70, 0x75, 0x73, + 0x68, 0x28, 0x65, 0x29, 0x29, 0x3a, 0x30, 0x2f, 0x30, 0x29, 0x29, + 0x2d, 0x31, 0x29, 0x25, 0x69, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x5d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x72, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x2e, 0x72, 0x61, 0x6e, 0x67, + 0x65, 0x28, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, + 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x2b, 0x65, 0x2a, 0x6e, 0x7d, 0x29, 0x7d, 0x76, + 0x61, 0x72, 0x20, 0x75, 0x2c, 0x69, 0x2c, 0x6f, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x2e, 0x64, 0x6f, 0x6d, 0x61, + 0x69, 0x6e, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x72, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x21, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x3b, 0x6e, 0x3d, 0x5b, 0x5d, 0x2c, 0x75, 0x3d, 0x6e, 0x65, 0x77, + 0x20, 0x6c, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, + 0x69, 0x2c, 0x6f, 0x3d, 0x2d, 0x31, 0x2c, 0x61, 0x3d, 0x72, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x2b, 0x2b, 0x6f, 0x3c, + 0x61, 0x3b, 0x29, 0x75, 0x2e, 0x68, 0x61, 0x73, 0x28, 0x69, 0x3d, + 0x72, 0x5b, 0x6f, 0x5d, 0x29, 0x7c, 0x7c, 0x75, 0x2e, 0x73, 0x65, + 0x74, 0x28, 0x69, 0x2c, 0x6e, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, + 0x69, 0x29, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x65, 0x5b, 0x74, 0x2e, 0x74, 0x5d, 0x2e, 0x61, 0x70, 0x70, 0x6c, + 0x79, 0x28, 0x65, 0x2c, 0x74, 0x2e, 0x61, 0x29, 0x7d, 0x2c, 0x65, + 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, + 0x69, 0x3d, 0x6e, 0x2c, 0x6f, 0x3d, 0x30, 0x2c, 0x74, 0x3d, 0x7b, + 0x74, 0x3a, 0x22, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x2c, 0x61, + 0x3a, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x7d, + 0x2c, 0x65, 0x29, 0x3a, 0x69, 0x7d, 0x2c, 0x65, 0x2e, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x75, 0x2c, 0x61, + 0x29, 0x7b, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3c, 0x32, 0x26, 0x26, + 0x28, 0x61, 0x3d, 0x30, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x63, + 0x3d, 0x75, 0x5b, 0x30, 0x5d, 0x2c, 0x6c, 0x3d, 0x75, 0x5b, 0x31, + 0x5d, 0x2c, 0x73, 0x3d, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3c, 0x32, 0x3f, 0x28, 0x63, 0x3d, 0x28, 0x63, 0x2b, 0x6c, + 0x29, 0x2f, 0x32, 0x2c, 0x30, 0x29, 0x3a, 0x28, 0x6c, 0x2d, 0x63, + 0x29, 0x2f, 0x28, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x2d, 0x31, 0x2b, 0x61, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x69, 0x3d, 0x72, 0x28, 0x63, 0x2b, 0x73, 0x2a, 0x61, + 0x2f, 0x32, 0x2c, 0x73, 0x29, 0x2c, 0x6f, 0x3d, 0x30, 0x2c, 0x74, + 0x3d, 0x7b, 0x74, 0x3a, 0x22, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x50, + 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x2c, 0x61, 0x3a, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x7d, 0x2c, 0x65, 0x7d, + 0x2c, 0x65, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x75, + 0x6e, 0x64, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x75, 0x2c, 0x61, 0x29, + 0x7b, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3c, 0x32, 0x26, 0x26, 0x28, + 0x61, 0x3d, 0x30, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x63, 0x3d, + 0x75, 0x5b, 0x30, 0x5d, 0x2c, 0x6c, 0x3d, 0x75, 0x5b, 0x31, 0x5d, + 0x2c, 0x73, 0x3d, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3c, 0x32, 0x3f, 0x28, 0x63, 0x3d, 0x6c, 0x3d, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x28, 0x28, 0x63, 0x2b, + 0x6c, 0x29, 0x2f, 0x32, 0x29, 0x2c, 0x30, 0x29, 0x3a, 0x28, 0x6c, + 0x2d, 0x63, 0x29, 0x2f, 0x28, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x2d, 0x31, 0x2b, 0x61, 0x29, 0x7c, 0x30, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x3d, 0x72, 0x28, 0x63, + 0x2b, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x6f, 0x75, 0x6e, 0x64, + 0x28, 0x73, 0x2a, 0x61, 0x2f, 0x32, 0x2b, 0x28, 0x6c, 0x2d, 0x63, + 0x2d, 0x28, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, + 0x31, 0x2b, 0x61, 0x29, 0x2a, 0x73, 0x29, 0x2f, 0x32, 0x29, 0x2c, + 0x73, 0x29, 0x2c, 0x6f, 0x3d, 0x30, 0x2c, 0x74, 0x3d, 0x7b, 0x74, + 0x3a, 0x22, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x6e, + 0x64, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x2c, 0x61, 0x3a, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x7d, 0x2c, + 0x65, 0x7d, 0x2c, 0x65, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x42, + 0x61, 0x6e, 0x64, 0x73, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x75, 0x2c, 0x61, 0x2c, 0x63, 0x29, 0x7b, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3c, 0x32, 0x26, 0x26, 0x28, 0x61, 0x3d, + 0x30, 0x29, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3c, 0x33, 0x26, + 0x26, 0x28, 0x63, 0x3d, 0x61, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x6c, 0x3d, 0x75, 0x5b, 0x31, 0x5d, 0x3c, 0x75, 0x5b, 0x30, 0x5d, + 0x2c, 0x73, 0x3d, 0x75, 0x5b, 0x6c, 0x2d, 0x30, 0x5d, 0x2c, 0x66, + 0x3d, 0x75, 0x5b, 0x31, 0x2d, 0x6c, 0x5d, 0x2c, 0x68, 0x3d, 0x28, + 0x66, 0x2d, 0x73, 0x29, 0x2f, 0x28, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x2d, 0x61, 0x2b, 0x32, 0x2a, 0x63, 0x29, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x3d, 0x72, 0x28, + 0x73, 0x2b, 0x68, 0x2a, 0x63, 0x2c, 0x68, 0x29, 0x2c, 0x6c, 0x26, + 0x26, 0x69, 0x2e, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x28, + 0x29, 0x2c, 0x6f, 0x3d, 0x68, 0x2a, 0x28, 0x31, 0x2d, 0x61, 0x29, + 0x2c, 0x74, 0x3d, 0x7b, 0x74, 0x3a, 0x22, 0x72, 0x61, 0x6e, 0x67, + 0x65, 0x42, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x2c, 0x61, 0x3a, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x7d, 0x2c, 0x65, + 0x7d, 0x2c, 0x65, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, + 0x75, 0x6e, 0x64, 0x42, 0x61, 0x6e, 0x64, 0x73, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x75, 0x2c, 0x61, 0x2c, + 0x63, 0x29, 0x7b, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3c, 0x32, 0x26, + 0x26, 0x28, 0x61, 0x3d, 0x30, 0x29, 0x2c, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3c, 0x33, 0x26, 0x26, 0x28, 0x63, 0x3d, 0x61, 0x29, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x6c, 0x3d, 0x75, 0x5b, 0x31, 0x5d, 0x3c, + 0x75, 0x5b, 0x30, 0x5d, 0x2c, 0x73, 0x3d, 0x75, 0x5b, 0x6c, 0x2d, + 0x30, 0x5d, 0x2c, 0x66, 0x3d, 0x75, 0x5b, 0x31, 0x2d, 0x6c, 0x5d, + 0x2c, 0x68, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6c, 0x6f, + 0x6f, 0x72, 0x28, 0x28, 0x66, 0x2d, 0x73, 0x29, 0x2f, 0x28, 0x6e, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x61, 0x2b, 0x32, + 0x2a, 0x63, 0x29, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x69, 0x3d, 0x72, 0x28, 0x73, 0x2b, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x28, 0x28, 0x66, 0x2d, 0x73, + 0x2d, 0x28, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, + 0x61, 0x29, 0x2a, 0x68, 0x29, 0x2f, 0x32, 0x29, 0x2c, 0x68, 0x29, + 0x2c, 0x6c, 0x26, 0x26, 0x69, 0x2e, 0x72, 0x65, 0x76, 0x65, 0x72, + 0x73, 0x65, 0x28, 0x29, 0x2c, 0x6f, 0x3d, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x28, 0x68, 0x2a, 0x28, 0x31, + 0x2d, 0x61, 0x29, 0x29, 0x2c, 0x74, 0x3d, 0x7b, 0x74, 0x3a, 0x22, + 0x72, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x42, + 0x61, 0x6e, 0x64, 0x73, 0x22, 0x2c, 0x61, 0x3a, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x7d, 0x2c, 0x65, 0x7d, 0x2c, + 0x65, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x61, 0x6e, 0x64, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x7d, 0x2c, + 0x65, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x50, + 0x69, 0x28, 0x74, 0x2e, 0x61, 0x5b, 0x30, 0x5d, 0x29, 0x7d, 0x2c, + 0x65, 0x2e, 0x63, 0x6f, 0x70, 0x79, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x51, 0x69, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7d, + 0x2c, 0x65, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x6e, + 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6e, 0x6f, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x28, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x65, 0x3d, 0x30, 0x2c, 0x72, 0x3d, 0x74, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x66, 0x6f, 0x72, 0x28, + 0x61, 0x3d, 0x5b, 0x5d, 0x3b, 0x2b, 0x2b, 0x65, 0x3c, 0x72, 0x3b, + 0x29, 0x61, 0x5b, 0x65, 0x2d, 0x31, 0x5d, 0x3d, 0x74, 0x61, 0x2e, + 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x2c, + 0x65, 0x2f, 0x72, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6f, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6f, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x69, 0x73, 0x4e, 0x61, 0x4e, 0x28, 0x6e, 0x3d, 0x2b, + 0x6e, 0x29, 0x3f, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x3a, 0x74, + 0x5b, 0x74, 0x61, 0x2e, 0x62, 0x69, 0x73, 0x65, 0x63, 0x74, 0x28, + 0x61, 0x2c, 0x6e, 0x29, 0x5d, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x61, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x2e, 0x64, + 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x6e, + 0x3d, 0x74, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x72, 0x29, 0x2e, 0x66, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x75, 0x29, 0x2e, 0x73, 0x6f, + 0x72, 0x74, 0x28, 0x65, 0x29, 0x2c, 0x69, 0x28, 0x29, 0x29, 0x3a, + 0x6e, 0x7d, 0x2c, 0x6f, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3f, 0x28, 0x74, 0x3d, 0x6e, 0x2c, 0x69, 0x28, 0x29, + 0x29, 0x3a, 0x74, 0x7d, 0x2c, 0x6f, 0x2e, 0x71, 0x75, 0x61, 0x6e, + 0x74, 0x69, 0x6c, 0x65, 0x73, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x61, 0x7d, 0x2c, 0x6f, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x72, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x3d, 0x74, 0x2e, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x65, 0x29, 0x2c, 0x30, + 0x3e, 0x65, 0x3f, 0x5b, 0x30, 0x2f, 0x30, 0x2c, 0x30, 0x2f, 0x30, + 0x5d, 0x3a, 0x5b, 0x65, 0x3e, 0x30, 0x3f, 0x61, 0x5b, 0x65, 0x2d, + 0x31, 0x5d, 0x3a, 0x6e, 0x5b, 0x30, 0x5d, 0x2c, 0x65, 0x3c, 0x61, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x61, 0x5b, 0x65, + 0x5d, 0x3a, 0x6e, 0x5b, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x2d, 0x31, 0x5d, 0x5d, 0x7d, 0x2c, 0x6f, 0x2e, 0x63, 0x6f, + 0x70, 0x79, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x6f, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7d, 0x2c, 0x69, 0x28, 0x29, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, + 0x6f, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x28, 0x74, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x5b, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x30, 0x2c, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x6f, 0x2c, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x69, + 0x2a, 0x28, 0x74, 0x2d, 0x6e, 0x29, 0x29, 0x29, 0x29, 0x5d, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x28, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x3d, + 0x65, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2f, 0x28, 0x74, + 0x2d, 0x6e, 0x29, 0x2c, 0x6f, 0x3d, 0x65, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x2d, 0x31, 0x2c, 0x72, 0x7d, 0x76, 0x61, 0x72, + 0x20, 0x69, 0x2c, 0x6f, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x72, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3f, 0x28, 0x6e, 0x3d, 0x2b, 0x65, 0x5b, 0x30, 0x5d, 0x2c, + 0x74, 0x3d, 0x2b, 0x65, 0x5b, 0x65, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x2d, 0x31, 0x5d, 0x2c, 0x75, 0x28, 0x29, 0x29, 0x3a, + 0x5b, 0x6e, 0x2c, 0x74, 0x5d, 0x7d, 0x2c, 0x72, 0x2e, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x65, 0x3d, 0x6e, + 0x2c, 0x75, 0x28, 0x29, 0x29, 0x3a, 0x65, 0x7d, 0x2c, 0x72, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x3d, 0x65, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, + 0x74, 0x29, 0x2c, 0x74, 0x3d, 0x30, 0x3e, 0x74, 0x3f, 0x30, 0x2f, + 0x30, 0x3a, 0x74, 0x2f, 0x69, 0x2b, 0x6e, 0x2c, 0x5b, 0x74, 0x2c, + 0x74, 0x2b, 0x31, 0x2f, 0x69, 0x5d, 0x7d, 0x2c, 0x72, 0x2e, 0x63, + 0x6f, 0x70, 0x79, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x6f, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7d, 0x2c, + 0x75, 0x28, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x65, 0x6f, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x28, 0x65, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x3e, + 0x3d, 0x65, 0x3f, 0x74, 0x5b, 0x74, 0x61, 0x2e, 0x62, 0x69, 0x73, + 0x65, 0x63, 0x74, 0x28, 0x6e, 0x2c, 0x65, 0x29, 0x5d, 0x3a, 0x76, + 0x6f, 0x69, 0x64, 0x20, 0x30, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x65, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3f, 0x28, 0x6e, 0x3d, 0x74, 0x2c, 0x65, 0x29, 0x3a, + 0x6e, 0x7d, 0x2c, 0x65, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3f, 0x28, 0x74, 0x3d, 0x6e, 0x2c, 0x65, 0x29, 0x3a, + 0x74, 0x7d, 0x2c, 0x65, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x72, 0x74, + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x65, 0x3d, 0x74, 0x2e, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x4f, 0x66, 0x28, 0x65, 0x29, 0x2c, 0x5b, 0x6e, 0x5b, + 0x65, 0x2d, 0x31, 0x5d, 0x2c, 0x6e, 0x5b, 0x65, 0x5d, 0x5d, 0x7d, + 0x2c, 0x65, 0x2e, 0x63, 0x6f, 0x70, 0x79, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x65, 0x6f, 0x28, 0x6e, 0x2c, 0x74, 0x29, + 0x7d, 0x2c, 0x65, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x72, 0x6f, 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x28, 0x6e, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x2b, 0x6e, 0x7d, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x72, 0x74, 0x3d, 0x74, 0x2c, 0x74, 0x2e, 0x64, 0x6f, 0x6d, 0x61, + 0x69, 0x6e, 0x3d, 0x74, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3f, 0x28, 0x6e, 0x3d, 0x65, 0x2e, 0x6d, 0x61, 0x70, + 0x28, 0x74, 0x29, 0x2c, 0x74, 0x29, 0x3a, 0x6e, 0x7d, 0x2c, 0x74, + 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x73, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x58, 0x69, 0x28, 0x6e, 0x2c, 0x74, 0x29, + 0x7d, 0x2c, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x46, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x24, 0x69, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, + 0x29, 0x7d, 0x2c, 0x74, 0x2e, 0x63, 0x6f, 0x70, 0x79, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x6f, 0x28, 0x6e, 0x29, + 0x7d, 0x2c, 0x74, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x75, 0x6f, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x30, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x69, 0x6f, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x69, 0x6e, 0x6e, 0x65, + 0x72, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6f, 0x28, 0x6e, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x6f, + 0x75, 0x74, 0x65, 0x72, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6f, + 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x2e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, 0x6e, 0x67, 0x6c, + 0x65, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x63, 0x6f, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x2e, 0x65, 0x6e, 0x64, 0x41, 0x6e, 0x67, 0x6c, + 0x65, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6c, 0x6f, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x26, 0x26, 0x6e, 0x2e, 0x70, 0x61, 0x64, 0x41, + 0x6e, 0x67, 0x6c, 0x65, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, + 0x2c, 0x72, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, + 0x6e, 0x2d, 0x65, 0x29, 0x2a, 0x74, 0x2d, 0x28, 0x74, 0x2d, 0x72, + 0x29, 0x2a, 0x6e, 0x3e, 0x30, 0x3f, 0x30, 0x3a, 0x31, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x28, + 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x75, 0x29, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, 0x6e, 0x5b, 0x30, 0x5d, 0x2d, + 0x74, 0x5b, 0x30, 0x5d, 0x2c, 0x6f, 0x3d, 0x6e, 0x5b, 0x31, 0x5d, + 0x2d, 0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x61, 0x3d, 0x28, 0x75, 0x3f, + 0x72, 0x3a, 0x2d, 0x72, 0x29, 0x2f, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x73, 0x71, 0x72, 0x74, 0x28, 0x69, 0x2a, 0x69, 0x2b, 0x6f, 0x2a, + 0x6f, 0x29, 0x2c, 0x63, 0x3d, 0x61, 0x2a, 0x6f, 0x2c, 0x6c, 0x3d, + 0x2d, 0x61, 0x2a, 0x69, 0x2c, 0x73, 0x3d, 0x6e, 0x5b, 0x30, 0x5d, + 0x2b, 0x63, 0x2c, 0x66, 0x3d, 0x6e, 0x5b, 0x31, 0x5d, 0x2b, 0x6c, + 0x2c, 0x68, 0x3d, 0x74, 0x5b, 0x30, 0x5d, 0x2b, 0x63, 0x2c, 0x67, + 0x3d, 0x74, 0x5b, 0x31, 0x5d, 0x2b, 0x6c, 0x2c, 0x70, 0x3d, 0x28, + 0x73, 0x2b, 0x68, 0x29, 0x2f, 0x32, 0x2c, 0x76, 0x3d, 0x28, 0x66, + 0x2b, 0x67, 0x29, 0x2f, 0x32, 0x2c, 0x64, 0x3d, 0x68, 0x2d, 0x73, + 0x2c, 0x6d, 0x3d, 0x67, 0x2d, 0x66, 0x2c, 0x79, 0x3d, 0x64, 0x2a, + 0x64, 0x2b, 0x6d, 0x2a, 0x6d, 0x2c, 0x4d, 0x3d, 0x65, 0x2d, 0x72, + 0x2c, 0x78, 0x3d, 0x73, 0x2a, 0x67, 0x2d, 0x68, 0x2a, 0x66, 0x2c, + 0x62, 0x3d, 0x28, 0x30, 0x3e, 0x6d, 0x3f, 0x2d, 0x31, 0x3a, 0x31, + 0x29, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x71, 0x72, 0x74, + 0x28, 0x4d, 0x2a, 0x4d, 0x2a, 0x79, 0x2d, 0x78, 0x2a, 0x78, 0x29, + 0x2c, 0x5f, 0x3d, 0x28, 0x78, 0x2a, 0x6d, 0x2d, 0x64, 0x2a, 0x62, + 0x29, 0x2f, 0x79, 0x2c, 0x77, 0x3d, 0x28, 0x2d, 0x78, 0x2a, 0x64, + 0x2d, 0x6d, 0x2a, 0x62, 0x29, 0x2f, 0x79, 0x2c, 0x53, 0x3d, 0x28, + 0x78, 0x2a, 0x6d, 0x2b, 0x64, 0x2a, 0x62, 0x29, 0x2f, 0x79, 0x2c, + 0x6b, 0x3d, 0x28, 0x2d, 0x78, 0x2a, 0x64, 0x2b, 0x6d, 0x2a, 0x62, + 0x29, 0x2f, 0x79, 0x2c, 0x45, 0x3d, 0x5f, 0x2d, 0x70, 0x2c, 0x41, + 0x3d, 0x77, 0x2d, 0x76, 0x2c, 0x4e, 0x3d, 0x53, 0x2d, 0x70, 0x2c, + 0x43, 0x3d, 0x6b, 0x2d, 0x76, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x45, 0x2a, 0x45, 0x2b, 0x41, 0x2a, 0x41, 0x3e, 0x4e, + 0x2a, 0x4e, 0x2b, 0x43, 0x2a, 0x43, 0x26, 0x26, 0x28, 0x5f, 0x3d, + 0x53, 0x2c, 0x77, 0x3d, 0x6b, 0x29, 0x2c, 0x5b, 0x5b, 0x5f, 0x2d, + 0x63, 0x2c, 0x77, 0x2d, 0x6c, 0x5d, 0x2c, 0x5b, 0x5f, 0x2a, 0x65, + 0x2f, 0x4d, 0x2c, 0x77, 0x2a, 0x65, 0x2f, 0x4d, 0x5d, 0x5d, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x6f, + 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x74, 0x28, 0x74, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x28, 0x29, 0x7b, 0x6c, 0x2e, + 0x70, 0x75, 0x73, 0x68, 0x28, 0x22, 0x4d, 0x22, 0x2c, 0x69, 0x28, + 0x6e, 0x28, 0x73, 0x29, 0x2c, 0x61, 0x29, 0x29, 0x7d, 0x66, 0x6f, + 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x63, 0x2c, 0x6c, 0x3d, 0x5b, + 0x5d, 0x2c, 0x73, 0x3d, 0x5b, 0x5d, 0x2c, 0x66, 0x3d, 0x2d, 0x31, + 0x2c, 0x68, 0x3d, 0x74, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x2c, 0x67, 0x3d, 0x45, 0x74, 0x28, 0x65, 0x29, 0x2c, 0x70, 0x3d, + 0x45, 0x74, 0x28, 0x72, 0x29, 0x3b, 0x2b, 0x2b, 0x66, 0x3c, 0x68, + 0x3b, 0x29, 0x75, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x2c, 0x63, 0x3d, 0x74, 0x5b, 0x66, 0x5d, 0x2c, 0x66, + 0x29, 0x3f, 0x73, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x5b, 0x2b, + 0x67, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x2c, 0x63, 0x2c, 0x66, 0x29, 0x2c, 0x2b, 0x70, 0x2e, 0x63, 0x61, + 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x63, 0x2c, 0x66, + 0x29, 0x5d, 0x29, 0x3a, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x26, 0x26, 0x28, 0x6f, 0x28, 0x29, 0x2c, 0x73, 0x3d, 0x5b, + 0x5d, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x26, 0x26, 0x6f, 0x28, + 0x29, 0x2c, 0x6c, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, + 0x6c, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x22, 0x22, 0x29, 0x3a, + 0x6e, 0x75, 0x6c, 0x6c, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, + 0x41, 0x72, 0x2c, 0x72, 0x3d, 0x4e, 0x72, 0x2c, 0x75, 0x3d, 0x4e, + 0x65, 0x2c, 0x69, 0x3d, 0x67, 0x6f, 0x2c, 0x6f, 0x3d, 0x69, 0x2e, + 0x6b, 0x65, 0x79, 0x2c, 0x61, 0x3d, 0x2e, 0x37, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, 0x78, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3f, 0x28, 0x65, 0x3d, 0x6e, 0x2c, 0x74, 0x29, 0x3a, 0x65, 0x7d, + 0x2c, 0x74, 0x2e, 0x79, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x72, 0x3d, + 0x6e, 0x2c, 0x74, 0x29, 0x3a, 0x72, 0x7d, 0x2c, 0x74, 0x2e, 0x64, + 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, + 0x75, 0x3d, 0x6e, 0x2c, 0x74, 0x29, 0x3a, 0x75, 0x7d, 0x2c, 0x74, + 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x6f, 0x6c, 0x61, 0x74, + 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x6f, 0x3d, 0x22, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3d, 0x3d, 0x74, 0x79, + 0x70, 0x65, 0x6f, 0x66, 0x20, 0x6e, 0x3f, 0x69, 0x3d, 0x6e, 0x3a, + 0x28, 0x69, 0x3d, 0x45, 0x6c, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x6e, + 0x29, 0x7c, 0x7c, 0x67, 0x6f, 0x29, 0x2e, 0x6b, 0x65, 0x79, 0x2c, + 0x74, 0x29, 0x3a, 0x6f, 0x7d, 0x2c, 0x74, 0x2e, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x61, 0x3d, + 0x6e, 0x2c, 0x74, 0x29, 0x3a, 0x61, 0x7d, 0x2c, 0x74, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x6f, 0x28, + 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x22, 0x4c, 0x22, 0x29, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x6f, + 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x67, 0x6f, 0x28, 0x6e, 0x29, 0x2b, 0x22, 0x5a, 0x22, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, 0x6f, 0x28, + 0x6e, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, + 0x74, 0x3d, 0x30, 0x2c, 0x65, 0x3d, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x2c, 0x72, 0x3d, 0x6e, 0x5b, 0x30, 0x5d, 0x2c, + 0x75, 0x3d, 0x5b, 0x72, 0x5b, 0x30, 0x5d, 0x2c, 0x22, 0x2c, 0x22, + 0x2c, 0x72, 0x5b, 0x31, 0x5d, 0x5d, 0x3b, 0x2b, 0x2b, 0x74, 0x3c, + 0x65, 0x3b, 0x29, 0x75, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x22, + 0x48, 0x22, 0x2c, 0x28, 0x72, 0x5b, 0x30, 0x5d, 0x2b, 0x28, 0x72, + 0x3d, 0x6e, 0x5b, 0x74, 0x5d, 0x29, 0x5b, 0x30, 0x5d, 0x29, 0x2f, + 0x32, 0x2c, 0x22, 0x56, 0x22, 0x2c, 0x72, 0x5b, 0x31, 0x5d, 0x29, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x3e, 0x31, + 0x26, 0x26, 0x75, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x22, 0x48, + 0x22, 0x2c, 0x72, 0x5b, 0x30, 0x5d, 0x29, 0x2c, 0x75, 0x2e, 0x6a, + 0x6f, 0x69, 0x6e, 0x28, 0x22, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x28, 0x6e, 0x29, + 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, + 0x30, 0x2c, 0x65, 0x3d, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x2c, 0x72, 0x3d, 0x6e, 0x5b, 0x30, 0x5d, 0x2c, 0x75, 0x3d, + 0x5b, 0x72, 0x5b, 0x30, 0x5d, 0x2c, 0x22, 0x2c, 0x22, 0x2c, 0x72, + 0x5b, 0x31, 0x5d, 0x5d, 0x3b, 0x2b, 0x2b, 0x74, 0x3c, 0x65, 0x3b, + 0x29, 0x75, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x22, 0x56, 0x22, + 0x2c, 0x28, 0x72, 0x3d, 0x6e, 0x5b, 0x74, 0x5d, 0x29, 0x5b, 0x31, + 0x5d, 0x2c, 0x22, 0x48, 0x22, 0x2c, 0x72, 0x5b, 0x30, 0x5d, 0x29, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x2e, 0x6a, + 0x6f, 0x69, 0x6e, 0x28, 0x22, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x79, 0x6f, 0x28, 0x6e, 0x29, + 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, + 0x30, 0x2c, 0x65, 0x3d, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x2c, 0x72, 0x3d, 0x6e, 0x5b, 0x30, 0x5d, 0x2c, 0x75, 0x3d, + 0x5b, 0x72, 0x5b, 0x30, 0x5d, 0x2c, 0x22, 0x2c, 0x22, 0x2c, 0x72, + 0x5b, 0x31, 0x5d, 0x5d, 0x3b, 0x2b, 0x2b, 0x74, 0x3c, 0x65, 0x3b, + 0x29, 0x75, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x22, 0x48, 0x22, + 0x2c, 0x28, 0x72, 0x3d, 0x6e, 0x5b, 0x74, 0x5d, 0x29, 0x5b, 0x30, + 0x5d, 0x2c, 0x22, 0x56, 0x22, 0x2c, 0x72, 0x5b, 0x31, 0x5d, 0x29, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x2e, 0x6a, + 0x6f, 0x69, 0x6e, 0x28, 0x22, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x6f, 0x28, 0x6e, 0x2c, + 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3c, 0x34, 0x3f, 0x67, + 0x6f, 0x28, 0x6e, 0x29, 0x3a, 0x6e, 0x5b, 0x31, 0x5d, 0x2b, 0x5f, + 0x6f, 0x28, 0x6e, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x31, + 0x2c, 0x2d, 0x31, 0x29, 0x2c, 0x77, 0x6f, 0x28, 0x6e, 0x2c, 0x74, + 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x78, 0x6f, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3c, 0x33, 0x3f, 0x67, 0x6f, 0x28, 0x6e, 0x29, 0x3a, + 0x6e, 0x5b, 0x30, 0x5d, 0x2b, 0x5f, 0x6f, 0x28, 0x28, 0x6e, 0x2e, + 0x70, 0x75, 0x73, 0x68, 0x28, 0x6e, 0x5b, 0x30, 0x5d, 0x29, 0x2c, + 0x6e, 0x29, 0x2c, 0x77, 0x6f, 0x28, 0x5b, 0x6e, 0x5b, 0x6e, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x32, 0x5d, 0x5d, 0x2e, + 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6e, 0x2c, 0x5b, 0x6e, + 0x5b, 0x31, 0x5d, 0x5d, 0x29, 0x2c, 0x74, 0x29, 0x29, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x6f, 0x28, + 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3c, 0x33, + 0x3f, 0x67, 0x6f, 0x28, 0x6e, 0x29, 0x3a, 0x6e, 0x5b, 0x30, 0x5d, + 0x2b, 0x5f, 0x6f, 0x28, 0x6e, 0x2c, 0x77, 0x6f, 0x28, 0x6e, 0x2c, + 0x74, 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x5f, 0x6f, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x69, + 0x66, 0x28, 0x74, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3c, + 0x31, 0x7c, 0x7c, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x21, 0x3d, 0x74, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x26, + 0x26, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x21, 0x3d, + 0x74, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2b, 0x32, 0x29, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x67, 0x6f, 0x28, 0x6e, + 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x6e, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x21, 0x3d, 0x74, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x72, 0x3d, 0x22, 0x22, 0x2c, 0x75, + 0x3d, 0x6e, 0x5b, 0x30, 0x5d, 0x2c, 0x69, 0x3d, 0x6e, 0x5b, 0x31, + 0x5d, 0x2c, 0x6f, 0x3d, 0x74, 0x5b, 0x30, 0x5d, 0x2c, 0x61, 0x3d, + 0x6f, 0x2c, 0x63, 0x3d, 0x31, 0x3b, 0x69, 0x66, 0x28, 0x65, 0x26, + 0x26, 0x28, 0x72, 0x2b, 0x3d, 0x22, 0x51, 0x22, 0x2b, 0x28, 0x69, + 0x5b, 0x30, 0x5d, 0x2d, 0x32, 0x2a, 0x6f, 0x5b, 0x30, 0x5d, 0x2f, + 0x33, 0x29, 0x2b, 0x22, 0x2c, 0x22, 0x2b, 0x28, 0x69, 0x5b, 0x31, + 0x5d, 0x2d, 0x32, 0x2a, 0x6f, 0x5b, 0x31, 0x5d, 0x2f, 0x33, 0x29, + 0x2b, 0x22, 0x2c, 0x22, 0x2b, 0x69, 0x5b, 0x30, 0x5d, 0x2b, 0x22, + 0x2c, 0x22, 0x2b, 0x69, 0x5b, 0x31, 0x5d, 0x2c, 0x75, 0x3d, 0x6e, + 0x5b, 0x31, 0x5d, 0x2c, 0x63, 0x3d, 0x32, 0x29, 0x2c, 0x74, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3e, 0x31, 0x29, 0x7b, 0x61, + 0x3d, 0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x69, 0x3d, 0x6e, 0x5b, 0x63, + 0x5d, 0x2c, 0x63, 0x2b, 0x2b, 0x2c, 0x72, 0x2b, 0x3d, 0x22, 0x43, + 0x22, 0x2b, 0x28, 0x75, 0x5b, 0x30, 0x5d, 0x2b, 0x6f, 0x5b, 0x30, + 0x5d, 0x29, 0x2b, 0x22, 0x2c, 0x22, 0x2b, 0x28, 0x75, 0x5b, 0x31, + 0x5d, 0x2b, 0x6f, 0x5b, 0x31, 0x5d, 0x29, 0x2b, 0x22, 0x2c, 0x22, + 0x2b, 0x28, 0x69, 0x5b, 0x30, 0x5d, 0x2d, 0x61, 0x5b, 0x30, 0x5d, + 0x29, 0x2b, 0x22, 0x2c, 0x22, 0x2b, 0x28, 0x69, 0x5b, 0x31, 0x5d, + 0x2d, 0x61, 0x5b, 0x31, 0x5d, 0x29, 0x2b, 0x22, 0x2c, 0x22, 0x2b, + 0x69, 0x5b, 0x30, 0x5d, 0x2b, 0x22, 0x2c, 0x22, 0x2b, 0x69, 0x5b, + 0x31, 0x5d, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, + 0x6c, 0x3d, 0x32, 0x3b, 0x6c, 0x3c, 0x74, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3b, 0x6c, 0x2b, 0x2b, 0x2c, 0x63, 0x2b, 0x2b, + 0x29, 0x69, 0x3d, 0x6e, 0x5b, 0x63, 0x5d, 0x2c, 0x61, 0x3d, 0x74, + 0x5b, 0x6c, 0x5d, 0x2c, 0x72, 0x2b, 0x3d, 0x22, 0x53, 0x22, 0x2b, + 0x28, 0x69, 0x5b, 0x30, 0x5d, 0x2d, 0x61, 0x5b, 0x30, 0x5d, 0x29, + 0x2b, 0x22, 0x2c, 0x22, 0x2b, 0x28, 0x69, 0x5b, 0x31, 0x5d, 0x2d, + 0x61, 0x5b, 0x31, 0x5d, 0x29, 0x2b, 0x22, 0x2c, 0x22, 0x2b, 0x69, + 0x5b, 0x30, 0x5d, 0x2b, 0x22, 0x2c, 0x22, 0x2b, 0x69, 0x5b, 0x31, + 0x5d, 0x7d, 0x69, 0x66, 0x28, 0x65, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x73, 0x3d, 0x6e, 0x5b, 0x63, 0x5d, 0x3b, 0x72, 0x2b, 0x3d, + 0x22, 0x51, 0x22, 0x2b, 0x28, 0x69, 0x5b, 0x30, 0x5d, 0x2b, 0x32, + 0x2a, 0x61, 0x5b, 0x30, 0x5d, 0x2f, 0x33, 0x29, 0x2b, 0x22, 0x2c, + 0x22, 0x2b, 0x28, 0x69, 0x5b, 0x31, 0x5d, 0x2b, 0x32, 0x2a, 0x61, + 0x5b, 0x31, 0x5d, 0x2f, 0x33, 0x29, 0x2b, 0x22, 0x2c, 0x22, 0x2b, + 0x73, 0x5b, 0x30, 0x5d, 0x2b, 0x22, 0x2c, 0x22, 0x2b, 0x73, 0x5b, + 0x31, 0x5d, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, + 0x6f, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, + 0x76, 0x61, 0x72, 0x20, 0x65, 0x2c, 0x72, 0x3d, 0x5b, 0x5d, 0x2c, + 0x75, 0x3d, 0x28, 0x31, 0x2d, 0x74, 0x29, 0x2f, 0x32, 0x2c, 0x69, + 0x3d, 0x6e, 0x5b, 0x30, 0x5d, 0x2c, 0x6f, 0x3d, 0x6e, 0x5b, 0x31, + 0x5d, 0x2c, 0x61, 0x3d, 0x31, 0x2c, 0x63, 0x3d, 0x6e, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x2b, 0x2b, 0x61, 0x3c, 0x63, + 0x3b, 0x29, 0x65, 0x3d, 0x69, 0x2c, 0x69, 0x3d, 0x6f, 0x2c, 0x6f, + 0x3d, 0x6e, 0x5b, 0x61, 0x5d, 0x2c, 0x72, 0x2e, 0x70, 0x75, 0x73, + 0x68, 0x28, 0x5b, 0x75, 0x2a, 0x28, 0x6f, 0x5b, 0x30, 0x5d, 0x2d, + 0x65, 0x5b, 0x30, 0x5d, 0x29, 0x2c, 0x75, 0x2a, 0x28, 0x6f, 0x5b, + 0x31, 0x5d, 0x2d, 0x65, 0x5b, 0x31, 0x5d, 0x29, 0x5d, 0x29, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x53, 0x6f, 0x28, 0x6e, + 0x29, 0x7b, 0x69, 0x66, 0x28, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3c, 0x33, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x67, 0x6f, 0x28, 0x6e, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x74, 0x3d, 0x31, 0x2c, 0x65, 0x3d, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x2c, 0x72, 0x3d, 0x6e, 0x5b, 0x30, 0x5d, 0x2c, + 0x75, 0x3d, 0x72, 0x5b, 0x30, 0x5d, 0x2c, 0x69, 0x3d, 0x72, 0x5b, + 0x31, 0x5d, 0x2c, 0x6f, 0x3d, 0x5b, 0x75, 0x2c, 0x75, 0x2c, 0x75, + 0x2c, 0x28, 0x72, 0x3d, 0x6e, 0x5b, 0x31, 0x5d, 0x29, 0x5b, 0x30, + 0x5d, 0x5d, 0x2c, 0x61, 0x3d, 0x5b, 0x69, 0x2c, 0x69, 0x2c, 0x69, + 0x2c, 0x72, 0x5b, 0x31, 0x5d, 0x5d, 0x2c, 0x63, 0x3d, 0x5b, 0x75, + 0x2c, 0x22, 0x2c, 0x22, 0x2c, 0x69, 0x2c, 0x22, 0x4c, 0x22, 0x2c, + 0x4e, 0x6f, 0x28, 0x43, 0x6c, 0x2c, 0x6f, 0x29, 0x2c, 0x22, 0x2c, + 0x22, 0x2c, 0x4e, 0x6f, 0x28, 0x43, 0x6c, 0x2c, 0x61, 0x29, 0x5d, + 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x6e, 0x2e, 0x70, 0x75, 0x73, 0x68, + 0x28, 0x6e, 0x5b, 0x65, 0x2d, 0x31, 0x5d, 0x29, 0x3b, 0x2b, 0x2b, + 0x74, 0x3c, 0x3d, 0x65, 0x3b, 0x29, 0x72, 0x3d, 0x6e, 0x5b, 0x74, + 0x5d, 0x2c, 0x6f, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, 0x29, + 0x2c, 0x6f, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x72, 0x5b, 0x30, + 0x5d, 0x29, 0x2c, 0x61, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, + 0x29, 0x2c, 0x61, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x72, 0x5b, + 0x31, 0x5d, 0x29, 0x2c, 0x43, 0x6f, 0x28, 0x63, 0x2c, 0x6f, 0x2c, + 0x61, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x2e, 0x70, 0x6f, 0x70, 0x28, 0x29, 0x2c, 0x63, 0x2e, 0x70, 0x75, + 0x73, 0x68, 0x28, 0x22, 0x4c, 0x22, 0x2c, 0x72, 0x29, 0x2c, 0x63, + 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x22, 0x22, 0x29, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6b, 0x6f, 0x28, + 0x6e, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3c, 0x34, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x67, 0x6f, 0x28, 0x6e, 0x29, 0x3b, 0x66, 0x6f, 0x72, + 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x2c, 0x65, 0x3d, 0x5b, 0x5d, + 0x2c, 0x72, 0x3d, 0x2d, 0x31, 0x2c, 0x75, 0x3d, 0x6e, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x69, 0x3d, 0x5b, 0x30, 0x5d, + 0x2c, 0x6f, 0x3d, 0x5b, 0x30, 0x5d, 0x3b, 0x2b, 0x2b, 0x72, 0x3c, + 0x33, 0x3b, 0x29, 0x74, 0x3d, 0x6e, 0x5b, 0x72, 0x5d, 0x2c, 0x69, + 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x74, 0x5b, 0x30, 0x5d, 0x29, + 0x2c, 0x6f, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x74, 0x5b, 0x31, + 0x5d, 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x65, 0x2e, 0x70, 0x75, + 0x73, 0x68, 0x28, 0x4e, 0x6f, 0x28, 0x43, 0x6c, 0x2c, 0x69, 0x29, + 0x2b, 0x22, 0x2c, 0x22, 0x2b, 0x4e, 0x6f, 0x28, 0x43, 0x6c, 0x2c, + 0x6f, 0x29, 0x29, 0x2c, 0x2d, 0x2d, 0x72, 0x3b, 0x2b, 0x2b, 0x72, + 0x3c, 0x75, 0x3b, 0x29, 0x74, 0x3d, 0x6e, 0x5b, 0x72, 0x5d, 0x2c, + 0x69, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, 0x29, 0x2c, 0x69, + 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x74, 0x5b, 0x30, 0x5d, 0x29, + 0x2c, 0x6f, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, 0x29, 0x2c, + 0x6f, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x74, 0x5b, 0x31, 0x5d, + 0x29, 0x2c, 0x43, 0x6f, 0x28, 0x65, 0x2c, 0x69, 0x2c, 0x6f, 0x29, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x2e, 0x6a, + 0x6f, 0x69, 0x6e, 0x28, 0x22, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x45, 0x6f, 0x28, 0x6e, 0x29, + 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x2c, + 0x65, 0x2c, 0x72, 0x3d, 0x2d, 0x31, 0x2c, 0x75, 0x3d, 0x6e, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x69, 0x3d, 0x75, 0x2b, + 0x34, 0x2c, 0x6f, 0x3d, 0x5b, 0x5d, 0x2c, 0x61, 0x3d, 0x5b, 0x5d, + 0x3b, 0x2b, 0x2b, 0x72, 0x3c, 0x34, 0x3b, 0x29, 0x65, 0x3d, 0x6e, + 0x5b, 0x72, 0x25, 0x75, 0x5d, 0x2c, 0x6f, 0x2e, 0x70, 0x75, 0x73, + 0x68, 0x28, 0x65, 0x5b, 0x30, 0x5d, 0x29, 0x2c, 0x61, 0x2e, 0x70, + 0x75, 0x73, 0x68, 0x28, 0x65, 0x5b, 0x31, 0x5d, 0x29, 0x3b, 0x66, + 0x6f, 0x72, 0x28, 0x74, 0x3d, 0x5b, 0x4e, 0x6f, 0x28, 0x43, 0x6c, + 0x2c, 0x6f, 0x29, 0x2c, 0x22, 0x2c, 0x22, 0x2c, 0x4e, 0x6f, 0x28, + 0x43, 0x6c, 0x2c, 0x61, 0x29, 0x5d, 0x2c, 0x2d, 0x2d, 0x72, 0x3b, + 0x2b, 0x2b, 0x72, 0x3c, 0x69, 0x3b, 0x29, 0x65, 0x3d, 0x6e, 0x5b, + 0x72, 0x25, 0x75, 0x5d, 0x2c, 0x6f, 0x2e, 0x73, 0x68, 0x69, 0x66, + 0x74, 0x28, 0x29, 0x2c, 0x6f, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, + 0x65, 0x5b, 0x30, 0x5d, 0x29, 0x2c, 0x61, 0x2e, 0x73, 0x68, 0x69, + 0x66, 0x74, 0x28, 0x29, 0x2c, 0x61, 0x2e, 0x70, 0x75, 0x73, 0x68, + 0x28, 0x65, 0x5b, 0x31, 0x5d, 0x29, 0x2c, 0x43, 0x6f, 0x28, 0x74, + 0x2c, 0x6f, 0x2c, 0x61, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x22, 0x22, + 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x41, 0x6f, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x65, 0x3d, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x2d, 0x31, 0x3b, 0x69, 0x66, 0x28, 0x65, 0x29, 0x66, 0x6f, 0x72, + 0x28, 0x76, 0x61, 0x72, 0x20, 0x72, 0x2c, 0x75, 0x2c, 0x69, 0x3d, + 0x6e, 0x5b, 0x30, 0x5d, 0x5b, 0x30, 0x5d, 0x2c, 0x6f, 0x3d, 0x6e, + 0x5b, 0x30, 0x5d, 0x5b, 0x31, 0x5d, 0x2c, 0x61, 0x3d, 0x6e, 0x5b, + 0x65, 0x5d, 0x5b, 0x30, 0x5d, 0x2d, 0x69, 0x2c, 0x63, 0x3d, 0x6e, + 0x5b, 0x65, 0x5d, 0x5b, 0x31, 0x5d, 0x2d, 0x6f, 0x2c, 0x6c, 0x3d, + 0x2d, 0x31, 0x3b, 0x2b, 0x2b, 0x6c, 0x3c, 0x3d, 0x65, 0x3b, 0x29, + 0x72, 0x3d, 0x6e, 0x5b, 0x6c, 0x5d, 0x2c, 0x75, 0x3d, 0x6c, 0x2f, + 0x65, 0x2c, 0x72, 0x5b, 0x30, 0x5d, 0x3d, 0x74, 0x2a, 0x72, 0x5b, + 0x30, 0x5d, 0x2b, 0x28, 0x31, 0x2d, 0x74, 0x29, 0x2a, 0x28, 0x69, + 0x2b, 0x75, 0x2a, 0x61, 0x29, 0x2c, 0x72, 0x5b, 0x31, 0x5d, 0x3d, + 0x74, 0x2a, 0x72, 0x5b, 0x31, 0x5d, 0x2b, 0x28, 0x31, 0x2d, 0x74, + 0x29, 0x2a, 0x28, 0x6f, 0x2b, 0x75, 0x2a, 0x63, 0x29, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x53, 0x6f, 0x28, 0x6e, 0x29, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4e, + 0x6f, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x5b, 0x30, 0x5d, 0x2a, 0x74, 0x5b, 0x30, + 0x5d, 0x2b, 0x6e, 0x5b, 0x31, 0x5d, 0x2a, 0x74, 0x5b, 0x31, 0x5d, + 0x2b, 0x6e, 0x5b, 0x32, 0x5d, 0x2a, 0x74, 0x5b, 0x32, 0x5d, 0x2b, + 0x6e, 0x5b, 0x33, 0x5d, 0x2a, 0x74, 0x5b, 0x33, 0x5d, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x43, 0x6f, 0x28, + 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x6e, 0x2e, 0x70, 0x75, + 0x73, 0x68, 0x28, 0x22, 0x43, 0x22, 0x2c, 0x4e, 0x6f, 0x28, 0x41, + 0x6c, 0x2c, 0x74, 0x29, 0x2c, 0x22, 0x2c, 0x22, 0x2c, 0x4e, 0x6f, + 0x28, 0x41, 0x6c, 0x2c, 0x65, 0x29, 0x2c, 0x22, 0x2c, 0x22, 0x2c, + 0x4e, 0x6f, 0x28, 0x4e, 0x6c, 0x2c, 0x74, 0x29, 0x2c, 0x22, 0x2c, + 0x22, 0x2c, 0x4e, 0x6f, 0x28, 0x4e, 0x6c, 0x2c, 0x65, 0x29, 0x2c, + 0x22, 0x2c, 0x22, 0x2c, 0x4e, 0x6f, 0x28, 0x43, 0x6c, 0x2c, 0x74, + 0x29, 0x2c, 0x22, 0x2c, 0x22, 0x2c, 0x4e, 0x6f, 0x28, 0x43, 0x6c, + 0x2c, 0x65, 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x7a, 0x6f, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x74, 0x5b, 0x31, 0x5d, + 0x2d, 0x6e, 0x5b, 0x31, 0x5d, 0x29, 0x2f, 0x28, 0x74, 0x5b, 0x30, + 0x5d, 0x2d, 0x6e, 0x5b, 0x30, 0x5d, 0x29, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x71, 0x6f, 0x28, 0x6e, 0x29, + 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, + 0x30, 0x2c, 0x65, 0x3d, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x2d, 0x31, 0x2c, 0x72, 0x3d, 0x5b, 0x5d, 0x2c, 0x75, 0x3d, + 0x6e, 0x5b, 0x30, 0x5d, 0x2c, 0x69, 0x3d, 0x6e, 0x5b, 0x31, 0x5d, + 0x2c, 0x6f, 0x3d, 0x72, 0x5b, 0x30, 0x5d, 0x3d, 0x7a, 0x6f, 0x28, + 0x75, 0x2c, 0x69, 0x29, 0x3b, 0x2b, 0x2b, 0x74, 0x3c, 0x65, 0x3b, + 0x29, 0x72, 0x5b, 0x74, 0x5d, 0x3d, 0x28, 0x6f, 0x2b, 0x28, 0x6f, + 0x3d, 0x7a, 0x6f, 0x28, 0x75, 0x3d, 0x69, 0x2c, 0x69, 0x3d, 0x6e, + 0x5b, 0x74, 0x2b, 0x31, 0x5d, 0x29, 0x29, 0x29, 0x2f, 0x32, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x5b, 0x74, 0x5d, + 0x3d, 0x6f, 0x2c, 0x72, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x4c, 0x6f, 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x6f, + 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x2c, 0x65, 0x2c, 0x72, + 0x2c, 0x75, 0x2c, 0x69, 0x3d, 0x5b, 0x5d, 0x2c, 0x6f, 0x3d, 0x71, + 0x6f, 0x28, 0x6e, 0x29, 0x2c, 0x61, 0x3d, 0x2d, 0x31, 0x2c, 0x63, + 0x3d, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, + 0x3b, 0x2b, 0x2b, 0x61, 0x3c, 0x63, 0x3b, 0x29, 0x74, 0x3d, 0x7a, + 0x6f, 0x28, 0x6e, 0x5b, 0x61, 0x5d, 0x2c, 0x6e, 0x5b, 0x61, 0x2b, + 0x31, 0x5d, 0x29, 0x2c, 0x67, 0x61, 0x28, 0x74, 0x29, 0x3c, 0x43, + 0x61, 0x3f, 0x6f, 0x5b, 0x61, 0x5d, 0x3d, 0x6f, 0x5b, 0x61, 0x2b, + 0x31, 0x5d, 0x3d, 0x30, 0x3a, 0x28, 0x65, 0x3d, 0x6f, 0x5b, 0x61, + 0x5d, 0x2f, 0x74, 0x2c, 0x72, 0x3d, 0x6f, 0x5b, 0x61, 0x2b, 0x31, + 0x5d, 0x2f, 0x74, 0x2c, 0x75, 0x3d, 0x65, 0x2a, 0x65, 0x2b, 0x72, + 0x2a, 0x72, 0x2c, 0x75, 0x3e, 0x39, 0x26, 0x26, 0x28, 0x75, 0x3d, + 0x33, 0x2a, 0x74, 0x2f, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x71, + 0x72, 0x74, 0x28, 0x75, 0x29, 0x2c, 0x6f, 0x5b, 0x61, 0x5d, 0x3d, + 0x75, 0x2a, 0x65, 0x2c, 0x6f, 0x5b, 0x61, 0x2b, 0x31, 0x5d, 0x3d, + 0x75, 0x2a, 0x72, 0x29, 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x61, + 0x3d, 0x2d, 0x31, 0x3b, 0x2b, 0x2b, 0x61, 0x3c, 0x3d, 0x63, 0x3b, + 0x29, 0x75, 0x3d, 0x28, 0x6e, 0x5b, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x6d, 0x69, 0x6e, 0x28, 0x63, 0x2c, 0x61, 0x2b, 0x31, 0x29, 0x5d, + 0x5b, 0x30, 0x5d, 0x2d, 0x6e, 0x5b, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x6d, 0x61, 0x78, 0x28, 0x30, 0x2c, 0x61, 0x2d, 0x31, 0x29, 0x5d, + 0x5b, 0x30, 0x5d, 0x29, 0x2f, 0x28, 0x36, 0x2a, 0x28, 0x31, 0x2b, + 0x6f, 0x5b, 0x61, 0x5d, 0x2a, 0x6f, 0x5b, 0x61, 0x5d, 0x29, 0x29, + 0x2c, 0x69, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x5b, 0x75, 0x7c, + 0x7c, 0x30, 0x2c, 0x6f, 0x5b, 0x61, 0x5d, 0x2a, 0x75, 0x7c, 0x7c, + 0x30, 0x5d, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x69, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x54, 0x6f, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3c, + 0x33, 0x3f, 0x67, 0x6f, 0x28, 0x6e, 0x29, 0x3a, 0x6e, 0x5b, 0x30, + 0x5d, 0x2b, 0x5f, 0x6f, 0x28, 0x6e, 0x2c, 0x4c, 0x6f, 0x28, 0x6e, + 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x52, 0x6f, 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, + 0x76, 0x61, 0x72, 0x20, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x75, + 0x3d, 0x2d, 0x31, 0x2c, 0x69, 0x3d, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3b, 0x2b, 0x2b, 0x75, 0x3c, 0x69, 0x3b, 0x29, + 0x74, 0x3d, 0x6e, 0x5b, 0x75, 0x5d, 0x2c, 0x65, 0x3d, 0x74, 0x5b, + 0x30, 0x5d, 0x2c, 0x72, 0x3d, 0x74, 0x5b, 0x31, 0x5d, 0x2d, 0x52, + 0x61, 0x2c, 0x74, 0x5b, 0x30, 0x5d, 0x3d, 0x65, 0x2a, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x72, 0x29, 0x2c, 0x74, + 0x5b, 0x31, 0x5d, 0x3d, 0x65, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x73, 0x69, 0x6e, 0x28, 0x72, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x44, 0x6f, 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x28, 0x74, 0x29, + 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, + 0x28, 0x29, 0x7b, 0x76, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x22, + 0x4d, 0x22, 0x2c, 0x61, 0x28, 0x6e, 0x28, 0x6d, 0x29, 0x2c, 0x66, + 0x29, 0x2c, 0x73, 0x2c, 0x6c, 0x28, 0x6e, 0x28, 0x64, 0x2e, 0x72, + 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x28, 0x29, 0x29, 0x2c, 0x66, + 0x29, 0x2c, 0x22, 0x5a, 0x22, 0x29, 0x7d, 0x66, 0x6f, 0x72, 0x28, + 0x76, 0x61, 0x72, 0x20, 0x68, 0x2c, 0x67, 0x2c, 0x70, 0x2c, 0x76, + 0x3d, 0x5b, 0x5d, 0x2c, 0x64, 0x3d, 0x5b, 0x5d, 0x2c, 0x6d, 0x3d, + 0x5b, 0x5d, 0x2c, 0x79, 0x3d, 0x2d, 0x31, 0x2c, 0x4d, 0x3d, 0x74, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x78, 0x3d, 0x45, + 0x74, 0x28, 0x65, 0x29, 0x2c, 0x62, 0x3d, 0x45, 0x74, 0x28, 0x75, + 0x29, 0x2c, 0x5f, 0x3d, 0x65, 0x3d, 0x3d, 0x3d, 0x72, 0x3f, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x67, 0x7d, 0x3a, 0x45, 0x74, + 0x28, 0x72, 0x29, 0x2c, 0x77, 0x3d, 0x75, 0x3d, 0x3d, 0x3d, 0x69, + 0x3f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x7d, 0x3a, + 0x45, 0x74, 0x28, 0x69, 0x29, 0x3b, 0x2b, 0x2b, 0x79, 0x3c, 0x4d, + 0x3b, 0x29, 0x6f, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x2c, 0x68, 0x3d, 0x74, 0x5b, 0x79, 0x5d, 0x2c, 0x79, + 0x29, 0x3f, 0x28, 0x64, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x5b, + 0x67, 0x3d, 0x2b, 0x78, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2c, 0x68, 0x2c, 0x79, 0x29, 0x2c, 0x70, 0x3d, + 0x2b, 0x62, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2c, 0x68, 0x2c, 0x79, 0x29, 0x5d, 0x29, 0x2c, 0x6d, 0x2e, + 0x70, 0x75, 0x73, 0x68, 0x28, 0x5b, 0x2b, 0x5f, 0x2e, 0x63, 0x61, + 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x68, 0x2c, 0x79, + 0x29, 0x2c, 0x2b, 0x77, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2c, 0x68, 0x2c, 0x79, 0x29, 0x5d, 0x29, 0x29, + 0x3a, 0x64, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x26, 0x26, + 0x28, 0x63, 0x28, 0x29, 0x2c, 0x64, 0x3d, 0x5b, 0x5d, 0x2c, 0x6d, + 0x3d, 0x5b, 0x5d, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x64, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x26, 0x26, + 0x63, 0x28, 0x29, 0x2c, 0x76, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3f, 0x76, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x22, 0x22, + 0x29, 0x3a, 0x6e, 0x75, 0x6c, 0x6c, 0x7d, 0x76, 0x61, 0x72, 0x20, + 0x65, 0x3d, 0x41, 0x72, 0x2c, 0x72, 0x3d, 0x41, 0x72, 0x2c, 0x75, + 0x3d, 0x30, 0x2c, 0x69, 0x3d, 0x4e, 0x72, 0x2c, 0x6f, 0x3d, 0x4e, + 0x65, 0x2c, 0x61, 0x3d, 0x67, 0x6f, 0x2c, 0x63, 0x3d, 0x61, 0x2e, + 0x6b, 0x65, 0x79, 0x2c, 0x6c, 0x3d, 0x61, 0x2c, 0x73, 0x3d, 0x22, + 0x4c, 0x22, 0x2c, 0x66, 0x3d, 0x2e, 0x37, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, 0x78, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, + 0x28, 0x65, 0x3d, 0x72, 0x3d, 0x6e, 0x2c, 0x74, 0x29, 0x3a, 0x72, + 0x7d, 0x2c, 0x74, 0x2e, 0x78, 0x30, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, + 0x65, 0x3d, 0x6e, 0x2c, 0x74, 0x29, 0x3a, 0x65, 0x7d, 0x2c, 0x74, + 0x2e, 0x78, 0x31, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x72, 0x3d, 0x6e, + 0x2c, 0x74, 0x29, 0x3a, 0x72, 0x7d, 0x2c, 0x74, 0x2e, 0x79, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3f, 0x28, 0x75, 0x3d, 0x69, 0x3d, 0x6e, 0x2c, 0x74, + 0x29, 0x3a, 0x69, 0x7d, 0x2c, 0x74, 0x2e, 0x79, 0x30, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3f, 0x28, 0x75, 0x3d, 0x6e, 0x2c, 0x74, 0x29, 0x3a, 0x75, + 0x7d, 0x2c, 0x74, 0x2e, 0x79, 0x31, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, + 0x69, 0x3d, 0x6e, 0x2c, 0x74, 0x29, 0x3a, 0x69, 0x7d, 0x2c, 0x74, + 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3f, 0x28, 0x6f, 0x3d, 0x6e, 0x2c, 0x74, 0x29, 0x3a, 0x6f, 0x7d, + 0x2c, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x6f, 0x6c, + 0x61, 0x74, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x63, 0x3d, 0x22, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3d, 0x3d, + 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x6e, 0x3f, 0x61, 0x3d, + 0x6e, 0x3a, 0x28, 0x61, 0x3d, 0x45, 0x6c, 0x2e, 0x67, 0x65, 0x74, + 0x28, 0x6e, 0x29, 0x7c, 0x7c, 0x67, 0x6f, 0x29, 0x2e, 0x6b, 0x65, + 0x79, 0x2c, 0x6c, 0x3d, 0x61, 0x2e, 0x72, 0x65, 0x76, 0x65, 0x72, + 0x73, 0x65, 0x7c, 0x7c, 0x61, 0x2c, 0x73, 0x3d, 0x61, 0x2e, 0x63, + 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x3f, 0x22, 0x4d, 0x22, 0x3a, 0x22, + 0x4c, 0x22, 0x2c, 0x74, 0x29, 0x3a, 0x63, 0x7d, 0x2c, 0x74, 0x2e, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, + 0x28, 0x66, 0x3d, 0x6e, 0x2c, 0x74, 0x29, 0x3a, 0x66, 0x7d, 0x2c, + 0x74, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x50, 0x6f, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x2e, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x55, 0x6f, + 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, + 0x6e, 0x2e, 0x78, 0x2c, 0x6e, 0x2e, 0x79, 0x5d, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6a, 0x6f, 0x28, 0x6e, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x74, 0x3d, 0x6e, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, + 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x29, 0x2c, 0x65, 0x3d, 0x74, 0x5b, 0x30, + 0x5d, 0x2c, 0x72, 0x3d, 0x74, 0x5b, 0x31, 0x5d, 0x2d, 0x52, 0x61, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, 0x65, 0x2a, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x72, 0x29, 0x2c, + 0x65, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, + 0x72, 0x29, 0x5d, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x46, 0x6f, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x36, 0x34, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x48, 0x6f, 0x28, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x63, 0x69, 0x72, 0x63, 0x6c, + 0x65, 0x22, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x4f, 0x6f, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x74, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x71, 0x72, 0x74, + 0x28, 0x6e, 0x2f, 0x71, 0x61, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x22, 0x4d, 0x30, 0x2c, 0x22, 0x2b, 0x74, 0x2b, 0x22, + 0x41, 0x22, 0x2b, 0x74, 0x2b, 0x22, 0x2c, 0x22, 0x2b, 0x74, 0x2b, + 0x22, 0x20, 0x30, 0x20, 0x31, 0x2c, 0x31, 0x20, 0x30, 0x2c, 0x22, + 0x2b, 0x2d, 0x74, 0x2b, 0x22, 0x41, 0x22, 0x2b, 0x74, 0x2b, 0x22, + 0x2c, 0x22, 0x2b, 0x74, 0x2b, 0x22, 0x20, 0x30, 0x20, 0x31, 0x2c, + 0x31, 0x20, 0x30, 0x2c, 0x22, 0x2b, 0x74, 0x2b, 0x22, 0x5a, 0x22, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x49, + 0x6f, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x2c, 0x65, 0x3b, 0x28, 0x74, + 0x3d, 0x74, 0x68, 0x69, 0x73, 0x5b, 0x6e, 0x5d, 0x29, 0x26, 0x26, + 0x28, 0x65, 0x3d, 0x74, 0x5b, 0x74, 0x2e, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x5d, 0x29, 0x26, 0x26, 0x28, 0x2d, 0x2d, 0x74, 0x2e, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3f, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x20, 0x74, 0x5b, 0x74, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x5d, 0x3a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x5b, 0x6e, 0x5d, 0x2c, 0x74, 0x2e, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x2b, 0x3d, 0x2e, 0x35, 0x2c, 0x65, 0x2e, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x26, 0x26, 0x65, 0x2e, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, + 0x70, 0x74, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x5f, 0x64, 0x61, + 0x74, 0x61, 0x5f, 0x5f, 0x2c, 0x65, 0x2e, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x29, 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x59, 0x6f, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x79, 0x61, + 0x28, 0x6e, 0x2c, 0x50, 0x6c, 0x29, 0x2c, 0x6e, 0x2e, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3d, 0x74, 0x2c, 0x6e, + 0x2e, 0x69, 0x64, 0x3d, 0x65, 0x2c, 0x6e, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5a, 0x6f, 0x28, 0x6e, 0x2c, + 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x75, 0x3d, 0x6e, 0x2e, 0x69, 0x64, 0x2c, 0x69, 0x3d, 0x6e, 0x2e, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x59, 0x28, 0x6e, 0x2c, 0x22, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3d, 0x3d, + 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x65, 0x3f, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x6f, 0x2c, + 0x61, 0x29, 0x7b, 0x6e, 0x5b, 0x69, 0x5d, 0x5b, 0x75, 0x5d, 0x2e, + 0x74, 0x77, 0x65, 0x65, 0x6e, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x74, + 0x2c, 0x72, 0x28, 0x65, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6e, + 0x2c, 0x6e, 0x2e, 0x5f, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x5f, + 0x2c, 0x6f, 0x2c, 0x61, 0x29, 0x29, 0x29, 0x7d, 0x3a, 0x28, 0x65, + 0x3d, 0x72, 0x28, 0x65, 0x29, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x6e, 0x5b, 0x69, 0x5d, + 0x5b, 0x75, 0x5d, 0x2e, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x2e, 0x73, + 0x65, 0x74, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7d, 0x29, 0x29, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x56, 0x6f, + 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x6e, 0x26, 0x26, 0x28, 0x6e, + 0x3d, 0x22, 0x22, 0x29, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x74, + 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, + 0x6e, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x58, 0x6f, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x6e, 0x3f, + 0x22, 0x5f, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x5f, 0x22, 0x3a, 0x22, 0x5f, 0x5f, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x22, 0x2b, + 0x6e, 0x2b, 0x22, 0x5f, 0x5f, 0x22, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x24, 0x6f, 0x28, 0x6e, 0x2c, 0x74, + 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x75, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x69, 0x3d, 0x6e, 0x5b, 0x65, 0x5d, 0x7c, 0x7c, 0x28, 0x6e, + 0x5b, 0x65, 0x5d, 0x3d, 0x7b, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x3a, 0x30, 0x2c, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x30, 0x7d, + 0x29, 0x2c, 0x6f, 0x3d, 0x69, 0x5b, 0x72, 0x5d, 0x3b, 0x69, 0x66, + 0x28, 0x21, 0x6f, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x61, 0x3d, + 0x75, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x3b, 0x6f, 0x3d, 0x69, 0x5b, + 0x72, 0x5d, 0x3d, 0x7b, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x3a, 0x6e, + 0x65, 0x77, 0x20, 0x6c, 0x2c, 0x74, 0x69, 0x6d, 0x65, 0x3a, 0x61, + 0x2c, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x3a, 0x75, 0x2e, 0x64, 0x65, + 0x6c, 0x61, 0x79, 0x2c, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x3a, 0x75, 0x2e, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2c, 0x65, 0x61, 0x73, 0x65, 0x3a, 0x75, 0x2e, 0x65, 0x61, + 0x73, 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x74, 0x7d, + 0x2c, 0x75, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x2b, 0x2b, 0x69, + 0x2e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2c, 0x74, 0x61, 0x2e, 0x74, + 0x69, 0x6d, 0x65, 0x72, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x75, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x28, 0x65, 0x29, 0x7b, 0x69, 0x66, + 0x28, 0x69, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x3e, 0x72, + 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x28, 0x29, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x75, 0x3d, 0x69, 0x5b, 0x69, 0x2e, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5d, 0x3b, 0x75, 0x26, 0x26, + 0x28, 0x2d, 0x2d, 0x69, 0x2e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2c, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x69, 0x5b, 0x69, 0x2e, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5d, 0x2c, 0x75, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x26, 0x26, 0x75, 0x2e, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, + 0x74, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6e, 0x2c, 0x6e, 0x2e, + 0x5f, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x5f, 0x2c, 0x75, 0x2e, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x29, 0x2c, 0x69, 0x2e, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x3d, 0x72, 0x2c, 0x6f, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x26, 0x26, 0x6f, 0x2e, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2e, 0x63, 0x61, + 0x6c, 0x6c, 0x28, 0x6e, 0x2c, 0x6e, 0x2e, 0x5f, 0x5f, 0x64, 0x61, + 0x74, 0x61, 0x5f, 0x5f, 0x2c, 0x74, 0x29, 0x2c, 0x6f, 0x2e, 0x74, + 0x77, 0x65, 0x65, 0x6e, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, + 0x68, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x28, 0x72, 0x3d, 0x72, 0x2e, 0x63, + 0x61, 0x6c, 0x6c, 0x28, 0x6e, 0x2c, 0x6e, 0x2e, 0x5f, 0x5f, 0x64, + 0x61, 0x74, 0x61, 0x5f, 0x5f, 0x2c, 0x74, 0x29, 0x29, 0x26, 0x26, + 0x76, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x72, 0x29, 0x7d, 0x29, + 0x2c, 0x68, 0x3d, 0x6f, 0x2e, 0x65, 0x61, 0x73, 0x65, 0x2c, 0x66, + 0x3d, 0x6f, 0x2e, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2c, 0x74, 0x61, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x28, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x2e, 0x63, 0x3d, 0x6c, + 0x28, 0x65, 0x7c, 0x7c, 0x31, 0x29, 0x3f, 0x4e, 0x65, 0x3a, 0x6c, + 0x2c, 0x31, 0x7d, 0x2c, 0x30, 0x2c, 0x61, 0x29, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x28, 0x65, 0x29, + 0x7b, 0x69, 0x66, 0x28, 0x69, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x21, 0x3d, 0x3d, 0x72, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x31, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, + 0x20, 0x75, 0x3d, 0x65, 0x2f, 0x66, 0x2c, 0x61, 0x3d, 0x68, 0x28, + 0x75, 0x29, 0x2c, 0x63, 0x3d, 0x76, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3b, 0x63, 0x3e, 0x30, 0x3b, 0x29, 0x76, 0x5b, 0x2d, + 0x2d, 0x63, 0x5d, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6e, 0x2c, + 0x61, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, + 0x3e, 0x3d, 0x31, 0x3f, 0x28, 0x6f, 0x2e, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x26, 0x26, 0x6f, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, + 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6e, 0x2c, + 0x6e, 0x2e, 0x5f, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x5f, 0x2c, + 0x74, 0x29, 0x2c, 0x73, 0x28, 0x29, 0x29, 0x3a, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x30, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x73, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x2d, 0x2d, 0x69, 0x2e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3f, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x69, 0x5b, 0x72, 0x5d, + 0x3a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6e, 0x5b, 0x65, + 0x5d, 0x2c, 0x31, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x66, 0x2c, 0x68, + 0x2c, 0x67, 0x3d, 0x6f, 0x2e, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x2c, + 0x70, 0x3d, 0x65, 0x63, 0x2c, 0x76, 0x3d, 0x5b, 0x5d, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x2e, 0x74, 0x3d, 0x67, + 0x2b, 0x61, 0x2c, 0x75, 0x3e, 0x3d, 0x67, 0x3f, 0x63, 0x28, 0x75, + 0x2d, 0x67, 0x29, 0x3a, 0x76, 0x6f, 0x69, 0x64, 0x28, 0x70, 0x2e, + 0x63, 0x3d, 0x63, 0x29, 0x7d, 0x2c, 0x30, 0x2c, 0x61, 0x29, 0x7d, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x42, + 0x6f, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x6e, 0x2e, + 0x61, 0x74, 0x74, 0x72, 0x28, 0x22, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x22, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x72, 0x3d, 0x74, 0x28, 0x6e, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x22, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, + 0x65, 0x28, 0x22, 0x2b, 0x28, 0x69, 0x73, 0x46, 0x69, 0x6e, 0x69, + 0x74, 0x65, 0x28, 0x72, 0x29, 0x3f, 0x72, 0x3a, 0x65, 0x28, 0x6e, + 0x29, 0x29, 0x2b, 0x22, 0x2c, 0x30, 0x29, 0x22, 0x7d, 0x29, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x57, 0x6f, + 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x6e, 0x2e, 0x61, + 0x74, 0x74, 0x72, 0x28, 0x22, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x6f, 0x72, 0x6d, 0x22, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, + 0x3d, 0x74, 0x28, 0x6e, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x22, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, + 0x28, 0x30, 0x2c, 0x22, 0x2b, 0x28, 0x69, 0x73, 0x46, 0x69, 0x6e, + 0x69, 0x74, 0x65, 0x28, 0x72, 0x29, 0x3f, 0x72, 0x3a, 0x65, 0x28, + 0x6e, 0x29, 0x29, 0x2b, 0x22, 0x29, 0x22, 0x7d, 0x29, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4a, 0x6f, 0x28, + 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x2e, 0x74, 0x6f, 0x49, 0x53, 0x4f, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x28, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x47, 0x6f, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, + 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, + 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x28, 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x75, 0x28, 0x6e, 0x2c, 0x65, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x72, 0x3d, 0x6e, 0x5b, 0x31, 0x5d, 0x2d, 0x6e, + 0x5b, 0x30, 0x5d, 0x2c, 0x75, 0x3d, 0x72, 0x2f, 0x65, 0x2c, 0x69, + 0x3d, 0x74, 0x61, 0x2e, 0x62, 0x69, 0x73, 0x65, 0x63, 0x74, 0x28, + 0x56, 0x6c, 0x2c, 0x75, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x69, 0x3d, 0x3d, 0x56, 0x6c, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3f, 0x5b, 0x74, 0x2e, 0x79, 0x65, 0x61, 0x72, + 0x2c, 0x56, 0x69, 0x28, 0x6e, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2f, 0x33, 0x31, + 0x35, 0x33, 0x36, 0x65, 0x36, 0x7d, 0x29, 0x2c, 0x65, 0x29, 0x5b, + 0x32, 0x5d, 0x5d, 0x3a, 0x69, 0x3f, 0x74, 0x5b, 0x75, 0x2f, 0x56, + 0x6c, 0x5b, 0x69, 0x2d, 0x31, 0x5d, 0x3c, 0x56, 0x6c, 0x5b, 0x69, + 0x5d, 0x2f, 0x75, 0x3f, 0x69, 0x2d, 0x31, 0x3a, 0x69, 0x5d, 0x3a, + 0x5b, 0x42, 0x6c, 0x2c, 0x56, 0x69, 0x28, 0x6e, 0x2c, 0x65, 0x29, + 0x5b, 0x32, 0x5d, 0x5d, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x72, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4b, 0x6f, 0x28, 0x6e, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x28, 0x74, 0x29, 0x29, + 0x7d, 0x2c, 0x72, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3f, 0x28, 0x6e, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x28, 0x74, 0x29, 0x2c, 0x72, 0x29, 0x3a, 0x6e, 0x2e, 0x64, + 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x2e, 0x6d, 0x61, 0x70, + 0x28, 0x4b, 0x6f, 0x29, 0x7d, 0x2c, 0x72, 0x2e, 0x6e, 0x69, 0x63, + 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x65, 0x28, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x21, 0x69, 0x73, 0x4e, 0x61, 0x4e, 0x28, 0x65, + 0x29, 0x26, 0x26, 0x21, 0x6e, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, + 0x28, 0x65, 0x2c, 0x4b, 0x6f, 0x28, 0x2b, 0x65, 0x2b, 0x31, 0x29, + 0x2c, 0x74, 0x29, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x7d, + 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, 0x72, 0x2e, 0x64, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x28, 0x29, 0x2c, 0x6f, 0x3d, 0x50, 0x69, 0x28, + 0x69, 0x29, 0x2c, 0x61, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, + 0x6e, 0x3f, 0x75, 0x28, 0x6f, 0x2c, 0x31, 0x30, 0x29, 0x3a, 0x22, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x3d, 0x3d, 0x74, 0x79, + 0x70, 0x65, 0x6f, 0x66, 0x20, 0x6e, 0x26, 0x26, 0x75, 0x28, 0x6f, + 0x2c, 0x6e, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x61, 0x26, 0x26, 0x28, 0x6e, 0x3d, 0x61, 0x5b, 0x30, 0x5d, 0x2c, + 0x74, 0x3d, 0x61, 0x5b, 0x31, 0x5d, 0x29, 0x2c, 0x72, 0x2e, 0x64, + 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x46, 0x69, 0x28, 0x69, 0x2c, + 0x74, 0x3e, 0x31, 0x3f, 0x7b, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x3a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, + 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x3b, 0x65, 0x28, 0x74, 0x3d, 0x6e, + 0x2e, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x74, 0x29, 0x29, 0x3b, + 0x29, 0x74, 0x3d, 0x4b, 0x6f, 0x28, 0x74, 0x2d, 0x31, 0x29, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x7d, 0x2c, 0x63, + 0x65, 0x69, 0x6c, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x3b, 0x65, + 0x28, 0x74, 0x3d, 0x6e, 0x2e, 0x63, 0x65, 0x69, 0x6c, 0x28, 0x74, + 0x29, 0x29, 0x3b, 0x29, 0x74, 0x3d, 0x4b, 0x6f, 0x28, 0x2b, 0x74, + 0x2b, 0x31, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x7d, 0x7d, 0x3a, 0x6e, 0x29, 0x29, 0x7d, 0x2c, 0x72, 0x2e, + 0x74, 0x69, 0x63, 0x6b, 0x73, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x65, 0x3d, 0x50, 0x69, 0x28, 0x72, 0x2e, 0x64, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x29, 0x2c, 0x69, 0x3d, 0x6e, + 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x6e, 0x3f, 0x75, 0x28, 0x65, 0x2c, + 0x31, 0x30, 0x29, 0x3a, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x6e, + 0x3f, 0x75, 0x28, 0x65, 0x2c, 0x6e, 0x29, 0x3a, 0x21, 0x6e, 0x2e, + 0x72, 0x61, 0x6e, 0x67, 0x65, 0x26, 0x26, 0x5b, 0x7b, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x3a, 0x6e, 0x7d, 0x2c, 0x74, 0x5d, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x26, 0x26, 0x28, 0x6e, + 0x3d, 0x69, 0x5b, 0x30, 0x5d, 0x2c, 0x74, 0x3d, 0x69, 0x5b, 0x31, + 0x5d, 0x29, 0x2c, 0x6e, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x28, + 0x65, 0x5b, 0x30, 0x5d, 0x2c, 0x4b, 0x6f, 0x28, 0x2b, 0x65, 0x5b, + 0x31, 0x5d, 0x2b, 0x31, 0x29, 0x2c, 0x31, 0x3e, 0x74, 0x3f, 0x31, + 0x3a, 0x74, 0x29, 0x7d, 0x2c, 0x72, 0x2e, 0x74, 0x69, 0x63, 0x6b, + 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x65, 0x7d, 0x2c, 0x72, 0x2e, 0x63, 0x6f, 0x70, + 0x79, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x47, 0x6f, + 0x28, 0x6e, 0x2e, 0x63, 0x6f, 0x70, 0x79, 0x28, 0x29, 0x2c, 0x74, + 0x2c, 0x65, 0x29, 0x7d, 0x2c, 0x59, 0x69, 0x28, 0x72, 0x2c, 0x6e, + 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x4b, 0x6f, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x44, 0x61, 0x74, 0x65, 0x28, + 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x51, 0x6f, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, + 0x73, 0x65, 0x28, 0x6e, 0x2e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x54, 0x65, 0x78, 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x61, 0x28, 0x6e, 0x29, + 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x75, 0x61, 0x2e, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x28, + 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x28, + 0x75, 0x61, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x2c, 0x74, 0x2e, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x75, 0x61, 0x6c, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x28, 0x6e, 0x2e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x54, 0x65, 0x78, 0x74, 0x29, 0x7d, 0x76, 0x61, 0x72, + 0x20, 0x74, 0x61, 0x3d, 0x7b, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x3a, 0x22, 0x33, 0x2e, 0x35, 0x2e, 0x36, 0x22, 0x7d, 0x2c, + 0x65, 0x61, 0x3d, 0x5b, 0x5d, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, + 0x2c, 0x72, 0x61, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x65, 0x61, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6e, 0x29, + 0x7d, 0x2c, 0x75, 0x61, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3b, 0x69, 0x66, 0x28, + 0x75, 0x61, 0x29, 0x74, 0x72, 0x79, 0x7b, 0x72, 0x61, 0x28, 0x75, + 0x61, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x45, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x68, 0x69, 0x6c, + 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x29, 0x5b, 0x30, 0x5d, 0x2e, + 0x6e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x63, 0x61, + 0x74, 0x63, 0x68, 0x28, 0x69, 0x61, 0x29, 0x7b, 0x72, 0x61, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, + 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, + 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x65, 0x3d, + 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x74, + 0x29, 0x3b, 0x74, 0x2d, 0x2d, 0x3b, 0x29, 0x65, 0x5b, 0x74, 0x5d, + 0x3d, 0x6e, 0x5b, 0x74, 0x5d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x65, 0x7d, 0x7d, 0x69, 0x66, 0x28, 0x44, 0x61, 0x74, + 0x65, 0x2e, 0x6e, 0x6f, 0x77, 0x7c, 0x7c, 0x28, 0x44, 0x61, 0x74, + 0x65, 0x2e, 0x6e, 0x6f, 0x77, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x2b, 0x6e, 0x65, 0x77, 0x20, 0x44, 0x61, 0x74, 0x65, 0x7d, + 0x29, 0x2c, 0x75, 0x61, 0x29, 0x74, 0x72, 0x79, 0x7b, 0x75, 0x61, + 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x28, 0x22, 0x44, 0x49, 0x56, 0x22, 0x29, 0x2e, + 0x73, 0x74, 0x79, 0x6c, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x22, 0x6f, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x22, 0x2c, 0x30, 0x2c, 0x22, 0x22, 0x29, + 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x6f, 0x61, 0x29, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x61, 0x61, 0x3d, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x63, 0x61, 0x3d, + 0x61, 0x61, 0x2e, 0x73, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x2c, 0x6c, 0x61, 0x3d, 0x61, 0x61, 0x2e, + 0x73, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x65, 0x4e, 0x53, 0x2c, 0x73, 0x61, 0x3d, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x43, 0x53, 0x53, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x44, 0x65, + 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x66, 0x61, + 0x3d, 0x73, 0x61, 0x2e, 0x73, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x79, 0x3b, 0x61, 0x61, 0x2e, 0x73, 0x65, 0x74, + 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, + 0x29, 0x7b, 0x63, 0x61, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2c, 0x6e, 0x2c, 0x74, 0x2b, 0x22, 0x22, 0x29, + 0x7d, 0x2c, 0x61, 0x61, 0x2e, 0x73, 0x65, 0x74, 0x41, 0x74, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x4e, 0x53, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x2c, + 0x65, 0x29, 0x7b, 0x6c, 0x61, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x2c, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x2b, + 0x22, 0x22, 0x29, 0x7d, 0x2c, 0x73, 0x61, 0x2e, 0x73, 0x65, 0x74, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x2c, + 0x65, 0x29, 0x7b, 0x66, 0x61, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x2c, 0x6e, 0x2c, 0x74, 0x2b, 0x22, 0x22, + 0x2c, 0x65, 0x29, 0x7d, 0x7d, 0x74, 0x61, 0x2e, 0x61, 0x73, 0x63, + 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x65, 0x2c, 0x74, 0x61, + 0x2e, 0x64, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x3e, 0x74, 0x3f, 0x2d, 0x31, 0x3a, 0x74, 0x3e, 0x6e, 0x3f, + 0x31, 0x3a, 0x74, 0x3e, 0x3d, 0x6e, 0x3f, 0x30, 0x3a, 0x30, 0x2f, + 0x30, 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x6d, 0x69, 0x6e, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x2c, 0x72, 0x2c, 0x75, + 0x3d, 0x2d, 0x31, 0x2c, 0x69, 0x3d, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3b, 0x69, 0x66, 0x28, 0x31, 0x3d, 0x3d, 0x3d, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, + 0x3b, 0x2b, 0x2b, 0x75, 0x3c, 0x69, 0x3b, 0x29, 0x69, 0x66, 0x28, + 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, 0x28, 0x72, 0x3d, 0x6e, 0x5b, + 0x75, 0x5d, 0x29, 0x26, 0x26, 0x72, 0x3e, 0x3d, 0x72, 0x29, 0x7b, + 0x65, 0x3d, 0x72, 0x3b, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x7d, 0x66, + 0x6f, 0x72, 0x28, 0x3b, 0x2b, 0x2b, 0x75, 0x3c, 0x69, 0x3b, 0x29, + 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, 0x28, 0x72, 0x3d, 0x6e, 0x5b, + 0x75, 0x5d, 0x29, 0x26, 0x26, 0x65, 0x3e, 0x72, 0x26, 0x26, 0x28, + 0x65, 0x3d, 0x72, 0x29, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x66, + 0x6f, 0x72, 0x28, 0x3b, 0x2b, 0x2b, 0x75, 0x3c, 0x69, 0x3b, 0x29, + 0x69, 0x66, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, 0x28, 0x72, + 0x3d, 0x74, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6e, 0x2c, 0x6e, + 0x5b, 0x75, 0x5d, 0x2c, 0x75, 0x29, 0x29, 0x26, 0x26, 0x72, 0x3e, + 0x3d, 0x72, 0x29, 0x7b, 0x65, 0x3d, 0x72, 0x3b, 0x62, 0x72, 0x65, + 0x61, 0x6b, 0x7d, 0x66, 0x6f, 0x72, 0x28, 0x3b, 0x2b, 0x2b, 0x75, + 0x3c, 0x69, 0x3b, 0x29, 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, 0x28, + 0x72, 0x3d, 0x74, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6e, 0x2c, + 0x6e, 0x5b, 0x75, 0x5d, 0x2c, 0x75, 0x29, 0x29, 0x26, 0x26, 0x65, + 0x3e, 0x72, 0x26, 0x26, 0x28, 0x65, 0x3d, 0x72, 0x29, 0x7d, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x7d, 0x2c, 0x74, 0x61, + 0x2e, 0x6d, 0x61, 0x78, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x65, 0x2c, 0x72, 0x2c, 0x75, 0x3d, 0x2d, 0x31, 0x2c, 0x69, + 0x3d, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x69, + 0x66, 0x28, 0x31, 0x3d, 0x3d, 0x3d, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x3b, 0x2b, 0x2b, 0x75, 0x3c, + 0x69, 0x3b, 0x29, 0x69, 0x66, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x21, + 0x3d, 0x28, 0x72, 0x3d, 0x6e, 0x5b, 0x75, 0x5d, 0x29, 0x26, 0x26, + 0x72, 0x3e, 0x3d, 0x72, 0x29, 0x7b, 0x65, 0x3d, 0x72, 0x3b, 0x62, + 0x72, 0x65, 0x61, 0x6b, 0x7d, 0x66, 0x6f, 0x72, 0x28, 0x3b, 0x2b, + 0x2b, 0x75, 0x3c, 0x69, 0x3b, 0x29, 0x6e, 0x75, 0x6c, 0x6c, 0x21, + 0x3d, 0x28, 0x72, 0x3d, 0x6e, 0x5b, 0x75, 0x5d, 0x29, 0x26, 0x26, + 0x72, 0x3e, 0x65, 0x26, 0x26, 0x28, 0x65, 0x3d, 0x72, 0x29, 0x7d, + 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x3b, 0x2b, + 0x2b, 0x75, 0x3c, 0x69, 0x3b, 0x29, 0x69, 0x66, 0x28, 0x6e, 0x75, + 0x6c, 0x6c, 0x21, 0x3d, 0x28, 0x72, 0x3d, 0x74, 0x2e, 0x63, 0x61, + 0x6c, 0x6c, 0x28, 0x6e, 0x2c, 0x6e, 0x5b, 0x75, 0x5d, 0x2c, 0x75, + 0x29, 0x29, 0x26, 0x26, 0x72, 0x3e, 0x3d, 0x72, 0x29, 0x7b, 0x65, + 0x3d, 0x72, 0x3b, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x7d, 0x66, 0x6f, + 0x72, 0x28, 0x3b, 0x2b, 0x2b, 0x75, 0x3c, 0x69, 0x3b, 0x29, 0x6e, + 0x75, 0x6c, 0x6c, 0x21, 0x3d, 0x28, 0x72, 0x3d, 0x74, 0x2e, 0x63, + 0x61, 0x6c, 0x6c, 0x28, 0x6e, 0x2c, 0x6e, 0x5b, 0x75, 0x5d, 0x2c, + 0x75, 0x29, 0x29, 0x26, 0x26, 0x72, 0x3e, 0x65, 0x26, 0x26, 0x28, + 0x65, 0x3d, 0x72, 0x29, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x65, 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, + 0x2c, 0x72, 0x2c, 0x75, 0x2c, 0x69, 0x3d, 0x2d, 0x31, 0x2c, 0x6f, + 0x3d, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x69, + 0x66, 0x28, 0x31, 0x3d, 0x3d, 0x3d, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x3b, 0x2b, 0x2b, 0x69, 0x3c, + 0x6f, 0x3b, 0x29, 0x69, 0x66, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x21, + 0x3d, 0x28, 0x72, 0x3d, 0x6e, 0x5b, 0x69, 0x5d, 0x29, 0x26, 0x26, + 0x72, 0x3e, 0x3d, 0x72, 0x29, 0x7b, 0x65, 0x3d, 0x75, 0x3d, 0x72, + 0x3b, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x7d, 0x66, 0x6f, 0x72, 0x28, + 0x3b, 0x2b, 0x2b, 0x69, 0x3c, 0x6f, 0x3b, 0x29, 0x6e, 0x75, 0x6c, + 0x6c, 0x21, 0x3d, 0x28, 0x72, 0x3d, 0x6e, 0x5b, 0x69, 0x5d, 0x29, + 0x26, 0x26, 0x28, 0x65, 0x3e, 0x72, 0x26, 0x26, 0x28, 0x65, 0x3d, + 0x72, 0x29, 0x2c, 0x72, 0x3e, 0x75, 0x26, 0x26, 0x28, 0x75, 0x3d, + 0x72, 0x29, 0x29, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x66, 0x6f, + 0x72, 0x28, 0x3b, 0x2b, 0x2b, 0x69, 0x3c, 0x6f, 0x3b, 0x29, 0x69, + 0x66, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, 0x28, 0x72, 0x3d, + 0x74, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6e, 0x2c, 0x6e, 0x5b, + 0x69, 0x5d, 0x2c, 0x69, 0x29, 0x29, 0x26, 0x26, 0x72, 0x3e, 0x3d, + 0x72, 0x29, 0x7b, 0x65, 0x3d, 0x75, 0x3d, 0x72, 0x3b, 0x62, 0x72, + 0x65, 0x61, 0x6b, 0x7d, 0x66, 0x6f, 0x72, 0x28, 0x3b, 0x2b, 0x2b, + 0x69, 0x3c, 0x6f, 0x3b, 0x29, 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, + 0x28, 0x72, 0x3d, 0x74, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6e, + 0x2c, 0x6e, 0x5b, 0x69, 0x5d, 0x2c, 0x69, 0x29, 0x29, 0x26, 0x26, + 0x28, 0x65, 0x3e, 0x72, 0x26, 0x26, 0x28, 0x65, 0x3d, 0x72, 0x29, + 0x2c, 0x72, 0x3e, 0x75, 0x26, 0x26, 0x28, 0x75, 0x3d, 0x72, 0x29, + 0x29, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, 0x65, 0x2c, + 0x75, 0x5d, 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x73, 0x75, 0x6d, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, + 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x2c, 0x72, 0x3d, + 0x30, 0x2c, 0x69, 0x3d, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x2c, 0x6f, 0x3d, 0x2d, 0x31, 0x3b, 0x69, 0x66, 0x28, 0x31, + 0x3d, 0x3d, 0x3d, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x66, 0x6f, + 0x72, 0x28, 0x3b, 0x2b, 0x2b, 0x6f, 0x3c, 0x69, 0x3b, 0x29, 0x75, + 0x28, 0x65, 0x3d, 0x2b, 0x6e, 0x5b, 0x6f, 0x5d, 0x29, 0x26, 0x26, + 0x28, 0x72, 0x2b, 0x3d, 0x65, 0x29, 0x3b, 0x65, 0x6c, 0x73, 0x65, + 0x20, 0x66, 0x6f, 0x72, 0x28, 0x3b, 0x2b, 0x2b, 0x6f, 0x3c, 0x69, + 0x3b, 0x29, 0x75, 0x28, 0x65, 0x3d, 0x2b, 0x74, 0x2e, 0x63, 0x61, + 0x6c, 0x6c, 0x28, 0x6e, 0x2c, 0x6e, 0x5b, 0x6f, 0x5d, 0x2c, 0x6f, + 0x29, 0x29, 0x26, 0x26, 0x28, 0x72, 0x2b, 0x3d, 0x65, 0x29, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x7d, 0x2c, 0x74, + 0x61, 0x2e, 0x6d, 0x65, 0x61, 0x6e, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x65, 0x2c, 0x69, 0x3d, 0x30, 0x2c, 0x6f, 0x3d, + 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x61, 0x3d, + 0x2d, 0x31, 0x2c, 0x63, 0x3d, 0x6f, 0x3b, 0x69, 0x66, 0x28, 0x31, + 0x3d, 0x3d, 0x3d, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x66, 0x6f, + 0x72, 0x28, 0x3b, 0x2b, 0x2b, 0x61, 0x3c, 0x6f, 0x3b, 0x29, 0x75, + 0x28, 0x65, 0x3d, 0x72, 0x28, 0x6e, 0x5b, 0x61, 0x5d, 0x29, 0x29, + 0x3f, 0x69, 0x2b, 0x3d, 0x65, 0x3a, 0x2d, 0x2d, 0x63, 0x3b, 0x65, + 0x6c, 0x73, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x28, 0x3b, 0x2b, 0x2b, + 0x61, 0x3c, 0x6f, 0x3b, 0x29, 0x75, 0x28, 0x65, 0x3d, 0x72, 0x28, + 0x74, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6e, 0x2c, 0x6e, 0x5b, + 0x61, 0x5d, 0x2c, 0x61, 0x29, 0x29, 0x29, 0x3f, 0x69, 0x2b, 0x3d, + 0x65, 0x3a, 0x2d, 0x2d, 0x63, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x63, 0x3f, 0x69, 0x2f, 0x63, 0x3a, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x30, 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x71, 0x75, 0x61, + 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x65, 0x3d, 0x28, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x2d, 0x31, 0x29, 0x2a, 0x74, 0x2b, 0x31, 0x2c, 0x72, + 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6c, 0x6f, 0x6f, 0x72, + 0x28, 0x65, 0x29, 0x2c, 0x75, 0x3d, 0x2b, 0x6e, 0x5b, 0x72, 0x2d, + 0x31, 0x5d, 0x2c, 0x69, 0x3d, 0x65, 0x2d, 0x72, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x3f, 0x75, 0x2b, 0x69, 0x2a, + 0x28, 0x6e, 0x5b, 0x72, 0x5d, 0x2d, 0x75, 0x29, 0x3a, 0x75, 0x7d, + 0x2c, 0x74, 0x61, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x6e, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, + 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x2c, 0x6f, 0x3d, + 0x5b, 0x5d, 0x2c, 0x61, 0x3d, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x2c, 0x63, 0x3d, 0x2d, 0x31, 0x3b, 0x69, 0x66, 0x28, + 0x31, 0x3d, 0x3d, 0x3d, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x66, + 0x6f, 0x72, 0x28, 0x3b, 0x2b, 0x2b, 0x63, 0x3c, 0x61, 0x3b, 0x29, + 0x75, 0x28, 0x69, 0x3d, 0x72, 0x28, 0x6e, 0x5b, 0x63, 0x5d, 0x29, + 0x29, 0x26, 0x26, 0x6f, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x69, + 0x29, 0x3b, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x28, + 0x3b, 0x2b, 0x2b, 0x63, 0x3c, 0x61, 0x3b, 0x29, 0x75, 0x28, 0x69, + 0x3d, 0x72, 0x28, 0x74, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6e, + 0x2c, 0x6e, 0x5b, 0x63, 0x5d, 0x2c, 0x63, 0x29, 0x29, 0x29, 0x26, + 0x26, 0x6f, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x69, 0x29, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x74, 0x61, 0x2e, 0x71, 0x75, 0x61, + 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x28, 0x6f, 0x2e, 0x73, 0x6f, 0x72, + 0x74, 0x28, 0x65, 0x29, 0x2c, 0x2e, 0x35, 0x29, 0x3a, 0x76, 0x6f, + 0x69, 0x64, 0x20, 0x30, 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x76, 0x61, + 0x72, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x65, 0x2c, 0x69, 0x2c, 0x6f, 0x3d, 0x6e, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x61, 0x3d, 0x30, 0x2c, + 0x63, 0x3d, 0x30, 0x2c, 0x6c, 0x3d, 0x2d, 0x31, 0x2c, 0x73, 0x3d, + 0x30, 0x3b, 0x69, 0x66, 0x28, 0x31, 0x3d, 0x3d, 0x3d, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x29, 0x66, 0x6f, 0x72, 0x28, 0x3b, 0x2b, 0x2b, + 0x6c, 0x3c, 0x6f, 0x3b, 0x29, 0x75, 0x28, 0x65, 0x3d, 0x72, 0x28, + 0x6e, 0x5b, 0x6c, 0x5d, 0x29, 0x29, 0x26, 0x26, 0x28, 0x69, 0x3d, + 0x65, 0x2d, 0x61, 0x2c, 0x61, 0x2b, 0x3d, 0x69, 0x2f, 0x2b, 0x2b, + 0x73, 0x2c, 0x63, 0x2b, 0x3d, 0x69, 0x2a, 0x28, 0x65, 0x2d, 0x61, + 0x29, 0x29, 0x3b, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x66, 0x6f, 0x72, + 0x28, 0x3b, 0x2b, 0x2b, 0x6c, 0x3c, 0x6f, 0x3b, 0x29, 0x75, 0x28, + 0x65, 0x3d, 0x72, 0x28, 0x74, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, + 0x6e, 0x2c, 0x6e, 0x5b, 0x6c, 0x5d, 0x2c, 0x6c, 0x29, 0x29, 0x29, + 0x26, 0x26, 0x28, 0x69, 0x3d, 0x65, 0x2d, 0x61, 0x2c, 0x61, 0x2b, + 0x3d, 0x69, 0x2f, 0x2b, 0x2b, 0x73, 0x2c, 0x63, 0x2b, 0x3d, 0x69, + 0x2a, 0x28, 0x65, 0x2d, 0x61, 0x29, 0x29, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x73, 0x3e, 0x31, 0x3f, 0x63, 0x2f, 0x28, + 0x73, 0x2d, 0x31, 0x29, 0x3a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, + 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6e, 0x3d, 0x74, + 0x61, 0x2e, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x2e, + 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x3f, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x73, 0x71, 0x72, 0x74, 0x28, 0x6e, 0x29, 0x3a, + 0x6e, 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x68, 0x61, 0x3d, 0x69, + 0x28, 0x65, 0x29, 0x3b, 0x74, 0x61, 0x2e, 0x62, 0x69, 0x73, 0x65, + 0x63, 0x74, 0x4c, 0x65, 0x66, 0x74, 0x3d, 0x68, 0x61, 0x2e, 0x6c, + 0x65, 0x66, 0x74, 0x2c, 0x74, 0x61, 0x2e, 0x62, 0x69, 0x73, 0x65, + 0x63, 0x74, 0x3d, 0x74, 0x61, 0x2e, 0x62, 0x69, 0x73, 0x65, 0x63, + 0x74, 0x52, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x68, 0x61, 0x2e, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x2c, 0x74, 0x61, 0x2e, 0x62, 0x69, 0x73, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x69, 0x28, 0x31, 0x3d, 0x3d, 0x3d, 0x6e, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x2c, 0x72, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x28, 0x6e, 0x28, 0x74, + 0x29, 0x2c, 0x72, 0x29, 0x7d, 0x3a, 0x6e, 0x29, 0x7d, 0x2c, 0x74, + 0x61, 0x2e, 0x73, 0x68, 0x75, 0x66, 0x66, 0x6c, 0x65, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, + 0x2c, 0x65, 0x29, 0x7b, 0x28, 0x69, 0x3d, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x29, 0x3c, 0x33, 0x26, 0x26, 0x28, 0x65, 0x3d, 0x6e, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x32, 0x3e, 0x69, 0x26, + 0x26, 0x28, 0x74, 0x3d, 0x30, 0x29, 0x29, 0x3b, 0x66, 0x6f, 0x72, + 0x28, 0x76, 0x61, 0x72, 0x20, 0x72, 0x2c, 0x75, 0x2c, 0x69, 0x3d, + 0x65, 0x2d, 0x74, 0x3b, 0x69, 0x3b, 0x29, 0x75, 0x3d, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x28, 0x29, + 0x2a, 0x69, 0x2d, 0x2d, 0x7c, 0x30, 0x2c, 0x72, 0x3d, 0x6e, 0x5b, + 0x69, 0x2b, 0x74, 0x5d, 0x2c, 0x6e, 0x5b, 0x69, 0x2b, 0x74, 0x5d, + 0x3d, 0x6e, 0x5b, 0x75, 0x2b, 0x74, 0x5d, 0x2c, 0x6e, 0x5b, 0x75, + 0x2b, 0x74, 0x5d, 0x3d, 0x72, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x70, 0x65, 0x72, + 0x6d, 0x75, 0x74, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x66, 0x6f, 0x72, + 0x28, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x74, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x72, 0x3d, 0x6e, 0x65, 0x77, 0x20, + 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x65, 0x29, 0x3b, 0x65, 0x2d, + 0x2d, 0x3b, 0x29, 0x72, 0x5b, 0x65, 0x5d, 0x3d, 0x6e, 0x5b, 0x74, + 0x5b, 0x65, 0x5d, 0x5d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x72, 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x70, 0x61, 0x69, 0x72, + 0x73, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, + 0x74, 0x2c, 0x65, 0x3d, 0x30, 0x2c, 0x72, 0x3d, 0x6e, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, 0x2c, 0x75, 0x3d, 0x6e, + 0x5b, 0x30, 0x5d, 0x2c, 0x69, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, + 0x72, 0x72, 0x61, 0x79, 0x28, 0x30, 0x3e, 0x72, 0x3f, 0x30, 0x3a, + 0x72, 0x29, 0x3b, 0x72, 0x3e, 0x65, 0x3b, 0x29, 0x69, 0x5b, 0x65, + 0x5d, 0x3d, 0x5b, 0x74, 0x3d, 0x75, 0x2c, 0x75, 0x3d, 0x6e, 0x5b, + 0x2b, 0x2b, 0x65, 0x5d, 0x5d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x69, 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x7a, 0x69, 0x70, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x7b, 0x69, 0x66, 0x28, 0x21, 0x28, 0x72, 0x3d, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x29, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, + 0x5d, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x6e, + 0x3d, 0x2d, 0x31, 0x2c, 0x74, 0x3d, 0x74, 0x61, 0x2e, 0x6d, 0x69, + 0x6e, 0x28, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x2c, 0x6f, 0x29, 0x2c, 0x65, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, + 0x72, 0x72, 0x61, 0x79, 0x28, 0x74, 0x29, 0x3b, 0x2b, 0x2b, 0x6e, + 0x3c, 0x74, 0x3b, 0x29, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, + 0x20, 0x72, 0x2c, 0x75, 0x3d, 0x2d, 0x31, 0x2c, 0x69, 0x3d, 0x65, + 0x5b, 0x6e, 0x5d, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, + 0x61, 0x79, 0x28, 0x72, 0x29, 0x3b, 0x2b, 0x2b, 0x75, 0x3c, 0x72, + 0x3b, 0x29, 0x69, 0x5b, 0x75, 0x5d, 0x3d, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5b, 0x75, 0x5d, 0x5b, 0x6e, 0x5d, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x7d, 0x2c, + 0x74, 0x61, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, + 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x61, 0x2e, 0x7a, 0x69, 0x70, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, + 0x28, 0x74, 0x61, 0x2c, 0x6e, 0x29, 0x7d, 0x2c, 0x74, 0x61, 0x2e, + 0x6b, 0x65, 0x79, 0x73, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, + 0x3d, 0x5b, 0x5d, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, + 0x20, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6e, 0x29, 0x74, 0x2e, 0x70, + 0x75, 0x73, 0x68, 0x28, 0x65, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x74, 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, + 0x3d, 0x5b, 0x5d, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, + 0x20, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6e, 0x29, 0x74, 0x2e, 0x70, + 0x75, 0x73, 0x68, 0x28, 0x6e, 0x5b, 0x65, 0x5d, 0x29, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x7d, 0x2c, 0x74, 0x61, + 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x74, 0x3d, 0x5b, 0x5d, 0x3b, 0x66, 0x6f, 0x72, + 0x28, 0x76, 0x61, 0x72, 0x20, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6e, + 0x29, 0x74, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x7b, 0x6b, 0x65, + 0x79, 0x3a, 0x65, 0x2c, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x6e, + 0x5b, 0x65, 0x5d, 0x7d, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x6d, 0x65, 0x72, + 0x67, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, + 0x20, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x75, 0x3d, 0x6e, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x69, 0x3d, 0x2d, 0x31, + 0x2c, 0x6f, 0x3d, 0x30, 0x3b, 0x2b, 0x2b, 0x69, 0x3c, 0x75, 0x3b, + 0x29, 0x6f, 0x2b, 0x3d, 0x6e, 0x5b, 0x69, 0x5d, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x65, 0x3d, + 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x6f, + 0x29, 0x3b, 0x2d, 0x2d, 0x75, 0x3e, 0x3d, 0x30, 0x3b, 0x29, 0x66, + 0x6f, 0x72, 0x28, 0x72, 0x3d, 0x6e, 0x5b, 0x75, 0x5d, 0x2c, 0x74, + 0x3d, 0x72, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x2d, + 0x2d, 0x74, 0x3e, 0x3d, 0x30, 0x3b, 0x29, 0x65, 0x5b, 0x2d, 0x2d, + 0x6f, 0x5d, 0x3d, 0x72, 0x5b, 0x74, 0x5d, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x65, 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x67, 0x61, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x61, 0x62, 0x73, + 0x3b, 0x74, 0x61, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, + 0x2c, 0x65, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3c, 0x33, 0x26, 0x26, 0x28, 0x65, 0x3d, 0x31, 0x2c, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3c, 0x32, 0x26, 0x26, 0x28, 0x74, 0x3d, + 0x6e, 0x2c, 0x6e, 0x3d, 0x30, 0x29, 0x29, 0x2c, 0x28, 0x74, 0x2d, + 0x6e, 0x29, 0x2f, 0x65, 0x3d, 0x3d, 0x3d, 0x31, 0x2f, 0x30, 0x29, + 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x69, 0x6e, 0x66, 0x69, 0x6e, + 0x69, 0x74, 0x65, 0x20, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x29, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x2c, 0x75, 0x3d, 0x5b, 0x5d, + 0x2c, 0x69, 0x3d, 0x61, 0x28, 0x67, 0x61, 0x28, 0x65, 0x29, 0x29, + 0x2c, 0x6f, 0x3d, 0x2d, 0x31, 0x3b, 0x69, 0x66, 0x28, 0x6e, 0x2a, + 0x3d, 0x69, 0x2c, 0x74, 0x2a, 0x3d, 0x69, 0x2c, 0x65, 0x2a, 0x3d, + 0x69, 0x2c, 0x30, 0x3e, 0x65, 0x29, 0x66, 0x6f, 0x72, 0x28, 0x3b, + 0x28, 0x72, 0x3d, 0x6e, 0x2b, 0x65, 0x2a, 0x2b, 0x2b, 0x6f, 0x29, + 0x3e, 0x74, 0x3b, 0x29, 0x75, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, + 0x72, 0x2f, 0x69, 0x29, 0x3b, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x66, + 0x6f, 0x72, 0x28, 0x3b, 0x28, 0x72, 0x3d, 0x6e, 0x2b, 0x65, 0x2a, + 0x2b, 0x2b, 0x6f, 0x29, 0x3c, 0x74, 0x3b, 0x29, 0x75, 0x2e, 0x70, + 0x75, 0x73, 0x68, 0x28, 0x72, 0x2f, 0x69, 0x29, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x7d, 0x2c, 0x74, 0x61, 0x2e, + 0x6d, 0x61, 0x70, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x65, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x6c, 0x3b, 0x69, 0x66, 0x28, + 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, + 0x66, 0x20, 0x6c, 0x29, 0x6e, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, + 0x63, 0x68, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x65, 0x2e, 0x73, 0x65, 0x74, + 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7d, 0x29, 0x3b, 0x65, 0x6c, 0x73, + 0x65, 0x20, 0x69, 0x66, 0x28, 0x41, 0x72, 0x72, 0x61, 0x79, 0x2e, + 0x69, 0x73, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x6e, 0x29, 0x29, + 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x2c, 0x75, 0x3d, 0x2d, 0x31, + 0x2c, 0x69, 0x3d, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3b, 0x69, 0x66, 0x28, 0x31, 0x3d, 0x3d, 0x3d, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x29, 0x66, 0x6f, 0x72, 0x28, 0x3b, 0x2b, 0x2b, 0x75, + 0x3c, 0x69, 0x3b, 0x29, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x75, + 0x2c, 0x6e, 0x5b, 0x75, 0x5d, 0x29, 0x3b, 0x65, 0x6c, 0x73, 0x65, + 0x20, 0x66, 0x6f, 0x72, 0x28, 0x3b, 0x2b, 0x2b, 0x75, 0x3c, 0x69, + 0x3b, 0x29, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x74, 0x2e, 0x63, + 0x61, 0x6c, 0x6c, 0x28, 0x6e, 0x2c, 0x72, 0x3d, 0x6e, 0x5b, 0x75, + 0x5d, 0x2c, 0x75, 0x29, 0x2c, 0x72, 0x29, 0x7d, 0x65, 0x6c, 0x73, + 0x65, 0x20, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x6f, + 0x20, 0x69, 0x6e, 0x20, 0x6e, 0x29, 0x65, 0x2e, 0x73, 0x65, 0x74, + 0x28, 0x6f, 0x2c, 0x6e, 0x5b, 0x6f, 0x5d, 0x29, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x7d, 0x3b, 0x76, 0x61, 0x72, + 0x20, 0x70, 0x61, 0x3d, 0x22, 0x5f, 0x5f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x5f, 0x5f, 0x22, 0x2c, 0x76, 0x61, 0x3d, 0x22, 0x5c, 0x78, + 0x30, 0x30, 0x22, 0x3b, 0x63, 0x28, 0x6c, 0x2c, 0x7b, 0x68, 0x61, + 0x73, 0x3a, 0x68, 0x2c, 0x67, 0x65, 0x74, 0x3a, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, + 0x5b, 0x73, 0x28, 0x6e, 0x29, 0x5d, 0x7d, 0x2c, 0x73, 0x65, 0x74, + 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x5b, 0x73, 0x28, 0x6e, 0x29, + 0x5d, 0x3d, 0x74, 0x7d, 0x2c, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x3a, 0x67, 0x2c, 0x6b, 0x65, 0x79, 0x73, 0x3a, 0x70, 0x2c, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6e, + 0x3d, 0x5b, 0x5d, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, + 0x20, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x5f, 0x29, 0x6e, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x5f, 0x5b, 0x74, 0x5d, 0x29, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x7d, 0x2c, 0x65, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6e, 0x3d, + 0x5b, 0x5d, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, + 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, + 0x29, 0x6e, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x7b, 0x6b, 0x65, + 0x79, 0x3a, 0x66, 0x28, 0x74, 0x29, 0x2c, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x5b, 0x74, 0x5d, + 0x7d, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x7d, 0x2c, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x76, 0x2c, 0x65, 0x6d, + 0x70, 0x74, 0x79, 0x3a, 0x64, 0x2c, 0x66, 0x6f, 0x72, 0x45, 0x61, + 0x63, 0x68, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, + 0x20, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x5f, 0x29, 0x6e, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x2c, 0x66, 0x28, 0x74, 0x29, 0x2c, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x5f, 0x5b, 0x74, 0x5d, 0x29, 0x7d, 0x7d, 0x29, 0x2c, + 0x74, 0x61, 0x2e, 0x6e, 0x65, 0x73, 0x74, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x28, 0x74, 0x2c, 0x6f, + 0x2c, 0x61, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x61, 0x3e, 0x3d, 0x69, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x72, 0x3f, 0x72, 0x2e, 0x63, 0x61, 0x6c, + 0x6c, 0x28, 0x75, 0x2c, 0x6f, 0x29, 0x3a, 0x65, 0x3f, 0x6f, 0x2e, + 0x73, 0x6f, 0x72, 0x74, 0x28, 0x65, 0x29, 0x3a, 0x6f, 0x3b, 0x66, + 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x63, 0x2c, 0x73, 0x2c, + 0x66, 0x2c, 0x68, 0x2c, 0x67, 0x3d, 0x2d, 0x31, 0x2c, 0x70, 0x3d, + 0x6f, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x76, 0x3d, + 0x69, 0x5b, 0x61, 0x2b, 0x2b, 0x5d, 0x2c, 0x64, 0x3d, 0x6e, 0x65, + 0x77, 0x20, 0x6c, 0x3b, 0x2b, 0x2b, 0x67, 0x3c, 0x70, 0x3b, 0x29, + 0x28, 0x68, 0x3d, 0x64, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x63, 0x3d, + 0x76, 0x28, 0x73, 0x3d, 0x6f, 0x5b, 0x67, 0x5d, 0x29, 0x29, 0x29, + 0x3f, 0x68, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x73, 0x29, 0x3a, + 0x64, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x63, 0x2c, 0x5b, 0x73, 0x5d, + 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x3f, + 0x28, 0x73, 0x3d, 0x74, 0x28, 0x29, 0x2c, 0x66, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x2c, 0x72, 0x29, + 0x7b, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x65, 0x2c, 0x6e, 0x28, + 0x74, 0x2c, 0x72, 0x2c, 0x61, 0x29, 0x29, 0x7d, 0x29, 0x3a, 0x28, + 0x73, 0x3d, 0x7b, 0x7d, 0x2c, 0x66, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x73, + 0x5b, 0x65, 0x5d, 0x3d, 0x6e, 0x28, 0x74, 0x2c, 0x72, 0x2c, 0x61, + 0x29, 0x7d, 0x29, 0x2c, 0x64, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, + 0x63, 0x68, 0x28, 0x66, 0x29, 0x2c, 0x73, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x28, 0x6e, 0x2c, 0x65, + 0x29, 0x7b, 0x69, 0x66, 0x28, 0x65, 0x3e, 0x3d, 0x69, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x5b, + 0x5d, 0x2c, 0x75, 0x3d, 0x6f, 0x5b, 0x65, 0x2b, 0x2b, 0x5d, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x66, 0x6f, + 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x75, 0x29, 0x7b, 0x72, 0x2e, + 0x70, 0x75, 0x73, 0x68, 0x28, 0x7b, 0x6b, 0x65, 0x79, 0x3a, 0x6e, + 0x2c, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x3a, 0x74, 0x28, 0x75, + 0x2c, 0x65, 0x29, 0x7d, 0x29, 0x7d, 0x29, 0x2c, 0x75, 0x3f, 0x72, + 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x28, 0x6e, 0x2e, 0x6b, 0x65, + 0x79, 0x2c, 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x29, 0x7d, 0x29, 0x3a, + 0x72, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x65, 0x2c, 0x72, 0x2c, 0x75, + 0x3d, 0x7b, 0x7d, 0x2c, 0x69, 0x3d, 0x5b, 0x5d, 0x2c, 0x6f, 0x3d, + 0x5b, 0x5d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, + 0x2e, 0x6d, 0x61, 0x70, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x28, 0x65, 0x2c, 0x74, 0x2c, 0x30, + 0x29, 0x7d, 0x2c, 0x75, 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x28, 0x6e, 0x28, 0x74, 0x61, 0x2e, 0x6d, 0x61, 0x70, 0x2c, 0x65, + 0x2c, 0x30, 0x29, 0x2c, 0x30, 0x29, 0x7d, 0x2c, 0x75, 0x2e, 0x6b, + 0x65, 0x79, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x69, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x6e, 0x29, 0x2c, 0x75, + 0x7d, 0x2c, 0x75, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x4b, 0x65, 0x79, + 0x73, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, + 0x5b, 0x69, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, + 0x5d, 0x3d, 0x6e, 0x2c, 0x75, 0x7d, 0x2c, 0x75, 0x2e, 0x73, 0x6f, + 0x72, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x3d, 0x6e, 0x2c, 0x75, + 0x7d, 0x2c, 0x75, 0x2e, 0x72, 0x6f, 0x6c, 0x6c, 0x75, 0x70, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x3d, 0x6e, + 0x2c, 0x75, 0x7d, 0x2c, 0x75, 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x73, + 0x65, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x6e, + 0x65, 0x77, 0x20, 0x6d, 0x3b, 0x69, 0x66, 0x28, 0x6e, 0x29, 0x66, + 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x30, 0x2c, + 0x72, 0x3d, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, + 0x72, 0x3e, 0x65, 0x3b, 0x2b, 0x2b, 0x65, 0x29, 0x74, 0x2e, 0x61, + 0x64, 0x64, 0x28, 0x6e, 0x5b, 0x65, 0x5d, 0x29, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x7d, 0x2c, 0x63, 0x28, 0x6d, + 0x2c, 0x7b, 0x68, 0x61, 0x73, 0x3a, 0x68, 0x2c, 0x61, 0x64, 0x64, + 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x5f, 0x5b, 0x73, 0x28, 0x6e, 0x2b, 0x3d, 0x22, + 0x22, 0x29, 0x5d, 0x3d, 0x21, 0x30, 0x2c, 0x6e, 0x7d, 0x2c, 0x72, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x3a, 0x67, 0x2c, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x3a, 0x70, 0x2c, 0x73, 0x69, 0x7a, 0x65, 0x3a, + 0x76, 0x2c, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x3a, 0x64, 0x2c, 0x66, + 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x3a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x6f, 0x72, + 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x29, 0x6e, 0x2e, 0x63, 0x61, 0x6c, + 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x66, 0x28, 0x74, 0x29, + 0x29, 0x7d, 0x7d, 0x29, 0x2c, 0x74, 0x61, 0x2e, 0x62, 0x65, 0x68, + 0x61, 0x76, 0x69, 0x6f, 0x72, 0x3d, 0x7b, 0x7d, 0x2c, 0x74, 0x61, + 0x2e, 0x72, 0x65, 0x62, 0x69, 0x6e, 0x64, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, + 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x65, 0x2c, 0x72, + 0x3d, 0x31, 0x2c, 0x75, 0x3d, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, + 0x2b, 0x2b, 0x72, 0x3c, 0x75, 0x3b, 0x29, 0x6e, 0x5b, 0x65, 0x3d, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5b, 0x72, + 0x5d, 0x5d, 0x3d, 0x4d, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x74, 0x5b, + 0x65, 0x5d, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x64, 0x61, 0x3d, 0x5b, + 0x22, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x22, 0x2c, 0x22, 0x6d, + 0x73, 0x22, 0x2c, 0x22, 0x6d, 0x6f, 0x7a, 0x22, 0x2c, 0x22, 0x4d, + 0x6f, 0x7a, 0x22, 0x2c, 0x22, 0x6f, 0x22, 0x2c, 0x22, 0x4f, 0x22, + 0x5d, 0x3b, 0x74, 0x61, 0x2e, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, + 0x63, 0x68, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, + 0x6e, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x5f, 0x2c, 0x74, 0x3d, 0x2d, + 0x31, 0x2c, 0x65, 0x3d, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x2b, + 0x2b, 0x74, 0x3c, 0x65, 0x3b, 0x29, 0x6e, 0x5b, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5b, 0x74, 0x5d, 0x5d, 0x3d, + 0x77, 0x28, 0x6e, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6e, 0x7d, 0x2c, 0x5f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x74, 0x79, 0x70, 0x65, 0x2e, 0x6f, 0x6e, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x6e, 0x2e, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x4f, 0x66, 0x28, 0x22, 0x2e, 0x22, 0x29, 0x2c, 0x72, + 0x3d, 0x22, 0x22, 0x3b, 0x69, 0x66, 0x28, 0x65, 0x3e, 0x3d, 0x30, + 0x26, 0x26, 0x28, 0x72, 0x3d, 0x6e, 0x2e, 0x73, 0x6c, 0x69, 0x63, + 0x65, 0x28, 0x65, 0x2b, 0x31, 0x29, 0x2c, 0x6e, 0x3d, 0x6e, 0x2e, + 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x30, 0x2c, 0x65, 0x29, 0x29, + 0x2c, 0x6e, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3c, 0x32, 0x3f, 0x74, 0x68, 0x69, 0x73, + 0x5b, 0x6e, 0x5d, 0x2e, 0x6f, 0x6e, 0x28, 0x72, 0x29, 0x3a, 0x74, + 0x68, 0x69, 0x73, 0x5b, 0x6e, 0x5d, 0x2e, 0x6f, 0x6e, 0x28, 0x72, + 0x2c, 0x74, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x32, 0x3d, 0x3d, 0x3d, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x6e, + 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x74, 0x29, 0x66, 0x6f, 0x72, 0x28, + 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x29, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x68, 0x61, 0x73, 0x4f, 0x77, 0x6e, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x6e, 0x29, 0x26, + 0x26, 0x74, 0x68, 0x69, 0x73, 0x5b, 0x6e, 0x5d, 0x2e, 0x6f, 0x6e, + 0x28, 0x72, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x7d, 0x7d, + 0x2c, 0x74, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x6e, + 0x75, 0x6c, 0x6c, 0x2c, 0x74, 0x61, 0x2e, 0x72, 0x65, 0x71, 0x75, + 0x6f, 0x74, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6e, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, + 0x6d, 0x61, 0x2c, 0x22, 0x5c, 0x5c, 0x24, 0x26, 0x22, 0x29, 0x7d, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x6d, 0x61, 0x3d, 0x2f, 0x5b, 0x5c, + 0x5c, 0x5c, 0x5e, 0x5c, 0x24, 0x5c, 0x2a, 0x5c, 0x2b, 0x5c, 0x3f, + 0x5c, 0x7c, 0x5c, 0x5b, 0x5c, 0x5d, 0x5c, 0x28, 0x5c, 0x29, 0x5c, + 0x2e, 0x5c, 0x7b, 0x5c, 0x7d, 0x5d, 0x2f, 0x67, 0x2c, 0x79, 0x61, + 0x3d, 0x7b, 0x7d, 0x2e, 0x5f, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x5f, 0x5f, 0x3f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x6e, 0x2e, 0x5f, 0x5f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x5f, 0x5f, 0x3d, 0x74, 0x7d, 0x3a, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, + 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x65, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x29, 0x6e, 0x5b, 0x65, 0x5d, 0x3d, + 0x74, 0x5b, 0x65, 0x5d, 0x7d, 0x2c, 0x4d, 0x61, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x28, 0x6e, 0x29, 0x7d, 0x2c, 0x78, 0x61, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x41, 0x6c, 0x6c, 0x28, 0x6e, 0x29, 0x7d, 0x2c, 0x62, 0x61, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x2c, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x6e, + 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x7c, 0x7c, 0x6e, + 0x5b, 0x78, 0x28, 0x6e, 0x2c, 0x22, 0x6d, 0x61, 0x74, 0x63, 0x68, + 0x65, 0x73, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, + 0x29, 0x5d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x62, + 0x61, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x65, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6e, 0x2c, 0x74, + 0x29, 0x7d, 0x29, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7d, 0x3b, 0x22, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3d, 0x3d, + 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x53, 0x69, 0x7a, 0x7a, + 0x6c, 0x65, 0x26, 0x26, 0x28, 0x4d, 0x61, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x53, 0x69, 0x7a, 0x7a, + 0x6c, 0x65, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x5b, 0x30, 0x5d, 0x7c, + 0x7c, 0x6e, 0x75, 0x6c, 0x6c, 0x7d, 0x2c, 0x78, 0x61, 0x3d, 0x53, + 0x69, 0x7a, 0x7a, 0x6c, 0x65, 0x2c, 0x62, 0x61, 0x3d, 0x53, 0x69, + 0x7a, 0x7a, 0x6c, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, + 0x73, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x29, 0x2c, + 0x74, 0x61, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, + 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x75, 0x61, 0x2e, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x29, 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x5f, 0x61, 0x3d, 0x74, 0x61, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, + 0x79, 0x70, 0x65, 0x3d, 0x5b, 0x5d, 0x3b, 0x5f, 0x61, 0x2e, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x75, 0x2c, 0x69, 0x3d, 0x5b, + 0x5d, 0x3b, 0x6e, 0x3d, 0x4e, 0x28, 0x6e, 0x29, 0x3b, 0x66, 0x6f, + 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x6f, 0x3d, 0x2d, 0x31, 0x2c, + 0x61, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3b, 0x2b, 0x2b, 0x6f, 0x3c, 0x61, 0x3b, 0x29, 0x7b, + 0x69, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x74, 0x3d, 0x5b, 0x5d, + 0x29, 0x2c, 0x74, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x3d, 0x28, 0x72, 0x3d, 0x74, 0x68, 0x69, 0x73, + 0x5b, 0x6f, 0x5d, 0x29, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x4e, 0x6f, 0x64, 0x65, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, + 0x72, 0x20, 0x63, 0x3d, 0x2d, 0x31, 0x2c, 0x6c, 0x3d, 0x72, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x2b, 0x2b, 0x63, 0x3c, + 0x6c, 0x3b, 0x29, 0x28, 0x75, 0x3d, 0x72, 0x5b, 0x63, 0x5d, 0x29, + 0x3f, 0x28, 0x74, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x65, 0x3d, + 0x6e, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x75, 0x2c, 0x75, 0x2e, + 0x5f, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x5f, 0x2c, 0x63, 0x2c, + 0x6f, 0x29, 0x29, 0x2c, 0x65, 0x26, 0x26, 0x22, 0x5f, 0x5f, 0x64, + 0x61, 0x74, 0x61, 0x5f, 0x5f, 0x22, 0x69, 0x6e, 0x20, 0x75, 0x26, + 0x26, 0x28, 0x65, 0x2e, 0x5f, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, + 0x5f, 0x3d, 0x75, 0x2e, 0x5f, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, + 0x5f, 0x29, 0x29, 0x3a, 0x74, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, + 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x41, 0x28, 0x69, 0x29, 0x7d, 0x2c, 0x5f, 0x61, 0x2e, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x41, 0x6c, 0x6c, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x3d, 0x5b, + 0x5d, 0x3b, 0x6e, 0x3d, 0x43, 0x28, 0x6e, 0x29, 0x3b, 0x66, 0x6f, + 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x75, 0x3d, 0x2d, 0x31, 0x2c, + 0x69, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3b, 0x2b, 0x2b, 0x75, 0x3c, 0x69, 0x3b, 0x29, 0x66, + 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x6f, 0x3d, 0x74, 0x68, + 0x69, 0x73, 0x5b, 0x75, 0x5d, 0x2c, 0x61, 0x3d, 0x2d, 0x31, 0x2c, + 0x63, 0x3d, 0x6f, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, + 0x2b, 0x2b, 0x61, 0x3c, 0x63, 0x3b, 0x29, 0x28, 0x65, 0x3d, 0x6f, + 0x5b, 0x61, 0x5d, 0x29, 0x26, 0x26, 0x28, 0x72, 0x2e, 0x70, 0x75, + 0x73, 0x68, 0x28, 0x74, 0x3d, 0x72, 0x61, 0x28, 0x6e, 0x2e, 0x63, + 0x61, 0x6c, 0x6c, 0x28, 0x65, 0x2c, 0x65, 0x2e, 0x5f, 0x5f, 0x64, + 0x61, 0x74, 0x61, 0x5f, 0x5f, 0x2c, 0x61, 0x2c, 0x75, 0x29, 0x29, + 0x29, 0x2c, 0x74, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x3d, 0x65, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x41, 0x28, 0x72, 0x29, 0x7d, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x77, 0x61, 0x3d, 0x7b, 0x73, 0x76, 0x67, 0x3a, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, + 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x32, 0x30, 0x30, 0x30, + 0x2f, 0x73, 0x76, 0x67, 0x22, 0x2c, 0x78, 0x68, 0x74, 0x6d, 0x6c, + 0x3a, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, + 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, + 0x39, 0x39, 0x2f, 0x78, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x2c, 0x78, + 0x6c, 0x69, 0x6e, 0x6b, 0x3a, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, + 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x78, 0x6c, 0x69, 0x6e, + 0x6b, 0x22, 0x2c, 0x78, 0x6d, 0x6c, 0x3a, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, + 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x31, 0x39, 0x39, + 0x38, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x22, 0x2c, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, + 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x32, 0x30, 0x30, 0x30, 0x2f, 0x78, + 0x6d, 0x6c, 0x6e, 0x73, 0x2f, 0x22, 0x7d, 0x3b, 0x74, 0x61, 0x2e, + 0x6e, 0x73, 0x3d, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x3a, + 0x77, 0x61, 0x2c, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x79, 0x3a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, + 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x6e, 0x2e, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x22, 0x3a, 0x22, 0x29, 0x2c, + 0x65, 0x3d, 0x6e, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x3e, 0x3d, 0x30, 0x26, 0x26, 0x28, 0x65, 0x3d, 0x6e, 0x2e, + 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x30, 0x2c, 0x74, 0x29, 0x2c, + 0x6e, 0x3d, 0x6e, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x74, + 0x2b, 0x31, 0x29, 0x29, 0x2c, 0x77, 0x61, 0x2e, 0x68, 0x61, 0x73, + 0x4f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x28, 0x65, 0x29, 0x3f, 0x7b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3a, + 0x77, 0x61, 0x5b, 0x65, 0x5d, 0x2c, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x3a, 0x6e, 0x7d, 0x3a, 0x6e, 0x7d, 0x7d, 0x2c, 0x5f, 0x61, 0x2e, + 0x61, 0x74, 0x74, 0x72, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x69, 0x66, 0x28, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3c, 0x32, 0x29, 0x7b, 0x69, 0x66, + 0x28, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x3d, 0x3d, + 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x6e, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6e, + 0x6f, 0x64, 0x65, 0x28, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x3d, 0x74, 0x61, 0x2e, 0x6e, 0x73, 0x2e, 0x71, + 0x75, 0x61, 0x6c, 0x69, 0x66, 0x79, 0x28, 0x6e, 0x29, 0x2c, 0x6e, + 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x3f, 0x65, 0x2e, 0x67, 0x65, + 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x4e, + 0x53, 0x28, 0x6e, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2c, 0x6e, + 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x29, 0x3a, 0x65, 0x2e, 0x67, + 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, + 0x28, 0x6e, 0x29, 0x7d, 0x66, 0x6f, 0x72, 0x28, 0x74, 0x20, 0x69, + 0x6e, 0x20, 0x6e, 0x29, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x61, + 0x63, 0x68, 0x28, 0x7a, 0x28, 0x74, 0x2c, 0x6e, 0x5b, 0x74, 0x5d, + 0x29, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x61, 0x63, 0x68, 0x28, 0x7a, + 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x29, 0x7d, 0x2c, 0x5f, 0x61, 0x2e, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x64, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, + 0x69, 0x66, 0x28, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3c, 0x32, 0x29, + 0x7b, 0x69, 0x66, 0x28, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x6e, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x28, 0x29, 0x2c, 0x72, 0x3d, + 0x28, 0x6e, 0x3d, 0x54, 0x28, 0x6e, 0x29, 0x29, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x75, 0x3d, 0x2d, 0x31, 0x3b, 0x69, + 0x66, 0x28, 0x74, 0x3d, 0x65, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x4c, 0x69, 0x73, 0x74, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x3b, + 0x2b, 0x2b, 0x75, 0x3c, 0x72, 0x3b, 0x29, 0x69, 0x66, 0x28, 0x21, + 0x74, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x28, + 0x6e, 0x5b, 0x75, 0x5d, 0x29, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x21, 0x31, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x66, 0x6f, + 0x72, 0x28, 0x74, 0x3d, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x22, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x22, 0x29, 0x3b, 0x2b, 0x2b, 0x75, 0x3c, 0x72, + 0x3b, 0x29, 0x69, 0x66, 0x28, 0x21, 0x4c, 0x28, 0x6e, 0x5b, 0x75, + 0x5d, 0x29, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x28, 0x74, 0x29, 0x29, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x21, 0x31, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x21, 0x30, 0x7d, 0x66, 0x6f, 0x72, 0x28, + 0x74, 0x20, 0x69, 0x6e, 0x20, 0x6e, 0x29, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x65, 0x61, 0x63, 0x68, 0x28, 0x52, 0x28, 0x74, 0x2c, 0x6e, + 0x5b, 0x74, 0x5d, 0x29, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x7d, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x61, 0x63, + 0x68, 0x28, 0x52, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x29, 0x7d, 0x2c, + 0x5f, 0x61, 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x65, 0x2c, + 0x72, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x75, 0x3d, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3b, 0x69, 0x66, 0x28, 0x33, 0x3e, 0x75, 0x29, + 0x7b, 0x69, 0x66, 0x28, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0x21, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x6e, + 0x29, 0x7b, 0x32, 0x3e, 0x75, 0x26, 0x26, 0x28, 0x65, 0x3d, 0x22, + 0x22, 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x72, 0x20, 0x69, 0x6e, + 0x20, 0x6e, 0x29, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x61, 0x63, + 0x68, 0x28, 0x50, 0x28, 0x72, 0x2c, 0x6e, 0x5b, 0x72, 0x5d, 0x2c, + 0x65, 0x29, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x7d, 0x69, 0x66, 0x28, 0x32, 0x3e, 0x75, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x28, 0x29, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x28, 0x69, 0x29, 0x2e, 0x67, + 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x53, + 0x74, 0x79, 0x6c, 0x65, 0x28, 0x69, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, + 0x29, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x6e, 0x29, 0x7d, + 0x72, 0x3d, 0x22, 0x22, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x61, 0x63, 0x68, 0x28, + 0x50, 0x28, 0x6e, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x29, 0x7d, 0x2c, + 0x5f, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x2c, 0x74, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3c, 0x32, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, 0x65, + 0x6f, 0x66, 0x20, 0x6e, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x28, + 0x29, 0x5b, 0x6e, 0x5d, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x74, 0x20, + 0x69, 0x6e, 0x20, 0x6e, 0x29, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, + 0x61, 0x63, 0x68, 0x28, 0x55, 0x28, 0x74, 0x2c, 0x6e, 0x5b, 0x74, + 0x5d, 0x29, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x61, 0x63, 0x68, 0x28, + 0x55, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x29, 0x7d, 0x2c, 0x5f, 0x61, + 0x2e, 0x74, 0x65, 0x78, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x65, 0x61, 0x63, 0x68, 0x28, 0x22, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3d, 0x3d, 0x74, 0x79, + 0x70, 0x65, 0x6f, 0x66, 0x20, 0x6e, 0x3f, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x74, 0x3d, 0x6e, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x74, 0x65, + 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x6e, + 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x74, 0x3f, 0x22, 0x22, 0x3a, 0x74, + 0x7d, 0x3a, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x6e, 0x3f, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x22, 0x7d, 0x3a, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x3d, 0x6e, 0x7d, 0x29, 0x3a, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x28, 0x29, 0x2e, 0x74, 0x65, + 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x7d, 0x2c, + 0x5f, 0x61, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x61, 0x63, 0x68, 0x28, 0x22, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3d, 0x3d, + 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x6e, 0x3f, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x74, 0x3d, 0x6e, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, + 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x6e, + 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x74, 0x3f, 0x22, 0x22, 0x3a, 0x74, + 0x7d, 0x3a, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x6e, 0x3f, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, + 0x4d, 0x4c, 0x3d, 0x22, 0x22, 0x7d, 0x3a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, + 0x6e, 0x7d, 0x29, 0x3a, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6e, 0x6f, + 0x64, 0x65, 0x28, 0x29, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, + 0x54, 0x4d, 0x4c, 0x7d, 0x2c, 0x5f, 0x61, 0x2e, 0x61, 0x70, 0x70, + 0x65, 0x6e, 0x64, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6e, 0x3d, 0x6a, 0x28, 0x6e, 0x29, 0x2c, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, + 0x70, 0x70, 0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, + 0x6e, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x29, 0x29, 0x7d, 0x29, 0x7d, 0x2c, 0x5f, 0x61, 0x2e, 0x69, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x3d, 0x6a, 0x28, 0x6e, 0x29, 0x2c, + 0x74, 0x3d, 0x4e, 0x28, 0x74, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x28, + 0x6e, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x29, 0x2c, 0x74, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x29, 0x7c, 0x7c, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x7d, + 0x29, 0x7d, 0x2c, 0x5f, 0x61, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x65, 0x61, 0x63, 0x68, 0x28, 0x46, 0x29, 0x7d, + 0x2c, 0x5f, 0x61, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, + 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, + 0x28, 0x6e, 0x2c, 0x65, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, + 0x2c, 0x75, 0x2c, 0x69, 0x2c, 0x6f, 0x3d, 0x6e, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x66, 0x3d, 0x65, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x68, 0x3d, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x6f, 0x2c, 0x66, 0x29, 0x2c, 0x67, + 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, + 0x66, 0x29, 0x2c, 0x70, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, + 0x72, 0x61, 0x79, 0x28, 0x66, 0x29, 0x2c, 0x76, 0x3d, 0x6e, 0x65, + 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x6f, 0x29, 0x3b, + 0x69, 0x66, 0x28, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x64, + 0x2c, 0x6d, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x6c, 0x2c, 0x79, 0x3d, + 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x6f, + 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x72, 0x3d, 0x2d, 0x31, 0x3b, + 0x2b, 0x2b, 0x72, 0x3c, 0x6f, 0x3b, 0x29, 0x6d, 0x2e, 0x68, 0x61, + 0x73, 0x28, 0x64, 0x3d, 0x74, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, + 0x75, 0x3d, 0x6e, 0x5b, 0x72, 0x5d, 0x2c, 0x75, 0x2e, 0x5f, 0x5f, + 0x64, 0x61, 0x74, 0x61, 0x5f, 0x5f, 0x2c, 0x72, 0x29, 0x29, 0x3f, + 0x76, 0x5b, 0x72, 0x5d, 0x3d, 0x75, 0x3a, 0x6d, 0x2e, 0x73, 0x65, + 0x74, 0x28, 0x64, 0x2c, 0x75, 0x29, 0x2c, 0x79, 0x5b, 0x72, 0x5d, + 0x3d, 0x64, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x72, 0x3d, 0x2d, 0x31, + 0x3b, 0x2b, 0x2b, 0x72, 0x3c, 0x66, 0x3b, 0x29, 0x28, 0x75, 0x3d, + 0x6d, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x64, 0x3d, 0x74, 0x2e, 0x63, + 0x61, 0x6c, 0x6c, 0x28, 0x65, 0x2c, 0x69, 0x3d, 0x65, 0x5b, 0x72, + 0x5d, 0x2c, 0x72, 0x29, 0x29, 0x29, 0x3f, 0x75, 0x21, 0x3d, 0x3d, + 0x21, 0x30, 0x26, 0x26, 0x28, 0x67, 0x5b, 0x72, 0x5d, 0x3d, 0x75, + 0x2c, 0x75, 0x2e, 0x5f, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x5f, + 0x3d, 0x69, 0x29, 0x3a, 0x70, 0x5b, 0x72, 0x5d, 0x3d, 0x48, 0x28, + 0x69, 0x29, 0x2c, 0x6d, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x64, 0x2c, + 0x21, 0x30, 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x72, 0x3d, 0x2d, + 0x31, 0x3b, 0x2b, 0x2b, 0x72, 0x3c, 0x6f, 0x3b, 0x29, 0x6d, 0x2e, + 0x67, 0x65, 0x74, 0x28, 0x79, 0x5b, 0x72, 0x5d, 0x29, 0x21, 0x3d, + 0x3d, 0x21, 0x30, 0x26, 0x26, 0x28, 0x76, 0x5b, 0x72, 0x5d, 0x3d, + 0x6e, 0x5b, 0x72, 0x5d, 0x29, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, + 0x66, 0x6f, 0x72, 0x28, 0x72, 0x3d, 0x2d, 0x31, 0x3b, 0x2b, 0x2b, + 0x72, 0x3c, 0x68, 0x3b, 0x29, 0x75, 0x3d, 0x6e, 0x5b, 0x72, 0x5d, + 0x2c, 0x69, 0x3d, 0x65, 0x5b, 0x72, 0x5d, 0x2c, 0x75, 0x3f, 0x28, + 0x75, 0x2e, 0x5f, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x5f, 0x3d, + 0x69, 0x2c, 0x67, 0x5b, 0x72, 0x5d, 0x3d, 0x75, 0x29, 0x3a, 0x70, + 0x5b, 0x72, 0x5d, 0x3d, 0x48, 0x28, 0x69, 0x29, 0x3b, 0x66, 0x6f, + 0x72, 0x28, 0x3b, 0x66, 0x3e, 0x72, 0x3b, 0x2b, 0x2b, 0x72, 0x29, + 0x70, 0x5b, 0x72, 0x5d, 0x3d, 0x48, 0x28, 0x65, 0x5b, 0x72, 0x5d, + 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x3b, 0x6f, 0x3e, 0x72, 0x3b, + 0x2b, 0x2b, 0x72, 0x29, 0x76, 0x5b, 0x72, 0x5d, 0x3d, 0x6e, 0x5b, + 0x72, 0x5d, 0x7d, 0x70, 0x2e, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x3d, 0x67, 0x2c, 0x70, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x4e, 0x6f, 0x64, 0x65, 0x3d, 0x67, 0x2e, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x3d, 0x76, 0x2e, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x3d, 0x6e, 0x2e, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x2c, + 0x61, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x70, 0x29, 0x2c, 0x63, + 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x67, 0x29, 0x2c, 0x73, 0x2e, + 0x70, 0x75, 0x73, 0x68, 0x28, 0x76, 0x29, 0x7d, 0x76, 0x61, 0x72, + 0x20, 0x72, 0x2c, 0x75, 0x2c, 0x69, 0x3d, 0x2d, 0x31, 0x2c, 0x6f, + 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x6e, 0x3d, 0x6e, 0x65, 0x77, + 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x6f, 0x3d, 0x28, 0x72, + 0x3d, 0x74, 0x68, 0x69, 0x73, 0x5b, 0x30, 0x5d, 0x29, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x3b, 0x2b, 0x2b, 0x69, 0x3c, + 0x6f, 0x3b, 0x29, 0x28, 0x75, 0x3d, 0x72, 0x5b, 0x69, 0x5d, 0x29, + 0x26, 0x26, 0x28, 0x6e, 0x5b, 0x69, 0x5d, 0x3d, 0x75, 0x2e, 0x5f, + 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x5f, 0x29, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x7d, 0x76, 0x61, 0x72, 0x20, + 0x61, 0x3d, 0x5a, 0x28, 0x5b, 0x5d, 0x29, 0x2c, 0x63, 0x3d, 0x41, + 0x28, 0x5b, 0x5d, 0x29, 0x2c, 0x73, 0x3d, 0x41, 0x28, 0x5b, 0x5d, + 0x29, 0x3b, 0x69, 0x66, 0x28, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, + 0x66, 0x20, 0x6e, 0x29, 0x66, 0x6f, 0x72, 0x28, 0x3b, 0x2b, 0x2b, + 0x69, 0x3c, 0x6f, 0x3b, 0x29, 0x65, 0x28, 0x72, 0x3d, 0x74, 0x68, + 0x69, 0x73, 0x5b, 0x69, 0x5d, 0x2c, 0x6e, 0x2e, 0x63, 0x61, 0x6c, + 0x6c, 0x28, 0x72, 0x2c, 0x72, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x2e, 0x5f, 0x5f, 0x64, 0x61, 0x74, + 0x61, 0x5f, 0x5f, 0x2c, 0x69, 0x29, 0x29, 0x3b, 0x65, 0x6c, 0x73, + 0x65, 0x20, 0x66, 0x6f, 0x72, 0x28, 0x3b, 0x2b, 0x2b, 0x69, 0x3c, + 0x6f, 0x3b, 0x29, 0x65, 0x28, 0x72, 0x3d, 0x74, 0x68, 0x69, 0x73, + 0x5b, 0x69, 0x5d, 0x2c, 0x6e, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x63, 0x2e, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x7d, 0x2c, 0x63, + 0x2e, 0x65, 0x78, 0x69, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x73, 0x7d, 0x2c, 0x63, 0x7d, 0x2c, 0x5f, 0x61, 0x2e, + 0x64, 0x61, 0x74, 0x75, 0x6d, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x28, 0x22, 0x5f, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x5f, 0x22, + 0x2c, 0x6e, 0x29, 0x3a, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x22, 0x5f, 0x5f, 0x64, + 0x61, 0x74, 0x61, 0x5f, 0x5f, 0x22, 0x29, 0x7d, 0x2c, 0x5f, 0x61, + 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x75, 0x3d, 0x5b, + 0x5d, 0x3b, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x21, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x6e, + 0x26, 0x26, 0x28, 0x6e, 0x3d, 0x4f, 0x28, 0x6e, 0x29, 0x29, 0x3b, + 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, 0x30, + 0x2c, 0x6f, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3b, 0x6f, 0x3e, 0x69, 0x3b, 0x69, 0x2b, 0x2b, + 0x29, 0x7b, 0x75, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x74, 0x3d, + 0x5b, 0x5d, 0x29, 0x2c, 0x74, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x3d, 0x28, 0x65, 0x3d, 0x74, 0x68, + 0x69, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0x2e, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x3b, 0x66, 0x6f, 0x72, 0x28, + 0x76, 0x61, 0x72, 0x20, 0x61, 0x3d, 0x30, 0x2c, 0x63, 0x3d, 0x65, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x63, 0x3e, 0x61, + 0x3b, 0x61, 0x2b, 0x2b, 0x29, 0x28, 0x72, 0x3d, 0x65, 0x5b, 0x61, + 0x5d, 0x29, 0x26, 0x26, 0x6e, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, + 0x72, 0x2c, 0x72, 0x2e, 0x5f, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, + 0x5f, 0x2c, 0x61, 0x2c, 0x69, 0x29, 0x26, 0x26, 0x74, 0x2e, 0x70, + 0x75, 0x73, 0x68, 0x28, 0x72, 0x29, 0x7d, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x41, 0x28, 0x75, 0x29, 0x7d, 0x2c, 0x5f, 0x61, + 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, + 0x76, 0x61, 0x72, 0x20, 0x6e, 0x3d, 0x2d, 0x31, 0x2c, 0x74, 0x3d, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3b, 0x2b, 0x2b, 0x6e, 0x3c, 0x74, 0x3b, 0x29, 0x66, 0x6f, 0x72, + 0x28, 0x76, 0x61, 0x72, 0x20, 0x65, 0x2c, 0x72, 0x3d, 0x74, 0x68, + 0x69, 0x73, 0x5b, 0x6e, 0x5d, 0x2c, 0x75, 0x3d, 0x72, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, 0x2c, 0x69, 0x3d, 0x72, + 0x5b, 0x75, 0x5d, 0x3b, 0x2d, 0x2d, 0x75, 0x3e, 0x3d, 0x30, 0x3b, + 0x29, 0x28, 0x65, 0x3d, 0x72, 0x5b, 0x75, 0x5d, 0x29, 0x26, 0x26, + 0x28, 0x69, 0x26, 0x26, 0x69, 0x21, 0x3d, 0x3d, 0x65, 0x2e, 0x6e, + 0x65, 0x78, 0x74, 0x53, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x26, + 0x26, 0x69, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x6f, + 0x64, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x42, 0x65, + 0x66, 0x6f, 0x72, 0x65, 0x28, 0x65, 0x2c, 0x69, 0x29, 0x2c, 0x69, + 0x3d, 0x65, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x7d, 0x2c, 0x5f, 0x61, 0x2e, 0x73, 0x6f, + 0x72, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6e, 0x29, 0x7b, 0x6e, 0x3d, 0x49, 0x2e, 0x61, 0x70, 0x70, + 0x6c, 0x79, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x3b, 0x66, 0x6f, 0x72, + 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x2d, 0x31, 0x2c, 0x65, + 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3b, 0x2b, 0x2b, 0x74, 0x3c, 0x65, 0x3b, 0x29, 0x74, 0x68, + 0x69, 0x73, 0x5b, 0x74, 0x5d, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x28, + 0x6e, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x28, 0x29, + 0x7d, 0x2c, 0x5f, 0x61, 0x2e, 0x65, 0x61, 0x63, 0x68, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x59, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x6e, 0x2e, 0x63, + 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x2c, 0x74, 0x2e, 0x5f, 0x5f, 0x64, + 0x61, 0x74, 0x61, 0x5f, 0x5f, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x7d, + 0x29, 0x7d, 0x2c, 0x5f, 0x61, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, + 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x72, 0x61, 0x28, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x61, 0x70, 0x70, + 0x6c, 0x79, 0x28, 0x74, 0x5b, 0x30, 0x5d, 0x3d, 0x74, 0x68, 0x69, + 0x73, 0x2c, 0x74, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x7d, 0x2c, + 0x5f, 0x61, 0x2e, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6e, + 0x6f, 0x64, 0x65, 0x28, 0x29, 0x7d, 0x2c, 0x5f, 0x61, 0x2e, 0x6e, + 0x6f, 0x64, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, + 0x20, 0x6e, 0x3d, 0x30, 0x2c, 0x74, 0x3d, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x74, 0x3e, 0x6e, + 0x3b, 0x6e, 0x2b, 0x2b, 0x29, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, + 0x72, 0x20, 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x5b, 0x6e, 0x5d, + 0x2c, 0x72, 0x3d, 0x30, 0x2c, 0x75, 0x3d, 0x65, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x75, 0x3e, 0x72, 0x3b, 0x72, 0x2b, + 0x2b, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, 0x65, 0x5b, + 0x72, 0x5d, 0x3b, 0x69, 0x66, 0x28, 0x69, 0x29, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x69, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x7d, 0x2c, 0x5f, 0x61, 0x2e, + 0x73, 0x69, 0x7a, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6e, 0x3d, + 0x30, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x59, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x2b, 0x2b, 0x6e, 0x7d, 0x29, 0x2c, + 0x6e, 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x53, 0x61, 0x3d, 0x5b, + 0x5d, 0x3b, 0x74, 0x61, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x5a, + 0x2c, 0x74, 0x61, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x53, 0x61, 0x2c, + 0x53, 0x61, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x3d, 0x5f, + 0x61, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x2c, 0x53, 0x61, + 0x2e, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x3d, 0x5f, 0x61, 0x2e, 0x65, + 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x53, 0x61, 0x2e, 0x6e, 0x6f, 0x64, + 0x65, 0x3d, 0x5f, 0x61, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x53, + 0x61, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x3d, 0x5f, 0x61, 0x2e, 0x63, + 0x61, 0x6c, 0x6c, 0x2c, 0x53, 0x61, 0x2e, 0x73, 0x69, 0x7a, 0x65, + 0x3d, 0x5f, 0x61, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x53, 0x61, + 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x6f, + 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x2c, 0x65, 0x2c, 0x72, + 0x2c, 0x75, 0x2c, 0x69, 0x2c, 0x6f, 0x3d, 0x5b, 0x5d, 0x2c, 0x61, + 0x3d, 0x2d, 0x31, 0x2c, 0x63, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x2b, 0x2b, 0x61, 0x3c, + 0x63, 0x3b, 0x29, 0x7b, 0x72, 0x3d, 0x28, 0x75, 0x3d, 0x74, 0x68, + 0x69, 0x73, 0x5b, 0x61, 0x5d, 0x29, 0x2e, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x2c, 0x6f, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x74, + 0x3d, 0x5b, 0x5d, 0x29, 0x2c, 0x74, 0x2e, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x3d, 0x75, 0x2e, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x3b, 0x66, 0x6f, + 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x6c, 0x3d, 0x2d, 0x31, 0x2c, + 0x73, 0x3d, 0x75, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, + 0x2b, 0x2b, 0x6c, 0x3c, 0x73, 0x3b, 0x29, 0x28, 0x69, 0x3d, 0x75, + 0x5b, 0x6c, 0x5d, 0x29, 0x3f, 0x28, 0x74, 0x2e, 0x70, 0x75, 0x73, + 0x68, 0x28, 0x72, 0x5b, 0x6c, 0x5d, 0x3d, 0x65, 0x3d, 0x6e, 0x2e, + 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x75, 0x2e, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x2c, 0x69, 0x2e, 0x5f, 0x5f, + 0x64, 0x61, 0x74, 0x61, 0x5f, 0x5f, 0x2c, 0x6c, 0x2c, 0x61, 0x29, + 0x29, 0x2c, 0x65, 0x2e, 0x5f, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, + 0x5f, 0x3d, 0x69, 0x2e, 0x5f, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, + 0x5f, 0x29, 0x3a, 0x74, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x6e, + 0x75, 0x6c, 0x6c, 0x29, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x41, 0x28, 0x6f, 0x29, 0x7d, 0x2c, 0x53, 0x61, 0x2e, 0x69, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3c, + 0x32, 0x26, 0x26, 0x28, 0x74, 0x3d, 0x56, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x29, 0x29, 0x2c, 0x5f, 0x61, 0x2e, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2c, 0x6e, 0x2c, 0x74, 0x29, 0x7d, 0x2c, 0x74, 0x61, 0x2e, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x65, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, + 0x65, 0x6f, 0x66, 0x20, 0x74, 0x3f, 0x28, 0x65, 0x3d, 0x5b, 0x4d, + 0x61, 0x28, 0x74, 0x2c, 0x75, 0x61, 0x29, 0x5d, 0x2c, 0x65, 0x2e, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x3d, + 0x75, 0x61, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x29, 0x3a, 0x28, 0x65, + 0x3d, 0x5b, 0x74, 0x5d, 0x2c, 0x65, 0x2e, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x3d, 0x6e, 0x28, 0x74, 0x29, + 0x29, 0x2c, 0x41, 0x28, 0x5b, 0x65, 0x5d, 0x29, 0x7d, 0x2c, 0x74, + 0x61, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x41, 0x6c, 0x6c, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0x3d, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x6e, 0x3f, + 0x28, 0x74, 0x3d, 0x72, 0x61, 0x28, 0x78, 0x61, 0x28, 0x6e, 0x2c, + 0x75, 0x61, 0x29, 0x29, 0x2c, 0x74, 0x2e, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x3d, 0x75, 0x61, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x29, 0x3a, 0x28, 0x74, 0x3d, 0x6e, 0x2c, 0x74, + 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, + 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x2c, 0x41, 0x28, 0x5b, 0x74, + 0x5d, 0x29, 0x7d, 0x2c, 0x5f, 0x61, 0x2e, 0x6f, 0x6e, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, + 0x2c, 0x65, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x69, 0x66, 0x28, 0x33, 0x3e, 0x72, + 0x29, 0x7b, 0x69, 0x66, 0x28, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0x21, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, + 0x6e, 0x29, 0x7b, 0x32, 0x3e, 0x72, 0x26, 0x26, 0x28, 0x74, 0x3d, + 0x21, 0x31, 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x65, 0x20, 0x69, + 0x6e, 0x20, 0x6e, 0x29, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x61, + 0x63, 0x68, 0x28, 0x58, 0x28, 0x65, 0x2c, 0x6e, 0x5b, 0x65, 0x5d, + 0x2c, 0x74, 0x29, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x7d, 0x69, 0x66, 0x28, 0x32, 0x3e, + 0x72, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x72, 0x3d, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x28, 0x29, + 0x5b, 0x22, 0x5f, 0x5f, 0x6f, 0x6e, 0x22, 0x2b, 0x6e, 0x5d, 0x29, + 0x26, 0x26, 0x72, 0x2e, 0x5f, 0x3b, 0x65, 0x3d, 0x21, 0x31, 0x7d, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x65, 0x61, 0x63, 0x68, 0x28, 0x58, 0x28, 0x6e, 0x2c, 0x74, + 0x2c, 0x65, 0x29, 0x29, 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x6b, + 0x61, 0x3d, 0x74, 0x61, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x7b, 0x6d, + 0x6f, 0x75, 0x73, 0x65, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3a, 0x22, + 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x6f, 0x76, 0x65, 0x72, 0x22, 0x2c, + 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x3a, + 0x22, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x6f, 0x75, 0x74, 0x22, 0x7d, + 0x29, 0x3b, 0x75, 0x61, 0x26, 0x26, 0x6b, 0x61, 0x2e, 0x66, 0x6f, + 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x22, 0x6f, 0x6e, 0x22, + 0x2b, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x75, 0x61, 0x26, 0x26, 0x6b, + 0x61, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x6e, 0x29, + 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x45, 0x61, 0x2c, 0x41, + 0x61, 0x3d, 0x30, 0x3b, 0x74, 0x61, 0x2e, 0x6d, 0x6f, 0x75, 0x73, + 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4a, + 0x28, 0x6e, 0x2c, 0x6b, 0x28, 0x29, 0x29, 0x7d, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x4e, 0x61, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6e, + 0x61, 0x76, 0x69, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x26, 0x26, 0x2f, + 0x57, 0x65, 0x62, 0x4b, 0x69, 0x74, 0x2f, 0x2e, 0x74, 0x65, 0x73, + 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6e, 0x61, 0x76, 0x69, + 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x29, 0x3f, 0x2d, 0x31, 0x3a, 0x30, 0x3b, + 0x74, 0x61, 0x2e, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x2c, + 0x65, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3c, 0x33, 0x26, 0x26, 0x28, 0x65, 0x3d, 0x74, 0x2c, 0x74, 0x3d, + 0x6b, 0x28, 0x29, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, + 0x54, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x73, 0x29, 0x2c, 0x74, 0x29, + 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x72, 0x2c, 0x75, + 0x3d, 0x30, 0x2c, 0x69, 0x3d, 0x74, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3b, 0x69, 0x3e, 0x75, 0x3b, 0x2b, 0x2b, 0x75, 0x29, + 0x69, 0x66, 0x28, 0x28, 0x72, 0x3d, 0x74, 0x5b, 0x75, 0x5d, 0x29, + 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x3d, 0x3d, 0x3d, 0x65, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x4a, 0x28, 0x6e, 0x2c, 0x72, 0x29, 0x7d, 0x2c, 0x74, 0x61, + 0x2e, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x64, + 0x72, 0x61, 0x67, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6e, 0x28, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x6f, 0x6e, 0x28, 0x22, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x64, 0x6f, + 0x77, 0x6e, 0x2e, 0x64, 0x72, 0x61, 0x67, 0x22, 0x2c, 0x69, 0x29, + 0x2e, 0x6f, 0x6e, 0x28, 0x22, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x2e, 0x64, 0x72, 0x61, 0x67, 0x22, 0x2c, + 0x6f, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x65, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x2c, 0x69, 0x2c, + 0x6f, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x28, 0x29, + 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6e, 0x2c, 0x65, 0x2c, 0x72, 0x3d, + 0x74, 0x28, 0x68, 0x2c, 0x76, 0x29, 0x3b, 0x72, 0x26, 0x26, 0x28, + 0x6e, 0x3d, 0x72, 0x5b, 0x30, 0x5d, 0x2d, 0x4d, 0x5b, 0x30, 0x5d, + 0x2c, 0x65, 0x3d, 0x72, 0x5b, 0x31, 0x5d, 0x2d, 0x4d, 0x5b, 0x31, + 0x5d, 0x2c, 0x70, 0x7c, 0x3d, 0x6e, 0x7c, 0x65, 0x2c, 0x4d, 0x3d, + 0x72, 0x2c, 0x67, 0x28, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, + 0x64, 0x72, 0x61, 0x67, 0x22, 0x2c, 0x78, 0x3a, 0x72, 0x5b, 0x30, + 0x5d, 0x2b, 0x6c, 0x5b, 0x30, 0x5d, 0x2c, 0x79, 0x3a, 0x72, 0x5b, + 0x31, 0x5d, 0x2b, 0x6c, 0x5b, 0x31, 0x5d, 0x2c, 0x64, 0x78, 0x3a, + 0x6e, 0x2c, 0x64, 0x79, 0x3a, 0x65, 0x7d, 0x29, 0x29, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x28, 0x29, + 0x7b, 0x74, 0x28, 0x68, 0x2c, 0x76, 0x29, 0x26, 0x26, 0x28, 0x6d, + 0x2e, 0x6f, 0x6e, 0x28, 0x69, 0x2b, 0x64, 0x2c, 0x6e, 0x75, 0x6c, + 0x6c, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x6f, 0x2b, 0x64, 0x2c, 0x6e, + 0x75, 0x6c, 0x6c, 0x29, 0x2c, 0x79, 0x28, 0x70, 0x26, 0x26, 0x74, + 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x3d, 0x3d, 0x3d, 0x66, 0x29, 0x2c, 0x67, 0x28, + 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x64, 0x72, 0x61, 0x67, + 0x65, 0x6e, 0x64, 0x22, 0x7d, 0x29, 0x29, 0x7d, 0x76, 0x61, 0x72, + 0x20, 0x6c, 0x2c, 0x73, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x66, + 0x3d, 0x74, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x2c, 0x68, 0x3d, 0x73, 0x2e, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x2c, 0x67, + 0x3d, 0x72, 0x2e, 0x6f, 0x66, 0x28, 0x73, 0x2c, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x2c, 0x70, 0x3d, 0x30, + 0x2c, 0x76, 0x3d, 0x6e, 0x28, 0x29, 0x2c, 0x64, 0x3d, 0x22, 0x2e, + 0x64, 0x72, 0x61, 0x67, 0x22, 0x2b, 0x28, 0x6e, 0x75, 0x6c, 0x6c, + 0x3d, 0x3d, 0x76, 0x3f, 0x22, 0x22, 0x3a, 0x22, 0x2d, 0x22, 0x2b, + 0x76, 0x29, 0x2c, 0x6d, 0x3d, 0x74, 0x61, 0x2e, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x28, 0x65, 0x28, 0x66, 0x29, 0x29, 0x2e, 0x6f, + 0x6e, 0x28, 0x69, 0x2b, 0x64, 0x2c, 0x61, 0x29, 0x2e, 0x6f, 0x6e, + 0x28, 0x6f, 0x2b, 0x64, 0x2c, 0x63, 0x29, 0x2c, 0x79, 0x3d, 0x57, + 0x28, 0x66, 0x29, 0x2c, 0x4d, 0x3d, 0x74, 0x28, 0x68, 0x2c, 0x76, + 0x29, 0x3b, 0x75, 0x3f, 0x28, 0x6c, 0x3d, 0x75, 0x2e, 0x61, 0x70, + 0x70, 0x6c, 0x79, 0x28, 0x73, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x29, 0x2c, 0x6c, 0x3d, 0x5b, 0x6c, 0x2e, + 0x78, 0x2d, 0x4d, 0x5b, 0x30, 0x5d, 0x2c, 0x6c, 0x2e, 0x79, 0x2d, + 0x4d, 0x5b, 0x31, 0x5d, 0x5d, 0x29, 0x3a, 0x6c, 0x3d, 0x5b, 0x30, + 0x2c, 0x30, 0x5d, 0x2c, 0x67, 0x28, 0x7b, 0x74, 0x79, 0x70, 0x65, + 0x3a, 0x22, 0x64, 0x72, 0x61, 0x67, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x22, 0x7d, 0x29, 0x7d, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, + 0x45, 0x28, 0x6e, 0x2c, 0x22, 0x64, 0x72, 0x61, 0x67, 0x22, 0x2c, + 0x22, 0x64, 0x72, 0x61, 0x67, 0x73, 0x74, 0x61, 0x72, 0x74, 0x22, + 0x2c, 0x22, 0x64, 0x72, 0x61, 0x67, 0x65, 0x6e, 0x64, 0x22, 0x29, + 0x2c, 0x75, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x69, 0x3d, 0x65, + 0x28, 0x62, 0x2c, 0x74, 0x61, 0x2e, 0x6d, 0x6f, 0x75, 0x73, 0x65, + 0x2c, 0x74, 0x2c, 0x22, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x22, 0x2c, 0x22, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x75, + 0x70, 0x22, 0x29, 0x2c, 0x6f, 0x3d, 0x65, 0x28, 0x47, 0x2c, 0x74, + 0x61, 0x2e, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x2c, 0x79, 0x2c, 0x22, + 0x74, 0x6f, 0x75, 0x63, 0x68, 0x6d, 0x6f, 0x76, 0x65, 0x22, 0x2c, + 0x22, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x6e, 0x64, 0x22, 0x29, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x6f, + 0x72, 0x69, 0x67, 0x69, 0x6e, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x75, + 0x3d, 0x74, 0x2c, 0x6e, 0x29, 0x3a, 0x75, 0x7d, 0x2c, 0x74, 0x61, + 0x2e, 0x72, 0x65, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x6e, 0x2c, 0x72, + 0x2c, 0x22, 0x6f, 0x6e, 0x22, 0x29, 0x7d, 0x2c, 0x74, 0x61, 0x2e, + 0x74, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x73, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3c, 0x32, 0x26, 0x26, 0x28, 0x74, 0x3d, 0x6b, 0x28, 0x29, + 0x2e, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x73, 0x29, 0x2c, 0x74, + 0x3f, 0x72, 0x61, 0x28, 0x74, 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, + 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x4a, 0x28, 0x6e, 0x2c, + 0x74, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, + 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x3d, 0x74, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x2c, 0x65, 0x7d, 0x29, 0x3a, 0x5b, 0x5d, 0x7d, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x43, 0x61, 0x3d, 0x31, 0x65, 0x2d, 0x36, + 0x2c, 0x7a, 0x61, 0x3d, 0x43, 0x61, 0x2a, 0x43, 0x61, 0x2c, 0x71, + 0x61, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x50, 0x49, 0x2c, 0x4c, + 0x61, 0x3d, 0x32, 0x2a, 0x71, 0x61, 0x2c, 0x54, 0x61, 0x3d, 0x4c, + 0x61, 0x2d, 0x43, 0x61, 0x2c, 0x52, 0x61, 0x3d, 0x71, 0x61, 0x2f, + 0x32, 0x2c, 0x44, 0x61, 0x3d, 0x71, 0x61, 0x2f, 0x31, 0x38, 0x30, + 0x2c, 0x50, 0x61, 0x3d, 0x31, 0x38, 0x30, 0x2f, 0x71, 0x61, 0x2c, + 0x55, 0x61, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x53, 0x51, 0x52, + 0x54, 0x32, 0x2c, 0x6a, 0x61, 0x3d, 0x32, 0x2c, 0x46, 0x61, 0x3d, + 0x34, 0x3b, 0x74, 0x61, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, + 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x5a, 0x6f, 0x6f, 0x6d, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, + 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x65, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, + 0x6e, 0x2a, 0x79, 0x3b, 0x69, 0x66, 0x28, 0x6d, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x65, 0x3d, 0x72, 0x74, 0x28, 0x76, 0x29, 0x2c, + 0x6f, 0x3d, 0x69, 0x2f, 0x28, 0x6a, 0x61, 0x2a, 0x68, 0x29, 0x2a, + 0x28, 0x65, 0x2a, 0x75, 0x74, 0x28, 0x55, 0x61, 0x2a, 0x74, 0x2b, + 0x76, 0x29, 0x2d, 0x65, 0x74, 0x28, 0x76, 0x29, 0x29, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, 0x72, 0x2b, 0x6f, 0x2a, 0x6c, + 0x2c, 0x75, 0x2b, 0x6f, 0x2a, 0x73, 0x2c, 0x69, 0x2a, 0x65, 0x2f, + 0x72, 0x74, 0x28, 0x55, 0x61, 0x2a, 0x74, 0x2b, 0x76, 0x29, 0x5d, + 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, 0x72, 0x2b, 0x6e, + 0x2a, 0x6c, 0x2c, 0x75, 0x2b, 0x6e, 0x2a, 0x73, 0x2c, 0x69, 0x2a, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x65, 0x78, 0x70, 0x28, 0x55, 0x61, + 0x2a, 0x74, 0x29, 0x5d, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, + 0x6e, 0x5b, 0x30, 0x5d, 0x2c, 0x75, 0x3d, 0x6e, 0x5b, 0x31, 0x5d, + 0x2c, 0x69, 0x3d, 0x6e, 0x5b, 0x32, 0x5d, 0x2c, 0x6f, 0x3d, 0x74, + 0x5b, 0x30, 0x5d, 0x2c, 0x61, 0x3d, 0x74, 0x5b, 0x31, 0x5d, 0x2c, + 0x63, 0x3d, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x6c, 0x3d, 0x6f, 0x2d, + 0x72, 0x2c, 0x73, 0x3d, 0x61, 0x2d, 0x75, 0x2c, 0x66, 0x3d, 0x6c, + 0x2a, 0x6c, 0x2b, 0x73, 0x2a, 0x73, 0x2c, 0x68, 0x3d, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x73, 0x71, 0x72, 0x74, 0x28, 0x66, 0x29, 0x2c, + 0x67, 0x3d, 0x28, 0x63, 0x2a, 0x63, 0x2d, 0x69, 0x2a, 0x69, 0x2b, + 0x46, 0x61, 0x2a, 0x66, 0x29, 0x2f, 0x28, 0x32, 0x2a, 0x69, 0x2a, + 0x6a, 0x61, 0x2a, 0x68, 0x29, 0x2c, 0x70, 0x3d, 0x28, 0x63, 0x2a, + 0x63, 0x2d, 0x69, 0x2a, 0x69, 0x2d, 0x46, 0x61, 0x2a, 0x66, 0x29, + 0x2f, 0x28, 0x32, 0x2a, 0x63, 0x2a, 0x6a, 0x61, 0x2a, 0x68, 0x29, + 0x2c, 0x76, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x6f, 0x67, + 0x28, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x71, 0x72, 0x74, 0x28, + 0x67, 0x2a, 0x67, 0x2b, 0x31, 0x29, 0x2d, 0x67, 0x29, 0x2c, 0x64, + 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x73, 0x71, 0x72, 0x74, 0x28, 0x70, 0x2a, + 0x70, 0x2b, 0x31, 0x29, 0x2d, 0x70, 0x29, 0x2c, 0x6d, 0x3d, 0x64, + 0x2d, 0x76, 0x2c, 0x79, 0x3d, 0x28, 0x6d, 0x7c, 0x7c, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x63, 0x2f, 0x69, 0x29, + 0x29, 0x2f, 0x55, 0x61, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x65, 0x2e, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x31, 0x65, 0x33, 0x2a, 0x79, 0x2c, 0x65, 0x7d, 0x2c, 0x74, + 0x61, 0x2e, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, + 0x7a, 0x6f, 0x6f, 0x6d, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x6e, 0x2e, 0x6f, + 0x6e, 0x28, 0x71, 0x2c, 0x66, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x4f, + 0x61, 0x2b, 0x22, 0x2e, 0x7a, 0x6f, 0x6f, 0x6d, 0x22, 0x2c, 0x67, + 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x22, 0x64, 0x62, 0x6c, 0x63, 0x6c, + 0x69, 0x63, 0x6b, 0x2e, 0x7a, 0x6f, 0x6f, 0x6d, 0x22, 0x2c, 0x70, + 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x52, 0x2c, 0x68, 0x29, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x28, 0x6e, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, 0x28, 0x6e, + 0x5b, 0x30, 0x5d, 0x2d, 0x6b, 0x2e, 0x78, 0x29, 0x2f, 0x6b, 0x2e, + 0x6b, 0x2c, 0x28, 0x6e, 0x5b, 0x31, 0x5d, 0x2d, 0x6b, 0x2e, 0x79, + 0x29, 0x2f, 0x6b, 0x2e, 0x6b, 0x5d, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x28, 0x6e, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, 0x6e, 0x5b, 0x30, 0x5d, 0x2a, + 0x6b, 0x2e, 0x6b, 0x2b, 0x6b, 0x2e, 0x78, 0x2c, 0x6e, 0x5b, 0x31, + 0x5d, 0x2a, 0x6b, 0x2e, 0x6b, 0x2b, 0x6b, 0x2e, 0x79, 0x5d, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x28, + 0x6e, 0x29, 0x7b, 0x6b, 0x2e, 0x6b, 0x3d, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x4e, 0x5b, 0x30, 0x5d, 0x2c, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x4e, 0x5b, 0x31, + 0x5d, 0x2c, 0x6e, 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, + 0x74, 0x3d, 0x72, 0x28, 0x74, 0x29, 0x2c, 0x6b, 0x2e, 0x78, 0x2b, + 0x3d, 0x6e, 0x5b, 0x30, 0x5d, 0x2d, 0x74, 0x5b, 0x30, 0x5d, 0x2c, + 0x6b, 0x2e, 0x79, 0x2b, 0x3d, 0x6e, 0x5b, 0x31, 0x5d, 0x2d, 0x74, + 0x5b, 0x31, 0x5d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6f, 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x6f, + 0x29, 0x7b, 0x74, 0x2e, 0x5f, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x74, + 0x5f, 0x5f, 0x3d, 0x7b, 0x78, 0x3a, 0x6b, 0x2e, 0x78, 0x2c, 0x79, + 0x3a, 0x6b, 0x2e, 0x79, 0x2c, 0x6b, 0x3a, 0x6b, 0x2e, 0x6b, 0x7d, + 0x2c, 0x75, 0x28, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x70, 0x6f, 0x77, + 0x28, 0x32, 0x2c, 0x6f, 0x29, 0x29, 0x2c, 0x69, 0x28, 0x64, 0x3d, + 0x65, 0x2c, 0x72, 0x29, 0x2c, 0x74, 0x3d, 0x74, 0x61, 0x2e, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x74, 0x29, 0x2c, 0x43, 0x3e, + 0x30, 0x26, 0x26, 0x28, 0x74, 0x3d, 0x74, 0x2e, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x2e, 0x64, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x43, 0x29, 0x29, + 0x2c, 0x74, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6e, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x28, 0x29, 0x7b, 0x62, 0x26, 0x26, + 0x62, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x78, 0x2e, + 0x72, 0x61, 0x6e, 0x67, 0x65, 0x28, 0x29, 0x2e, 0x6d, 0x61, 0x70, + 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x6e, 0x2d, + 0x6b, 0x2e, 0x78, 0x29, 0x2f, 0x6b, 0x2e, 0x6b, 0x7d, 0x29, 0x2e, + 0x6d, 0x61, 0x70, 0x28, 0x78, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x72, + 0x74, 0x29, 0x29, 0x2c, 0x77, 0x26, 0x26, 0x77, 0x2e, 0x64, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x5f, 0x2e, 0x72, 0x61, 0x6e, 0x67, + 0x65, 0x28, 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x28, 0x6e, 0x2d, 0x6b, 0x2e, 0x79, 0x29, + 0x2f, 0x6b, 0x2e, 0x6b, 0x7d, 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, + 0x5f, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x29, 0x29, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x28, + 0x6e, 0x29, 0x7b, 0x7a, 0x2b, 0x2b, 0x7c, 0x7c, 0x6e, 0x28, 0x7b, + 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x7a, 0x6f, 0x6f, 0x6d, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x22, 0x7d, 0x29, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x28, 0x6e, 0x29, 0x7b, + 0x61, 0x28, 0x29, 0x2c, 0x6e, 0x28, 0x7b, 0x74, 0x79, 0x70, 0x65, + 0x3a, 0x22, 0x7a, 0x6f, 0x6f, 0x6d, 0x22, 0x2c, 0x73, 0x63, 0x61, + 0x6c, 0x65, 0x3a, 0x6b, 0x2e, 0x6b, 0x2c, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x6c, 0x61, 0x74, 0x65, 0x3a, 0x5b, 0x6b, 0x2e, 0x78, 0x2c, + 0x6b, 0x2e, 0x79, 0x5d, 0x7d, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x28, 0x6e, 0x29, 0x7b, 0x2d, + 0x2d, 0x7a, 0x7c, 0x7c, 0x28, 0x6e, 0x28, 0x7b, 0x74, 0x79, 0x70, + 0x65, 0x3a, 0x22, 0x7a, 0x6f, 0x6f, 0x6d, 0x65, 0x6e, 0x64, 0x22, + 0x7d, 0x29, 0x2c, 0x64, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x28, + 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6e, 0x28, 0x29, 0x7b, 0x66, 0x3d, 0x31, 0x2c, 0x69, 0x28, 0x74, + 0x61, 0x2e, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x28, 0x75, 0x29, 0x2c, + 0x67, 0x29, 0x2c, 0x6c, 0x28, 0x61, 0x29, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x28, 0x29, 0x7b, 0x68, + 0x2e, 0x6f, 0x6e, 0x28, 0x4c, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x29, + 0x2e, 0x6f, 0x6e, 0x28, 0x54, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x29, + 0x2c, 0x70, 0x28, 0x66, 0x26, 0x26, 0x74, 0x61, 0x2e, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, + 0x3d, 0x3d, 0x6f, 0x29, 0x2c, 0x73, 0x28, 0x61, 0x29, 0x7d, 0x76, + 0x61, 0x72, 0x20, 0x75, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x6f, + 0x3d, 0x74, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x2c, 0x61, 0x3d, 0x44, 0x2e, 0x6f, + 0x66, 0x28, 0x75, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x29, 0x2c, 0x66, 0x3d, 0x30, 0x2c, 0x68, 0x3d, 0x74, + 0x61, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x74, 0x28, + 0x75, 0x29, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x4c, 0x2c, 0x6e, 0x29, + 0x2e, 0x6f, 0x6e, 0x28, 0x54, 0x2c, 0x72, 0x29, 0x2c, 0x67, 0x3d, + 0x65, 0x28, 0x74, 0x61, 0x2e, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x28, + 0x75, 0x29, 0x29, 0x2c, 0x70, 0x3d, 0x57, 0x28, 0x75, 0x29, 0x3b, + 0x44, 0x6c, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x75, 0x29, 0x2c, + 0x63, 0x28, 0x61, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x68, 0x28, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x28, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x6e, 0x3d, 0x74, 0x61, 0x2e, 0x74, 0x6f, 0x75, 0x63, + 0x68, 0x65, 0x73, 0x28, 0x70, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x67, 0x3d, 0x6b, 0x2e, 0x6b, 0x2c, 0x6e, 0x2e, + 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x6e, 0x2e, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, + 0x69, 0x6e, 0x20, 0x64, 0x26, 0x26, 0x28, 0x64, 0x5b, 0x6e, 0x2e, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x5d, + 0x3d, 0x65, 0x28, 0x6e, 0x29, 0x29, 0x7d, 0x29, 0x2c, 0x6e, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x28, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x74, 0x61, 0x2e, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x3b, 0x74, 0x61, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x28, 0x74, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x78, 0x2c, 0x72, 0x29, + 0x2e, 0x6f, 0x6e, 0x28, 0x62, 0x2c, 0x61, 0x29, 0x2c, 0x5f, 0x2e, + 0x70, 0x75, 0x73, 0x68, 0x28, 0x74, 0x29, 0x3b, 0x66, 0x6f, 0x72, + 0x28, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x74, 0x61, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x64, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x73, 0x2c, 0x75, 0x3d, + 0x30, 0x2c, 0x69, 0x3d, 0x65, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3b, 0x69, 0x3e, 0x75, 0x3b, 0x2b, 0x2b, 0x75, 0x29, 0x64, + 0x5b, 0x65, 0x5b, 0x75, 0x5d, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x5d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x63, 0x3d, 0x6e, 0x28, 0x29, 0x2c, + 0x6c, 0x3d, 0x44, 0x61, 0x74, 0x65, 0x2e, 0x6e, 0x6f, 0x77, 0x28, + 0x29, 0x3b, 0x69, 0x66, 0x28, 0x31, 0x3d, 0x3d, 0x3d, 0x63, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x7b, 0x69, 0x66, 0x28, + 0x35, 0x30, 0x30, 0x3e, 0x6c, 0x2d, 0x4d, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x73, 0x3d, 0x63, 0x5b, 0x30, 0x5d, 0x3b, 0x6f, 0x28, + 0x70, 0x2c, 0x73, 0x2c, 0x64, 0x5b, 0x73, 0x2e, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x5d, 0x2c, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x6b, 0x2e, 0x6b, 0x29, + 0x2f, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x4c, 0x4e, 0x32, 0x29, 0x2b, + 0x31, 0x29, 0x2c, 0x53, 0x28, 0x29, 0x7d, 0x4d, 0x3d, 0x6c, 0x7d, + 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x63, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3e, 0x31, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x73, 0x3d, 0x63, 0x5b, 0x30, 0x5d, 0x2c, 0x66, 0x3d, + 0x63, 0x5b, 0x31, 0x5d, 0x2c, 0x68, 0x3d, 0x73, 0x5b, 0x30, 0x5d, + 0x2d, 0x66, 0x5b, 0x30, 0x5d, 0x2c, 0x67, 0x3d, 0x73, 0x5b, 0x31, + 0x5d, 0x2d, 0x66, 0x5b, 0x31, 0x5d, 0x3b, 0x6d, 0x3d, 0x68, 0x2a, + 0x68, 0x2b, 0x67, 0x2a, 0x67, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x28, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x6f, + 0x3d, 0x74, 0x61, 0x2e, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x73, + 0x28, 0x70, 0x29, 0x3b, 0x44, 0x6c, 0x2e, 0x63, 0x61, 0x6c, 0x6c, + 0x28, 0x70, 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, + 0x20, 0x61, 0x3d, 0x30, 0x2c, 0x63, 0x3d, 0x6f, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x63, 0x3e, 0x61, 0x3b, 0x2b, 0x2b, + 0x61, 0x2c, 0x72, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x69, 0x66, + 0x28, 0x65, 0x3d, 0x6f, 0x5b, 0x61, 0x5d, 0x2c, 0x72, 0x3d, 0x64, + 0x5b, 0x65, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x5d, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x29, 0x62, + 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x6e, 0x3d, 0x65, 0x2c, 0x74, 0x3d, + 0x72, 0x7d, 0x69, 0x66, 0x28, 0x72, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x73, 0x3d, 0x28, 0x73, 0x3d, 0x65, 0x5b, 0x30, 0x5d, 0x2d, + 0x6e, 0x5b, 0x30, 0x5d, 0x29, 0x2a, 0x73, 0x2b, 0x28, 0x73, 0x3d, + 0x65, 0x5b, 0x31, 0x5d, 0x2d, 0x6e, 0x5b, 0x31, 0x5d, 0x29, 0x2a, + 0x73, 0x2c, 0x66, 0x3d, 0x6d, 0x26, 0x26, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x73, 0x71, 0x72, 0x74, 0x28, 0x73, 0x2f, 0x6d, 0x29, 0x3b, + 0x6e, 0x3d, 0x5b, 0x28, 0x6e, 0x5b, 0x30, 0x5d, 0x2b, 0x65, 0x5b, + 0x30, 0x5d, 0x29, 0x2f, 0x32, 0x2c, 0x28, 0x6e, 0x5b, 0x31, 0x5d, + 0x2b, 0x65, 0x5b, 0x31, 0x5d, 0x29, 0x2f, 0x32, 0x5d, 0x2c, 0x74, + 0x3d, 0x5b, 0x28, 0x74, 0x5b, 0x30, 0x5d, 0x2b, 0x72, 0x5b, 0x30, + 0x5d, 0x29, 0x2f, 0x32, 0x2c, 0x28, 0x74, 0x5b, 0x31, 0x5d, 0x2b, + 0x72, 0x5b, 0x31, 0x5d, 0x29, 0x2f, 0x32, 0x5d, 0x2c, 0x75, 0x28, + 0x66, 0x2a, 0x67, 0x29, 0x7d, 0x4d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, + 0x2c, 0x69, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x2c, 0x6c, 0x28, 0x76, + 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x61, 0x28, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x61, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x65, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x7b, 0x66, + 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x74, 0x61, + 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x64, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x73, 0x2c, + 0x65, 0x3d, 0x30, 0x2c, 0x72, 0x3d, 0x74, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3b, 0x72, 0x3e, 0x65, 0x3b, 0x2b, 0x2b, 0x65, + 0x29, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x64, 0x5b, 0x74, + 0x5b, 0x65, 0x5d, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x5d, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, + 0x72, 0x20, 0x75, 0x20, 0x69, 0x6e, 0x20, 0x64, 0x29, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6e, + 0x28, 0x29, 0x7d, 0x74, 0x61, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x41, 0x6c, 0x6c, 0x28, 0x5f, 0x29, 0x2e, 0x6f, 0x6e, 0x28, + 0x79, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x2c, 0x77, 0x2e, 0x6f, + 0x6e, 0x28, 0x71, 0x2c, 0x66, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x52, + 0x2c, 0x68, 0x29, 0x2c, 0x45, 0x28, 0x29, 0x2c, 0x73, 0x28, 0x76, + 0x29, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x67, 0x2c, 0x70, 0x3d, 0x74, + 0x68, 0x69, 0x73, 0x2c, 0x76, 0x3d, 0x44, 0x2e, 0x6f, 0x66, 0x28, + 0x70, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x29, 0x2c, 0x64, 0x3d, 0x7b, 0x7d, 0x2c, 0x6d, 0x3d, 0x30, 0x2c, + 0x79, 0x3d, 0x22, 0x2e, 0x7a, 0x6f, 0x6f, 0x6d, 0x2d, 0x22, 0x2b, + 0x74, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x64, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x65, + 0x73, 0x5b, 0x30, 0x5d, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x2c, 0x78, 0x3d, 0x22, 0x74, 0x6f, 0x75, + 0x63, 0x68, 0x6d, 0x6f, 0x76, 0x65, 0x22, 0x2b, 0x79, 0x2c, 0x62, + 0x3d, 0x22, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x6e, 0x64, 0x22, + 0x2b, 0x79, 0x2c, 0x5f, 0x3d, 0x5b, 0x5d, 0x2c, 0x77, 0x3d, 0x74, + 0x61, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x70, 0x29, + 0x2c, 0x45, 0x3d, 0x57, 0x28, 0x70, 0x29, 0x3b, 0x74, 0x28, 0x29, + 0x2c, 0x63, 0x28, 0x76, 0x29, 0x2c, 0x77, 0x2e, 0x6f, 0x6e, 0x28, + 0x71, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x2e, 0x6f, 0x6e, 0x28, + 0x52, 0x2c, 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x67, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x6e, 0x3d, 0x44, 0x2e, 0x6f, 0x66, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, + 0x3b, 0x79, 0x3f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x54, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x28, 0x79, 0x29, 0x3a, 0x28, 0x44, 0x6c, + 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, + 0x2c, 0x76, 0x3d, 0x65, 0x28, 0x64, 0x3d, 0x6d, 0x7c, 0x7c, 0x74, + 0x61, 0x2e, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x29, 0x29, 0x2c, 0x63, 0x28, 0x6e, 0x29, 0x29, 0x2c, 0x79, + 0x3d, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x7b, 0x79, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x73, 0x28, 0x6e, + 0x29, 0x7d, 0x2c, 0x35, 0x30, 0x29, 0x2c, 0x53, 0x28, 0x29, 0x2c, + 0x75, 0x28, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x70, 0x6f, 0x77, 0x28, + 0x32, 0x2c, 0x2e, 0x30, 0x30, 0x32, 0x2a, 0x48, 0x61, 0x28, 0x29, + 0x29, 0x2a, 0x6b, 0x2e, 0x6b, 0x29, 0x2c, 0x69, 0x28, 0x64, 0x2c, + 0x76, 0x29, 0x2c, 0x6c, 0x28, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x28, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x6e, 0x3d, 0x74, 0x61, 0x2e, 0x6d, 0x6f, 0x75, + 0x73, 0x65, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x2c, 0x74, 0x3d, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x6b, 0x2e, + 0x6b, 0x29, 0x2f, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x4c, 0x4e, 0x32, + 0x3b, 0x6f, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x6e, 0x2c, 0x65, + 0x28, 0x6e, 0x29, 0x2c, 0x74, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x4b, 0x65, 0x79, 0x3f, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x65, 0x69, 0x6c, 0x28, 0x74, + 0x29, 0x2d, 0x31, 0x3a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6c, + 0x6f, 0x6f, 0x72, 0x28, 0x74, 0x29, 0x2b, 0x31, 0x29, 0x7d, 0x76, + 0x61, 0x72, 0x20, 0x76, 0x2c, 0x64, 0x2c, 0x6d, 0x2c, 0x79, 0x2c, + 0x4d, 0x2c, 0x78, 0x2c, 0x62, 0x2c, 0x5f, 0x2c, 0x77, 0x2c, 0x6b, + 0x3d, 0x7b, 0x78, 0x3a, 0x30, 0x2c, 0x79, 0x3a, 0x30, 0x2c, 0x6b, + 0x3a, 0x31, 0x7d, 0x2c, 0x41, 0x3d, 0x5b, 0x39, 0x36, 0x30, 0x2c, + 0x35, 0x30, 0x30, 0x5d, 0x2c, 0x4e, 0x3d, 0x49, 0x61, 0x2c, 0x43, + 0x3d, 0x32, 0x35, 0x30, 0x2c, 0x7a, 0x3d, 0x30, 0x2c, 0x71, 0x3d, + 0x22, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x2e, + 0x7a, 0x6f, 0x6f, 0x6d, 0x22, 0x2c, 0x4c, 0x3d, 0x22, 0x6d, 0x6f, + 0x75, 0x73, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x2e, 0x7a, 0x6f, 0x6f, + 0x6d, 0x22, 0x2c, 0x54, 0x3d, 0x22, 0x6d, 0x6f, 0x75, 0x73, 0x65, + 0x75, 0x70, 0x2e, 0x7a, 0x6f, 0x6f, 0x6d, 0x22, 0x2c, 0x52, 0x3d, + 0x22, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x2e, 0x7a, 0x6f, 0x6f, 0x6d, 0x22, 0x2c, 0x44, 0x3d, 0x45, 0x28, + 0x6e, 0x2c, 0x22, 0x7a, 0x6f, 0x6f, 0x6d, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x22, 0x2c, 0x22, 0x7a, 0x6f, 0x6f, 0x6d, 0x22, 0x2c, 0x22, + 0x7a, 0x6f, 0x6f, 0x6d, 0x65, 0x6e, 0x64, 0x22, 0x29, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4f, 0x61, 0x7c, 0x7c, 0x28, + 0x4f, 0x61, 0x3d, 0x22, 0x6f, 0x6e, 0x77, 0x68, 0x65, 0x65, 0x6c, + 0x22, 0x69, 0x6e, 0x20, 0x75, 0x61, 0x3f, 0x28, 0x48, 0x61, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x2d, 0x74, 0x61, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x59, + 0x2a, 0x28, 0x74, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, + 0x64, 0x65, 0x6c, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x3f, 0x31, + 0x32, 0x30, 0x3a, 0x31, 0x29, 0x7d, 0x2c, 0x22, 0x77, 0x68, 0x65, + 0x65, 0x6c, 0x22, 0x29, 0x3a, 0x22, 0x6f, 0x6e, 0x6d, 0x6f, 0x75, + 0x73, 0x65, 0x77, 0x68, 0x65, 0x65, 0x6c, 0x22, 0x69, 0x6e, 0x20, + 0x75, 0x61, 0x3f, 0x28, 0x48, 0x61, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x74, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x2e, 0x77, 0x68, 0x65, 0x65, 0x6c, 0x44, 0x65, 0x6c, 0x74, 0x61, + 0x7d, 0x2c, 0x22, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x77, 0x68, 0x65, + 0x65, 0x6c, 0x22, 0x29, 0x3a, 0x28, 0x48, 0x61, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x2d, 0x74, 0x61, 0x2e, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x7d, 0x2c, + 0x22, 0x4d, 0x6f, 0x7a, 0x4d, 0x6f, 0x75, 0x73, 0x65, 0x50, 0x69, + 0x78, 0x65, 0x6c, 0x53, 0x63, 0x72, 0x6f, 0x6c, 0x6c, 0x22, 0x29, + 0x29, 0x2c, 0x6e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, + 0x6e, 0x2e, 0x65, 0x61, 0x63, 0x68, 0x28, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x6e, 0x3d, 0x44, 0x2e, 0x6f, 0x66, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, + 0x2c, 0x74, 0x3d, 0x6b, 0x3b, 0x54, 0x6c, 0x3f, 0x74, 0x61, 0x2e, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x29, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x2e, 0x65, 0x61, 0x63, 0x68, 0x28, 0x22, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x2e, 0x7a, 0x6f, 0x6f, 0x6d, 0x22, 0x2c, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, + 0x6b, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x5f, 0x63, 0x68, + 0x61, 0x72, 0x74, 0x5f, 0x5f, 0x7c, 0x7c, 0x7b, 0x78, 0x3a, 0x30, + 0x2c, 0x79, 0x3a, 0x30, 0x2c, 0x6b, 0x3a, 0x31, 0x7d, 0x2c, 0x63, + 0x28, 0x6e, 0x29, 0x7d, 0x29, 0x2e, 0x74, 0x77, 0x65, 0x65, 0x6e, + 0x28, 0x22, 0x7a, 0x6f, 0x6f, 0x6d, 0x3a, 0x7a, 0x6f, 0x6f, 0x6d, + 0x22, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x41, 0x5b, 0x30, + 0x5d, 0x2c, 0x72, 0x3d, 0x41, 0x5b, 0x31, 0x5d, 0x2c, 0x75, 0x3d, + 0x64, 0x3f, 0x64, 0x5b, 0x30, 0x5d, 0x3a, 0x65, 0x2f, 0x32, 0x2c, + 0x69, 0x3d, 0x64, 0x3f, 0x64, 0x5b, 0x31, 0x5d, 0x3a, 0x72, 0x2f, + 0x32, 0x2c, 0x6f, 0x3d, 0x74, 0x61, 0x2e, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x70, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x5a, 0x6f, 0x6f, 0x6d, + 0x28, 0x5b, 0x28, 0x75, 0x2d, 0x6b, 0x2e, 0x78, 0x29, 0x2f, 0x6b, + 0x2e, 0x6b, 0x2c, 0x28, 0x69, 0x2d, 0x6b, 0x2e, 0x79, 0x29, 0x2f, + 0x6b, 0x2e, 0x6b, 0x2c, 0x65, 0x2f, 0x6b, 0x2e, 0x6b, 0x5d, 0x2c, + 0x5b, 0x28, 0x75, 0x2d, 0x74, 0x2e, 0x78, 0x29, 0x2f, 0x74, 0x2e, + 0x6b, 0x2c, 0x28, 0x69, 0x2d, 0x74, 0x2e, 0x79, 0x29, 0x2f, 0x74, + 0x2e, 0x6b, 0x2c, 0x65, 0x2f, 0x74, 0x2e, 0x6b, 0x5d, 0x29, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x72, 0x3d, 0x6f, 0x28, 0x74, 0x29, 0x2c, 0x61, 0x3d, 0x65, + 0x2f, 0x72, 0x5b, 0x32, 0x5d, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x5f, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x74, 0x5f, 0x5f, 0x3d, 0x6b, + 0x3d, 0x7b, 0x78, 0x3a, 0x75, 0x2d, 0x72, 0x5b, 0x30, 0x5d, 0x2a, + 0x61, 0x2c, 0x79, 0x3a, 0x69, 0x2d, 0x72, 0x5b, 0x31, 0x5d, 0x2a, + 0x61, 0x2c, 0x6b, 0x3a, 0x61, 0x7d, 0x2c, 0x6c, 0x28, 0x6e, 0x29, + 0x7d, 0x7d, 0x29, 0x2e, 0x65, 0x61, 0x63, 0x68, 0x28, 0x22, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x2e, 0x7a, 0x6f, + 0x6f, 0x6d, 0x22, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x7b, 0x73, 0x28, 0x6e, 0x29, 0x7d, 0x29, 0x2e, + 0x65, 0x61, 0x63, 0x68, 0x28, 0x22, 0x65, 0x6e, 0x64, 0x2e, 0x7a, + 0x6f, 0x6f, 0x6d, 0x22, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x73, 0x28, 0x6e, 0x29, 0x7d, 0x29, + 0x3a, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x5f, 0x63, 0x68, + 0x61, 0x72, 0x74, 0x5f, 0x5f, 0x3d, 0x6b, 0x2c, 0x63, 0x28, 0x6e, + 0x29, 0x2c, 0x6c, 0x28, 0x6e, 0x29, 0x2c, 0x73, 0x28, 0x6e, 0x29, + 0x29, 0x7d, 0x29, 0x7d, 0x2c, 0x6e, 0x2e, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x6c, 0x61, 0x74, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x6b, + 0x3d, 0x7b, 0x78, 0x3a, 0x2b, 0x74, 0x5b, 0x30, 0x5d, 0x2c, 0x79, + 0x3a, 0x2b, 0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x6b, 0x3a, 0x6b, 0x2e, + 0x6b, 0x7d, 0x2c, 0x61, 0x28, 0x29, 0x2c, 0x6e, 0x29, 0x3a, 0x5b, + 0x6b, 0x2e, 0x78, 0x2c, 0x6b, 0x2e, 0x79, 0x5d, 0x7d, 0x2c, 0x6e, + 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, + 0x6b, 0x3d, 0x7b, 0x78, 0x3a, 0x6b, 0x2e, 0x78, 0x2c, 0x79, 0x3a, + 0x6b, 0x2e, 0x79, 0x2c, 0x6b, 0x3a, 0x2b, 0x74, 0x7d, 0x2c, 0x61, + 0x28, 0x29, 0x2c, 0x6e, 0x29, 0x3a, 0x6b, 0x2e, 0x6b, 0x7d, 0x2c, + 0x6e, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x4e, 0x3d, 0x6e, 0x75, + 0x6c, 0x6c, 0x3d, 0x3d, 0x74, 0x3f, 0x49, 0x61, 0x3a, 0x5b, 0x2b, + 0x74, 0x5b, 0x30, 0x5d, 0x2c, 0x2b, 0x74, 0x5b, 0x31, 0x5d, 0x5d, + 0x2c, 0x6e, 0x29, 0x3a, 0x4e, 0x7d, 0x2c, 0x6e, 0x2e, 0x63, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x6d, 0x3d, + 0x74, 0x26, 0x26, 0x5b, 0x2b, 0x74, 0x5b, 0x30, 0x5d, 0x2c, 0x2b, + 0x74, 0x5b, 0x31, 0x5d, 0x5d, 0x2c, 0x6e, 0x29, 0x3a, 0x6d, 0x7d, + 0x2c, 0x6e, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, + 0x28, 0x41, 0x3d, 0x74, 0x26, 0x26, 0x5b, 0x2b, 0x74, 0x5b, 0x30, + 0x5d, 0x2c, 0x2b, 0x74, 0x5b, 0x31, 0x5d, 0x5d, 0x2c, 0x6e, 0x29, + 0x3a, 0x41, 0x7d, 0x2c, 0x6e, 0x2e, 0x64, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x43, 0x3d, 0x2b, + 0x74, 0x2c, 0x6e, 0x29, 0x3a, 0x43, 0x7d, 0x2c, 0x6e, 0x2e, 0x78, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3f, 0x28, 0x62, 0x3d, 0x74, 0x2c, 0x78, 0x3d, + 0x74, 0x2e, 0x63, 0x6f, 0x70, 0x79, 0x28, 0x29, 0x2c, 0x6b, 0x3d, + 0x7b, 0x78, 0x3a, 0x30, 0x2c, 0x79, 0x3a, 0x30, 0x2c, 0x6b, 0x3a, + 0x31, 0x7d, 0x2c, 0x6e, 0x29, 0x3a, 0x62, 0x7d, 0x2c, 0x6e, 0x2e, + 0x79, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x77, 0x3d, 0x74, 0x2c, 0x5f, + 0x3d, 0x74, 0x2e, 0x63, 0x6f, 0x70, 0x79, 0x28, 0x29, 0x2c, 0x6b, + 0x3d, 0x7b, 0x78, 0x3a, 0x30, 0x2c, 0x79, 0x3a, 0x30, 0x2c, 0x6b, + 0x3a, 0x31, 0x7d, 0x2c, 0x6e, 0x29, 0x3a, 0x77, 0x7d, 0x2c, 0x74, + 0x61, 0x2e, 0x72, 0x65, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x6e, 0x2c, + 0x44, 0x2c, 0x22, 0x6f, 0x6e, 0x22, 0x29, 0x7d, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x48, 0x61, 0x2c, 0x4f, 0x61, 0x2c, 0x49, 0x61, 0x3d, + 0x5b, 0x30, 0x2c, 0x31, 0x2f, 0x30, 0x5d, 0x3b, 0x74, 0x61, 0x2e, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3d, 0x6f, 0x74, 0x2c, 0x6f, 0x74, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x2e, + 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, + 0x67, 0x62, 0x28, 0x29, 0x2b, 0x22, 0x22, 0x7d, 0x2c, 0x74, 0x61, + 0x2e, 0x68, 0x73, 0x6c, 0x3d, 0x61, 0x74, 0x3b, 0x76, 0x61, 0x72, + 0x20, 0x59, 0x61, 0x3d, 0x61, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x6f, + 0x74, 0x3b, 0x59, 0x61, 0x2e, 0x62, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x65, 0x72, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x70, 0x6f, 0x77, 0x28, + 0x2e, 0x37, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x6e, 0x3a, + 0x31, 0x29, 0x2c, 0x6e, 0x65, 0x77, 0x20, 0x61, 0x74, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x68, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x73, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x2f, 0x6e, 0x29, + 0x7d, 0x2c, 0x59, 0x61, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x65, 0x72, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x3d, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x70, 0x6f, 0x77, 0x28, 0x2e, 0x37, + 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x6e, 0x3a, 0x31, 0x29, + 0x2c, 0x6e, 0x65, 0x77, 0x20, 0x61, 0x74, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x68, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x2c, + 0x6e, 0x2a, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x29, 0x7d, 0x2c, + 0x59, 0x61, 0x2e, 0x72, 0x67, 0x62, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x63, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x68, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x2c, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x6c, 0x29, 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x68, + 0x63, 0x6c, 0x3d, 0x6c, 0x74, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x5a, + 0x61, 0x3d, 0x6c, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, + 0x79, 0x70, 0x65, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x6f, 0x74, 0x3b, + 0x5a, 0x61, 0x2e, 0x62, 0x72, 0x69, 0x67, 0x68, 0x74, 0x65, 0x72, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x65, + 0x77, 0x20, 0x6c, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x68, + 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x2c, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x31, 0x30, 0x30, 0x2c, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x2b, 0x56, 0x61, 0x2a, 0x28, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x6e, 0x3a, 0x31, 0x29, 0x29, 0x29, + 0x7d, 0x2c, 0x5a, 0x61, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x65, 0x72, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x65, + 0x77, 0x20, 0x6c, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x68, + 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x2c, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x30, 0x2c, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x6c, 0x2d, 0x56, 0x61, 0x2a, 0x28, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3f, 0x6e, 0x3a, 0x31, 0x29, 0x29, 0x29, 0x7d, 0x2c, + 0x5a, 0x61, 0x2e, 0x72, 0x67, 0x62, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x73, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x68, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x2c, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x6c, 0x29, 0x2e, 0x72, 0x67, 0x62, 0x28, 0x29, + 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x6c, 0x61, 0x62, 0x3d, 0x66, 0x74, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x56, 0x61, 0x3d, 0x31, 0x38, 0x2c, + 0x58, 0x61, 0x3d, 0x2e, 0x39, 0x35, 0x30, 0x34, 0x37, 0x2c, 0x24, + 0x61, 0x3d, 0x31, 0x2c, 0x42, 0x61, 0x3d, 0x31, 0x2e, 0x30, 0x38, + 0x38, 0x38, 0x33, 0x2c, 0x57, 0x61, 0x3d, 0x66, 0x74, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x6e, 0x65, + 0x77, 0x20, 0x6f, 0x74, 0x3b, 0x57, 0x61, 0x2e, 0x62, 0x72, 0x69, + 0x67, 0x68, 0x74, 0x65, 0x72, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x66, 0x74, 0x28, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x31, 0x30, 0x30, + 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x2b, 0x56, 0x61, 0x2a, + 0x28, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x6e, 0x3a, 0x31, 0x29, + 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x2c, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x62, 0x29, 0x7d, 0x2c, 0x57, 0x61, 0x2e, 0x64, + 0x61, 0x72, 0x6b, 0x65, 0x72, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x66, 0x74, 0x28, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x30, 0x2c, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x2d, 0x56, 0x61, 0x2a, 0x28, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x6e, 0x3a, 0x31, 0x29, 0x29, 0x2c, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x2c, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x62, 0x29, 0x7d, 0x2c, 0x57, 0x61, 0x2e, 0x72, 0x67, 0x62, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x74, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x2c, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x61, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x62, 0x29, 0x7d, + 0x2c, 0x74, 0x61, 0x2e, 0x72, 0x67, 0x62, 0x3d, 0x6d, 0x74, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x4a, 0x61, 0x3d, 0x6d, 0x74, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x6e, 0x65, + 0x77, 0x20, 0x6f, 0x74, 0x3b, 0x4a, 0x61, 0x2e, 0x62, 0x72, 0x69, + 0x67, 0x68, 0x74, 0x65, 0x72, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x6e, 0x3d, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x70, 0x6f, 0x77, 0x28, 0x2e, 0x37, 0x2c, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x6e, 0x3a, 0x31, 0x29, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x74, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, + 0x2c, 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x67, 0x2c, 0x72, + 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x62, 0x2c, 0x75, 0x3d, 0x33, + 0x30, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x7c, + 0x7c, 0x65, 0x7c, 0x7c, 0x72, 0x3f, 0x28, 0x74, 0x26, 0x26, 0x75, + 0x3e, 0x74, 0x26, 0x26, 0x28, 0x74, 0x3d, 0x75, 0x29, 0x2c, 0x65, + 0x26, 0x26, 0x75, 0x3e, 0x65, 0x26, 0x26, 0x28, 0x65, 0x3d, 0x75, + 0x29, 0x2c, 0x72, 0x26, 0x26, 0x75, 0x3e, 0x72, 0x26, 0x26, 0x28, + 0x72, 0x3d, 0x75, 0x29, 0x2c, 0x6e, 0x65, 0x77, 0x20, 0x6d, 0x74, + 0x28, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x32, + 0x35, 0x35, 0x2c, 0x74, 0x2f, 0x6e, 0x29, 0x2c, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x32, 0x35, 0x35, 0x2c, 0x65, + 0x2f, 0x6e, 0x29, 0x2c, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x69, + 0x6e, 0x28, 0x32, 0x35, 0x35, 0x2c, 0x72, 0x2f, 0x6e, 0x29, 0x29, + 0x29, 0x3a, 0x6e, 0x65, 0x77, 0x20, 0x6d, 0x74, 0x28, 0x75, 0x2c, + 0x75, 0x2c, 0x75, 0x29, 0x7d, 0x2c, 0x4a, 0x61, 0x2e, 0x64, 0x61, + 0x72, 0x6b, 0x65, 0x72, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x70, 0x6f, + 0x77, 0x28, 0x2e, 0x37, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, + 0x6e, 0x3a, 0x31, 0x29, 0x2c, 0x6e, 0x65, 0x77, 0x20, 0x6d, 0x74, + 0x28, 0x6e, 0x2a, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x2c, 0x6e, + 0x2a, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x67, 0x2c, 0x6e, 0x2a, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x62, 0x29, 0x7d, 0x2c, 0x4a, 0x61, 0x2e, + 0x68, 0x73, 0x6c, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x5f, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x2c, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x67, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x62, 0x29, 0x7d, 0x2c, 0x4a, 0x61, 0x2e, 0x74, 0x6f, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x22, 0x23, 0x22, 0x2b, 0x78, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x72, 0x29, 0x2b, 0x78, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x67, 0x29, 0x2b, 0x78, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x62, 0x29, 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x47, 0x61, + 0x3d, 0x74, 0x61, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x7b, 0x61, 0x6c, + 0x69, 0x63, 0x65, 0x62, 0x6c, 0x75, 0x65, 0x3a, 0x31, 0x35, 0x37, + 0x39, 0x32, 0x33, 0x38, 0x33, 0x2c, 0x61, 0x6e, 0x74, 0x69, 0x71, + 0x75, 0x65, 0x77, 0x68, 0x69, 0x74, 0x65, 0x3a, 0x31, 0x36, 0x34, + 0x34, 0x34, 0x33, 0x37, 0x35, 0x2c, 0x61, 0x71, 0x75, 0x61, 0x3a, + 0x36, 0x35, 0x35, 0x33, 0x35, 0x2c, 0x61, 0x71, 0x75, 0x61, 0x6d, + 0x61, 0x72, 0x69, 0x6e, 0x65, 0x3a, 0x38, 0x33, 0x38, 0x38, 0x35, + 0x36, 0x34, 0x2c, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x3a, 0x31, 0x35, + 0x37, 0x39, 0x34, 0x31, 0x37, 0x35, 0x2c, 0x62, 0x65, 0x69, 0x67, + 0x65, 0x3a, 0x31, 0x36, 0x31, 0x31, 0x39, 0x32, 0x36, 0x30, 0x2c, + 0x62, 0x69, 0x73, 0x71, 0x75, 0x65, 0x3a, 0x31, 0x36, 0x37, 0x37, + 0x30, 0x32, 0x34, 0x34, 0x2c, 0x62, 0x6c, 0x61, 0x63, 0x6b, 0x3a, + 0x30, 0x2c, 0x62, 0x6c, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x64, 0x61, + 0x6c, 0x6d, 0x6f, 0x6e, 0x64, 0x3a, 0x31, 0x36, 0x37, 0x37, 0x32, + 0x30, 0x34, 0x35, 0x2c, 0x62, 0x6c, 0x75, 0x65, 0x3a, 0x32, 0x35, + 0x35, 0x2c, 0x62, 0x6c, 0x75, 0x65, 0x76, 0x69, 0x6f, 0x6c, 0x65, + 0x74, 0x3a, 0x39, 0x30, 0x35, 0x35, 0x32, 0x30, 0x32, 0x2c, 0x62, + 0x72, 0x6f, 0x77, 0x6e, 0x3a, 0x31, 0x30, 0x38, 0x32, 0x34, 0x32, + 0x33, 0x34, 0x2c, 0x62, 0x75, 0x72, 0x6c, 0x79, 0x77, 0x6f, 0x6f, + 0x64, 0x3a, 0x31, 0x34, 0x35, 0x39, 0x36, 0x32, 0x33, 0x31, 0x2c, + 0x63, 0x61, 0x64, 0x65, 0x74, 0x62, 0x6c, 0x75, 0x65, 0x3a, 0x36, + 0x32, 0x36, 0x36, 0x35, 0x32, 0x38, 0x2c, 0x63, 0x68, 0x61, 0x72, + 0x74, 0x72, 0x65, 0x75, 0x73, 0x65, 0x3a, 0x38, 0x33, 0x38, 0x38, + 0x33, 0x35, 0x32, 0x2c, 0x63, 0x68, 0x6f, 0x63, 0x6f, 0x6c, 0x61, + 0x74, 0x65, 0x3a, 0x31, 0x33, 0x37, 0x38, 0x39, 0x34, 0x37, 0x30, + 0x2c, 0x63, 0x6f, 0x72, 0x61, 0x6c, 0x3a, 0x31, 0x36, 0x37, 0x34, + 0x34, 0x32, 0x37, 0x32, 0x2c, 0x63, 0x6f, 0x72, 0x6e, 0x66, 0x6c, + 0x6f, 0x77, 0x65, 0x72, 0x62, 0x6c, 0x75, 0x65, 0x3a, 0x36, 0x35, + 0x39, 0x31, 0x39, 0x38, 0x31, 0x2c, 0x63, 0x6f, 0x72, 0x6e, 0x73, + 0x69, 0x6c, 0x6b, 0x3a, 0x31, 0x36, 0x37, 0x37, 0x35, 0x33, 0x38, + 0x38, 0x2c, 0x63, 0x72, 0x69, 0x6d, 0x73, 0x6f, 0x6e, 0x3a, 0x31, + 0x34, 0x34, 0x32, 0x33, 0x31, 0x30, 0x30, 0x2c, 0x63, 0x79, 0x61, + 0x6e, 0x3a, 0x36, 0x35, 0x35, 0x33, 0x35, 0x2c, 0x64, 0x61, 0x72, + 0x6b, 0x62, 0x6c, 0x75, 0x65, 0x3a, 0x31, 0x33, 0x39, 0x2c, 0x64, + 0x61, 0x72, 0x6b, 0x63, 0x79, 0x61, 0x6e, 0x3a, 0x33, 0x35, 0x37, + 0x32, 0x33, 0x2c, 0x64, 0x61, 0x72, 0x6b, 0x67, 0x6f, 0x6c, 0x64, + 0x65, 0x6e, 0x72, 0x6f, 0x64, 0x3a, 0x31, 0x32, 0x30, 0x39, 0x32, + 0x39, 0x33, 0x39, 0x2c, 0x64, 0x61, 0x72, 0x6b, 0x67, 0x72, 0x61, + 0x79, 0x3a, 0x31, 0x31, 0x31, 0x31, 0x39, 0x30, 0x31, 0x37, 0x2c, + 0x64, 0x61, 0x72, 0x6b, 0x67, 0x72, 0x65, 0x65, 0x6e, 0x3a, 0x32, + 0x35, 0x36, 0x30, 0x30, 0x2c, 0x64, 0x61, 0x72, 0x6b, 0x67, 0x72, + 0x65, 0x79, 0x3a, 0x31, 0x31, 0x31, 0x31, 0x39, 0x30, 0x31, 0x37, + 0x2c, 0x64, 0x61, 0x72, 0x6b, 0x6b, 0x68, 0x61, 0x6b, 0x69, 0x3a, + 0x31, 0x32, 0x34, 0x33, 0x33, 0x32, 0x35, 0x39, 0x2c, 0x64, 0x61, + 0x72, 0x6b, 0x6d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x61, 0x3a, 0x39, + 0x31, 0x30, 0x39, 0x36, 0x34, 0x33, 0x2c, 0x64, 0x61, 0x72, 0x6b, + 0x6f, 0x6c, 0x69, 0x76, 0x65, 0x67, 0x72, 0x65, 0x65, 0x6e, 0x3a, + 0x35, 0x35, 0x39, 0x37, 0x39, 0x39, 0x39, 0x2c, 0x64, 0x61, 0x72, + 0x6b, 0x6f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x31, 0x36, 0x37, + 0x34, 0x37, 0x35, 0x32, 0x30, 0x2c, 0x64, 0x61, 0x72, 0x6b, 0x6f, + 0x72, 0x63, 0x68, 0x69, 0x64, 0x3a, 0x31, 0x30, 0x30, 0x34, 0x30, + 0x30, 0x31, 0x32, 0x2c, 0x64, 0x61, 0x72, 0x6b, 0x72, 0x65, 0x64, + 0x3a, 0x39, 0x31, 0x30, 0x39, 0x35, 0x30, 0x34, 0x2c, 0x64, 0x61, + 0x72, 0x6b, 0x73, 0x61, 0x6c, 0x6d, 0x6f, 0x6e, 0x3a, 0x31, 0x35, + 0x33, 0x30, 0x38, 0x34, 0x31, 0x30, 0x2c, 0x64, 0x61, 0x72, 0x6b, + 0x73, 0x65, 0x61, 0x67, 0x72, 0x65, 0x65, 0x6e, 0x3a, 0x39, 0x34, + 0x31, 0x39, 0x39, 0x31, 0x39, 0x2c, 0x64, 0x61, 0x72, 0x6b, 0x73, + 0x6c, 0x61, 0x74, 0x65, 0x62, 0x6c, 0x75, 0x65, 0x3a, 0x34, 0x37, + 0x33, 0x34, 0x33, 0x34, 0x37, 0x2c, 0x64, 0x61, 0x72, 0x6b, 0x73, + 0x6c, 0x61, 0x74, 0x65, 0x67, 0x72, 0x61, 0x79, 0x3a, 0x33, 0x31, + 0x30, 0x30, 0x34, 0x39, 0x35, 0x2c, 0x64, 0x61, 0x72, 0x6b, 0x73, + 0x6c, 0x61, 0x74, 0x65, 0x67, 0x72, 0x65, 0x79, 0x3a, 0x33, 0x31, + 0x30, 0x30, 0x34, 0x39, 0x35, 0x2c, 0x64, 0x61, 0x72, 0x6b, 0x74, + 0x75, 0x72, 0x71, 0x75, 0x6f, 0x69, 0x73, 0x65, 0x3a, 0x35, 0x32, + 0x39, 0x34, 0x35, 0x2c, 0x64, 0x61, 0x72, 0x6b, 0x76, 0x69, 0x6f, + 0x6c, 0x65, 0x74, 0x3a, 0x39, 0x36, 0x39, 0x39, 0x35, 0x33, 0x39, + 0x2c, 0x64, 0x65, 0x65, 0x70, 0x70, 0x69, 0x6e, 0x6b, 0x3a, 0x31, + 0x36, 0x37, 0x31, 0x36, 0x39, 0x34, 0x37, 0x2c, 0x64, 0x65, 0x65, + 0x70, 0x73, 0x6b, 0x79, 0x62, 0x6c, 0x75, 0x65, 0x3a, 0x34, 0x39, + 0x31, 0x35, 0x31, 0x2c, 0x64, 0x69, 0x6d, 0x67, 0x72, 0x61, 0x79, + 0x3a, 0x36, 0x39, 0x30, 0x38, 0x32, 0x36, 0x35, 0x2c, 0x64, 0x69, + 0x6d, 0x67, 0x72, 0x65, 0x79, 0x3a, 0x36, 0x39, 0x30, 0x38, 0x32, + 0x36, 0x35, 0x2c, 0x64, 0x6f, 0x64, 0x67, 0x65, 0x72, 0x62, 0x6c, + 0x75, 0x65, 0x3a, 0x32, 0x30, 0x30, 0x33, 0x31, 0x39, 0x39, 0x2c, + 0x66, 0x69, 0x72, 0x65, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x3a, 0x31, + 0x31, 0x36, 0x37, 0x34, 0x31, 0x34, 0x36, 0x2c, 0x66, 0x6c, 0x6f, + 0x72, 0x61, 0x6c, 0x77, 0x68, 0x69, 0x74, 0x65, 0x3a, 0x31, 0x36, + 0x37, 0x37, 0x35, 0x39, 0x32, 0x30, 0x2c, 0x66, 0x6f, 0x72, 0x65, + 0x73, 0x74, 0x67, 0x72, 0x65, 0x65, 0x6e, 0x3a, 0x32, 0x32, 0x36, + 0x33, 0x38, 0x34, 0x32, 0x2c, 0x66, 0x75, 0x63, 0x68, 0x73, 0x69, + 0x61, 0x3a, 0x31, 0x36, 0x37, 0x31, 0x31, 0x39, 0x33, 0x35, 0x2c, + 0x67, 0x61, 0x69, 0x6e, 0x73, 0x62, 0x6f, 0x72, 0x6f, 0x3a, 0x31, + 0x34, 0x34, 0x37, 0x34, 0x34, 0x36, 0x30, 0x2c, 0x67, 0x68, 0x6f, + 0x73, 0x74, 0x77, 0x68, 0x69, 0x74, 0x65, 0x3a, 0x31, 0x36, 0x33, + 0x31, 0x36, 0x36, 0x37, 0x31, 0x2c, 0x67, 0x6f, 0x6c, 0x64, 0x3a, + 0x31, 0x36, 0x37, 0x36, 0x36, 0x37, 0x32, 0x30, 0x2c, 0x67, 0x6f, + 0x6c, 0x64, 0x65, 0x6e, 0x72, 0x6f, 0x64, 0x3a, 0x31, 0x34, 0x33, + 0x32, 0x39, 0x31, 0x32, 0x30, 0x2c, 0x67, 0x72, 0x61, 0x79, 0x3a, + 0x38, 0x34, 0x32, 0x31, 0x35, 0x30, 0x34, 0x2c, 0x67, 0x72, 0x65, + 0x65, 0x6e, 0x3a, 0x33, 0x32, 0x37, 0x36, 0x38, 0x2c, 0x67, 0x72, + 0x65, 0x65, 0x6e, 0x79, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x3a, 0x31, + 0x31, 0x34, 0x30, 0x33, 0x30, 0x35, 0x35, 0x2c, 0x67, 0x72, 0x65, + 0x79, 0x3a, 0x38, 0x34, 0x32, 0x31, 0x35, 0x30, 0x34, 0x2c, 0x68, + 0x6f, 0x6e, 0x65, 0x79, 0x64, 0x65, 0x77, 0x3a, 0x31, 0x35, 0x37, + 0x39, 0x34, 0x31, 0x36, 0x30, 0x2c, 0x68, 0x6f, 0x74, 0x70, 0x69, + 0x6e, 0x6b, 0x3a, 0x31, 0x36, 0x37, 0x33, 0x38, 0x37, 0x34, 0x30, + 0x2c, 0x69, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x72, 0x65, 0x64, 0x3a, + 0x31, 0x33, 0x34, 0x35, 0x38, 0x35, 0x32, 0x34, 0x2c, 0x69, 0x6e, + 0x64, 0x69, 0x67, 0x6f, 0x3a, 0x34, 0x39, 0x31, 0x35, 0x33, 0x33, + 0x30, 0x2c, 0x69, 0x76, 0x6f, 0x72, 0x79, 0x3a, 0x31, 0x36, 0x37, + 0x37, 0x37, 0x32, 0x30, 0x30, 0x2c, 0x6b, 0x68, 0x61, 0x6b, 0x69, + 0x3a, 0x31, 0x35, 0x37, 0x38, 0x37, 0x36, 0x36, 0x30, 0x2c, 0x6c, + 0x61, 0x76, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x3a, 0x31, 0x35, 0x31, + 0x33, 0x32, 0x34, 0x31, 0x30, 0x2c, 0x6c, 0x61, 0x76, 0x65, 0x6e, + 0x64, 0x65, 0x72, 0x62, 0x6c, 0x75, 0x73, 0x68, 0x3a, 0x31, 0x36, + 0x37, 0x37, 0x33, 0x33, 0x36, 0x35, 0x2c, 0x6c, 0x61, 0x77, 0x6e, + 0x67, 0x72, 0x65, 0x65, 0x6e, 0x3a, 0x38, 0x31, 0x39, 0x30, 0x39, + 0x37, 0x36, 0x2c, 0x6c, 0x65, 0x6d, 0x6f, 0x6e, 0x63, 0x68, 0x69, + 0x66, 0x66, 0x6f, 0x6e, 0x3a, 0x31, 0x36, 0x37, 0x37, 0x35, 0x38, + 0x38, 0x35, 0x2c, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x62, 0x6c, 0x75, + 0x65, 0x3a, 0x31, 0x31, 0x33, 0x39, 0x33, 0x32, 0x35, 0x34, 0x2c, + 0x6c, 0x69, 0x67, 0x68, 0x74, 0x63, 0x6f, 0x72, 0x61, 0x6c, 0x3a, + 0x31, 0x35, 0x37, 0x36, 0x31, 0x35, 0x33, 0x36, 0x2c, 0x6c, 0x69, + 0x67, 0x68, 0x74, 0x63, 0x79, 0x61, 0x6e, 0x3a, 0x31, 0x34, 0x37, + 0x34, 0x35, 0x35, 0x39, 0x39, 0x2c, 0x6c, 0x69, 0x67, 0x68, 0x74, + 0x67, 0x6f, 0x6c, 0x64, 0x65, 0x6e, 0x72, 0x6f, 0x64, 0x79, 0x65, + 0x6c, 0x6c, 0x6f, 0x77, 0x3a, 0x31, 0x36, 0x34, 0x34, 0x38, 0x32, + 0x31, 0x30, 0x2c, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x67, 0x72, 0x61, + 0x79, 0x3a, 0x31, 0x33, 0x38, 0x38, 0x32, 0x33, 0x32, 0x33, 0x2c, + 0x6c, 0x69, 0x67, 0x68, 0x74, 0x67, 0x72, 0x65, 0x65, 0x6e, 0x3a, + 0x39, 0x34, 0x39, 0x38, 0x32, 0x35, 0x36, 0x2c, 0x6c, 0x69, 0x67, + 0x68, 0x74, 0x67, 0x72, 0x65, 0x79, 0x3a, 0x31, 0x33, 0x38, 0x38, + 0x32, 0x33, 0x32, 0x33, 0x2c, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x70, + 0x69, 0x6e, 0x6b, 0x3a, 0x31, 0x36, 0x37, 0x35, 0x38, 0x34, 0x36, + 0x35, 0x2c, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x61, 0x6c, 0x6d, + 0x6f, 0x6e, 0x3a, 0x31, 0x36, 0x37, 0x35, 0x32, 0x37, 0x36, 0x32, + 0x2c, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x65, 0x61, 0x67, 0x72, + 0x65, 0x65, 0x6e, 0x3a, 0x32, 0x31, 0x34, 0x32, 0x38, 0x39, 0x30, + 0x2c, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x6b, 0x79, 0x62, 0x6c, + 0x75, 0x65, 0x3a, 0x38, 0x39, 0x30, 0x30, 0x33, 0x34, 0x36, 0x2c, + 0x6c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x6c, 0x61, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x79, 0x3a, 0x37, 0x38, 0x33, 0x33, 0x37, 0x35, 0x33, + 0x2c, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x6c, 0x61, 0x74, 0x65, + 0x67, 0x72, 0x65, 0x79, 0x3a, 0x37, 0x38, 0x33, 0x33, 0x37, 0x35, + 0x33, 0x2c, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x74, 0x65, 0x65, + 0x6c, 0x62, 0x6c, 0x75, 0x65, 0x3a, 0x31, 0x31, 0x35, 0x38, 0x34, + 0x37, 0x33, 0x34, 0x2c, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x79, 0x65, + 0x6c, 0x6c, 0x6f, 0x77, 0x3a, 0x31, 0x36, 0x37, 0x37, 0x37, 0x31, + 0x38, 0x34, 0x2c, 0x6c, 0x69, 0x6d, 0x65, 0x3a, 0x36, 0x35, 0x32, + 0x38, 0x30, 0x2c, 0x6c, 0x69, 0x6d, 0x65, 0x67, 0x72, 0x65, 0x65, + 0x6e, 0x3a, 0x33, 0x33, 0x32, 0x39, 0x33, 0x33, 0x30, 0x2c, 0x6c, + 0x69, 0x6e, 0x65, 0x6e, 0x3a, 0x31, 0x36, 0x34, 0x34, 0x35, 0x36, + 0x37, 0x30, 0x2c, 0x6d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x61, 0x3a, + 0x31, 0x36, 0x37, 0x31, 0x31, 0x39, 0x33, 0x35, 0x2c, 0x6d, 0x61, + 0x72, 0x6f, 0x6f, 0x6e, 0x3a, 0x38, 0x33, 0x38, 0x38, 0x36, 0x30, + 0x38, 0x2c, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x61, 0x71, 0x75, + 0x61, 0x6d, 0x61, 0x72, 0x69, 0x6e, 0x65, 0x3a, 0x36, 0x37, 0x33, + 0x37, 0x33, 0x32, 0x32, 0x2c, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, + 0x62, 0x6c, 0x75, 0x65, 0x3a, 0x32, 0x30, 0x35, 0x2c, 0x6d, 0x65, + 0x64, 0x69, 0x75, 0x6d, 0x6f, 0x72, 0x63, 0x68, 0x69, 0x64, 0x3a, + 0x31, 0x32, 0x32, 0x31, 0x31, 0x36, 0x36, 0x37, 0x2c, 0x6d, 0x65, + 0x64, 0x69, 0x75, 0x6d, 0x70, 0x75, 0x72, 0x70, 0x6c, 0x65, 0x3a, + 0x39, 0x36, 0x36, 0x32, 0x36, 0x38, 0x33, 0x2c, 0x6d, 0x65, 0x64, + 0x69, 0x75, 0x6d, 0x73, 0x65, 0x61, 0x67, 0x72, 0x65, 0x65, 0x6e, + 0x3a, 0x33, 0x39, 0x37, 0x38, 0x30, 0x39, 0x37, 0x2c, 0x6d, 0x65, + 0x64, 0x69, 0x75, 0x6d, 0x73, 0x6c, 0x61, 0x74, 0x65, 0x62, 0x6c, + 0x75, 0x65, 0x3a, 0x38, 0x30, 0x38, 0x37, 0x37, 0x39, 0x30, 0x2c, + 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x73, 0x70, 0x72, 0x69, 0x6e, + 0x67, 0x67, 0x72, 0x65, 0x65, 0x6e, 0x3a, 0x36, 0x34, 0x31, 0x35, + 0x34, 0x2c, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x74, 0x75, 0x72, + 0x71, 0x75, 0x6f, 0x69, 0x73, 0x65, 0x3a, 0x34, 0x37, 0x37, 0x32, + 0x33, 0x30, 0x30, 0x2c, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x76, + 0x69, 0x6f, 0x6c, 0x65, 0x74, 0x72, 0x65, 0x64, 0x3a, 0x31, 0x33, + 0x30, 0x34, 0x37, 0x31, 0x37, 0x33, 0x2c, 0x6d, 0x69, 0x64, 0x6e, + 0x69, 0x67, 0x68, 0x74, 0x62, 0x6c, 0x75, 0x65, 0x3a, 0x31, 0x36, + 0x34, 0x34, 0x39, 0x31, 0x32, 0x2c, 0x6d, 0x69, 0x6e, 0x74, 0x63, + 0x72, 0x65, 0x61, 0x6d, 0x3a, 0x31, 0x36, 0x31, 0x32, 0x31, 0x38, + 0x35, 0x30, 0x2c, 0x6d, 0x69, 0x73, 0x74, 0x79, 0x72, 0x6f, 0x73, + 0x65, 0x3a, 0x31, 0x36, 0x37, 0x37, 0x30, 0x32, 0x37, 0x33, 0x2c, + 0x6d, 0x6f, 0x63, 0x63, 0x61, 0x73, 0x69, 0x6e, 0x3a, 0x31, 0x36, + 0x37, 0x37, 0x30, 0x32, 0x32, 0x39, 0x2c, 0x6e, 0x61, 0x76, 0x61, + 0x6a, 0x6f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x3a, 0x31, 0x36, 0x37, + 0x36, 0x38, 0x36, 0x38, 0x35, 0x2c, 0x6e, 0x61, 0x76, 0x79, 0x3a, + 0x31, 0x32, 0x38, 0x2c, 0x6f, 0x6c, 0x64, 0x6c, 0x61, 0x63, 0x65, + 0x3a, 0x31, 0x36, 0x36, 0x34, 0x33, 0x35, 0x35, 0x38, 0x2c, 0x6f, + 0x6c, 0x69, 0x76, 0x65, 0x3a, 0x38, 0x34, 0x32, 0x31, 0x33, 0x37, + 0x36, 0x2c, 0x6f, 0x6c, 0x69, 0x76, 0x65, 0x64, 0x72, 0x61, 0x62, + 0x3a, 0x37, 0x30, 0x34, 0x38, 0x37, 0x33, 0x39, 0x2c, 0x6f, 0x72, + 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x31, 0x36, 0x37, 0x35, 0x33, 0x39, + 0x32, 0x30, 0x2c, 0x6f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x65, + 0x64, 0x3a, 0x31, 0x36, 0x37, 0x32, 0x39, 0x33, 0x34, 0x34, 0x2c, + 0x6f, 0x72, 0x63, 0x68, 0x69, 0x64, 0x3a, 0x31, 0x34, 0x33, 0x31, + 0x35, 0x37, 0x33, 0x34, 0x2c, 0x70, 0x61, 0x6c, 0x65, 0x67, 0x6f, + 0x6c, 0x64, 0x65, 0x6e, 0x72, 0x6f, 0x64, 0x3a, 0x31, 0x35, 0x36, + 0x35, 0x37, 0x31, 0x33, 0x30, 0x2c, 0x70, 0x61, 0x6c, 0x65, 0x67, + 0x72, 0x65, 0x65, 0x6e, 0x3a, 0x31, 0x30, 0x30, 0x32, 0x35, 0x38, + 0x38, 0x30, 0x2c, 0x70, 0x61, 0x6c, 0x65, 0x74, 0x75, 0x72, 0x71, + 0x75, 0x6f, 0x69, 0x73, 0x65, 0x3a, 0x31, 0x31, 0x35, 0x32, 0x39, + 0x39, 0x36, 0x36, 0x2c, 0x70, 0x61, 0x6c, 0x65, 0x76, 0x69, 0x6f, + 0x6c, 0x65, 0x74, 0x72, 0x65, 0x64, 0x3a, 0x31, 0x34, 0x33, 0x38, + 0x31, 0x32, 0x30, 0x33, 0x2c, 0x70, 0x61, 0x70, 0x61, 0x79, 0x61, + 0x77, 0x68, 0x69, 0x70, 0x3a, 0x31, 0x36, 0x37, 0x37, 0x33, 0x30, + 0x37, 0x37, 0x2c, 0x70, 0x65, 0x61, 0x63, 0x68, 0x70, 0x75, 0x66, + 0x66, 0x3a, 0x31, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x33, 0x2c, + 0x70, 0x65, 0x72, 0x75, 0x3a, 0x31, 0x33, 0x34, 0x36, 0x38, 0x39, + 0x39, 0x31, 0x2c, 0x70, 0x69, 0x6e, 0x6b, 0x3a, 0x31, 0x36, 0x37, + 0x36, 0x31, 0x30, 0x33, 0x35, 0x2c, 0x70, 0x6c, 0x75, 0x6d, 0x3a, + 0x31, 0x34, 0x35, 0x32, 0x34, 0x36, 0x33, 0x37, 0x2c, 0x70, 0x6f, + 0x77, 0x64, 0x65, 0x72, 0x62, 0x6c, 0x75, 0x65, 0x3a, 0x31, 0x31, + 0x35, 0x39, 0x31, 0x39, 0x31, 0x30, 0x2c, 0x70, 0x75, 0x72, 0x70, + 0x6c, 0x65, 0x3a, 0x38, 0x33, 0x38, 0x38, 0x37, 0x33, 0x36, 0x2c, + 0x72, 0x65, 0x62, 0x65, 0x63, 0x63, 0x61, 0x70, 0x75, 0x72, 0x70, + 0x6c, 0x65, 0x3a, 0x36, 0x36, 0x39, 0x37, 0x38, 0x38, 0x31, 0x2c, + 0x72, 0x65, 0x64, 0x3a, 0x31, 0x36, 0x37, 0x31, 0x31, 0x36, 0x38, + 0x30, 0x2c, 0x72, 0x6f, 0x73, 0x79, 0x62, 0x72, 0x6f, 0x77, 0x6e, + 0x3a, 0x31, 0x32, 0x33, 0x35, 0x37, 0x35, 0x31, 0x39, 0x2c, 0x72, + 0x6f, 0x79, 0x61, 0x6c, 0x62, 0x6c, 0x75, 0x65, 0x3a, 0x34, 0x32, + 0x38, 0x36, 0x39, 0x34, 0x35, 0x2c, 0x73, 0x61, 0x64, 0x64, 0x6c, + 0x65, 0x62, 0x72, 0x6f, 0x77, 0x6e, 0x3a, 0x39, 0x31, 0x32, 0x37, + 0x31, 0x38, 0x37, 0x2c, 0x73, 0x61, 0x6c, 0x6d, 0x6f, 0x6e, 0x3a, + 0x31, 0x36, 0x34, 0x31, 0x36, 0x38, 0x38, 0x32, 0x2c, 0x73, 0x61, + 0x6e, 0x64, 0x79, 0x62, 0x72, 0x6f, 0x77, 0x6e, 0x3a, 0x31, 0x36, + 0x30, 0x33, 0x32, 0x38, 0x36, 0x34, 0x2c, 0x73, 0x65, 0x61, 0x67, + 0x72, 0x65, 0x65, 0x6e, 0x3a, 0x33, 0x30, 0x35, 0x30, 0x33, 0x32, + 0x37, 0x2c, 0x73, 0x65, 0x61, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x3a, + 0x31, 0x36, 0x37, 0x37, 0x34, 0x36, 0x33, 0x38, 0x2c, 0x73, 0x69, + 0x65, 0x6e, 0x6e, 0x61, 0x3a, 0x31, 0x30, 0x35, 0x30, 0x36, 0x37, + 0x39, 0x37, 0x2c, 0x73, 0x69, 0x6c, 0x76, 0x65, 0x72, 0x3a, 0x31, + 0x32, 0x36, 0x33, 0x32, 0x32, 0x35, 0x36, 0x2c, 0x73, 0x6b, 0x79, + 0x62, 0x6c, 0x75, 0x65, 0x3a, 0x38, 0x39, 0x30, 0x30, 0x33, 0x33, + 0x31, 0x2c, 0x73, 0x6c, 0x61, 0x74, 0x65, 0x62, 0x6c, 0x75, 0x65, + 0x3a, 0x36, 0x39, 0x37, 0x30, 0x30, 0x36, 0x31, 0x2c, 0x73, 0x6c, + 0x61, 0x74, 0x65, 0x67, 0x72, 0x61, 0x79, 0x3a, 0x37, 0x33, 0x37, + 0x32, 0x39, 0x34, 0x34, 0x2c, 0x73, 0x6c, 0x61, 0x74, 0x65, 0x67, + 0x72, 0x65, 0x79, 0x3a, 0x37, 0x33, 0x37, 0x32, 0x39, 0x34, 0x34, + 0x2c, 0x73, 0x6e, 0x6f, 0x77, 0x3a, 0x31, 0x36, 0x37, 0x37, 0x35, + 0x39, 0x33, 0x30, 0x2c, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x67, + 0x72, 0x65, 0x65, 0x6e, 0x3a, 0x36, 0x35, 0x34, 0x30, 0x37, 0x2c, + 0x73, 0x74, 0x65, 0x65, 0x6c, 0x62, 0x6c, 0x75, 0x65, 0x3a, 0x34, + 0x36, 0x32, 0x30, 0x39, 0x38, 0x30, 0x2c, 0x74, 0x61, 0x6e, 0x3a, + 0x31, 0x33, 0x38, 0x30, 0x38, 0x37, 0x38, 0x30, 0x2c, 0x74, 0x65, + 0x61, 0x6c, 0x3a, 0x33, 0x32, 0x38, 0x39, 0x36, 0x2c, 0x74, 0x68, + 0x69, 0x73, 0x74, 0x6c, 0x65, 0x3a, 0x31, 0x34, 0x32, 0x30, 0x34, + 0x38, 0x38, 0x38, 0x2c, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x6f, 0x3a, + 0x31, 0x36, 0x37, 0x33, 0x37, 0x30, 0x39, 0x35, 0x2c, 0x74, 0x75, + 0x72, 0x71, 0x75, 0x6f, 0x69, 0x73, 0x65, 0x3a, 0x34, 0x32, 0x35, + 0x31, 0x38, 0x35, 0x36, 0x2c, 0x76, 0x69, 0x6f, 0x6c, 0x65, 0x74, + 0x3a, 0x31, 0x35, 0x36, 0x33, 0x31, 0x30, 0x38, 0x36, 0x2c, 0x77, + 0x68, 0x65, 0x61, 0x74, 0x3a, 0x31, 0x36, 0x31, 0x31, 0x33, 0x33, + 0x33, 0x31, 0x2c, 0x77, 0x68, 0x69, 0x74, 0x65, 0x3a, 0x31, 0x36, + 0x37, 0x37, 0x37, 0x32, 0x31, 0x35, 0x2c, 0x77, 0x68, 0x69, 0x74, + 0x65, 0x73, 0x6d, 0x6f, 0x6b, 0x65, 0x3a, 0x31, 0x36, 0x31, 0x31, + 0x39, 0x32, 0x38, 0x35, 0x2c, 0x79, 0x65, 0x6c, 0x6c, 0x6f, 0x77, + 0x3a, 0x31, 0x36, 0x37, 0x37, 0x36, 0x39, 0x36, 0x30, 0x2c, 0x79, + 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x67, 0x72, 0x65, 0x65, 0x6e, 0x3a, + 0x31, 0x30, 0x31, 0x34, 0x35, 0x30, 0x37, 0x34, 0x7d, 0x29, 0x3b, + 0x47, 0x61, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, + 0x74, 0x29, 0x7b, 0x47, 0x61, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x6e, + 0x2c, 0x79, 0x74, 0x28, 0x74, 0x29, 0x29, 0x7d, 0x29, 0x2c, 0x74, + 0x61, 0x2e, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x6f, 0x72, 0x3d, 0x45, + 0x74, 0x2c, 0x74, 0x61, 0x2e, 0x78, 0x68, 0x72, 0x3d, 0x41, 0x74, + 0x28, 0x79, 0x29, 0x2c, 0x74, 0x61, 0x2e, 0x64, 0x73, 0x76, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, + 0x74, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x65, 0x28, 0x6e, 0x2c, 0x65, 0x2c, 0x69, 0x29, 0x7b, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3c, 0x33, 0x26, 0x26, 0x28, 0x69, 0x3d, + 0x65, 0x2c, 0x65, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x6f, 0x3d, 0x4e, 0x74, 0x28, 0x6e, 0x2c, 0x74, + 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x65, 0x3f, 0x72, 0x3a, + 0x75, 0x28, 0x65, 0x29, 0x2c, 0x69, 0x29, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x2e, 0x72, 0x6f, 0x77, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3f, 0x6f, 0x2e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x28, 0x65, 0x3d, + 0x6e, 0x29, 0x3f, 0x72, 0x3a, 0x75, 0x28, 0x6e, 0x29, 0x29, 0x3a, + 0x65, 0x7d, 0x2c, 0x6f, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x72, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x65, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, + 0x28, 0x6e, 0x2e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x54, 0x65, 0x78, 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x65, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x74, + 0x2e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x65, + 0x78, 0x74, 0x2c, 0x6e, 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x28, 0x74, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, 0x6d, 0x61, 0x70, + 0x28, 0x6f, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x6e, 0x29, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, + 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x61, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x28, 0x6e, 0x29, 0x3f, 0x27, + 0x22, 0x27, 0x2b, 0x6e, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, + 0x65, 0x28, 0x2f, 0x5c, 0x22, 0x2f, 0x67, 0x2c, 0x27, 0x22, 0x22, + 0x27, 0x29, 0x2b, 0x27, 0x22, 0x27, 0x3a, 0x6e, 0x7d, 0x76, 0x61, + 0x72, 0x20, 0x61, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x52, 0x65, 0x67, + 0x45, 0x78, 0x70, 0x28, 0x27, 0x5b, 0x22, 0x27, 0x2b, 0x6e, 0x2b, + 0x22, 0x5c, 0x6e, 0x5d, 0x22, 0x29, 0x2c, 0x63, 0x3d, 0x6e, 0x2e, + 0x63, 0x68, 0x61, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x41, 0x74, 0x28, + 0x30, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, + 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x72, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x65, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x52, 0x6f, 0x77, + 0x73, 0x28, 0x6e, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x2c, 0x65, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x72, + 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x28, 0x6e, + 0x2c, 0x65, 0x2d, 0x31, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x75, + 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x22, 0x64, 0x22, 0x2c, 0x22, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x22, 0x2b, 0x6e, 0x2e, 0x6d, 0x61, + 0x70, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x69, 0x66, 0x79, 0x28, 0x6e, 0x29, 0x2b, 0x22, 0x3a, 0x20, + 0x64, 0x5b, 0x22, 0x2b, 0x74, 0x2b, 0x22, 0x5d, 0x22, 0x7d, 0x29, + 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x22, 0x2c, 0x22, 0x29, 0x2b, + 0x22, 0x7d, 0x22, 0x29, 0x3b, 0x72, 0x3d, 0x74, 0x3f, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x65, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x28, 0x75, + 0x28, 0x6e, 0x29, 0x2c, 0x65, 0x29, 0x7d, 0x3a, 0x75, 0x7d, 0x29, + 0x7d, 0x2c, 0x65, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x52, 0x6f, + 0x77, 0x73, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x28, 0x29, 0x7b, 0x69, 0x66, 0x28, + 0x73, 0x3e, 0x3d, 0x6c, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6f, 0x3b, 0x69, 0x66, 0x28, 0x75, 0x29, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x75, 0x3d, 0x21, 0x31, 0x2c, 0x69, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x73, 0x3b, 0x69, 0x66, 0x28, + 0x33, 0x34, 0x3d, 0x3d, 0x3d, 0x6e, 0x2e, 0x63, 0x68, 0x61, 0x72, + 0x43, 0x6f, 0x64, 0x65, 0x41, 0x74, 0x28, 0x74, 0x29, 0x29, 0x7b, + 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x74, + 0x3b, 0x65, 0x2b, 0x2b, 0x3c, 0x6c, 0x3b, 0x29, 0x69, 0x66, 0x28, + 0x33, 0x34, 0x3d, 0x3d, 0x3d, 0x6e, 0x2e, 0x63, 0x68, 0x61, 0x72, + 0x43, 0x6f, 0x64, 0x65, 0x41, 0x74, 0x28, 0x65, 0x29, 0x29, 0x7b, + 0x69, 0x66, 0x28, 0x33, 0x34, 0x21, 0x3d, 0x3d, 0x6e, 0x2e, 0x63, + 0x68, 0x61, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x41, 0x74, 0x28, 0x65, + 0x2b, 0x31, 0x29, 0x29, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x2b, + 0x2b, 0x65, 0x7d, 0x73, 0x3d, 0x65, 0x2b, 0x32, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x72, 0x3d, 0x6e, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x43, + 0x6f, 0x64, 0x65, 0x41, 0x74, 0x28, 0x65, 0x2b, 0x31, 0x29, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x33, 0x3d, 0x3d, + 0x3d, 0x72, 0x3f, 0x28, 0x75, 0x3d, 0x21, 0x30, 0x2c, 0x31, 0x30, + 0x3d, 0x3d, 0x3d, 0x6e, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x43, 0x6f, + 0x64, 0x65, 0x41, 0x74, 0x28, 0x65, 0x2b, 0x32, 0x29, 0x26, 0x26, + 0x2b, 0x2b, 0x73, 0x29, 0x3a, 0x31, 0x30, 0x3d, 0x3d, 0x3d, 0x72, + 0x26, 0x26, 0x28, 0x75, 0x3d, 0x21, 0x30, 0x29, 0x2c, 0x6e, 0x2e, + 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x74, 0x2b, 0x31, 0x2c, 0x65, + 0x29, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, + 0x22, 0x22, 0x2f, 0x67, 0x2c, 0x27, 0x22, 0x27, 0x29, 0x7d, 0x66, + 0x6f, 0x72, 0x28, 0x3b, 0x6c, 0x3e, 0x73, 0x3b, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x72, 0x3d, 0x6e, 0x2e, 0x63, 0x68, 0x61, 0x72, + 0x43, 0x6f, 0x64, 0x65, 0x41, 0x74, 0x28, 0x73, 0x2b, 0x2b, 0x29, + 0x2c, 0x61, 0x3d, 0x31, 0x3b, 0x69, 0x66, 0x28, 0x31, 0x30, 0x3d, + 0x3d, 0x3d, 0x72, 0x29, 0x75, 0x3d, 0x21, 0x30, 0x3b, 0x65, 0x6c, + 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x31, 0x33, 0x3d, 0x3d, 0x3d, + 0x72, 0x29, 0x75, 0x3d, 0x21, 0x30, 0x2c, 0x31, 0x30, 0x3d, 0x3d, + 0x3d, 0x6e, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x43, 0x6f, 0x64, 0x65, + 0x41, 0x74, 0x28, 0x73, 0x29, 0x26, 0x26, 0x28, 0x2b, 0x2b, 0x73, + 0x2c, 0x2b, 0x2b, 0x61, 0x29, 0x3b, 0x65, 0x6c, 0x73, 0x65, 0x20, + 0x69, 0x66, 0x28, 0x72, 0x21, 0x3d, 0x3d, 0x63, 0x29, 0x63, 0x6f, + 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, + 0x74, 0x2c, 0x73, 0x2d, 0x61, 0x29, 0x7d, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, + 0x74, 0x29, 0x7d, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, + 0x72, 0x2c, 0x75, 0x2c, 0x69, 0x3d, 0x7b, 0x7d, 0x2c, 0x6f, 0x3d, + 0x7b, 0x7d, 0x2c, 0x61, 0x3d, 0x5b, 0x5d, 0x2c, 0x6c, 0x3d, 0x6e, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x73, 0x3d, 0x30, + 0x2c, 0x66, 0x3d, 0x30, 0x3b, 0x28, 0x72, 0x3d, 0x65, 0x28, 0x29, + 0x29, 0x21, 0x3d, 0x3d, 0x6f, 0x3b, 0x29, 0x7b, 0x66, 0x6f, 0x72, + 0x28, 0x76, 0x61, 0x72, 0x20, 0x68, 0x3d, 0x5b, 0x5d, 0x3b, 0x72, + 0x21, 0x3d, 0x3d, 0x69, 0x26, 0x26, 0x72, 0x21, 0x3d, 0x3d, 0x6f, + 0x3b, 0x29, 0x68, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x72, 0x29, + 0x2c, 0x72, 0x3d, 0x65, 0x28, 0x29, 0x3b, 0x74, 0x26, 0x26, 0x6e, + 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x28, 0x68, 0x3d, 0x74, 0x28, 0x68, + 0x2c, 0x66, 0x2b, 0x2b, 0x29, 0x29, 0x7c, 0x7c, 0x61, 0x2e, 0x70, + 0x75, 0x73, 0x68, 0x28, 0x68, 0x29, 0x7d, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x61, 0x7d, 0x2c, 0x65, 0x2e, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x41, 0x72, 0x72, + 0x61, 0x79, 0x2e, 0x69, 0x73, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, + 0x74, 0x5b, 0x30, 0x5d, 0x29, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x65, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, + 0x6f, 0x77, 0x73, 0x28, 0x74, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x72, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x6d, 0x2c, 0x75, 0x3d, 0x5b, + 0x5d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, + 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x6f, + 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x20, 0x69, 0x6e, 0x20, + 0x6e, 0x29, 0x72, 0x2e, 0x68, 0x61, 0x73, 0x28, 0x74, 0x29, 0x7c, + 0x7c, 0x75, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x72, 0x2e, 0x61, + 0x64, 0x64, 0x28, 0x74, 0x29, 0x29, 0x7d, 0x29, 0x2c, 0x5b, 0x75, + 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6f, 0x29, 0x2e, 0x6a, 0x6f, 0x69, + 0x6e, 0x28, 0x6e, 0x29, 0x5d, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, + 0x74, 0x28, 0x74, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x2e, 0x6d, 0x61, 0x70, 0x28, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x28, 0x74, + 0x5b, 0x6e, 0x5d, 0x29, 0x7d, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, + 0x28, 0x6e, 0x29, 0x7d, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, + 0x28, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x7d, 0x2c, 0x65, 0x2e, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x6f, 0x77, 0x73, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x6d, 0x61, + 0x70, 0x28, 0x69, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x22, + 0x5c, 0x6e, 0x22, 0x29, 0x7d, 0x2c, 0x65, 0x7d, 0x2c, 0x74, 0x61, + 0x2e, 0x63, 0x73, 0x76, 0x3d, 0x74, 0x61, 0x2e, 0x64, 0x73, 0x76, + 0x28, 0x22, 0x2c, 0x22, 0x2c, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, + 0x63, 0x73, 0x76, 0x22, 0x29, 0x2c, 0x74, 0x61, 0x2e, 0x74, 0x73, + 0x76, 0x3d, 0x74, 0x61, 0x2e, 0x64, 0x73, 0x76, 0x28, 0x22, 0x09, + 0x22, 0x2c, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x74, 0x61, 0x62, + 0x2d, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x64, 0x2d, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x29, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x4b, 0x61, 0x2c, 0x51, 0x61, 0x2c, 0x6e, 0x63, 0x2c, + 0x74, 0x63, 0x2c, 0x65, 0x63, 0x2c, 0x72, 0x63, 0x3d, 0x74, 0x68, + 0x69, 0x73, 0x5b, 0x78, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x22, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x6e, 0x69, 0x6d, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x22, + 0x29, 0x5d, 0x7c, 0x7c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x28, 0x6e, 0x2c, 0x31, 0x37, 0x29, 0x7d, + 0x3b, 0x74, 0x61, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, + 0x2c, 0x65, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x32, 0x3e, 0x72, 0x26, 0x26, 0x28, + 0x74, 0x3d, 0x30, 0x29, 0x2c, 0x33, 0x3e, 0x72, 0x26, 0x26, 0x28, + 0x65, 0x3d, 0x44, 0x61, 0x74, 0x65, 0x2e, 0x6e, 0x6f, 0x77, 0x28, + 0x29, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x75, 0x3d, 0x65, 0x2b, + 0x74, 0x2c, 0x69, 0x3d, 0x7b, 0x63, 0x3a, 0x6e, 0x2c, 0x74, 0x3a, + 0x75, 0x2c, 0x66, 0x3a, 0x21, 0x31, 0x2c, 0x6e, 0x3a, 0x6e, 0x75, + 0x6c, 0x6c, 0x7d, 0x3b, 0x51, 0x61, 0x3f, 0x51, 0x61, 0x2e, 0x6e, + 0x3d, 0x69, 0x3a, 0x4b, 0x61, 0x3d, 0x69, 0x2c, 0x51, 0x61, 0x3d, + 0x69, 0x2c, 0x6e, 0x63, 0x7c, 0x7c, 0x28, 0x74, 0x63, 0x3d, 0x63, + 0x6c, 0x65, 0x61, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x28, 0x74, 0x63, 0x29, 0x2c, 0x6e, 0x63, 0x3d, 0x31, 0x2c, 0x72, + 0x63, 0x28, 0x71, 0x74, 0x29, 0x29, 0x7d, 0x2c, 0x74, 0x61, 0x2e, + 0x74, 0x69, 0x6d, 0x65, 0x72, 0x2e, 0x66, 0x6c, 0x75, 0x73, 0x68, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x7b, 0x4c, 0x74, 0x28, 0x29, 0x2c, 0x54, 0x74, 0x28, 0x29, 0x7d, + 0x2c, 0x74, 0x61, 0x2e, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x3f, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x28, + 0x6e, 0x2a, 0x28, 0x74, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x70, + 0x6f, 0x77, 0x28, 0x31, 0x30, 0x2c, 0x74, 0x29, 0x29, 0x29, 0x2f, + 0x74, 0x3a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x28, 0x6e, 0x29, 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x75, + 0x63, 0x3d, 0x5b, 0x22, 0x79, 0x22, 0x2c, 0x22, 0x7a, 0x22, 0x2c, + 0x22, 0x61, 0x22, 0x2c, 0x22, 0x66, 0x22, 0x2c, 0x22, 0x70, 0x22, + 0x2c, 0x22, 0x6e, 0x22, 0x2c, 0x22, 0x5c, 0x78, 0x62, 0x35, 0x22, + 0x2c, 0x22, 0x6d, 0x22, 0x2c, 0x22, 0x22, 0x2c, 0x22, 0x6b, 0x22, + 0x2c, 0x22, 0x4d, 0x22, 0x2c, 0x22, 0x47, 0x22, 0x2c, 0x22, 0x54, + 0x22, 0x2c, 0x22, 0x50, 0x22, 0x2c, 0x22, 0x45, 0x22, 0x2c, 0x22, + 0x5a, 0x22, 0x2c, 0x22, 0x59, 0x22, 0x5d, 0x2e, 0x6d, 0x61, 0x70, + 0x28, 0x44, 0x74, 0x29, 0x3b, 0x74, 0x61, 0x2e, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x30, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x26, 0x26, 0x28, 0x30, + 0x3e, 0x6e, 0x26, 0x26, 0x28, 0x6e, 0x2a, 0x3d, 0x2d, 0x31, 0x29, + 0x2c, 0x74, 0x26, 0x26, 0x28, 0x6e, 0x3d, 0x74, 0x61, 0x2e, 0x72, + 0x6f, 0x75, 0x6e, 0x64, 0x28, 0x6e, 0x2c, 0x52, 0x74, 0x28, 0x6e, + 0x2c, 0x74, 0x29, 0x29, 0x29, 0x2c, 0x65, 0x3d, 0x31, 0x2b, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x31, + 0x65, 0x2d, 0x31, 0x32, 0x2b, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6c, + 0x6f, 0x67, 0x28, 0x6e, 0x29, 0x2f, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x4c, 0x4e, 0x31, 0x30, 0x29, 0x2c, 0x65, 0x3d, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x2d, 0x32, 0x34, 0x2c, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x32, 0x34, 0x2c, + 0x33, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6c, 0x6f, 0x6f, + 0x72, 0x28, 0x28, 0x65, 0x2d, 0x31, 0x29, 0x2f, 0x33, 0x29, 0x29, + 0x29, 0x29, 0x2c, 0x75, 0x63, 0x5b, 0x38, 0x2b, 0x65, 0x2f, 0x33, + 0x5d, 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x63, 0x3d, 0x2f, + 0x28, 0x3f, 0x3a, 0x28, 0x5b, 0x5e, 0x7b, 0x5d, 0x29, 0x3f, 0x28, + 0x5b, 0x3c, 0x3e, 0x3d, 0x5e, 0x5d, 0x29, 0x29, 0x3f, 0x28, 0x5b, + 0x2b, 0x5c, 0x2d, 0x20, 0x5d, 0x29, 0x3f, 0x28, 0x5b, 0x24, 0x23, + 0x5d, 0x29, 0x3f, 0x28, 0x30, 0x29, 0x3f, 0x28, 0x5c, 0x64, 0x2b, + 0x29, 0x3f, 0x28, 0x2c, 0x29, 0x3f, 0x28, 0x5c, 0x2e, 0x2d, 0x3f, + 0x5c, 0x64, 0x2b, 0x29, 0x3f, 0x28, 0x5b, 0x61, 0x2d, 0x7a, 0x25, + 0x5d, 0x29, 0x3f, 0x2f, 0x69, 0x2c, 0x6f, 0x63, 0x3d, 0x74, 0x61, + 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x7b, 0x62, 0x3a, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x74, 0x6f, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x28, 0x32, 0x29, 0x7d, 0x2c, 0x63, 0x3a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x72, 0x6f, 0x6d, 0x43, 0x68, 0x61, + 0x72, 0x43, 0x6f, 0x64, 0x65, 0x28, 0x6e, 0x29, 0x7d, 0x2c, 0x6f, + 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, + 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x38, 0x29, + 0x7d, 0x2c, 0x78, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6e, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x31, 0x36, 0x29, 0x7d, 0x2c, 0x58, 0x3a, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x74, 0x6f, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x28, 0x31, 0x36, 0x29, 0x2e, 0x74, 0x6f, + 0x55, 0x70, 0x70, 0x65, 0x72, 0x43, 0x61, 0x73, 0x65, 0x28, 0x29, + 0x7d, 0x2c, 0x67, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x74, 0x6f, 0x50, 0x72, 0x65, 0x63, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7d, 0x2c, 0x65, + 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x2e, 0x74, 0x6f, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x28, 0x74, 0x29, 0x7d, 0x2c, 0x66, 0x3a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, + 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x74, 0x29, + 0x7d, 0x2c, 0x72, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x28, 0x6e, 0x3d, 0x74, 0x61, 0x2e, 0x72, 0x6f, 0x75, + 0x6e, 0x64, 0x28, 0x6e, 0x2c, 0x52, 0x74, 0x28, 0x6e, 0x2c, 0x74, + 0x29, 0x29, 0x29, 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, + 0x28, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x30, + 0x2c, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x32, + 0x30, 0x2c, 0x52, 0x74, 0x28, 0x6e, 0x2a, 0x28, 0x31, 0x2b, 0x31, + 0x65, 0x2d, 0x31, 0x35, 0x29, 0x2c, 0x74, 0x29, 0x29, 0x29, 0x29, + 0x7d, 0x7d, 0x29, 0x2c, 0x61, 0x63, 0x3d, 0x74, 0x61, 0x2e, 0x74, + 0x69, 0x6d, 0x65, 0x3d, 0x7b, 0x7d, 0x2c, 0x63, 0x63, 0x3d, 0x44, + 0x61, 0x74, 0x65, 0x3b, 0x6a, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x7b, 0x67, 0x65, 0x74, 0x44, + 0x61, 0x74, 0x65, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x2e, 0x67, 0x65, 0x74, 0x55, + 0x54, 0x43, 0x44, 0x61, 0x74, 0x65, 0x28, 0x29, 0x7d, 0x2c, 0x67, + 0x65, 0x74, 0x44, 0x61, 0x79, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x2e, 0x67, 0x65, + 0x74, 0x55, 0x54, 0x43, 0x44, 0x61, 0x79, 0x28, 0x29, 0x7d, 0x2c, + 0x67, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x59, 0x65, 0x61, 0x72, + 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x5f, 0x2e, 0x67, 0x65, 0x74, 0x55, 0x54, 0x43, 0x46, + 0x75, 0x6c, 0x6c, 0x59, 0x65, 0x61, 0x72, 0x28, 0x29, 0x7d, 0x2c, + 0x67, 0x65, 0x74, 0x48, 0x6f, 0x75, 0x72, 0x73, 0x3a, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, + 0x2e, 0x67, 0x65, 0x74, 0x55, 0x54, 0x43, 0x48, 0x6f, 0x75, 0x72, + 0x73, 0x28, 0x29, 0x7d, 0x2c, 0x67, 0x65, 0x74, 0x4d, 0x69, 0x6c, + 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x3a, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x5f, 0x2e, 0x67, 0x65, 0x74, 0x55, 0x54, 0x43, 0x4d, 0x69, 0x6c, + 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x28, 0x29, + 0x7d, 0x2c, 0x67, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x75, 0x74, 0x65, + 0x73, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x5f, 0x2e, 0x67, 0x65, 0x74, 0x55, 0x54, 0x43, + 0x4d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x28, 0x29, 0x7d, 0x2c, + 0x67, 0x65, 0x74, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x3a, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, + 0x2e, 0x67, 0x65, 0x74, 0x55, 0x54, 0x43, 0x4d, 0x6f, 0x6e, 0x74, + 0x68, 0x28, 0x29, 0x7d, 0x2c, 0x67, 0x65, 0x74, 0x53, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x73, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x2e, 0x67, 0x65, 0x74, + 0x55, 0x54, 0x43, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x28, + 0x29, 0x7d, 0x2c, 0x67, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x3a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x5f, 0x2e, 0x67, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x28, + 0x29, 0x7d, 0x2c, 0x67, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x7a, + 0x6f, 0x6e, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3a, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x30, 0x7d, 0x2c, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x4f, 0x66, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x2e, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x4f, 0x66, 0x28, 0x29, 0x7d, 0x2c, 0x73, 0x65, + 0x74, 0x44, 0x61, 0x74, 0x65, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x6c, 0x63, 0x2e, 0x73, 0x65, + 0x74, 0x55, 0x54, 0x43, 0x44, 0x61, 0x74, 0x65, 0x2e, 0x61, 0x70, + 0x70, 0x6c, 0x79, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x2c, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x7d, + 0x2c, 0x73, 0x65, 0x74, 0x44, 0x61, 0x79, 0x3a, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x6c, 0x63, 0x2e, + 0x73, 0x65, 0x74, 0x55, 0x54, 0x43, 0x44, 0x61, 0x79, 0x2e, 0x61, + 0x70, 0x70, 0x6c, 0x79, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, + 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, + 0x7d, 0x2c, 0x73, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x59, 0x65, + 0x61, 0x72, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x7b, 0x6c, 0x63, 0x2e, 0x73, 0x65, 0x74, 0x55, 0x54, + 0x43, 0x46, 0x75, 0x6c, 0x6c, 0x59, 0x65, 0x61, 0x72, 0x2e, 0x61, + 0x70, 0x70, 0x6c, 0x79, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, + 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, + 0x7d, 0x2c, 0x73, 0x65, 0x74, 0x48, 0x6f, 0x75, 0x72, 0x73, 0x3a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, + 0x6c, 0x63, 0x2e, 0x73, 0x65, 0x74, 0x55, 0x54, 0x43, 0x48, 0x6f, + 0x75, 0x72, 0x73, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x29, 0x7d, 0x2c, 0x73, 0x65, 0x74, 0x4d, + 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, + 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x7b, 0x6c, 0x63, 0x2e, 0x73, 0x65, 0x74, 0x55, 0x54, 0x43, 0x4d, + 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, + 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x5f, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x29, 0x7d, 0x2c, 0x73, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x75, + 0x74, 0x65, 0x73, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x7b, 0x6c, 0x63, 0x2e, 0x73, 0x65, 0x74, 0x55, + 0x54, 0x43, 0x4d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x61, + 0x70, 0x70, 0x6c, 0x79, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, + 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, + 0x7d, 0x2c, 0x73, 0x65, 0x74, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x3a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, + 0x6c, 0x63, 0x2e, 0x73, 0x65, 0x74, 0x55, 0x54, 0x43, 0x4d, 0x6f, + 0x6e, 0x74, 0x68, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x29, 0x7d, 0x2c, 0x73, 0x65, 0x74, 0x53, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x3a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x6c, 0x63, 0x2e, 0x73, + 0x65, 0x74, 0x55, 0x54, 0x43, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x5f, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x29, 0x7d, 0x2c, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x29, 0x7b, 0x6c, 0x63, 0x2e, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x5f, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x29, 0x7d, 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x6c, + 0x63, 0x3d, 0x44, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x74, 0x79, 0x70, 0x65, 0x3b, 0x61, 0x63, 0x2e, 0x79, 0x65, + 0x61, 0x72, 0x3d, 0x46, 0x74, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x3d, 0x61, 0x63, 0x2e, 0x64, 0x61, 0x79, + 0x28, 0x6e, 0x29, 0x2c, 0x6e, 0x2e, 0x73, 0x65, 0x74, 0x4d, 0x6f, + 0x6e, 0x74, 0x68, 0x28, 0x30, 0x2c, 0x31, 0x29, 0x2c, 0x6e, 0x7d, + 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x2c, 0x74, 0x29, 0x7b, 0x6e, 0x2e, 0x73, 0x65, 0x74, 0x46, 0x75, + 0x6c, 0x6c, 0x59, 0x65, 0x61, 0x72, 0x28, 0x6e, 0x2e, 0x67, 0x65, + 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x59, 0x65, 0x61, 0x72, 0x28, 0x29, + 0x2b, 0x74, 0x29, 0x7d, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x2e, 0x67, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, + 0x59, 0x65, 0x61, 0x72, 0x28, 0x29, 0x7d, 0x29, 0x2c, 0x61, 0x63, + 0x2e, 0x79, 0x65, 0x61, 0x72, 0x73, 0x3d, 0x61, 0x63, 0x2e, 0x79, + 0x65, 0x61, 0x72, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x2c, 0x61, + 0x63, 0x2e, 0x79, 0x65, 0x61, 0x72, 0x73, 0x2e, 0x75, 0x74, 0x63, + 0x3d, 0x61, 0x63, 0x2e, 0x79, 0x65, 0x61, 0x72, 0x2e, 0x75, 0x74, + 0x63, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x2c, 0x61, 0x63, 0x2e, + 0x64, 0x61, 0x79, 0x3d, 0x46, 0x74, 0x28, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x74, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x63, 0x63, 0x28, 0x32, + 0x65, 0x33, 0x2c, 0x30, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x2e, 0x73, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, + 0x59, 0x65, 0x61, 0x72, 0x28, 0x6e, 0x2e, 0x67, 0x65, 0x74, 0x46, + 0x75, 0x6c, 0x6c, 0x59, 0x65, 0x61, 0x72, 0x28, 0x29, 0x2c, 0x6e, + 0x2e, 0x67, 0x65, 0x74, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x28, 0x29, + 0x2c, 0x6e, 0x2e, 0x67, 0x65, 0x74, 0x44, 0x61, 0x74, 0x65, 0x28, + 0x29, 0x29, 0x2c, 0x74, 0x7d, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x6e, 0x2e, + 0x73, 0x65, 0x74, 0x44, 0x61, 0x74, 0x65, 0x28, 0x6e, 0x2e, 0x67, + 0x65, 0x74, 0x44, 0x61, 0x74, 0x65, 0x28, 0x29, 0x2b, 0x74, 0x29, + 0x7d, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x2e, 0x67, 0x65, 0x74, 0x44, 0x61, 0x74, 0x65, 0x28, 0x29, 0x2d, + 0x31, 0x7d, 0x29, 0x2c, 0x61, 0x63, 0x2e, 0x64, 0x61, 0x79, 0x73, + 0x3d, 0x61, 0x63, 0x2e, 0x64, 0x61, 0x79, 0x2e, 0x72, 0x61, 0x6e, + 0x67, 0x65, 0x2c, 0x61, 0x63, 0x2e, 0x64, 0x61, 0x79, 0x73, 0x2e, + 0x75, 0x74, 0x63, 0x3d, 0x61, 0x63, 0x2e, 0x64, 0x61, 0x79, 0x2e, + 0x75, 0x74, 0x63, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x2c, 0x61, + 0x63, 0x2e, 0x64, 0x61, 0x79, 0x4f, 0x66, 0x59, 0x65, 0x61, 0x72, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x61, 0x63, 0x2e, + 0x79, 0x65, 0x61, 0x72, 0x28, 0x6e, 0x29, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6c, + 0x6f, 0x6f, 0x72, 0x28, 0x28, 0x6e, 0x2d, 0x74, 0x2d, 0x36, 0x65, + 0x34, 0x2a, 0x28, 0x6e, 0x2e, 0x67, 0x65, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x7a, 0x6f, 0x6e, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x28, 0x29, 0x2d, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x7a, 0x6f, 0x6e, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x28, 0x29, 0x29, 0x29, 0x2f, 0x38, 0x36, 0x34, 0x65, 0x35, 0x29, + 0x7d, 0x2c, 0x5b, 0x22, 0x73, 0x75, 0x6e, 0x64, 0x61, 0x79, 0x22, + 0x2c, 0x22, 0x6d, 0x6f, 0x6e, 0x64, 0x61, 0x79, 0x22, 0x2c, 0x22, + 0x74, 0x75, 0x65, 0x73, 0x64, 0x61, 0x79, 0x22, 0x2c, 0x22, 0x77, + 0x65, 0x64, 0x6e, 0x65, 0x73, 0x64, 0x61, 0x79, 0x22, 0x2c, 0x22, + 0x74, 0x68, 0x75, 0x72, 0x73, 0x64, 0x61, 0x79, 0x22, 0x2c, 0x22, + 0x66, 0x72, 0x69, 0x64, 0x61, 0x79, 0x22, 0x2c, 0x22, 0x73, 0x61, + 0x74, 0x75, 0x72, 0x64, 0x61, 0x79, 0x22, 0x5d, 0x2e, 0x66, 0x6f, + 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x74, 0x3d, + 0x37, 0x2d, 0x74, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x61, + 0x63, 0x5b, 0x6e, 0x5d, 0x3d, 0x46, 0x74, 0x28, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x28, 0x6e, 0x3d, 0x61, 0x63, 0x2e, 0x64, + 0x61, 0x79, 0x28, 0x6e, 0x29, 0x29, 0x2e, 0x73, 0x65, 0x74, 0x44, + 0x61, 0x74, 0x65, 0x28, 0x6e, 0x2e, 0x67, 0x65, 0x74, 0x44, 0x61, + 0x74, 0x65, 0x28, 0x29, 0x2d, 0x28, 0x6e, 0x2e, 0x67, 0x65, 0x74, + 0x44, 0x61, 0x79, 0x28, 0x29, 0x2b, 0x74, 0x29, 0x25, 0x37, 0x29, + 0x2c, 0x6e, 0x7d, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x6e, 0x2e, 0x73, 0x65, + 0x74, 0x44, 0x61, 0x74, 0x65, 0x28, 0x6e, 0x2e, 0x67, 0x65, 0x74, + 0x44, 0x61, 0x74, 0x65, 0x28, 0x29, 0x2b, 0x37, 0x2a, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x74, 0x29, + 0x29, 0x7d, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x61, + 0x63, 0x2e, 0x79, 0x65, 0x61, 0x72, 0x28, 0x6e, 0x29, 0x2e, 0x67, + 0x65, 0x74, 0x44, 0x61, 0x79, 0x28, 0x29, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6c, + 0x6f, 0x6f, 0x72, 0x28, 0x28, 0x61, 0x63, 0x2e, 0x64, 0x61, 0x79, + 0x4f, 0x66, 0x59, 0x65, 0x61, 0x72, 0x28, 0x6e, 0x29, 0x2b, 0x28, + 0x65, 0x2b, 0x74, 0x29, 0x25, 0x37, 0x29, 0x2f, 0x37, 0x29, 0x2d, + 0x28, 0x65, 0x21, 0x3d, 0x3d, 0x74, 0x29, 0x7d, 0x29, 0x3b, 0x61, + 0x63, 0x5b, 0x6e, 0x2b, 0x22, 0x73, 0x22, 0x5d, 0x3d, 0x65, 0x2e, + 0x72, 0x61, 0x6e, 0x67, 0x65, 0x2c, 0x61, 0x63, 0x5b, 0x6e, 0x2b, + 0x22, 0x73, 0x22, 0x5d, 0x2e, 0x75, 0x74, 0x63, 0x3d, 0x65, 0x2e, + 0x75, 0x74, 0x63, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x2c, 0x61, + 0x63, 0x5b, 0x6e, 0x2b, 0x22, 0x4f, 0x66, 0x59, 0x65, 0x61, 0x72, + 0x22, 0x5d, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x61, + 0x63, 0x2e, 0x79, 0x65, 0x61, 0x72, 0x28, 0x6e, 0x29, 0x2e, 0x67, + 0x65, 0x74, 0x44, 0x61, 0x79, 0x28, 0x29, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6c, + 0x6f, 0x6f, 0x72, 0x28, 0x28, 0x61, 0x63, 0x2e, 0x64, 0x61, 0x79, + 0x4f, 0x66, 0x59, 0x65, 0x61, 0x72, 0x28, 0x6e, 0x29, 0x2b, 0x28, + 0x65, 0x2b, 0x74, 0x29, 0x25, 0x37, 0x29, 0x2f, 0x37, 0x29, 0x7d, + 0x7d, 0x29, 0x2c, 0x61, 0x63, 0x2e, 0x77, 0x65, 0x65, 0x6b, 0x3d, + 0x61, 0x63, 0x2e, 0x73, 0x75, 0x6e, 0x64, 0x61, 0x79, 0x2c, 0x61, + 0x63, 0x2e, 0x77, 0x65, 0x65, 0x6b, 0x73, 0x3d, 0x61, 0x63, 0x2e, + 0x73, 0x75, 0x6e, 0x64, 0x61, 0x79, 0x2e, 0x72, 0x61, 0x6e, 0x67, + 0x65, 0x2c, 0x61, 0x63, 0x2e, 0x77, 0x65, 0x65, 0x6b, 0x73, 0x2e, + 0x75, 0x74, 0x63, 0x3d, 0x61, 0x63, 0x2e, 0x73, 0x75, 0x6e, 0x64, + 0x61, 0x79, 0x2e, 0x75, 0x74, 0x63, 0x2e, 0x72, 0x61, 0x6e, 0x67, + 0x65, 0x2c, 0x61, 0x63, 0x2e, 0x77, 0x65, 0x65, 0x6b, 0x4f, 0x66, + 0x59, 0x65, 0x61, 0x72, 0x3d, 0x61, 0x63, 0x2e, 0x73, 0x75, 0x6e, + 0x64, 0x61, 0x79, 0x4f, 0x66, 0x59, 0x65, 0x61, 0x72, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x73, 0x63, 0x3d, 0x7b, 0x22, 0x2d, 0x22, 0x3a, + 0x22, 0x22, 0x2c, 0x5f, 0x3a, 0x22, 0x20, 0x22, 0x2c, 0x30, 0x3a, + 0x22, 0x30, 0x22, 0x7d, 0x2c, 0x66, 0x63, 0x3d, 0x2f, 0x5e, 0x5c, + 0x73, 0x2a, 0x5c, 0x64, 0x2b, 0x2f, 0x2c, 0x68, 0x63, 0x3d, 0x2f, + 0x5e, 0x25, 0x2f, 0x3b, 0x74, 0x61, 0x2e, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7b, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x46, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x3a, 0x50, 0x74, 0x28, 0x6e, 0x29, 0x2c, 0x74, 0x69, 0x6d, + 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x4f, 0x74, 0x28, + 0x6e, 0x29, 0x7d, 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x67, 0x63, + 0x3d, 0x74, 0x61, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x28, + 0x7b, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x3a, 0x22, 0x2e, + 0x22, 0x2c, 0x74, 0x68, 0x6f, 0x75, 0x73, 0x61, 0x6e, 0x64, 0x73, + 0x3a, 0x22, 0x2c, 0x22, 0x2c, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x69, + 0x6e, 0x67, 0x3a, 0x5b, 0x33, 0x5d, 0x2c, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x63, 0x79, 0x3a, 0x5b, 0x22, 0x24, 0x22, 0x2c, 0x22, + 0x22, 0x5d, 0x2c, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, + 0x3a, 0x22, 0x25, 0x61, 0x20, 0x25, 0x62, 0x20, 0x25, 0x65, 0x20, + 0x25, 0x58, 0x20, 0x25, 0x59, 0x22, 0x2c, 0x64, 0x61, 0x74, 0x65, + 0x3a, 0x22, 0x25, 0x6d, 0x2f, 0x25, 0x64, 0x2f, 0x25, 0x59, 0x22, + 0x2c, 0x74, 0x69, 0x6d, 0x65, 0x3a, 0x22, 0x25, 0x48, 0x3a, 0x25, + 0x4d, 0x3a, 0x25, 0x53, 0x22, 0x2c, 0x70, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x73, 0x3a, 0x5b, 0x22, 0x41, 0x4d, 0x22, 0x2c, 0x22, 0x50, + 0x4d, 0x22, 0x5d, 0x2c, 0x64, 0x61, 0x79, 0x73, 0x3a, 0x5b, 0x22, + 0x53, 0x75, 0x6e, 0x64, 0x61, 0x79, 0x22, 0x2c, 0x22, 0x4d, 0x6f, + 0x6e, 0x64, 0x61, 0x79, 0x22, 0x2c, 0x22, 0x54, 0x75, 0x65, 0x73, + 0x64, 0x61, 0x79, 0x22, 0x2c, 0x22, 0x57, 0x65, 0x64, 0x6e, 0x65, + 0x73, 0x64, 0x61, 0x79, 0x22, 0x2c, 0x22, 0x54, 0x68, 0x75, 0x72, + 0x73, 0x64, 0x61, 0x79, 0x22, 0x2c, 0x22, 0x46, 0x72, 0x69, 0x64, + 0x61, 0x79, 0x22, 0x2c, 0x22, 0x53, 0x61, 0x74, 0x75, 0x72, 0x64, + 0x61, 0x79, 0x22, 0x5d, 0x2c, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x44, + 0x61, 0x79, 0x73, 0x3a, 0x5b, 0x22, 0x53, 0x75, 0x6e, 0x22, 0x2c, + 0x22, 0x4d, 0x6f, 0x6e, 0x22, 0x2c, 0x22, 0x54, 0x75, 0x65, 0x22, + 0x2c, 0x22, 0x57, 0x65, 0x64, 0x22, 0x2c, 0x22, 0x54, 0x68, 0x75, + 0x22, 0x2c, 0x22, 0x46, 0x72, 0x69, 0x22, 0x2c, 0x22, 0x53, 0x61, + 0x74, 0x22, 0x5d, 0x2c, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x73, 0x3a, + 0x5b, 0x22, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x79, 0x22, 0x2c, + 0x22, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x79, 0x22, 0x2c, + 0x22, 0x4d, 0x61, 0x72, 0x63, 0x68, 0x22, 0x2c, 0x22, 0x41, 0x70, + 0x72, 0x69, 0x6c, 0x22, 0x2c, 0x22, 0x4d, 0x61, 0x79, 0x22, 0x2c, + 0x22, 0x4a, 0x75, 0x6e, 0x65, 0x22, 0x2c, 0x22, 0x4a, 0x75, 0x6c, + 0x79, 0x22, 0x2c, 0x22, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x22, + 0x2c, 0x22, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x22, 0x2c, 0x22, 0x4f, 0x63, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x22, + 0x2c, 0x22, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x22, + 0x2c, 0x22, 0x44, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x22, + 0x5d, 0x2c, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x4d, 0x6f, 0x6e, 0x74, + 0x68, 0x73, 0x3a, 0x5b, 0x22, 0x4a, 0x61, 0x6e, 0x22, 0x2c, 0x22, + 0x46, 0x65, 0x62, 0x22, 0x2c, 0x22, 0x4d, 0x61, 0x72, 0x22, 0x2c, + 0x22, 0x41, 0x70, 0x72, 0x22, 0x2c, 0x22, 0x4d, 0x61, 0x79, 0x22, + 0x2c, 0x22, 0x4a, 0x75, 0x6e, 0x22, 0x2c, 0x22, 0x4a, 0x75, 0x6c, + 0x22, 0x2c, 0x22, 0x41, 0x75, 0x67, 0x22, 0x2c, 0x22, 0x53, 0x65, + 0x70, 0x22, 0x2c, 0x22, 0x4f, 0x63, 0x74, 0x22, 0x2c, 0x22, 0x4e, + 0x6f, 0x76, 0x22, 0x2c, 0x22, 0x44, 0x65, 0x63, 0x22, 0x5d, 0x7d, + 0x29, 0x3b, 0x74, 0x61, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x3d, 0x67, 0x63, 0x2e, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x46, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2c, 0x74, 0x61, 0x2e, 0x67, 0x65, + 0x6f, 0x3d, 0x7b, 0x7d, 0x2c, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x7b, 0x73, 0x3a, 0x30, + 0x2c, 0x74, 0x3a, 0x30, 0x2c, 0x61, 0x64, 0x64, 0x3a, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x6c, + 0x65, 0x28, 0x6e, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x74, 0x2c, + 0x70, 0x63, 0x29, 0x2c, 0x6c, 0x65, 0x28, 0x70, 0x63, 0x2e, 0x73, + 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x2c, 0x74, 0x68, 0x69, + 0x73, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x3f, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x74, 0x2b, 0x3d, 0x70, 0x63, 0x2e, 0x74, + 0x3a, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x3d, 0x70, 0x63, 0x2e, + 0x74, 0x7d, 0x2c, 0x72, 0x65, 0x73, 0x65, 0x74, 0x3a, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x73, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x74, + 0x3d, 0x30, 0x7d, 0x2c, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x66, + 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x73, 0x7d, 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x70, + 0x63, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x63, 0x65, 0x3b, 0x74, 0x61, + 0x2e, 0x67, 0x65, 0x6f, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x2c, 0x74, 0x29, 0x7b, 0x6e, 0x26, 0x26, 0x76, 0x63, 0x2e, 0x68, + 0x61, 0x73, 0x4f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x79, 0x28, 0x6e, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x29, 0x3f, + 0x76, 0x63, 0x5b, 0x6e, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x5d, 0x28, + 0x6e, 0x2c, 0x74, 0x29, 0x3a, 0x73, 0x65, 0x28, 0x6e, 0x2c, 0x74, + 0x29, 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x76, 0x63, 0x3d, 0x7b, + 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x3a, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, + 0x73, 0x65, 0x28, 0x6e, 0x2e, 0x67, 0x65, 0x6f, 0x6d, 0x65, 0x74, + 0x72, 0x79, 0x2c, 0x74, 0x29, 0x7d, 0x2c, 0x46, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, + 0x61, 0x72, 0x20, 0x65, 0x3d, 0x6e, 0x2e, 0x66, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x73, 0x2c, 0x72, 0x3d, 0x2d, 0x31, 0x2c, 0x75, + 0x3d, 0x65, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x2b, + 0x2b, 0x72, 0x3c, 0x75, 0x3b, 0x29, 0x73, 0x65, 0x28, 0x65, 0x5b, + 0x72, 0x5d, 0x2e, 0x67, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, + 0x2c, 0x74, 0x29, 0x7d, 0x7d, 0x2c, 0x64, 0x63, 0x3d, 0x7b, 0x53, + 0x70, 0x68, 0x65, 0x72, 0x65, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x74, 0x2e, + 0x73, 0x70, 0x68, 0x65, 0x72, 0x65, 0x28, 0x29, 0x7d, 0x2c, 0x50, + 0x6f, 0x69, 0x6e, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x6e, 0x3d, 0x6e, + 0x2e, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, + 0x73, 0x2c, 0x74, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x6e, + 0x5b, 0x30, 0x5d, 0x2c, 0x6e, 0x5b, 0x31, 0x5d, 0x2c, 0x6e, 0x5b, + 0x32, 0x5d, 0x29, 0x7d, 0x2c, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x50, + 0x6f, 0x69, 0x6e, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x66, 0x6f, 0x72, + 0x28, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x6e, 0x2e, 0x63, 0x6f, + 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x2c, 0x72, + 0x3d, 0x2d, 0x31, 0x2c, 0x75, 0x3d, 0x65, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3b, 0x2b, 0x2b, 0x72, 0x3c, 0x75, 0x3b, 0x29, + 0x6e, 0x3d, 0x65, 0x5b, 0x72, 0x5d, 0x2c, 0x74, 0x2e, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x28, 0x6e, 0x5b, 0x30, 0x5d, 0x2c, 0x6e, 0x5b, + 0x31, 0x5d, 0x2c, 0x6e, 0x5b, 0x32, 0x5d, 0x29, 0x7d, 0x2c, 0x4c, + 0x69, 0x6e, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, + 0x29, 0x7b, 0x66, 0x65, 0x28, 0x6e, 0x2e, 0x63, 0x6f, 0x6f, 0x72, + 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x2c, 0x74, 0x2c, 0x30, + 0x29, 0x7d, 0x2c, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x4c, 0x69, 0x6e, + 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, + 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x6e, + 0x2e, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, + 0x73, 0x2c, 0x72, 0x3d, 0x2d, 0x31, 0x2c, 0x75, 0x3d, 0x65, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x2b, 0x2b, 0x72, 0x3c, + 0x75, 0x3b, 0x29, 0x66, 0x65, 0x28, 0x65, 0x5b, 0x72, 0x5d, 0x2c, + 0x74, 0x2c, 0x30, 0x29, 0x7d, 0x2c, 0x50, 0x6f, 0x6c, 0x79, 0x67, + 0x6f, 0x6e, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x68, 0x65, 0x28, 0x6e, 0x2e, + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, + 0x2c, 0x74, 0x29, 0x7d, 0x2c, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x50, + 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x3a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x66, + 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x6e, 0x2e, + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, + 0x2c, 0x72, 0x3d, 0x2d, 0x31, 0x2c, 0x75, 0x3d, 0x65, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x2b, 0x2b, 0x72, 0x3c, 0x75, + 0x3b, 0x29, 0x68, 0x65, 0x28, 0x65, 0x5b, 0x72, 0x5d, 0x2c, 0x74, + 0x29, 0x7d, 0x2c, 0x47, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, + 0x74, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, + 0x65, 0x3d, 0x6e, 0x2e, 0x67, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x2c, 0x72, 0x3d, 0x2d, 0x31, 0x2c, 0x75, 0x3d, + 0x65, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x2b, 0x2b, + 0x72, 0x3c, 0x75, 0x3b, 0x29, 0x73, 0x65, 0x28, 0x65, 0x5b, 0x72, + 0x5d, 0x2c, 0x74, 0x29, 0x7d, 0x7d, 0x3b, 0x74, 0x61, 0x2e, 0x67, + 0x65, 0x6f, 0x2e, 0x61, 0x72, 0x65, 0x61, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x63, 0x3d, 0x30, 0x2c, 0x74, + 0x61, 0x2e, 0x67, 0x65, 0x6f, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x28, 0x6e, 0x2c, 0x4d, 0x63, 0x29, 0x2c, 0x6d, 0x63, 0x7d, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x6d, 0x63, 0x2c, 0x79, 0x63, 0x3d, + 0x6e, 0x65, 0x77, 0x20, 0x63, 0x65, 0x2c, 0x4d, 0x63, 0x3d, 0x7b, + 0x73, 0x70, 0x68, 0x65, 0x72, 0x65, 0x3a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x6d, 0x63, 0x2b, 0x3d, + 0x34, 0x2a, 0x71, 0x61, 0x7d, 0x2c, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x3a, 0x62, 0x2c, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x3a, 0x62, 0x2c, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, + 0x3a, 0x62, 0x2c, 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x79, 0x63, 0x2e, 0x72, 0x65, 0x73, + 0x65, 0x74, 0x28, 0x29, 0x2c, 0x4d, 0x63, 0x2e, 0x6c, 0x69, 0x6e, + 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3d, 0x67, 0x65, 0x7d, 0x2c, + 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x3a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x6e, 0x3d, 0x32, 0x2a, 0x79, 0x63, 0x3b, + 0x6d, 0x63, 0x2b, 0x3d, 0x30, 0x3e, 0x6e, 0x3f, 0x34, 0x2a, 0x71, + 0x61, 0x2b, 0x6e, 0x3a, 0x6e, 0x2c, 0x4d, 0x63, 0x2e, 0x6c, 0x69, + 0x6e, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3d, 0x4d, 0x63, 0x2e, + 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, 0x3d, 0x4d, 0x63, 0x2e, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3d, 0x62, 0x7d, 0x7d, 0x3b, 0x74, + 0x61, 0x2e, 0x67, 0x65, 0x6f, 0x2e, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x73, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x4d, 0x2e, 0x70, 0x75, + 0x73, 0x68, 0x28, 0x78, 0x3d, 0x5b, 0x73, 0x3d, 0x6e, 0x2c, 0x68, + 0x3d, 0x6e, 0x5d, 0x29, 0x2c, 0x66, 0x3e, 0x74, 0x26, 0x26, 0x28, + 0x66, 0x3d, 0x74, 0x29, 0x2c, 0x74, 0x3e, 0x67, 0x26, 0x26, 0x28, + 0x67, 0x3d, 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x74, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x72, 0x3d, 0x70, 0x65, 0x28, 0x5b, 0x74, 0x2a, + 0x44, 0x61, 0x2c, 0x65, 0x2a, 0x44, 0x61, 0x5d, 0x29, 0x3b, 0x69, + 0x66, 0x28, 0x6d, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x75, 0x3d, + 0x64, 0x65, 0x28, 0x6d, 0x2c, 0x72, 0x29, 0x2c, 0x69, 0x3d, 0x5b, + 0x75, 0x5b, 0x31, 0x5d, 0x2c, 0x2d, 0x75, 0x5b, 0x30, 0x5d, 0x2c, + 0x30, 0x5d, 0x2c, 0x6f, 0x3d, 0x64, 0x65, 0x28, 0x69, 0x2c, 0x75, + 0x29, 0x3b, 0x4d, 0x65, 0x28, 0x6f, 0x29, 0x2c, 0x6f, 0x3d, 0x78, + 0x65, 0x28, 0x6f, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x63, 0x3d, + 0x74, 0x2d, 0x70, 0x2c, 0x6c, 0x3d, 0x63, 0x3e, 0x30, 0x3f, 0x31, + 0x3a, 0x2d, 0x31, 0x2c, 0x76, 0x3d, 0x6f, 0x5b, 0x30, 0x5d, 0x2a, + 0x50, 0x61, 0x2a, 0x6c, 0x2c, 0x64, 0x3d, 0x67, 0x61, 0x28, 0x63, + 0x29, 0x3e, 0x31, 0x38, 0x30, 0x3b, 0x69, 0x66, 0x28, 0x64, 0x5e, + 0x28, 0x76, 0x3e, 0x6c, 0x2a, 0x70, 0x26, 0x26, 0x6c, 0x2a, 0x74, + 0x3e, 0x76, 0x29, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x79, 0x3d, + 0x6f, 0x5b, 0x31, 0x5d, 0x2a, 0x50, 0x61, 0x3b, 0x79, 0x3e, 0x67, + 0x26, 0x26, 0x28, 0x67, 0x3d, 0x79, 0x29, 0x7d, 0x65, 0x6c, 0x73, + 0x65, 0x20, 0x69, 0x66, 0x28, 0x76, 0x3d, 0x28, 0x76, 0x2b, 0x33, + 0x36, 0x30, 0x29, 0x25, 0x33, 0x36, 0x30, 0x2d, 0x31, 0x38, 0x30, + 0x2c, 0x64, 0x5e, 0x28, 0x76, 0x3e, 0x6c, 0x2a, 0x70, 0x26, 0x26, + 0x6c, 0x2a, 0x74, 0x3e, 0x76, 0x29, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x79, 0x3d, 0x2d, 0x6f, 0x5b, 0x31, 0x5d, 0x2a, 0x50, 0x61, + 0x3b, 0x66, 0x3e, 0x79, 0x26, 0x26, 0x28, 0x66, 0x3d, 0x79, 0x29, + 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x66, 0x3e, 0x65, 0x26, 0x26, + 0x28, 0x66, 0x3d, 0x65, 0x29, 0x2c, 0x65, 0x3e, 0x67, 0x26, 0x26, + 0x28, 0x67, 0x3d, 0x65, 0x29, 0x3b, 0x64, 0x3f, 0x70, 0x3e, 0x74, + 0x3f, 0x61, 0x28, 0x73, 0x2c, 0x74, 0x29, 0x3e, 0x61, 0x28, 0x73, + 0x2c, 0x68, 0x29, 0x26, 0x26, 0x28, 0x68, 0x3d, 0x74, 0x29, 0x3a, + 0x61, 0x28, 0x74, 0x2c, 0x68, 0x29, 0x3e, 0x61, 0x28, 0x73, 0x2c, + 0x68, 0x29, 0x26, 0x26, 0x28, 0x73, 0x3d, 0x74, 0x29, 0x3a, 0x68, + 0x3e, 0x3d, 0x73, 0x3f, 0x28, 0x73, 0x3e, 0x74, 0x26, 0x26, 0x28, + 0x73, 0x3d, 0x74, 0x29, 0x2c, 0x74, 0x3e, 0x68, 0x26, 0x26, 0x28, + 0x68, 0x3d, 0x74, 0x29, 0x29, 0x3a, 0x74, 0x3e, 0x70, 0x3f, 0x61, + 0x28, 0x73, 0x2c, 0x74, 0x29, 0x3e, 0x61, 0x28, 0x73, 0x2c, 0x68, + 0x29, 0x26, 0x26, 0x28, 0x68, 0x3d, 0x74, 0x29, 0x3a, 0x61, 0x28, + 0x74, 0x2c, 0x68, 0x29, 0x3e, 0x61, 0x28, 0x73, 0x2c, 0x68, 0x29, + 0x26, 0x26, 0x28, 0x73, 0x3d, 0x74, 0x29, 0x7d, 0x65, 0x6c, 0x73, + 0x65, 0x20, 0x6e, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x3b, 0x6d, 0x3d, + 0x72, 0x2c, 0x70, 0x3d, 0x74, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x28, 0x29, 0x7b, 0x62, 0x2e, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x3d, 0x74, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x28, 0x29, 0x7b, 0x78, 0x5b, + 0x30, 0x5d, 0x3d, 0x73, 0x2c, 0x78, 0x5b, 0x31, 0x5d, 0x3d, 0x68, + 0x2c, 0x62, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3d, 0x6e, 0x2c, + 0x6d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x28, 0x6e, 0x2c, 0x65, 0x29, + 0x7b, 0x69, 0x66, 0x28, 0x6d, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x72, 0x3d, 0x6e, 0x2d, 0x70, 0x3b, 0x79, 0x2b, 0x3d, 0x67, 0x61, + 0x28, 0x72, 0x29, 0x3e, 0x31, 0x38, 0x30, 0x3f, 0x72, 0x2b, 0x28, + 0x72, 0x3e, 0x30, 0x3f, 0x33, 0x36, 0x30, 0x3a, 0x2d, 0x33, 0x36, + 0x30, 0x29, 0x3a, 0x72, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x76, + 0x3d, 0x6e, 0x2c, 0x64, 0x3d, 0x65, 0x3b, 0x4d, 0x63, 0x2e, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x6e, 0x2c, 0x65, 0x29, 0x2c, 0x74, + 0x28, 0x6e, 0x2c, 0x65, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x28, 0x29, 0x7b, 0x4d, 0x63, 0x2e, + 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, 0x29, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, + 0x28, 0x29, 0x7b, 0x75, 0x28, 0x76, 0x2c, 0x64, 0x29, 0x2c, 0x4d, + 0x63, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, 0x28, 0x29, + 0x2c, 0x67, 0x61, 0x28, 0x79, 0x29, 0x3e, 0x43, 0x61, 0x26, 0x26, + 0x28, 0x73, 0x3d, 0x2d, 0x28, 0x68, 0x3d, 0x31, 0x38, 0x30, 0x29, + 0x29, 0x2c, 0x78, 0x5b, 0x30, 0x5d, 0x3d, 0x73, 0x2c, 0x78, 0x5b, + 0x31, 0x5d, 0x3d, 0x68, 0x2c, 0x6d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, + 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x28, 0x74, 0x2d, 0x3d, 0x6e, 0x29, 0x3c, 0x30, 0x3f, 0x74, + 0x2b, 0x33, 0x36, 0x30, 0x3a, 0x74, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x28, 0x6e, 0x2c, 0x74, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x5b, 0x30, + 0x5d, 0x2d, 0x74, 0x5b, 0x30, 0x5d, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x28, 0x6e, 0x2c, 0x74, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x5b, 0x30, + 0x5d, 0x3c, 0x3d, 0x74, 0x5b, 0x31, 0x5d, 0x3f, 0x74, 0x5b, 0x30, + 0x5d, 0x3c, 0x3d, 0x6e, 0x26, 0x26, 0x6e, 0x3c, 0x3d, 0x74, 0x5b, + 0x31, 0x5d, 0x3a, 0x6e, 0x3c, 0x74, 0x5b, 0x30, 0x5d, 0x7c, 0x7c, + 0x74, 0x5b, 0x31, 0x5d, 0x3c, 0x6e, 0x7d, 0x76, 0x61, 0x72, 0x20, + 0x73, 0x2c, 0x66, 0x2c, 0x68, 0x2c, 0x67, 0x2c, 0x70, 0x2c, 0x76, + 0x2c, 0x64, 0x2c, 0x6d, 0x2c, 0x79, 0x2c, 0x4d, 0x2c, 0x78, 0x2c, + 0x62, 0x3d, 0x7b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3a, 0x6e, 0x2c, + 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3a, 0x65, + 0x2c, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, 0x3a, 0x72, 0x2c, + 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x29, 0x7b, 0x62, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3d, 0x75, + 0x2c, 0x62, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x3d, 0x69, 0x2c, 0x62, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x45, + 0x6e, 0x64, 0x3d, 0x6f, 0x2c, 0x79, 0x3d, 0x30, 0x2c, 0x4d, 0x63, + 0x2e, 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x28, 0x29, 0x7d, 0x2c, 0x70, 0x6f, 0x6c, 0x79, 0x67, + 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x4d, 0x63, 0x2e, 0x70, 0x6f, + 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x28, 0x29, 0x2c, + 0x62, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3d, 0x6e, 0x2c, 0x62, + 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3d, + 0x65, 0x2c, 0x62, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, + 0x3d, 0x72, 0x2c, 0x30, 0x3e, 0x79, 0x63, 0x3f, 0x28, 0x73, 0x3d, + 0x2d, 0x28, 0x68, 0x3d, 0x31, 0x38, 0x30, 0x29, 0x2c, 0x66, 0x3d, + 0x2d, 0x28, 0x67, 0x3d, 0x39, 0x30, 0x29, 0x29, 0x3a, 0x79, 0x3e, + 0x43, 0x61, 0x3f, 0x67, 0x3d, 0x39, 0x30, 0x3a, 0x2d, 0x43, 0x61, + 0x3e, 0x79, 0x26, 0x26, 0x28, 0x66, 0x3d, 0x2d, 0x39, 0x30, 0x29, + 0x2c, 0x78, 0x5b, 0x30, 0x5d, 0x3d, 0x73, 0x2c, 0x78, 0x5b, 0x31, + 0x5d, 0x3d, 0x68, 0x7d, 0x7d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x29, 0x7b, 0x67, 0x3d, 0x68, 0x3d, 0x2d, 0x28, 0x73, 0x3d, + 0x66, 0x3d, 0x31, 0x2f, 0x30, 0x29, 0x2c, 0x4d, 0x3d, 0x5b, 0x5d, + 0x2c, 0x74, 0x61, 0x2e, 0x67, 0x65, 0x6f, 0x2e, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x28, 0x6e, 0x2c, 0x62, 0x29, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x74, 0x3d, 0x4d, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3b, 0x69, 0x66, 0x28, 0x74, 0x29, 0x7b, 0x4d, 0x2e, 0x73, + 0x6f, 0x72, 0x74, 0x28, 0x63, 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x28, + 0x76, 0x61, 0x72, 0x20, 0x65, 0x2c, 0x72, 0x3d, 0x31, 0x2c, 0x75, + 0x3d, 0x4d, 0x5b, 0x30, 0x5d, 0x2c, 0x69, 0x3d, 0x5b, 0x75, 0x5d, + 0x3b, 0x74, 0x3e, 0x72, 0x3b, 0x2b, 0x2b, 0x72, 0x29, 0x65, 0x3d, + 0x4d, 0x5b, 0x72, 0x5d, 0x2c, 0x6c, 0x28, 0x65, 0x5b, 0x30, 0x5d, + 0x2c, 0x75, 0x29, 0x7c, 0x7c, 0x6c, 0x28, 0x65, 0x5b, 0x31, 0x5d, + 0x2c, 0x75, 0x29, 0x3f, 0x28, 0x61, 0x28, 0x75, 0x5b, 0x30, 0x5d, + 0x2c, 0x65, 0x5b, 0x31, 0x5d, 0x29, 0x3e, 0x61, 0x28, 0x75, 0x5b, + 0x30, 0x5d, 0x2c, 0x75, 0x5b, 0x31, 0x5d, 0x29, 0x26, 0x26, 0x28, + 0x75, 0x5b, 0x31, 0x5d, 0x3d, 0x65, 0x5b, 0x31, 0x5d, 0x29, 0x2c, + 0x61, 0x28, 0x65, 0x5b, 0x30, 0x5d, 0x2c, 0x75, 0x5b, 0x31, 0x5d, + 0x29, 0x3e, 0x61, 0x28, 0x75, 0x5b, 0x30, 0x5d, 0x2c, 0x75, 0x5b, + 0x31, 0x5d, 0x29, 0x26, 0x26, 0x28, 0x75, 0x5b, 0x30, 0x5d, 0x3d, + 0x65, 0x5b, 0x30, 0x5d, 0x29, 0x29, 0x3a, 0x69, 0x2e, 0x70, 0x75, + 0x73, 0x68, 0x28, 0x75, 0x3d, 0x65, 0x29, 0x3b, 0x66, 0x6f, 0x72, + 0x28, 0x76, 0x61, 0x72, 0x20, 0x6f, 0x2c, 0x65, 0x2c, 0x70, 0x3d, + 0x2d, 0x31, 0x2f, 0x30, 0x2c, 0x74, 0x3d, 0x69, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, 0x2c, 0x72, 0x3d, 0x30, 0x2c, + 0x75, 0x3d, 0x69, 0x5b, 0x74, 0x5d, 0x3b, 0x74, 0x3e, 0x3d, 0x72, + 0x3b, 0x75, 0x3d, 0x65, 0x2c, 0x2b, 0x2b, 0x72, 0x29, 0x65, 0x3d, + 0x69, 0x5b, 0x72, 0x5d, 0x2c, 0x28, 0x6f, 0x3d, 0x61, 0x28, 0x75, + 0x5b, 0x31, 0x5d, 0x2c, 0x65, 0x5b, 0x30, 0x5d, 0x29, 0x29, 0x3e, + 0x70, 0x26, 0x26, 0x28, 0x70, 0x3d, 0x6f, 0x2c, 0x73, 0x3d, 0x65, + 0x5b, 0x30, 0x5d, 0x2c, 0x68, 0x3d, 0x75, 0x5b, 0x31, 0x5d, 0x29, + 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4d, 0x3d, 0x78, + 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x31, 0x2f, 0x30, 0x3d, 0x3d, + 0x3d, 0x73, 0x7c, 0x7c, 0x31, 0x2f, 0x30, 0x3d, 0x3d, 0x3d, 0x66, + 0x3f, 0x5b, 0x5b, 0x30, 0x2f, 0x30, 0x2c, 0x30, 0x2f, 0x30, 0x5d, + 0x2c, 0x5b, 0x30, 0x2f, 0x30, 0x2c, 0x30, 0x2f, 0x30, 0x5d, 0x5d, + 0x3a, 0x5b, 0x5b, 0x73, 0x2c, 0x66, 0x5d, 0x2c, 0x5b, 0x68, 0x2c, + 0x67, 0x5d, 0x5d, 0x7d, 0x7d, 0x28, 0x29, 0x2c, 0x74, 0x61, 0x2e, + 0x67, 0x65, 0x6f, 0x2e, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x6f, 0x69, + 0x64, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x29, 0x7b, 0x78, 0x63, 0x3d, 0x62, 0x63, 0x3d, 0x5f, 0x63, + 0x3d, 0x77, 0x63, 0x3d, 0x53, 0x63, 0x3d, 0x6b, 0x63, 0x3d, 0x45, + 0x63, 0x3d, 0x41, 0x63, 0x3d, 0x4e, 0x63, 0x3d, 0x43, 0x63, 0x3d, + 0x7a, 0x63, 0x3d, 0x30, 0x2c, 0x74, 0x61, 0x2e, 0x67, 0x65, 0x6f, + 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x28, 0x6e, 0x2c, 0x71, + 0x63, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x4e, 0x63, + 0x2c, 0x65, 0x3d, 0x43, 0x63, 0x2c, 0x72, 0x3d, 0x7a, 0x63, 0x2c, + 0x75, 0x3d, 0x74, 0x2a, 0x74, 0x2b, 0x65, 0x2a, 0x65, 0x2b, 0x72, + 0x2a, 0x72, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7a, + 0x61, 0x3e, 0x75, 0x26, 0x26, 0x28, 0x74, 0x3d, 0x6b, 0x63, 0x2c, + 0x65, 0x3d, 0x45, 0x63, 0x2c, 0x72, 0x3d, 0x41, 0x63, 0x2c, 0x43, + 0x61, 0x3e, 0x62, 0x63, 0x26, 0x26, 0x28, 0x74, 0x3d, 0x5f, 0x63, + 0x2c, 0x65, 0x3d, 0x77, 0x63, 0x2c, 0x72, 0x3d, 0x53, 0x63, 0x29, + 0x2c, 0x75, 0x3d, 0x74, 0x2a, 0x74, 0x2b, 0x65, 0x2a, 0x65, 0x2b, + 0x72, 0x2a, 0x72, 0x2c, 0x7a, 0x61, 0x3e, 0x75, 0x29, 0x3f, 0x5b, + 0x30, 0x2f, 0x30, 0x2c, 0x30, 0x2f, 0x30, 0x5d, 0x3a, 0x5b, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x61, 0x74, 0x61, 0x6e, 0x32, 0x28, 0x65, + 0x2c, 0x74, 0x29, 0x2a, 0x50, 0x61, 0x2c, 0x74, 0x74, 0x28, 0x72, + 0x2f, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x71, 0x72, 0x74, 0x28, + 0x75, 0x29, 0x29, 0x2a, 0x50, 0x61, 0x5d, 0x7d, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x78, 0x63, 0x2c, 0x62, 0x63, 0x2c, 0x5f, 0x63, 0x2c, + 0x77, 0x63, 0x2c, 0x53, 0x63, 0x2c, 0x6b, 0x63, 0x2c, 0x45, 0x63, + 0x2c, 0x41, 0x63, 0x2c, 0x4e, 0x63, 0x2c, 0x43, 0x63, 0x2c, 0x7a, + 0x63, 0x2c, 0x71, 0x63, 0x3d, 0x7b, 0x73, 0x70, 0x68, 0x65, 0x72, + 0x65, 0x3a, 0x62, 0x2c, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3a, 0x5f, + 0x65, 0x2c, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x3a, 0x53, 0x65, 0x2c, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, + 0x3a, 0x6b, 0x65, 0x2c, 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x71, 0x63, 0x2e, 0x6c, 0x69, + 0x6e, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3d, 0x45, 0x65, 0x7d, + 0x2c, 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x45, 0x6e, 0x64, + 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x7b, 0x71, 0x63, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x3d, 0x53, 0x65, 0x7d, 0x7d, 0x2c, 0x4c, 0x63, 0x3d, + 0x4c, 0x65, 0x28, 0x4e, 0x65, 0x2c, 0x50, 0x65, 0x2c, 0x6a, 0x65, + 0x2c, 0x5b, 0x2d, 0x71, 0x61, 0x2c, 0x2d, 0x71, 0x61, 0x2f, 0x32, + 0x5d, 0x29, 0x2c, 0x54, 0x63, 0x3d, 0x31, 0x65, 0x39, 0x3b, 0x74, + 0x61, 0x2e, 0x67, 0x65, 0x6f, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x45, + 0x78, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6e, + 0x2c, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x75, 0x2c, 0x69, 0x2c, + 0x6f, 0x3d, 0x7b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x3a, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x26, 0x26, 0x28, + 0x75, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x3d, 0x21, 0x31, 0x29, + 0x2c, 0x75, 0x3d, 0x69, 0x28, 0x6e, 0x29, 0x2c, 0x75, 0x2e, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x3d, 0x21, 0x30, 0x2c, 0x75, 0x7d, 0x2c, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, + 0x69, 0x3d, 0x49, 0x65, 0x28, 0x6e, 0x3d, 0x2b, 0x61, 0x5b, 0x30, + 0x5d, 0x5b, 0x30, 0x5d, 0x2c, 0x74, 0x3d, 0x2b, 0x61, 0x5b, 0x30, + 0x5d, 0x5b, 0x31, 0x5d, 0x2c, 0x65, 0x3d, 0x2b, 0x61, 0x5b, 0x31, + 0x5d, 0x5b, 0x30, 0x5d, 0x2c, 0x72, 0x3d, 0x2b, 0x61, 0x5b, 0x31, + 0x5d, 0x5b, 0x31, 0x5d, 0x29, 0x2c, 0x75, 0x26, 0x26, 0x28, 0x75, + 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x3d, 0x21, 0x31, 0x2c, 0x75, + 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x2c, 0x6f, 0x29, 0x3a, 0x5b, + 0x5b, 0x6e, 0x2c, 0x74, 0x5d, 0x2c, 0x5b, 0x65, 0x2c, 0x72, 0x5d, + 0x5d, 0x7d, 0x7d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x28, 0x5b, 0x5b, + 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x5b, 0x39, 0x36, 0x30, 0x2c, 0x35, + 0x30, 0x30, 0x5d, 0x5d, 0x29, 0x7d, 0x2c, 0x28, 0x74, 0x61, 0x2e, + 0x67, 0x65, 0x6f, 0x2e, 0x63, 0x6f, 0x6e, 0x69, 0x63, 0x45, 0x71, + 0x75, 0x61, 0x6c, 0x41, 0x72, 0x65, 0x61, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x59, 0x65, 0x28, 0x5a, 0x65, 0x29, 0x7d, + 0x29, 0x2e, 0x72, 0x61, 0x77, 0x3d, 0x5a, 0x65, 0x2c, 0x74, 0x61, + 0x2e, 0x67, 0x65, 0x6f, 0x2e, 0x61, 0x6c, 0x62, 0x65, 0x72, 0x73, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x2e, + 0x67, 0x65, 0x6f, 0x2e, 0x63, 0x6f, 0x6e, 0x69, 0x63, 0x45, 0x71, + 0x75, 0x61, 0x6c, 0x41, 0x72, 0x65, 0x61, 0x28, 0x29, 0x2e, 0x72, + 0x6f, 0x74, 0x61, 0x74, 0x65, 0x28, 0x5b, 0x39, 0x36, 0x2c, 0x30, + 0x5d, 0x29, 0x2e, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x28, 0x5b, + 0x2d, 0x2e, 0x36, 0x2c, 0x33, 0x38, 0x2e, 0x37, 0x5d, 0x29, 0x2e, + 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x73, 0x28, 0x5b, + 0x32, 0x39, 0x2e, 0x35, 0x2c, 0x34, 0x35, 0x2e, 0x35, 0x5d, 0x29, + 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x28, 0x31, 0x30, 0x37, 0x30, + 0x29, 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x67, 0x65, 0x6f, 0x2e, 0x61, + 0x6c, 0x62, 0x65, 0x72, 0x73, 0x55, 0x73, 0x61, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x28, 0x6e, 0x29, + 0x7b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, 0x6e, 0x5b, 0x30, 0x5d, + 0x2c, 0x6f, 0x3d, 0x6e, 0x5b, 0x31, 0x5d, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, + 0x65, 0x28, 0x69, 0x2c, 0x6f, 0x29, 0x2c, 0x74, 0x7c, 0x7c, 0x28, + 0x72, 0x28, 0x69, 0x2c, 0x6f, 0x29, 0x2c, 0x74, 0x29, 0x7c, 0x7c, + 0x75, 0x28, 0x69, 0x2c, 0x6f, 0x29, 0x2c, 0x74, 0x7d, 0x76, 0x61, + 0x72, 0x20, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x75, 0x2c, 0x69, + 0x3d, 0x74, 0x61, 0x2e, 0x67, 0x65, 0x6f, 0x2e, 0x61, 0x6c, 0x62, + 0x65, 0x72, 0x73, 0x28, 0x29, 0x2c, 0x6f, 0x3d, 0x74, 0x61, 0x2e, + 0x67, 0x65, 0x6f, 0x2e, 0x63, 0x6f, 0x6e, 0x69, 0x63, 0x45, 0x71, + 0x75, 0x61, 0x6c, 0x41, 0x72, 0x65, 0x61, 0x28, 0x29, 0x2e, 0x72, + 0x6f, 0x74, 0x61, 0x74, 0x65, 0x28, 0x5b, 0x31, 0x35, 0x34, 0x2c, + 0x30, 0x5d, 0x29, 0x2e, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x28, + 0x5b, 0x2d, 0x32, 0x2c, 0x35, 0x38, 0x2e, 0x35, 0x5d, 0x29, 0x2e, + 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x73, 0x28, 0x5b, + 0x35, 0x35, 0x2c, 0x36, 0x35, 0x5d, 0x29, 0x2c, 0x61, 0x3d, 0x74, + 0x61, 0x2e, 0x67, 0x65, 0x6f, 0x2e, 0x63, 0x6f, 0x6e, 0x69, 0x63, + 0x45, 0x71, 0x75, 0x61, 0x6c, 0x41, 0x72, 0x65, 0x61, 0x28, 0x29, + 0x2e, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x28, 0x5b, 0x31, 0x35, + 0x37, 0x2c, 0x30, 0x5d, 0x29, 0x2e, 0x63, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x28, 0x5b, 0x2d, 0x33, 0x2c, 0x31, 0x39, 0x2e, 0x39, 0x5d, + 0x29, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x73, + 0x28, 0x5b, 0x38, 0x2c, 0x31, 0x38, 0x5d, 0x29, 0x2c, 0x63, 0x3d, + 0x7b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x65, 0x29, 0x7b, 0x74, + 0x3d, 0x5b, 0x6e, 0x2c, 0x65, 0x5d, 0x7d, 0x7d, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x72, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x69, + 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x28, 0x29, 0x2c, 0x65, 0x3d, + 0x69, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, + 0x28, 0x29, 0x2c, 0x72, 0x3d, 0x28, 0x6e, 0x5b, 0x30, 0x5d, 0x2d, + 0x65, 0x5b, 0x30, 0x5d, 0x29, 0x2f, 0x74, 0x2c, 0x75, 0x3d, 0x28, + 0x6e, 0x5b, 0x31, 0x5d, 0x2d, 0x65, 0x5b, 0x31, 0x5d, 0x29, 0x2f, + 0x74, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x75, 0x3e, + 0x3d, 0x2e, 0x31, 0x32, 0x26, 0x26, 0x2e, 0x32, 0x33, 0x34, 0x3e, + 0x75, 0x26, 0x26, 0x72, 0x3e, 0x3d, 0x2d, 0x2e, 0x34, 0x32, 0x35, + 0x26, 0x26, 0x2d, 0x2e, 0x32, 0x31, 0x34, 0x3e, 0x72, 0x3f, 0x6f, + 0x3a, 0x75, 0x3e, 0x3d, 0x2e, 0x31, 0x36, 0x36, 0x26, 0x26, 0x2e, + 0x32, 0x33, 0x34, 0x3e, 0x75, 0x26, 0x26, 0x72, 0x3e, 0x3d, 0x2d, + 0x2e, 0x32, 0x31, 0x34, 0x26, 0x26, 0x2d, 0x2e, 0x31, 0x31, 0x35, + 0x3e, 0x72, 0x3f, 0x61, 0x3a, 0x69, 0x29, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x72, 0x74, 0x28, 0x6e, 0x29, 0x7d, 0x2c, 0x6e, 0x2e, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x74, 0x3d, 0x69, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x28, + 0x6e, 0x29, 0x2c, 0x65, 0x3d, 0x6f, 0x2e, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x28, 0x6e, 0x29, 0x2c, 0x72, 0x3d, 0x61, 0x2e, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x28, 0x6e, 0x29, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x7b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, + 0x75, 0x29, 0x7b, 0x74, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, + 0x6e, 0x2c, 0x75, 0x29, 0x2c, 0x65, 0x2e, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x28, 0x6e, 0x2c, 0x75, 0x29, 0x2c, 0x72, 0x2e, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x28, 0x6e, 0x2c, 0x75, 0x29, 0x7d, 0x2c, 0x73, + 0x70, 0x68, 0x65, 0x72, 0x65, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x74, 0x2e, 0x73, 0x70, 0x68, + 0x65, 0x72, 0x65, 0x28, 0x29, 0x2c, 0x65, 0x2e, 0x73, 0x70, 0x68, + 0x65, 0x72, 0x65, 0x28, 0x29, 0x2c, 0x72, 0x2e, 0x73, 0x70, 0x68, + 0x65, 0x72, 0x65, 0x28, 0x29, 0x7d, 0x2c, 0x6c, 0x69, 0x6e, 0x65, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x74, 0x2e, 0x6c, 0x69, 0x6e, + 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, 0x29, 0x2c, 0x65, 0x2e, + 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, 0x29, + 0x2c, 0x72, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x28, 0x29, 0x7d, 0x2c, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, + 0x64, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x29, 0x7b, 0x74, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, + 0x28, 0x29, 0x2c, 0x65, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, + 0x64, 0x28, 0x29, 0x2c, 0x72, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x45, + 0x6e, 0x64, 0x28, 0x29, 0x7d, 0x2c, 0x70, 0x6f, 0x6c, 0x79, 0x67, + 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3a, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x74, 0x2e, 0x70, + 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x28, 0x29, 0x2c, 0x65, 0x2e, 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, + 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, 0x29, 0x2c, 0x72, 0x2e, + 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x28, 0x29, 0x7d, 0x2c, 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, + 0x6e, 0x45, 0x6e, 0x64, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x74, 0x2e, 0x70, 0x6f, 0x6c, 0x79, + 0x67, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x28, 0x29, 0x2c, 0x65, 0x2e, + 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x28, + 0x29, 0x2c, 0x72, 0x2e, 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, + 0x45, 0x6e, 0x64, 0x28, 0x29, 0x7d, 0x7d, 0x7d, 0x2c, 0x6e, 0x2e, + 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3f, 0x28, 0x69, 0x2e, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x2c, 0x6f, 0x2e, 0x70, 0x72, + 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x2c, + 0x61, 0x2e, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x28, 0x74, 0x29, 0x2c, 0x6e, 0x29, 0x3a, 0x69, 0x2e, 0x70, 0x72, + 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7d, 0x2c, + 0x6e, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, + 0x28, 0x69, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x28, 0x74, 0x29, + 0x2c, 0x6f, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x28, 0x2e, 0x33, + 0x35, 0x2a, 0x74, 0x29, 0x2c, 0x61, 0x2e, 0x73, 0x63, 0x61, 0x6c, + 0x65, 0x28, 0x74, 0x29, 0x2c, 0x6e, 0x2e, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x6c, 0x61, 0x74, 0x65, 0x28, 0x69, 0x2e, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, 0x28, 0x29, 0x29, 0x29, 0x3a, + 0x69, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x28, 0x29, 0x7d, 0x2c, + 0x6e, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, + 0x29, 0x7b, 0x69, 0x66, 0x28, 0x21, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x2e, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, 0x28, 0x29, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x6c, 0x3d, 0x69, 0x2e, 0x73, 0x63, 0x61, + 0x6c, 0x65, 0x28, 0x29, 0x2c, 0x73, 0x3d, 0x2b, 0x74, 0x5b, 0x30, + 0x5d, 0x2c, 0x66, 0x3d, 0x2b, 0x74, 0x5b, 0x31, 0x5d, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x3d, 0x69, 0x2e, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, 0x28, 0x74, 0x29, + 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x74, + 0x28, 0x5b, 0x5b, 0x73, 0x2d, 0x2e, 0x34, 0x35, 0x35, 0x2a, 0x6c, + 0x2c, 0x66, 0x2d, 0x2e, 0x32, 0x33, 0x38, 0x2a, 0x6c, 0x5d, 0x2c, + 0x5b, 0x73, 0x2b, 0x2e, 0x34, 0x35, 0x35, 0x2a, 0x6c, 0x2c, 0x66, + 0x2b, 0x2e, 0x32, 0x33, 0x38, 0x2a, 0x6c, 0x5d, 0x5d, 0x29, 0x2e, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x28, 0x63, 0x29, 0x2e, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x2c, 0x72, 0x3d, 0x6f, 0x2e, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, 0x28, 0x5b, 0x73, 0x2d, + 0x2e, 0x33, 0x30, 0x37, 0x2a, 0x6c, 0x2c, 0x66, 0x2b, 0x2e, 0x32, + 0x30, 0x31, 0x2a, 0x6c, 0x5d, 0x29, 0x2e, 0x63, 0x6c, 0x69, 0x70, + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x28, 0x5b, 0x5b, 0x73, 0x2d, + 0x2e, 0x34, 0x32, 0x35, 0x2a, 0x6c, 0x2b, 0x43, 0x61, 0x2c, 0x66, + 0x2b, 0x2e, 0x31, 0x32, 0x2a, 0x6c, 0x2b, 0x43, 0x61, 0x5d, 0x2c, + 0x5b, 0x73, 0x2d, 0x2e, 0x32, 0x31, 0x34, 0x2a, 0x6c, 0x2d, 0x43, + 0x61, 0x2c, 0x66, 0x2b, 0x2e, 0x32, 0x33, 0x34, 0x2a, 0x6c, 0x2d, + 0x43, 0x61, 0x5d, 0x5d, 0x29, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x28, 0x63, 0x29, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2c, + 0x75, 0x3d, 0x61, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, + 0x74, 0x65, 0x28, 0x5b, 0x73, 0x2d, 0x2e, 0x32, 0x30, 0x35, 0x2a, + 0x6c, 0x2c, 0x66, 0x2b, 0x2e, 0x32, 0x31, 0x32, 0x2a, 0x6c, 0x5d, + 0x29, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x74, 0x28, 0x5b, 0x5b, 0x73, 0x2d, 0x2e, 0x32, 0x31, 0x34, 0x2a, + 0x6c, 0x2b, 0x43, 0x61, 0x2c, 0x66, 0x2b, 0x2e, 0x31, 0x36, 0x36, + 0x2a, 0x6c, 0x2b, 0x43, 0x61, 0x5d, 0x2c, 0x5b, 0x73, 0x2d, 0x2e, + 0x31, 0x31, 0x35, 0x2a, 0x6c, 0x2d, 0x43, 0x61, 0x2c, 0x66, 0x2b, + 0x2e, 0x32, 0x33, 0x34, 0x2a, 0x6c, 0x2d, 0x43, 0x61, 0x5d, 0x5d, + 0x29, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x28, 0x63, 0x29, + 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2c, 0x6e, 0x7d, 0x2c, 0x6e, + 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x28, 0x31, 0x30, 0x37, 0x30, + 0x29, 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x52, 0x63, 0x2c, 0x44, + 0x63, 0x2c, 0x50, 0x63, 0x2c, 0x55, 0x63, 0x2c, 0x6a, 0x63, 0x2c, + 0x46, 0x63, 0x2c, 0x48, 0x63, 0x3d, 0x7b, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x3a, 0x62, 0x2c, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x3a, 0x62, 0x2c, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, + 0x64, 0x3a, 0x62, 0x2c, 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x44, 0x63, 0x3d, 0x30, 0x2c, + 0x48, 0x63, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x3d, 0x56, 0x65, 0x7d, 0x2c, 0x70, 0x6f, 0x6c, 0x79, 0x67, + 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x48, 0x63, 0x2e, 0x6c, 0x69, + 0x6e, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3d, 0x48, 0x63, 0x2e, + 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, 0x3d, 0x48, 0x63, 0x2e, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3d, 0x62, 0x2c, 0x52, 0x63, 0x2b, + 0x3d, 0x67, 0x61, 0x28, 0x44, 0x63, 0x2f, 0x32, 0x29, 0x7d, 0x7d, + 0x2c, 0x4f, 0x63, 0x3d, 0x7b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3a, + 0x58, 0x65, 0x2c, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x3a, 0x62, 0x2c, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, + 0x3a, 0x62, 0x2c, 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x3a, 0x62, 0x2c, 0x70, 0x6f, 0x6c, 0x79, + 0x67, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x3a, 0x62, 0x7d, 0x2c, 0x49, + 0x63, 0x3d, 0x7b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3a, 0x57, 0x65, + 0x2c, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3a, + 0x4a, 0x65, 0x2c, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, 0x3a, + 0x47, 0x65, 0x2c, 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x49, 0x63, 0x2e, 0x6c, 0x69, 0x6e, + 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3d, 0x4b, 0x65, 0x7d, 0x2c, + 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x3a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, + 0x49, 0x63, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3d, 0x57, 0x65, + 0x2c, 0x49, 0x63, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x3d, 0x4a, 0x65, 0x2c, 0x49, 0x63, 0x2e, 0x6c, 0x69, + 0x6e, 0x65, 0x45, 0x6e, 0x64, 0x3d, 0x47, 0x65, 0x7d, 0x7d, 0x3b, + 0x74, 0x61, 0x2e, 0x67, 0x65, 0x6f, 0x2e, 0x70, 0x61, 0x74, 0x68, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, + 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x26, 0x26, 0x28, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, + 0x20, 0x61, 0x26, 0x26, 0x69, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x28, 0x2b, 0x61, 0x2e, 0x61, + 0x70, 0x70, 0x6c, 0x79, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x29, 0x2c, + 0x6f, 0x26, 0x26, 0x6f, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x7c, + 0x7c, 0x28, 0x6f, 0x3d, 0x75, 0x28, 0x69, 0x29, 0x29, 0x2c, 0x74, + 0x61, 0x2e, 0x67, 0x65, 0x6f, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x28, 0x6e, 0x2c, 0x6f, 0x29, 0x29, 0x2c, 0x69, 0x2e, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x28, 0x29, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x28, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x3d, 0x6e, 0x75, 0x6c, + 0x6c, 0x2c, 0x6e, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x65, 0x2c, 0x72, + 0x2c, 0x75, 0x2c, 0x69, 0x2c, 0x6f, 0x2c, 0x61, 0x3d, 0x34, 0x2e, + 0x35, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, + 0x61, 0x72, 0x65, 0x61, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x52, 0x63, 0x3d, 0x30, 0x2c, 0x74, 0x61, 0x2e, 0x67, + 0x65, 0x6f, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x28, 0x6e, + 0x2c, 0x75, 0x28, 0x48, 0x63, 0x29, 0x29, 0x2c, 0x52, 0x63, 0x7d, + 0x2c, 0x6e, 0x2e, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x6f, 0x69, 0x64, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, + 0x3d, 0x77, 0x63, 0x3d, 0x53, 0x63, 0x3d, 0x6b, 0x63, 0x3d, 0x45, + 0x63, 0x3d, 0x41, 0x63, 0x3d, 0x4e, 0x63, 0x3d, 0x43, 0x63, 0x3d, + 0x7a, 0x63, 0x3d, 0x30, 0x2c, 0x74, 0x61, 0x2e, 0x67, 0x65, 0x6f, + 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x28, 0x6e, 0x2c, 0x75, + 0x28, 0x49, 0x63, 0x29, 0x29, 0x2c, 0x7a, 0x63, 0x3f, 0x5b, 0x4e, + 0x63, 0x2f, 0x7a, 0x63, 0x2c, 0x43, 0x63, 0x2f, 0x7a, 0x63, 0x5d, + 0x3a, 0x41, 0x63, 0x3f, 0x5b, 0x6b, 0x63, 0x2f, 0x41, 0x63, 0x2c, + 0x45, 0x63, 0x2f, 0x41, 0x63, 0x5d, 0x3a, 0x53, 0x63, 0x3f, 0x5b, + 0x5f, 0x63, 0x2f, 0x53, 0x63, 0x2c, 0x77, 0x63, 0x2f, 0x53, 0x63, + 0x5d, 0x3a, 0x5b, 0x30, 0x2f, 0x30, 0x2c, 0x30, 0x2f, 0x30, 0x5d, + 0x7d, 0x2c, 0x6e, 0x2e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6a, 0x63, 0x3d, + 0x46, 0x63, 0x3d, 0x2d, 0x28, 0x50, 0x63, 0x3d, 0x55, 0x63, 0x3d, + 0x31, 0x2f, 0x30, 0x29, 0x2c, 0x74, 0x61, 0x2e, 0x67, 0x65, 0x6f, + 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x28, 0x6e, 0x2c, 0x75, + 0x28, 0x4f, 0x63, 0x29, 0x29, 0x2c, 0x5b, 0x5b, 0x50, 0x63, 0x2c, + 0x55, 0x63, 0x5d, 0x2c, 0x5b, 0x6a, 0x63, 0x2c, 0x46, 0x63, 0x5d, + 0x5d, 0x7d, 0x2c, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x75, 0x3d, + 0x28, 0x65, 0x3d, 0x6e, 0x29, 0x3f, 0x6e, 0x2e, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x7c, 0x7c, 0x74, 0x72, 0x28, 0x6e, 0x29, 0x3a, + 0x79, 0x2c, 0x74, 0x28, 0x29, 0x29, 0x3a, 0x65, 0x7d, 0x2c, 0x6e, + 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3f, 0x28, 0x69, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x28, + 0x72, 0x3d, 0x6e, 0x29, 0x3f, 0x6e, 0x65, 0x77, 0x20, 0x24, 0x65, + 0x3a, 0x6e, 0x65, 0x77, 0x20, 0x51, 0x65, 0x28, 0x6e, 0x29, 0x2c, + 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x21, + 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x61, 0x26, 0x26, + 0x69, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x61, 0x64, 0x69, + 0x75, 0x73, 0x28, 0x61, 0x29, 0x2c, 0x74, 0x28, 0x29, 0x29, 0x3a, + 0x72, 0x7d, 0x2c, 0x6e, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, + 0x61, 0x64, 0x69, 0x75, 0x73, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x61, + 0x3d, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3d, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x74, 0x3f, + 0x74, 0x3a, 0x28, 0x69, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, + 0x61, 0x64, 0x69, 0x75, 0x73, 0x28, 0x2b, 0x74, 0x29, 0x2c, 0x2b, + 0x74, 0x29, 0x2c, 0x6e, 0x29, 0x3a, 0x61, 0x7d, 0x2c, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x74, 0x61, 0x2e, 0x67, 0x65, 0x6f, 0x2e, 0x61, 0x6c, 0x62, 0x65, + 0x72, 0x73, 0x55, 0x73, 0x61, 0x28, 0x29, 0x29, 0x2e, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, + 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x67, 0x65, 0x6f, 0x2e, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x7b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x6e, 0x65, 0x77, + 0x20, 0x65, 0x72, 0x28, 0x74, 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x28, + 0x76, 0x61, 0x72, 0x20, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x6e, 0x29, + 0x65, 0x5b, 0x72, 0x5d, 0x3d, 0x6e, 0x5b, 0x72, 0x5d, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x7d, 0x7d, 0x7d, 0x2c, + 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, + 0x65, 0x3d, 0x7b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3a, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, + 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x6e, 0x2c, 0x74, + 0x29, 0x7d, 0x2c, 0x73, 0x70, 0x68, 0x65, 0x72, 0x65, 0x3a, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, + 0x73, 0x70, 0x68, 0x65, 0x72, 0x65, 0x28, 0x29, 0x7d, 0x2c, 0x6c, + 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3a, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x6c, + 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, 0x29, 0x7d, + 0x2c, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, 0x3a, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x6c, + 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, 0x28, 0x29, 0x7d, 0x2c, 0x70, + 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x28, 0x29, 0x7d, 0x2c, 0x70, 0x6f, 0x6c, 0x79, + 0x67, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x3a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, + 0x79, 0x67, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x28, 0x29, 0x7d, 0x7d, + 0x2c, 0x74, 0x61, 0x2e, 0x67, 0x65, 0x6f, 0x2e, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x75, 0x72, 0x2c, + 0x74, 0x61, 0x2e, 0x67, 0x65, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x75, 0x74, 0x61, 0x74, + 0x6f, 0x72, 0x3d, 0x69, 0x72, 0x2c, 0x28, 0x74, 0x61, 0x2e, 0x67, + 0x65, 0x6f, 0x2e, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x61, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x75, 0x72, 0x28, 0x61, 0x72, 0x29, 0x7d, + 0x29, 0x2e, 0x72, 0x61, 0x77, 0x3d, 0x61, 0x72, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x72, 0x74, 0x3d, 0x61, 0x72, 0x2c, 0x74, 0x61, 0x2e, + 0x67, 0x65, 0x6f, 0x2e, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x74, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x3d, 0x6e, 0x28, 0x74, 0x5b, 0x30, 0x5d, 0x2a, + 0x44, 0x61, 0x2c, 0x74, 0x5b, 0x31, 0x5d, 0x2a, 0x44, 0x61, 0x29, + 0x2c, 0x74, 0x5b, 0x30, 0x5d, 0x2a, 0x3d, 0x50, 0x61, 0x2c, 0x74, + 0x5b, 0x31, 0x5d, 0x2a, 0x3d, 0x50, 0x61, 0x2c, 0x74, 0x7d, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x3d, 0x6c, 0x72, 0x28, + 0x6e, 0x5b, 0x30, 0x5d, 0x25, 0x33, 0x36, 0x30, 0x2a, 0x44, 0x61, + 0x2c, 0x6e, 0x5b, 0x31, 0x5d, 0x2a, 0x44, 0x61, 0x2c, 0x6e, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3e, 0x32, 0x3f, 0x6e, 0x5b, + 0x32, 0x5d, 0x2a, 0x44, 0x61, 0x3a, 0x30, 0x29, 0x2c, 0x74, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x3d, 0x6e, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x72, 0x74, 0x28, 0x74, 0x5b, 0x30, 0x5d, 0x2a, 0x44, 0x61, + 0x2c, 0x74, 0x5b, 0x31, 0x5d, 0x2a, 0x44, 0x61, 0x29, 0x2c, 0x74, + 0x5b, 0x30, 0x5d, 0x2a, 0x3d, 0x50, 0x61, 0x2c, 0x74, 0x5b, 0x31, + 0x5d, 0x2a, 0x3d, 0x50, 0x61, 0x2c, 0x74, 0x7d, 0x2c, 0x74, 0x7d, + 0x2c, 0x63, 0x72, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x3d, + 0x61, 0x72, 0x2c, 0x74, 0x61, 0x2e, 0x67, 0x65, 0x6f, 0x2e, 0x63, + 0x69, 0x72, 0x63, 0x6c, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x6e, 0x3d, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, + 0x72, 0x3f, 0x72, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x29, 0x3a, 0x72, 0x2c, 0x74, 0x3d, 0x6c, 0x72, 0x28, + 0x2d, 0x6e, 0x5b, 0x30, 0x5d, 0x2a, 0x44, 0x61, 0x2c, 0x2d, 0x6e, + 0x5b, 0x31, 0x5d, 0x2a, 0x44, 0x61, 0x2c, 0x30, 0x29, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x72, 0x74, 0x2c, 0x75, 0x3d, 0x5b, 0x5d, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x28, 0x6e, 0x75, + 0x6c, 0x6c, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x31, 0x2c, 0x7b, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x65, 0x29, 0x7b, 0x75, 0x2e, + 0x70, 0x75, 0x73, 0x68, 0x28, 0x6e, 0x3d, 0x74, 0x28, 0x6e, 0x2c, + 0x65, 0x29, 0x29, 0x2c, 0x6e, 0x5b, 0x30, 0x5d, 0x2a, 0x3d, 0x50, + 0x61, 0x2c, 0x6e, 0x5b, 0x31, 0x5d, 0x2a, 0x3d, 0x50, 0x61, 0x7d, + 0x7d, 0x29, 0x2c, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x50, + 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x22, 0x2c, 0x63, 0x6f, 0x6f, + 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x3a, 0x5b, 0x75, + 0x5d, 0x7d, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x74, 0x2c, 0x65, 0x2c, + 0x72, 0x3d, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x75, 0x3d, 0x36, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x6f, + 0x72, 0x69, 0x67, 0x69, 0x6e, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x72, + 0x3d, 0x74, 0x2c, 0x6e, 0x29, 0x3a, 0x72, 0x7d, 0x2c, 0x6e, 0x2e, + 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x72, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x65, + 0x3d, 0x67, 0x72, 0x28, 0x28, 0x74, 0x3d, 0x2b, 0x72, 0x29, 0x2a, + 0x44, 0x61, 0x2c, 0x75, 0x2a, 0x44, 0x61, 0x29, 0x2c, 0x6e, 0x29, + 0x3a, 0x74, 0x7d, 0x2c, 0x6e, 0x2e, 0x70, 0x72, 0x65, 0x63, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x72, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x65, 0x3d, + 0x67, 0x72, 0x28, 0x74, 0x2a, 0x44, 0x61, 0x2c, 0x28, 0x75, 0x3d, + 0x2b, 0x72, 0x29, 0x2a, 0x44, 0x61, 0x29, 0x2c, 0x6e, 0x29, 0x3a, + 0x75, 0x7d, 0x2c, 0x6e, 0x2e, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x28, + 0x39, 0x30, 0x29, 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x67, 0x65, 0x6f, + 0x2e, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x2c, 0x72, 0x3d, 0x28, + 0x74, 0x5b, 0x30, 0x5d, 0x2d, 0x6e, 0x5b, 0x30, 0x5d, 0x29, 0x2a, + 0x44, 0x61, 0x2c, 0x75, 0x3d, 0x6e, 0x5b, 0x31, 0x5d, 0x2a, 0x44, + 0x61, 0x2c, 0x69, 0x3d, 0x74, 0x5b, 0x31, 0x5d, 0x2a, 0x44, 0x61, + 0x2c, 0x6f, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, + 0x28, 0x72, 0x29, 0x2c, 0x61, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x63, 0x6f, 0x73, 0x28, 0x72, 0x29, 0x2c, 0x63, 0x3d, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x75, 0x29, 0x2c, 0x6c, + 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x75, + 0x29, 0x2c, 0x73, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, + 0x6e, 0x28, 0x69, 0x29, 0x2c, 0x66, 0x3d, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x69, 0x29, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x61, 0x74, + 0x61, 0x6e, 0x32, 0x28, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x71, + 0x72, 0x74, 0x28, 0x28, 0x65, 0x3d, 0x66, 0x2a, 0x6f, 0x29, 0x2a, + 0x65, 0x2b, 0x28, 0x65, 0x3d, 0x6c, 0x2a, 0x73, 0x2d, 0x63, 0x2a, + 0x66, 0x2a, 0x61, 0x29, 0x2a, 0x65, 0x29, 0x2c, 0x63, 0x2a, 0x73, + 0x2b, 0x6c, 0x2a, 0x66, 0x2a, 0x61, 0x29, 0x7d, 0x2c, 0x74, 0x61, + 0x2e, 0x67, 0x65, 0x6f, 0x2e, 0x67, 0x72, 0x61, 0x74, 0x69, 0x63, + 0x75, 0x6c, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x4d, 0x75, 0x6c, + 0x74, 0x69, 0x4c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0x2c, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, + 0x74, 0x65, 0x73, 0x3a, 0x74, 0x28, 0x29, 0x7d, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x28, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x2e, 0x72, + 0x61, 0x6e, 0x67, 0x65, 0x28, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, + 0x65, 0x69, 0x6c, 0x28, 0x69, 0x2f, 0x64, 0x29, 0x2a, 0x64, 0x2c, + 0x75, 0x2c, 0x64, 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x68, 0x29, + 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x74, 0x61, 0x2e, + 0x72, 0x61, 0x6e, 0x67, 0x65, 0x28, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x63, 0x65, 0x69, 0x6c, 0x28, 0x6c, 0x2f, 0x6d, 0x29, 0x2a, 0x6d, + 0x2c, 0x63, 0x2c, 0x6d, 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x67, + 0x29, 0x29, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x74, + 0x61, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x28, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x63, 0x65, 0x69, 0x6c, 0x28, 0x72, 0x2f, 0x70, 0x29, + 0x2a, 0x70, 0x2c, 0x65, 0x2c, 0x70, 0x29, 0x2e, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x67, 0x61, 0x28, 0x6e, 0x25, 0x64, 0x29, 0x3e, 0x43, 0x61, + 0x7d, 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x73, 0x29, 0x29, 0x2e, + 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x74, 0x61, 0x2e, 0x72, + 0x61, 0x6e, 0x67, 0x65, 0x28, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, + 0x65, 0x69, 0x6c, 0x28, 0x61, 0x2f, 0x76, 0x29, 0x2a, 0x76, 0x2c, + 0x6f, 0x2c, 0x76, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x67, 0x61, + 0x28, 0x6e, 0x25, 0x6d, 0x29, 0x3e, 0x43, 0x61, 0x7d, 0x29, 0x2e, + 0x6d, 0x61, 0x70, 0x28, 0x66, 0x29, 0x29, 0x7d, 0x76, 0x61, 0x72, + 0x20, 0x65, 0x2c, 0x72, 0x2c, 0x75, 0x2c, 0x69, 0x2c, 0x6f, 0x2c, + 0x61, 0x2c, 0x63, 0x2c, 0x6c, 0x2c, 0x73, 0x2c, 0x66, 0x2c, 0x68, + 0x2c, 0x67, 0x2c, 0x70, 0x3d, 0x31, 0x30, 0x2c, 0x76, 0x3d, 0x70, + 0x2c, 0x64, 0x3d, 0x39, 0x30, 0x2c, 0x6d, 0x3d, 0x33, 0x36, 0x30, + 0x2c, 0x79, 0x3d, 0x32, 0x2e, 0x35, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x28, 0x29, 0x2e, + 0x6d, 0x61, 0x70, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x4c, 0x69, 0x6e, 0x65, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x63, 0x6f, 0x6f, + 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x3a, 0x6e, 0x7d, + 0x7d, 0x29, 0x7d, 0x2c, 0x6e, 0x2e, 0x6f, 0x75, 0x74, 0x6c, 0x69, + 0x6e, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7b, 0x74, + 0x79, 0x70, 0x65, 0x3a, 0x22, 0x50, 0x6f, 0x6c, 0x79, 0x67, 0x6f, + 0x6e, 0x22, 0x2c, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, + 0x74, 0x65, 0x73, 0x3a, 0x5b, 0x68, 0x28, 0x69, 0x29, 0x2e, 0x63, + 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x67, 0x28, 0x63, 0x29, 0x2e, + 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x31, 0x29, 0x2c, 0x68, 0x28, + 0x75, 0x29, 0x2e, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x28, + 0x29, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x31, 0x29, 0x2c, + 0x67, 0x28, 0x6c, 0x29, 0x2e, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, + 0x65, 0x28, 0x29, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x31, + 0x29, 0x29, 0x5d, 0x7d, 0x7d, 0x2c, 0x6e, 0x2e, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x6e, 0x2e, 0x6d, 0x61, + 0x6a, 0x6f, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x28, 0x74, + 0x29, 0x2e, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x74, 0x28, 0x74, 0x29, 0x3a, 0x6e, 0x2e, 0x6d, 0x69, 0x6e, + 0x6f, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x28, 0x29, 0x7d, + 0x2c, 0x6e, 0x2e, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x69, 0x3d, 0x2b, + 0x74, 0x5b, 0x30, 0x5d, 0x5b, 0x30, 0x5d, 0x2c, 0x75, 0x3d, 0x2b, + 0x74, 0x5b, 0x31, 0x5d, 0x5b, 0x30, 0x5d, 0x2c, 0x6c, 0x3d, 0x2b, + 0x74, 0x5b, 0x30, 0x5d, 0x5b, 0x31, 0x5d, 0x2c, 0x63, 0x3d, 0x2b, + 0x74, 0x5b, 0x31, 0x5d, 0x5b, 0x31, 0x5d, 0x2c, 0x69, 0x3e, 0x75, + 0x26, 0x26, 0x28, 0x74, 0x3d, 0x69, 0x2c, 0x69, 0x3d, 0x75, 0x2c, + 0x75, 0x3d, 0x74, 0x29, 0x2c, 0x6c, 0x3e, 0x63, 0x26, 0x26, 0x28, + 0x74, 0x3d, 0x6c, 0x2c, 0x6c, 0x3d, 0x63, 0x2c, 0x63, 0x3d, 0x74, + 0x29, 0x2c, 0x6e, 0x2e, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x28, 0x79, 0x29, 0x29, 0x3a, 0x5b, 0x5b, 0x69, 0x2c, + 0x6c, 0x5d, 0x2c, 0x5b, 0x75, 0x2c, 0x63, 0x5d, 0x5d, 0x7d, 0x2c, + 0x6e, 0x2e, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x72, 0x3d, 0x2b, 0x74, + 0x5b, 0x30, 0x5d, 0x5b, 0x30, 0x5d, 0x2c, 0x65, 0x3d, 0x2b, 0x74, + 0x5b, 0x31, 0x5d, 0x5b, 0x30, 0x5d, 0x2c, 0x61, 0x3d, 0x2b, 0x74, + 0x5b, 0x30, 0x5d, 0x5b, 0x31, 0x5d, 0x2c, 0x6f, 0x3d, 0x2b, 0x74, + 0x5b, 0x31, 0x5d, 0x5b, 0x31, 0x5d, 0x2c, 0x72, 0x3e, 0x65, 0x26, + 0x26, 0x28, 0x74, 0x3d, 0x72, 0x2c, 0x72, 0x3d, 0x65, 0x2c, 0x65, + 0x3d, 0x74, 0x29, 0x2c, 0x61, 0x3e, 0x6f, 0x26, 0x26, 0x28, 0x74, + 0x3d, 0x61, 0x2c, 0x61, 0x3d, 0x6f, 0x2c, 0x6f, 0x3d, 0x74, 0x29, + 0x2c, 0x6e, 0x2e, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x28, 0x79, 0x29, 0x29, 0x3a, 0x5b, 0x5b, 0x72, 0x2c, 0x61, + 0x5d, 0x2c, 0x5b, 0x65, 0x2c, 0x6f, 0x5d, 0x5d, 0x7d, 0x2c, 0x6e, + 0x2e, 0x73, 0x74, 0x65, 0x70, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x6e, 0x2e, + 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x53, 0x74, 0x65, 0x70, 0x28, 0x74, + 0x29, 0x2e, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x53, 0x74, 0x65, 0x70, + 0x28, 0x74, 0x29, 0x3a, 0x6e, 0x2e, 0x6d, 0x69, 0x6e, 0x6f, 0x72, + 0x53, 0x74, 0x65, 0x70, 0x28, 0x29, 0x7d, 0x2c, 0x6e, 0x2e, 0x6d, + 0x61, 0x6a, 0x6f, 0x72, 0x53, 0x74, 0x65, 0x70, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3f, 0x28, 0x64, 0x3d, 0x2b, 0x74, 0x5b, 0x30, 0x5d, 0x2c, 0x6d, + 0x3d, 0x2b, 0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x6e, 0x29, 0x3a, 0x5b, + 0x64, 0x2c, 0x6d, 0x5d, 0x7d, 0x2c, 0x6e, 0x2e, 0x6d, 0x69, 0x6e, + 0x6f, 0x72, 0x53, 0x74, 0x65, 0x70, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, + 0x70, 0x3d, 0x2b, 0x74, 0x5b, 0x30, 0x5d, 0x2c, 0x76, 0x3d, 0x2b, + 0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x6e, 0x29, 0x3a, 0x5b, 0x70, 0x2c, + 0x76, 0x5d, 0x7d, 0x2c, 0x6e, 0x2e, 0x70, 0x72, 0x65, 0x63, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x79, 0x3d, + 0x2b, 0x74, 0x2c, 0x73, 0x3d, 0x76, 0x72, 0x28, 0x61, 0x2c, 0x6f, + 0x2c, 0x39, 0x30, 0x29, 0x2c, 0x66, 0x3d, 0x64, 0x72, 0x28, 0x72, + 0x2c, 0x65, 0x2c, 0x79, 0x29, 0x2c, 0x68, 0x3d, 0x76, 0x72, 0x28, + 0x6c, 0x2c, 0x63, 0x2c, 0x39, 0x30, 0x29, 0x2c, 0x67, 0x3d, 0x64, + 0x72, 0x28, 0x69, 0x2c, 0x75, 0x2c, 0x79, 0x29, 0x2c, 0x6e, 0x29, + 0x3a, 0x79, 0x7d, 0x2c, 0x6e, 0x2e, 0x6d, 0x61, 0x6a, 0x6f, 0x72, + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x28, 0x5b, 0x5b, 0x2d, 0x31, + 0x38, 0x30, 0x2c, 0x2d, 0x39, 0x30, 0x2b, 0x43, 0x61, 0x5d, 0x2c, + 0x5b, 0x31, 0x38, 0x30, 0x2c, 0x39, 0x30, 0x2d, 0x43, 0x61, 0x5d, + 0x5d, 0x29, 0x2e, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x74, 0x28, 0x5b, 0x5b, 0x2d, 0x31, 0x38, 0x30, 0x2c, + 0x2d, 0x38, 0x30, 0x2d, 0x43, 0x61, 0x5d, 0x2c, 0x5b, 0x31, 0x38, + 0x30, 0x2c, 0x38, 0x30, 0x2b, 0x43, 0x61, 0x5d, 0x5d, 0x29, 0x7d, + 0x2c, 0x74, 0x61, 0x2e, 0x67, 0x65, 0x6f, 0x2e, 0x67, 0x72, 0x65, + 0x61, 0x74, 0x41, 0x72, 0x63, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x4c, + 0x69, 0x6e, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, + 0x3a, 0x5b, 0x74, 0x7c, 0x7c, 0x72, 0x2e, 0x61, 0x70, 0x70, 0x6c, + 0x79, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x2c, 0x65, 0x7c, 0x7c, 0x75, + 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, + 0x5d, 0x7d, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x74, 0x2c, 0x65, 0x2c, + 0x72, 0x3d, 0x6d, 0x72, 0x2c, 0x75, 0x3d, 0x79, 0x72, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x64, 0x69, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x61, 0x2e, 0x67, 0x65, 0x6f, 0x2e, 0x64, 0x69, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x28, 0x74, 0x7c, 0x7c, 0x72, + 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, + 0x2c, 0x65, 0x7c, 0x7c, 0x75, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, + 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x29, 0x29, 0x7d, 0x2c, 0x6e, 0x2e, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x72, + 0x3d, 0x65, 0x2c, 0x74, 0x3d, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, + 0x66, 0x20, 0x65, 0x3f, 0x6e, 0x75, 0x6c, 0x6c, 0x3a, 0x65, 0x2c, + 0x6e, 0x29, 0x3a, 0x72, 0x7d, 0x2c, 0x6e, 0x2e, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x75, 0x3d, 0x74, + 0x2c, 0x65, 0x3d, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, + 0x74, 0x3f, 0x6e, 0x75, 0x6c, 0x6c, 0x3a, 0x74, 0x2c, 0x6e, 0x29, + 0x3a, 0x75, 0x7d, 0x2c, 0x6e, 0x2e, 0x70, 0x72, 0x65, 0x63, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x6e, 0x3a, 0x30, 0x7d, + 0x2c, 0x6e, 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x67, 0x65, 0x6f, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x6f, 0x6c, 0x61, 0x74, 0x65, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x4d, 0x72, 0x28, 0x6e, 0x5b, 0x30, 0x5d, 0x2a, 0x44, 0x61, 0x2c, + 0x6e, 0x5b, 0x31, 0x5d, 0x2a, 0x44, 0x61, 0x2c, 0x74, 0x5b, 0x30, + 0x5d, 0x2a, 0x44, 0x61, 0x2c, 0x74, 0x5b, 0x31, 0x5d, 0x2a, 0x44, + 0x61, 0x29, 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x67, 0x65, 0x6f, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x59, 0x63, 0x3d, 0x30, 0x2c, 0x74, 0x61, + 0x2e, 0x67, 0x65, 0x6f, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x28, 0x6e, 0x2c, 0x5a, 0x63, 0x29, 0x2c, 0x59, 0x63, 0x7d, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x59, 0x63, 0x2c, 0x5a, 0x63, 0x3d, 0x7b, + 0x73, 0x70, 0x68, 0x65, 0x72, 0x65, 0x3a, 0x62, 0x2c, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x3a, 0x62, 0x2c, 0x6c, 0x69, 0x6e, 0x65, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x3a, 0x78, 0x72, 0x2c, 0x6c, 0x69, 0x6e, + 0x65, 0x45, 0x6e, 0x64, 0x3a, 0x62, 0x2c, 0x70, 0x6f, 0x6c, 0x79, + 0x67, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3a, 0x62, 0x2c, + 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x3a, + 0x62, 0x7d, 0x2c, 0x56, 0x63, 0x3d, 0x62, 0x72, 0x28, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x73, 0x71, 0x72, 0x74, 0x28, 0x32, 0x2f, 0x28, 0x31, 0x2b, 0x6e, + 0x29, 0x29, 0x7d, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x32, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x61, 0x73, 0x69, + 0x6e, 0x28, 0x6e, 0x2f, 0x32, 0x29, 0x7d, 0x29, 0x3b, 0x28, 0x74, + 0x61, 0x2e, 0x67, 0x65, 0x6f, 0x2e, 0x61, 0x7a, 0x69, 0x6d, 0x75, + 0x74, 0x68, 0x61, 0x6c, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x41, 0x72, + 0x65, 0x61, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, + 0x72, 0x28, 0x56, 0x63, 0x29, 0x7d, 0x29, 0x2e, 0x72, 0x61, 0x77, + 0x3d, 0x56, 0x63, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x58, 0x63, 0x3d, + 0x62, 0x72, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x61, 0x63, 0x6f, 0x73, 0x28, 0x6e, 0x29, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x26, 0x26, + 0x74, 0x2f, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, + 0x74, 0x29, 0x7d, 0x2c, 0x79, 0x29, 0x3b, 0x28, 0x74, 0x61, 0x2e, + 0x67, 0x65, 0x6f, 0x2e, 0x61, 0x7a, 0x69, 0x6d, 0x75, 0x74, 0x68, + 0x61, 0x6c, 0x45, 0x71, 0x75, 0x69, 0x64, 0x69, 0x73, 0x74, 0x61, + 0x6e, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, + 0x72, 0x28, 0x58, 0x63, 0x29, 0x7d, 0x29, 0x2e, 0x72, 0x61, 0x77, + 0x3d, 0x58, 0x63, 0x2c, 0x28, 0x74, 0x61, 0x2e, 0x67, 0x65, 0x6f, + 0x2e, 0x63, 0x6f, 0x6e, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x6c, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x59, 0x65, 0x28, 0x5f, 0x72, 0x29, 0x7d, 0x29, 0x2e, 0x72, + 0x61, 0x77, 0x3d, 0x5f, 0x72, 0x2c, 0x28, 0x74, 0x61, 0x2e, 0x67, + 0x65, 0x6f, 0x2e, 0x63, 0x6f, 0x6e, 0x69, 0x63, 0x45, 0x71, 0x75, + 0x69, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x59, 0x65, 0x28, 0x77, 0x72, 0x29, + 0x7d, 0x29, 0x2e, 0x72, 0x61, 0x77, 0x3d, 0x77, 0x72, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x24, 0x63, 0x3d, 0x62, 0x72, 0x28, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x2f, 0x6e, 0x7d, 0x2c, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x61, 0x74, 0x61, 0x6e, 0x29, 0x3b, + 0x28, 0x74, 0x61, 0x2e, 0x67, 0x65, 0x6f, 0x2e, 0x67, 0x6e, 0x6f, + 0x6d, 0x6f, 0x6e, 0x69, 0x63, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x75, 0x72, 0x28, 0x24, 0x63, 0x29, 0x7d, 0x29, 0x2e, + 0x72, 0x61, 0x77, 0x3d, 0x24, 0x63, 0x2c, 0x53, 0x72, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x72, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x5b, 0x6e, 0x2c, 0x32, 0x2a, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x61, 0x74, 0x61, 0x6e, 0x28, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x65, 0x78, 0x70, 0x28, 0x74, 0x29, 0x29, 0x2d, 0x52, + 0x61, 0x5d, 0x7d, 0x2c, 0x28, 0x74, 0x61, 0x2e, 0x67, 0x65, 0x6f, + 0x2e, 0x6d, 0x65, 0x72, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6b, 0x72, 0x28, 0x53, 0x72, + 0x29, 0x7d, 0x29, 0x2e, 0x72, 0x61, 0x77, 0x3d, 0x53, 0x72, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x42, 0x63, 0x3d, 0x62, 0x72, 0x28, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x7d, 0x2c, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x61, 0x73, 0x69, 0x6e, 0x29, 0x3b, 0x28, 0x74, + 0x61, 0x2e, 0x67, 0x65, 0x6f, 0x2e, 0x6f, 0x72, 0x74, 0x68, 0x6f, + 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x75, 0x72, 0x28, 0x42, 0x63, 0x29, 0x7d, + 0x29, 0x2e, 0x72, 0x61, 0x77, 0x3d, 0x42, 0x63, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x57, 0x63, 0x3d, 0x62, 0x72, 0x28, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x2f, 0x28, 0x31, 0x2b, 0x6e, + 0x29, 0x7d, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x32, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x61, 0x74, 0x61, 0x6e, + 0x28, 0x6e, 0x29, 0x7d, 0x29, 0x3b, 0x28, 0x74, 0x61, 0x2e, 0x67, + 0x65, 0x6f, 0x2e, 0x73, 0x74, 0x65, 0x72, 0x65, 0x6f, 0x67, 0x72, + 0x61, 0x70, 0x68, 0x69, 0x63, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x75, 0x72, 0x28, 0x57, 0x63, 0x29, 0x7d, 0x29, 0x2e, + 0x72, 0x61, 0x77, 0x3d, 0x57, 0x63, 0x2c, 0x45, 0x72, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x72, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x5b, 0x2d, 0x74, 0x2c, 0x32, 0x2a, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x61, 0x74, 0x61, 0x6e, 0x28, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x65, 0x78, 0x70, 0x28, 0x6e, 0x29, 0x29, 0x2d, + 0x52, 0x61, 0x5d, 0x7d, 0x2c, 0x28, 0x74, 0x61, 0x2e, 0x67, 0x65, + 0x6f, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x76, 0x65, 0x72, 0x73, + 0x65, 0x4d, 0x65, 0x72, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x6e, 0x3d, 0x6b, 0x72, 0x28, 0x45, 0x72, 0x29, + 0x2c, 0x74, 0x3d, 0x6e, 0x2e, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x2c, 0x65, 0x3d, 0x6e, 0x2e, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x63, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x3f, 0x74, 0x28, 0x5b, 0x2d, 0x6e, 0x5b, + 0x31, 0x5d, 0x2c, 0x6e, 0x5b, 0x30, 0x5d, 0x5d, 0x29, 0x3a, 0x28, + 0x6e, 0x3d, 0x74, 0x28, 0x29, 0x2c, 0x5b, 0x6e, 0x5b, 0x31, 0x5d, + 0x2c, 0x2d, 0x6e, 0x5b, 0x30, 0x5d, 0x5d, 0x29, 0x7d, 0x2c, 0x6e, + 0x2e, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x3f, 0x65, 0x28, 0x5b, 0x6e, + 0x5b, 0x30, 0x5d, 0x2c, 0x6e, 0x5b, 0x31, 0x5d, 0x2c, 0x6e, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3e, 0x32, 0x3f, 0x6e, 0x5b, + 0x32, 0x5d, 0x2b, 0x39, 0x30, 0x3a, 0x39, 0x30, 0x5d, 0x29, 0x3a, + 0x28, 0x6e, 0x3d, 0x65, 0x28, 0x29, 0x2c, 0x5b, 0x6e, 0x5b, 0x30, + 0x5d, 0x2c, 0x6e, 0x5b, 0x31, 0x5d, 0x2c, 0x6e, 0x5b, 0x32, 0x5d, + 0x2d, 0x39, 0x30, 0x5d, 0x29, 0x7d, 0x2c, 0x65, 0x28, 0x5b, 0x30, + 0x2c, 0x30, 0x2c, 0x39, 0x30, 0x5d, 0x29, 0x7d, 0x29, 0x2e, 0x72, + 0x61, 0x77, 0x3d, 0x45, 0x72, 0x2c, 0x74, 0x61, 0x2e, 0x67, 0x65, + 0x6f, 0x6d, 0x3d, 0x7b, 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x67, 0x65, + 0x6f, 0x6d, 0x2e, 0x68, 0x75, 0x6c, 0x6c, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x28, 0x6e, 0x29, + 0x7b, 0x69, 0x66, 0x28, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3c, 0x33, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, + 0x5d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x2c, 0x75, 0x3d, 0x45, + 0x74, 0x28, 0x65, 0x29, 0x2c, 0x69, 0x3d, 0x45, 0x74, 0x28, 0x72, + 0x29, 0x2c, 0x6f, 0x3d, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x2c, 0x61, 0x3d, 0x5b, 0x5d, 0x2c, 0x63, 0x3d, 0x5b, 0x5d, + 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x74, 0x3d, 0x30, 0x3b, 0x6f, 0x3e, + 0x74, 0x3b, 0x74, 0x2b, 0x2b, 0x29, 0x61, 0x2e, 0x70, 0x75, 0x73, + 0x68, 0x28, 0x5b, 0x2b, 0x75, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x2c, 0x6e, 0x5b, 0x74, 0x5d, 0x2c, 0x74, + 0x29, 0x2c, 0x2b, 0x69, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2c, 0x6e, 0x5b, 0x74, 0x5d, 0x2c, 0x74, 0x29, + 0x2c, 0x74, 0x5d, 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x61, 0x2e, + 0x73, 0x6f, 0x72, 0x74, 0x28, 0x7a, 0x72, 0x29, 0x2c, 0x74, 0x3d, + 0x30, 0x3b, 0x6f, 0x3e, 0x74, 0x3b, 0x74, 0x2b, 0x2b, 0x29, 0x63, + 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x5b, 0x61, 0x5b, 0x74, 0x5d, + 0x5b, 0x30, 0x5d, 0x2c, 0x2d, 0x61, 0x5b, 0x74, 0x5d, 0x5b, 0x31, + 0x5d, 0x5d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x6c, 0x3d, 0x43, + 0x72, 0x28, 0x61, 0x29, 0x2c, 0x73, 0x3d, 0x43, 0x72, 0x28, 0x63, + 0x29, 0x2c, 0x66, 0x3d, 0x73, 0x5b, 0x30, 0x5d, 0x3d, 0x3d, 0x3d, + 0x6c, 0x5b, 0x30, 0x5d, 0x2c, 0x68, 0x3d, 0x73, 0x5b, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, 0x5d, 0x3d, 0x3d, + 0x3d, 0x6c, 0x5b, 0x6c, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x2d, 0x31, 0x5d, 0x2c, 0x67, 0x3d, 0x5b, 0x5d, 0x3b, 0x66, 0x6f, + 0x72, 0x28, 0x74, 0x3d, 0x6c, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x2d, 0x31, 0x3b, 0x74, 0x3e, 0x3d, 0x30, 0x3b, 0x2d, 0x2d, + 0x74, 0x29, 0x67, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x6e, 0x5b, + 0x61, 0x5b, 0x6c, 0x5b, 0x74, 0x5d, 0x5d, 0x5b, 0x32, 0x5d, 0x5d, + 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x74, 0x3d, 0x2b, 0x66, 0x3b, + 0x74, 0x3c, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, + 0x68, 0x3b, 0x2b, 0x2b, 0x74, 0x29, 0x67, 0x2e, 0x70, 0x75, 0x73, + 0x68, 0x28, 0x6e, 0x5b, 0x61, 0x5b, 0x73, 0x5b, 0x74, 0x5d, 0x5d, + 0x5b, 0x32, 0x5d, 0x5d, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x67, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x41, + 0x72, 0x2c, 0x72, 0x3d, 0x4e, 0x72, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x74, 0x28, + 0x6e, 0x29, 0x3a, 0x28, 0x74, 0x2e, 0x78, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, + 0x28, 0x65, 0x3d, 0x6e, 0x2c, 0x74, 0x29, 0x3a, 0x65, 0x7d, 0x2c, + 0x74, 0x2e, 0x79, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x72, 0x3d, 0x6e, + 0x2c, 0x74, 0x29, 0x3a, 0x72, 0x7d, 0x2c, 0x74, 0x29, 0x7d, 0x2c, + 0x74, 0x61, 0x2e, 0x67, 0x65, 0x6f, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, + 0x79, 0x67, 0x6f, 0x6e, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x79, 0x61, 0x28, 0x6e, 0x2c, 0x4a, 0x63, 0x29, 0x2c, + 0x6e, 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x4a, 0x63, 0x3d, 0x74, + 0x61, 0x2e, 0x67, 0x65, 0x6f, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x79, + 0x67, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, + 0x70, 0x65, 0x3d, 0x5b, 0x5d, 0x3b, 0x4a, 0x63, 0x2e, 0x61, 0x72, + 0x65, 0x61, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, + 0x6e, 0x2c, 0x74, 0x3d, 0x2d, 0x31, 0x2c, 0x65, 0x3d, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x72, + 0x3d, 0x74, 0x68, 0x69, 0x73, 0x5b, 0x65, 0x2d, 0x31, 0x5d, 0x2c, + 0x75, 0x3d, 0x30, 0x3b, 0x2b, 0x2b, 0x74, 0x3c, 0x65, 0x3b, 0x29, + 0x6e, 0x3d, 0x72, 0x2c, 0x72, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x5b, + 0x74, 0x5d, 0x2c, 0x75, 0x2b, 0x3d, 0x6e, 0x5b, 0x31, 0x5d, 0x2a, + 0x72, 0x5b, 0x30, 0x5d, 0x2d, 0x6e, 0x5b, 0x30, 0x5d, 0x2a, 0x72, + 0x5b, 0x31, 0x5d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x2e, + 0x35, 0x2a, 0x75, 0x7d, 0x2c, 0x4a, 0x63, 0x2e, 0x63, 0x65, 0x6e, + 0x74, 0x72, 0x6f, 0x69, 0x64, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x3d, 0x2d, 0x31, 0x2c, 0x75, 0x3d, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x2c, 0x69, 0x3d, 0x30, 0x2c, 0x6f, 0x3d, 0x30, 0x2c, 0x61, 0x3d, + 0x74, 0x68, 0x69, 0x73, 0x5b, 0x75, 0x2d, 0x31, 0x5d, 0x3b, 0x66, + 0x6f, 0x72, 0x28, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x7c, 0x7c, 0x28, + 0x6e, 0x3d, 0x2d, 0x31, 0x2f, 0x28, 0x36, 0x2a, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x61, 0x72, 0x65, 0x61, 0x28, 0x29, 0x29, 0x29, 0x3b, + 0x2b, 0x2b, 0x72, 0x3c, 0x75, 0x3b, 0x29, 0x74, 0x3d, 0x61, 0x2c, + 0x61, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x5b, 0x72, 0x5d, 0x2c, 0x65, + 0x3d, 0x74, 0x5b, 0x30, 0x5d, 0x2a, 0x61, 0x5b, 0x31, 0x5d, 0x2d, + 0x61, 0x5b, 0x30, 0x5d, 0x2a, 0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x69, + 0x2b, 0x3d, 0x28, 0x74, 0x5b, 0x30, 0x5d, 0x2b, 0x61, 0x5b, 0x30, + 0x5d, 0x29, 0x2a, 0x65, 0x2c, 0x6f, 0x2b, 0x3d, 0x28, 0x74, 0x5b, + 0x31, 0x5d, 0x2b, 0x61, 0x5b, 0x31, 0x5d, 0x29, 0x2a, 0x65, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, 0x69, 0x2a, 0x6e, 0x2c, + 0x6f, 0x2a, 0x6e, 0x5d, 0x7d, 0x2c, 0x4a, 0x63, 0x2e, 0x63, 0x6c, + 0x69, 0x70, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, + 0x20, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x75, 0x2c, 0x69, 0x2c, + 0x6f, 0x2c, 0x61, 0x3d, 0x54, 0x72, 0x28, 0x6e, 0x29, 0x2c, 0x63, + 0x3d, 0x2d, 0x31, 0x2c, 0x6c, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x54, 0x72, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x29, 0x2c, 0x73, 0x3d, 0x74, 0x68, 0x69, 0x73, + 0x5b, 0x6c, 0x2d, 0x31, 0x5d, 0x3b, 0x2b, 0x2b, 0x63, 0x3c, 0x6c, + 0x3b, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x74, 0x3d, 0x6e, 0x2e, + 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x29, 0x2c, 0x6e, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3d, 0x30, 0x2c, 0x75, 0x3d, 0x74, + 0x68, 0x69, 0x73, 0x5b, 0x63, 0x5d, 0x2c, 0x69, 0x3d, 0x74, 0x5b, + 0x28, 0x72, 0x3d, 0x74, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x2d, 0x61, 0x29, 0x2d, 0x31, 0x5d, 0x2c, 0x65, 0x3d, 0x2d, 0x31, + 0x3b, 0x2b, 0x2b, 0x65, 0x3c, 0x72, 0x3b, 0x29, 0x6f, 0x3d, 0x74, + 0x5b, 0x65, 0x5d, 0x2c, 0x71, 0x72, 0x28, 0x6f, 0x2c, 0x73, 0x2c, + 0x75, 0x29, 0x3f, 0x28, 0x71, 0x72, 0x28, 0x69, 0x2c, 0x73, 0x2c, + 0x75, 0x29, 0x7c, 0x7c, 0x6e, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, + 0x4c, 0x72, 0x28, 0x69, 0x2c, 0x6f, 0x2c, 0x73, 0x2c, 0x75, 0x29, + 0x29, 0x2c, 0x6e, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x6f, 0x29, + 0x29, 0x3a, 0x71, 0x72, 0x28, 0x69, 0x2c, 0x73, 0x2c, 0x75, 0x29, + 0x26, 0x26, 0x6e, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x4c, 0x72, + 0x28, 0x69, 0x2c, 0x6f, 0x2c, 0x73, 0x2c, 0x75, 0x29, 0x29, 0x2c, + 0x69, 0x3d, 0x6f, 0x3b, 0x61, 0x26, 0x26, 0x6e, 0x2e, 0x70, 0x75, + 0x73, 0x68, 0x28, 0x6e, 0x5b, 0x30, 0x5d, 0x29, 0x2c, 0x73, 0x3d, + 0x75, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x7d, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x47, 0x63, 0x2c, 0x4b, 0x63, 0x2c, + 0x51, 0x63, 0x2c, 0x6e, 0x6c, 0x2c, 0x74, 0x6c, 0x2c, 0x65, 0x6c, + 0x3d, 0x5b, 0x5d, 0x2c, 0x72, 0x6c, 0x3d, 0x5b, 0x5d, 0x3b, 0x4f, + 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, + 0x2e, 0x70, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x66, 0x6f, + 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x6e, 0x2c, 0x74, 0x3d, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x73, 0x2c, 0x65, + 0x3d, 0x74, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x65, + 0x2d, 0x2d, 0x3b, 0x29, 0x6e, 0x3d, 0x74, 0x5b, 0x65, 0x5d, 0x2e, + 0x65, 0x64, 0x67, 0x65, 0x2c, 0x6e, 0x2e, 0x62, 0x26, 0x26, 0x6e, + 0x2e, 0x61, 0x7c, 0x7c, 0x74, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x63, + 0x65, 0x28, 0x65, 0x2c, 0x31, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x74, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x28, 0x59, + 0x72, 0x29, 0x2c, 0x74, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x7d, 0x2c, 0x51, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, + 0x79, 0x70, 0x65, 0x3d, 0x7b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x3a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x6c, 0x3d, 0x3d, 0x3d, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x73, 0x69, 0x74, 0x65, 0x3f, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x61, 0x3a, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x62, 0x7d, + 0x2c, 0x65, 0x6e, 0x64, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x2e, + 0x6c, 0x3d, 0x3d, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x69, + 0x74, 0x65, 0x3f, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x64, 0x67, + 0x65, 0x2e, 0x62, 0x3a, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x64, + 0x67, 0x65, 0x2e, 0x61, 0x7d, 0x7d, 0x2c, 0x6e, 0x75, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x7b, 0x69, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x65, 0x2c, 0x72, 0x2c, 0x75, 0x3b, 0x69, 0x66, 0x28, + 0x6e, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x2e, 0x50, 0x3d, 0x6e, + 0x2c, 0x74, 0x2e, 0x4e, 0x3d, 0x6e, 0x2e, 0x4e, 0x2c, 0x6e, 0x2e, + 0x4e, 0x26, 0x26, 0x28, 0x6e, 0x2e, 0x4e, 0x2e, 0x50, 0x3d, 0x74, + 0x29, 0x2c, 0x6e, 0x2e, 0x4e, 0x3d, 0x74, 0x2c, 0x6e, 0x2e, 0x52, + 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x6e, 0x3d, 0x6e, 0x2e, 0x52, + 0x3b, 0x6e, 0x2e, 0x4c, 0x3b, 0x29, 0x6e, 0x3d, 0x6e, 0x2e, 0x4c, + 0x3b, 0x6e, 0x2e, 0x4c, 0x3d, 0x74, 0x7d, 0x65, 0x6c, 0x73, 0x65, + 0x20, 0x6e, 0x2e, 0x52, 0x3d, 0x74, 0x3b, 0x65, 0x3d, 0x6e, 0x7d, + 0x65, 0x6c, 0x73, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, + 0x3f, 0x28, 0x6e, 0x3d, 0x75, 0x75, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x5f, 0x29, 0x2c, 0x74, 0x2e, 0x50, 0x3d, 0x6e, 0x75, 0x6c, + 0x6c, 0x2c, 0x74, 0x2e, 0x4e, 0x3d, 0x6e, 0x2c, 0x6e, 0x2e, 0x50, + 0x3d, 0x6e, 0x2e, 0x4c, 0x3d, 0x74, 0x2c, 0x65, 0x3d, 0x6e, 0x29, + 0x3a, 0x28, 0x74, 0x2e, 0x50, 0x3d, 0x74, 0x2e, 0x4e, 0x3d, 0x6e, + 0x75, 0x6c, 0x6c, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x3d, + 0x74, 0x2c, 0x65, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x66, + 0x6f, 0x72, 0x28, 0x74, 0x2e, 0x4c, 0x3d, 0x74, 0x2e, 0x52, 0x3d, + 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x74, 0x2e, 0x55, 0x3d, 0x65, 0x2c, + 0x74, 0x2e, 0x43, 0x3d, 0x21, 0x30, 0x2c, 0x6e, 0x3d, 0x74, 0x3b, + 0x65, 0x26, 0x26, 0x65, 0x2e, 0x43, 0x3b, 0x29, 0x72, 0x3d, 0x65, + 0x2e, 0x55, 0x2c, 0x65, 0x3d, 0x3d, 0x3d, 0x72, 0x2e, 0x4c, 0x3f, + 0x28, 0x75, 0x3d, 0x72, 0x2e, 0x52, 0x2c, 0x75, 0x26, 0x26, 0x75, + 0x2e, 0x43, 0x3f, 0x28, 0x65, 0x2e, 0x43, 0x3d, 0x75, 0x2e, 0x43, + 0x3d, 0x21, 0x31, 0x2c, 0x72, 0x2e, 0x43, 0x3d, 0x21, 0x30, 0x2c, + 0x6e, 0x3d, 0x72, 0x29, 0x3a, 0x28, 0x6e, 0x3d, 0x3d, 0x3d, 0x65, + 0x2e, 0x52, 0x26, 0x26, 0x28, 0x65, 0x75, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2c, 0x65, 0x29, 0x2c, 0x6e, 0x3d, 0x65, 0x2c, 0x65, 0x3d, + 0x6e, 0x2e, 0x55, 0x29, 0x2c, 0x65, 0x2e, 0x43, 0x3d, 0x21, 0x31, + 0x2c, 0x72, 0x2e, 0x43, 0x3d, 0x21, 0x30, 0x2c, 0x72, 0x75, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x2c, 0x72, 0x29, 0x29, 0x29, 0x3a, 0x28, + 0x75, 0x3d, 0x72, 0x2e, 0x4c, 0x2c, 0x75, 0x26, 0x26, 0x75, 0x2e, + 0x43, 0x3f, 0x28, 0x65, 0x2e, 0x43, 0x3d, 0x75, 0x2e, 0x43, 0x3d, + 0x21, 0x31, 0x2c, 0x72, 0x2e, 0x43, 0x3d, 0x21, 0x30, 0x2c, 0x6e, + 0x3d, 0x72, 0x29, 0x3a, 0x28, 0x6e, 0x3d, 0x3d, 0x3d, 0x65, 0x2e, + 0x4c, 0x26, 0x26, 0x28, 0x72, 0x75, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x2c, 0x65, 0x29, 0x2c, 0x6e, 0x3d, 0x65, 0x2c, 0x65, 0x3d, 0x6e, + 0x2e, 0x55, 0x29, 0x2c, 0x65, 0x2e, 0x43, 0x3d, 0x21, 0x31, 0x2c, + 0x72, 0x2e, 0x43, 0x3d, 0x21, 0x30, 0x2c, 0x65, 0x75, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2c, 0x72, 0x29, 0x29, 0x29, 0x2c, 0x65, 0x3d, + 0x6e, 0x2e, 0x55, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x2e, + 0x43, 0x3d, 0x21, 0x31, 0x7d, 0x2c, 0x72, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x29, 0x7b, 0x6e, 0x2e, 0x4e, 0x26, 0x26, 0x28, 0x6e, 0x2e, + 0x4e, 0x2e, 0x50, 0x3d, 0x6e, 0x2e, 0x50, 0x29, 0x2c, 0x6e, 0x2e, + 0x50, 0x26, 0x26, 0x28, 0x6e, 0x2e, 0x50, 0x2e, 0x4e, 0x3d, 0x6e, + 0x2e, 0x4e, 0x29, 0x2c, 0x6e, 0x2e, 0x4e, 0x3d, 0x6e, 0x2e, 0x50, + 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x74, + 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x75, 0x3d, 0x6e, 0x2e, 0x55, 0x2c, + 0x69, 0x3d, 0x6e, 0x2e, 0x4c, 0x2c, 0x6f, 0x3d, 0x6e, 0x2e, 0x52, + 0x3b, 0x69, 0x66, 0x28, 0x65, 0x3d, 0x69, 0x3f, 0x6f, 0x3f, 0x75, + 0x75, 0x28, 0x6f, 0x29, 0x3a, 0x69, 0x3a, 0x6f, 0x2c, 0x75, 0x3f, + 0x75, 0x2e, 0x4c, 0x3d, 0x3d, 0x3d, 0x6e, 0x3f, 0x75, 0x2e, 0x4c, + 0x3d, 0x65, 0x3a, 0x75, 0x2e, 0x52, 0x3d, 0x65, 0x3a, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x5f, 0x3d, 0x65, 0x2c, 0x69, 0x26, 0x26, 0x6f, + 0x3f, 0x28, 0x72, 0x3d, 0x65, 0x2e, 0x43, 0x2c, 0x65, 0x2e, 0x43, + 0x3d, 0x6e, 0x2e, 0x43, 0x2c, 0x65, 0x2e, 0x4c, 0x3d, 0x69, 0x2c, + 0x69, 0x2e, 0x55, 0x3d, 0x65, 0x2c, 0x65, 0x21, 0x3d, 0x3d, 0x6f, + 0x3f, 0x28, 0x75, 0x3d, 0x65, 0x2e, 0x55, 0x2c, 0x65, 0x2e, 0x55, + 0x3d, 0x6e, 0x2e, 0x55, 0x2c, 0x6e, 0x3d, 0x65, 0x2e, 0x52, 0x2c, + 0x75, 0x2e, 0x4c, 0x3d, 0x6e, 0x2c, 0x65, 0x2e, 0x52, 0x3d, 0x6f, + 0x2c, 0x6f, 0x2e, 0x55, 0x3d, 0x65, 0x29, 0x3a, 0x28, 0x65, 0x2e, + 0x55, 0x3d, 0x75, 0x2c, 0x75, 0x3d, 0x65, 0x2c, 0x6e, 0x3d, 0x65, + 0x2e, 0x52, 0x29, 0x29, 0x3a, 0x28, 0x72, 0x3d, 0x6e, 0x2e, 0x43, + 0x2c, 0x6e, 0x3d, 0x65, 0x29, 0x2c, 0x6e, 0x26, 0x26, 0x28, 0x6e, + 0x2e, 0x55, 0x3d, 0x75, 0x29, 0x2c, 0x21, 0x72, 0x29, 0x7b, 0x69, + 0x66, 0x28, 0x6e, 0x26, 0x26, 0x6e, 0x2e, 0x43, 0x29, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x28, 0x6e, + 0x2e, 0x43, 0x3d, 0x21, 0x31, 0x29, 0x3b, 0x64, 0x6f, 0x7b, 0x69, + 0x66, 0x28, 0x6e, 0x3d, 0x3d, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x5f, 0x29, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x69, 0x66, 0x28, + 0x6e, 0x3d, 0x3d, 0x3d, 0x75, 0x2e, 0x4c, 0x29, 0x7b, 0x69, 0x66, + 0x28, 0x74, 0x3d, 0x75, 0x2e, 0x52, 0x2c, 0x74, 0x2e, 0x43, 0x26, + 0x26, 0x28, 0x74, 0x2e, 0x43, 0x3d, 0x21, 0x31, 0x2c, 0x75, 0x2e, + 0x43, 0x3d, 0x21, 0x30, 0x2c, 0x65, 0x75, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2c, 0x75, 0x29, 0x2c, 0x74, 0x3d, 0x75, 0x2e, 0x52, 0x29, + 0x2c, 0x74, 0x2e, 0x4c, 0x26, 0x26, 0x74, 0x2e, 0x4c, 0x2e, 0x43, + 0x7c, 0x7c, 0x74, 0x2e, 0x52, 0x26, 0x26, 0x74, 0x2e, 0x52, 0x2e, + 0x43, 0x29, 0x7b, 0x74, 0x2e, 0x52, 0x26, 0x26, 0x74, 0x2e, 0x52, + 0x2e, 0x43, 0x7c, 0x7c, 0x28, 0x74, 0x2e, 0x4c, 0x2e, 0x43, 0x3d, + 0x21, 0x31, 0x2c, 0x74, 0x2e, 0x43, 0x3d, 0x21, 0x30, 0x2c, 0x72, + 0x75, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x74, 0x29, 0x2c, 0x74, + 0x3d, 0x75, 0x2e, 0x52, 0x29, 0x2c, 0x74, 0x2e, 0x43, 0x3d, 0x75, + 0x2e, 0x43, 0x2c, 0x75, 0x2e, 0x43, 0x3d, 0x74, 0x2e, 0x52, 0x2e, + 0x43, 0x3d, 0x21, 0x31, 0x2c, 0x65, 0x75, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2c, 0x75, 0x29, 0x2c, 0x6e, 0x3d, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x5f, 0x3b, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x7d, 0x7d, 0x65, + 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x74, 0x3d, 0x75, 0x2e, + 0x4c, 0x2c, 0x74, 0x2e, 0x43, 0x26, 0x26, 0x28, 0x74, 0x2e, 0x43, + 0x3d, 0x21, 0x31, 0x2c, 0x75, 0x2e, 0x43, 0x3d, 0x21, 0x30, 0x2c, + 0x72, 0x75, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x75, 0x29, 0x2c, + 0x74, 0x3d, 0x75, 0x2e, 0x4c, 0x29, 0x2c, 0x74, 0x2e, 0x4c, 0x26, + 0x26, 0x74, 0x2e, 0x4c, 0x2e, 0x43, 0x7c, 0x7c, 0x74, 0x2e, 0x52, + 0x26, 0x26, 0x74, 0x2e, 0x52, 0x2e, 0x43, 0x29, 0x7b, 0x74, 0x2e, + 0x4c, 0x26, 0x26, 0x74, 0x2e, 0x4c, 0x2e, 0x43, 0x7c, 0x7c, 0x28, + 0x74, 0x2e, 0x52, 0x2e, 0x43, 0x3d, 0x21, 0x31, 0x2c, 0x74, 0x2e, + 0x43, 0x3d, 0x21, 0x30, 0x2c, 0x65, 0x75, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2c, 0x74, 0x29, 0x2c, 0x74, 0x3d, 0x75, 0x2e, 0x4c, 0x29, + 0x2c, 0x74, 0x2e, 0x43, 0x3d, 0x75, 0x2e, 0x43, 0x2c, 0x75, 0x2e, + 0x43, 0x3d, 0x74, 0x2e, 0x4c, 0x2e, 0x43, 0x3d, 0x21, 0x31, 0x2c, + 0x72, 0x75, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x75, 0x29, 0x2c, + 0x6e, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x3b, 0x62, 0x72, + 0x65, 0x61, 0x6b, 0x7d, 0x74, 0x2e, 0x43, 0x3d, 0x21, 0x30, 0x2c, + 0x6e, 0x3d, 0x75, 0x2c, 0x75, 0x3d, 0x75, 0x2e, 0x55, 0x7d, 0x77, + 0x68, 0x69, 0x6c, 0x65, 0x28, 0x21, 0x6e, 0x2e, 0x43, 0x29, 0x3b, + 0x6e, 0x26, 0x26, 0x28, 0x6e, 0x2e, 0x43, 0x3d, 0x21, 0x31, 0x29, + 0x7d, 0x7d, 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x67, 0x65, 0x6f, 0x6d, + 0x2e, 0x76, 0x6f, 0x72, 0x6f, 0x6e, 0x6f, 0x69, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x28, 0x6e, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x6e, 0x65, 0x77, + 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x6e, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x29, 0x2c, 0x72, 0x3d, 0x61, 0x5b, 0x30, + 0x5d, 0x5b, 0x30, 0x5d, 0x2c, 0x75, 0x3d, 0x61, 0x5b, 0x30, 0x5d, + 0x5b, 0x31, 0x5d, 0x2c, 0x69, 0x3d, 0x61, 0x5b, 0x31, 0x5d, 0x5b, + 0x30, 0x5d, 0x2c, 0x6f, 0x3d, 0x61, 0x5b, 0x31, 0x5d, 0x5b, 0x31, + 0x5d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x75, + 0x28, 0x65, 0x28, 0x6e, 0x29, 0x2c, 0x61, 0x29, 0x2e, 0x63, 0x65, + 0x6c, 0x6c, 0x73, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, + 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, + 0x2c, 0x61, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x63, 0x3d, 0x65, + 0x2e, 0x65, 0x64, 0x67, 0x65, 0x73, 0x2c, 0x6c, 0x3d, 0x65, 0x2e, + 0x73, 0x69, 0x74, 0x65, 0x2c, 0x73, 0x3d, 0x74, 0x5b, 0x61, 0x5d, + 0x3d, 0x63, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x63, + 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, + 0x3d, 0x6e, 0x2e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x28, 0x29, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, 0x74, 0x2e, 0x78, 0x2c, + 0x74, 0x2e, 0x79, 0x5d, 0x7d, 0x29, 0x3a, 0x6c, 0x2e, 0x78, 0x3e, + 0x3d, 0x72, 0x26, 0x26, 0x6c, 0x2e, 0x78, 0x3c, 0x3d, 0x69, 0x26, + 0x26, 0x6c, 0x2e, 0x79, 0x3e, 0x3d, 0x75, 0x26, 0x26, 0x6c, 0x2e, + 0x79, 0x3c, 0x3d, 0x6f, 0x3f, 0x5b, 0x5b, 0x72, 0x2c, 0x6f, 0x5d, + 0x2c, 0x5b, 0x69, 0x2c, 0x6f, 0x5d, 0x2c, 0x5b, 0x69, 0x2c, 0x75, + 0x5d, 0x2c, 0x5b, 0x72, 0x2c, 0x75, 0x5d, 0x5d, 0x3a, 0x5b, 0x5d, + 0x3b, 0x73, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3d, 0x6e, 0x5b, + 0x61, 0x5d, 0x7d, 0x29, 0x2c, 0x74, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x28, 0x6e, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x6d, 0x61, 0x70, + 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7b, + 0x78, 0x3a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x28, 0x69, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x2f, 0x43, 0x61, + 0x29, 0x2a, 0x43, 0x61, 0x2c, 0x79, 0x3a, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x28, 0x6f, 0x28, 0x6e, 0x2c, + 0x74, 0x29, 0x2f, 0x43, 0x61, 0x29, 0x2a, 0x43, 0x61, 0x2c, 0x69, + 0x3a, 0x74, 0x7d, 0x7d, 0x29, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x72, + 0x3d, 0x41, 0x72, 0x2c, 0x75, 0x3d, 0x4e, 0x72, 0x2c, 0x69, 0x3d, + 0x72, 0x2c, 0x6f, 0x3d, 0x75, 0x2c, 0x61, 0x3d, 0x75, 0x6c, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x3f, 0x74, 0x28, + 0x6e, 0x29, 0x3a, 0x28, 0x74, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x73, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x75, + 0x28, 0x65, 0x28, 0x6e, 0x29, 0x29, 0x2e, 0x65, 0x64, 0x67, 0x65, + 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x6c, 0x26, 0x26, + 0x6e, 0x2e, 0x72, 0x7d, 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7b, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x3a, 0x6e, 0x5b, 0x74, 0x2e, 0x6c, 0x2e, 0x69, 0x5d, + 0x2c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3a, 0x6e, 0x5b, 0x74, + 0x2e, 0x72, 0x2e, 0x69, 0x5d, 0x7d, 0x7d, 0x29, 0x7d, 0x2c, 0x74, + 0x2e, 0x74, 0x72, 0x69, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x73, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, + 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x5b, 0x5d, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x75, 0x28, 0x65, 0x28, + 0x6e, 0x29, 0x29, 0x2e, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x2e, 0x66, + 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x66, + 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x75, 0x2c, 0x69, 0x2c, + 0x6f, 0x3d, 0x65, 0x2e, 0x73, 0x69, 0x74, 0x65, 0x2c, 0x61, 0x3d, + 0x65, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x73, 0x2e, 0x73, 0x6f, 0x72, + 0x74, 0x28, 0x59, 0x72, 0x29, 0x2c, 0x63, 0x3d, 0x2d, 0x31, 0x2c, + 0x6c, 0x3d, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, + 0x73, 0x3d, 0x61, 0x5b, 0x6c, 0x2d, 0x31, 0x5d, 0x2e, 0x65, 0x64, + 0x67, 0x65, 0x2c, 0x66, 0x3d, 0x73, 0x2e, 0x6c, 0x3d, 0x3d, 0x3d, + 0x6f, 0x3f, 0x73, 0x2e, 0x72, 0x3a, 0x73, 0x2e, 0x6c, 0x3b, 0x2b, + 0x2b, 0x63, 0x3c, 0x6c, 0x3b, 0x29, 0x75, 0x3d, 0x73, 0x2c, 0x69, + 0x3d, 0x66, 0x2c, 0x73, 0x3d, 0x61, 0x5b, 0x63, 0x5d, 0x2e, 0x65, + 0x64, 0x67, 0x65, 0x2c, 0x66, 0x3d, 0x73, 0x2e, 0x6c, 0x3d, 0x3d, + 0x3d, 0x6f, 0x3f, 0x73, 0x2e, 0x72, 0x3a, 0x73, 0x2e, 0x6c, 0x2c, + 0x72, 0x3c, 0x69, 0x2e, 0x69, 0x26, 0x26, 0x72, 0x3c, 0x66, 0x2e, + 0x69, 0x26, 0x26, 0x61, 0x75, 0x28, 0x6f, 0x2c, 0x69, 0x2c, 0x66, + 0x29, 0x3c, 0x30, 0x26, 0x26, 0x74, 0x2e, 0x70, 0x75, 0x73, 0x68, + 0x28, 0x5b, 0x6e, 0x5b, 0x72, 0x5d, 0x2c, 0x6e, 0x5b, 0x69, 0x2e, + 0x69, 0x5d, 0x2c, 0x6e, 0x5b, 0x66, 0x2e, 0x69, 0x5d, 0x5d, 0x29, + 0x7d, 0x29, 0x2c, 0x74, 0x7d, 0x2c, 0x74, 0x2e, 0x78, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3f, 0x28, 0x69, 0x3d, 0x45, 0x74, 0x28, 0x72, 0x3d, 0x6e, + 0x29, 0x2c, 0x74, 0x29, 0x3a, 0x72, 0x7d, 0x2c, 0x74, 0x2e, 0x79, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3f, 0x28, 0x6f, 0x3d, 0x45, 0x74, 0x28, 0x75, + 0x3d, 0x6e, 0x29, 0x2c, 0x74, 0x29, 0x3a, 0x75, 0x7d, 0x2c, 0x74, + 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x74, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3f, 0x28, 0x61, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, + 0x3d, 0x3d, 0x6e, 0x3f, 0x75, 0x6c, 0x3a, 0x6e, 0x2c, 0x74, 0x29, + 0x3a, 0x61, 0x3d, 0x3d, 0x3d, 0x75, 0x6c, 0x3f, 0x6e, 0x75, 0x6c, + 0x6c, 0x3a, 0x61, 0x7d, 0x2c, 0x74, 0x2e, 0x73, 0x69, 0x7a, 0x65, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x70, 0x45, + 0x78, 0x74, 0x65, 0x6e, 0x74, 0x28, 0x6e, 0x26, 0x26, 0x5b, 0x5b, + 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x6e, 0x5d, 0x29, 0x3a, 0x61, 0x3d, + 0x3d, 0x3d, 0x75, 0x6c, 0x3f, 0x6e, 0x75, 0x6c, 0x6c, 0x3a, 0x61, + 0x26, 0x26, 0x61, 0x5b, 0x31, 0x5d, 0x7d, 0x2c, 0x74, 0x29, 0x7d, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x75, 0x6c, 0x3d, 0x5b, 0x5b, 0x2d, + 0x31, 0x65, 0x36, 0x2c, 0x2d, 0x31, 0x65, 0x36, 0x5d, 0x2c, 0x5b, + 0x31, 0x65, 0x36, 0x2c, 0x31, 0x65, 0x36, 0x5d, 0x5d, 0x3b, 0x74, + 0x61, 0x2e, 0x67, 0x65, 0x6f, 0x6d, 0x2e, 0x64, 0x65, 0x6c, 0x61, + 0x75, 0x6e, 0x61, 0x79, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x61, 0x2e, 0x67, 0x65, 0x6f, 0x6d, 0x2e, 0x76, + 0x6f, 0x72, 0x6f, 0x6e, 0x6f, 0x69, 0x28, 0x29, 0x2e, 0x74, 0x72, + 0x69, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x73, 0x28, 0x6e, 0x29, 0x7d, + 0x2c, 0x74, 0x61, 0x2e, 0x67, 0x65, 0x6f, 0x6d, 0x2e, 0x71, 0x75, + 0x61, 0x64, 0x74, 0x72, 0x65, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x2c, + 0x72, 0x2c, 0x75, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x69, 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x28, 0x6e, 0x2c, 0x74, + 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x75, 0x2c, 0x69, 0x2c, 0x6f, 0x2c, + 0x61, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x21, 0x69, 0x73, 0x4e, 0x61, + 0x4e, 0x28, 0x65, 0x29, 0x26, 0x26, 0x21, 0x69, 0x73, 0x4e, 0x61, + 0x4e, 0x28, 0x72, 0x29, 0x29, 0x69, 0x66, 0x28, 0x6e, 0x2e, 0x6c, + 0x65, 0x61, 0x66, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x63, 0x3d, + 0x6e, 0x2e, 0x78, 0x2c, 0x73, 0x3d, 0x6e, 0x2e, 0x79, 0x3b, 0x69, + 0x66, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, 0x63, 0x29, 0x69, + 0x66, 0x28, 0x67, 0x61, 0x28, 0x63, 0x2d, 0x65, 0x29, 0x2b, 0x67, + 0x61, 0x28, 0x73, 0x2d, 0x72, 0x29, 0x3c, 0x2e, 0x30, 0x31, 0x29, + 0x6c, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x75, + 0x2c, 0x69, 0x2c, 0x6f, 0x2c, 0x61, 0x29, 0x3b, 0x65, 0x6c, 0x73, + 0x65, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x66, 0x3d, 0x6e, 0x2e, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x3b, 0x6e, 0x2e, 0x78, 0x3d, 0x6e, 0x2e, + 0x79, 0x3d, 0x6e, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x3d, 0x6e, + 0x75, 0x6c, 0x6c, 0x2c, 0x6c, 0x28, 0x6e, 0x2c, 0x66, 0x2c, 0x63, + 0x2c, 0x73, 0x2c, 0x75, 0x2c, 0x69, 0x2c, 0x6f, 0x2c, 0x61, 0x29, + 0x2c, 0x6c, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, + 0x75, 0x2c, 0x69, 0x2c, 0x6f, 0x2c, 0x61, 0x29, 0x7d, 0x65, 0x6c, + 0x73, 0x65, 0x20, 0x6e, 0x2e, 0x78, 0x3d, 0x65, 0x2c, 0x6e, 0x2e, + 0x79, 0x3d, 0x72, 0x2c, 0x6e, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x3d, 0x74, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x6c, 0x28, 0x6e, + 0x2c, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x75, 0x2c, 0x69, 0x2c, + 0x6f, 0x2c, 0x61, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6c, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x2c, + 0x72, 0x2c, 0x75, 0x2c, 0x6f, 0x2c, 0x61, 0x2c, 0x63, 0x29, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x6c, 0x3d, 0x2e, 0x35, 0x2a, 0x28, 0x75, + 0x2b, 0x61, 0x29, 0x2c, 0x73, 0x3d, 0x2e, 0x35, 0x2a, 0x28, 0x6f, + 0x2b, 0x63, 0x29, 0x2c, 0x66, 0x3d, 0x65, 0x3e, 0x3d, 0x6c, 0x2c, + 0x68, 0x3d, 0x72, 0x3e, 0x3d, 0x73, 0x2c, 0x67, 0x3d, 0x68, 0x3c, + 0x3c, 0x31, 0x7c, 0x66, 0x3b, 0x6e, 0x2e, 0x6c, 0x65, 0x61, 0x66, + 0x3d, 0x21, 0x31, 0x2c, 0x6e, 0x3d, 0x6e, 0x2e, 0x6e, 0x6f, 0x64, + 0x65, 0x73, 0x5b, 0x67, 0x5d, 0x7c, 0x7c, 0x28, 0x6e, 0x2e, 0x6e, + 0x6f, 0x64, 0x65, 0x73, 0x5b, 0x67, 0x5d, 0x3d, 0x73, 0x75, 0x28, + 0x29, 0x29, 0x2c, 0x66, 0x3f, 0x75, 0x3d, 0x6c, 0x3a, 0x61, 0x3d, + 0x6c, 0x2c, 0x68, 0x3f, 0x6f, 0x3d, 0x73, 0x3a, 0x63, 0x3d, 0x73, + 0x2c, 0x69, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, + 0x75, 0x2c, 0x6f, 0x2c, 0x61, 0x2c, 0x63, 0x29, 0x7d, 0x76, 0x61, + 0x72, 0x20, 0x73, 0x2c, 0x66, 0x2c, 0x68, 0x2c, 0x67, 0x2c, 0x70, + 0x2c, 0x76, 0x2c, 0x64, 0x2c, 0x6d, 0x2c, 0x79, 0x2c, 0x4d, 0x3d, + 0x45, 0x74, 0x28, 0x61, 0x29, 0x2c, 0x78, 0x3d, 0x45, 0x74, 0x28, + 0x63, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x21, + 0x3d, 0x74, 0x29, 0x76, 0x3d, 0x74, 0x2c, 0x64, 0x3d, 0x65, 0x2c, + 0x6d, 0x3d, 0x72, 0x2c, 0x79, 0x3d, 0x75, 0x3b, 0x65, 0x6c, 0x73, + 0x65, 0x20, 0x69, 0x66, 0x28, 0x6d, 0x3d, 0x79, 0x3d, 0x2d, 0x28, + 0x76, 0x3d, 0x64, 0x3d, 0x31, 0x2f, 0x30, 0x29, 0x2c, 0x66, 0x3d, + 0x5b, 0x5d, 0x2c, 0x68, 0x3d, 0x5b, 0x5d, 0x2c, 0x70, 0x3d, 0x6e, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x6f, 0x29, 0x66, + 0x6f, 0x72, 0x28, 0x67, 0x3d, 0x30, 0x3b, 0x70, 0x3e, 0x67, 0x3b, + 0x2b, 0x2b, 0x67, 0x29, 0x73, 0x3d, 0x6e, 0x5b, 0x67, 0x5d, 0x2c, + 0x73, 0x2e, 0x78, 0x3c, 0x76, 0x26, 0x26, 0x28, 0x76, 0x3d, 0x73, + 0x2e, 0x78, 0x29, 0x2c, 0x73, 0x2e, 0x79, 0x3c, 0x64, 0x26, 0x26, + 0x28, 0x64, 0x3d, 0x73, 0x2e, 0x79, 0x29, 0x2c, 0x73, 0x2e, 0x78, + 0x3e, 0x6d, 0x26, 0x26, 0x28, 0x6d, 0x3d, 0x73, 0x2e, 0x78, 0x29, + 0x2c, 0x73, 0x2e, 0x79, 0x3e, 0x79, 0x26, 0x26, 0x28, 0x79, 0x3d, + 0x73, 0x2e, 0x79, 0x29, 0x2c, 0x66, 0x2e, 0x70, 0x75, 0x73, 0x68, + 0x28, 0x73, 0x2e, 0x78, 0x29, 0x2c, 0x68, 0x2e, 0x70, 0x75, 0x73, + 0x68, 0x28, 0x73, 0x2e, 0x79, 0x29, 0x3b, 0x65, 0x6c, 0x73, 0x65, + 0x20, 0x66, 0x6f, 0x72, 0x28, 0x67, 0x3d, 0x30, 0x3b, 0x70, 0x3e, + 0x67, 0x3b, 0x2b, 0x2b, 0x67, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x62, 0x3d, 0x2b, 0x4d, 0x28, 0x73, 0x3d, 0x6e, 0x5b, 0x67, 0x5d, + 0x2c, 0x67, 0x29, 0x2c, 0x5f, 0x3d, 0x2b, 0x78, 0x28, 0x73, 0x2c, + 0x67, 0x29, 0x3b, 0x76, 0x3e, 0x62, 0x26, 0x26, 0x28, 0x76, 0x3d, + 0x62, 0x29, 0x2c, 0x64, 0x3e, 0x5f, 0x26, 0x26, 0x28, 0x64, 0x3d, + 0x5f, 0x29, 0x2c, 0x62, 0x3e, 0x6d, 0x26, 0x26, 0x28, 0x6d, 0x3d, + 0x62, 0x29, 0x2c, 0x5f, 0x3e, 0x79, 0x26, 0x26, 0x28, 0x79, 0x3d, + 0x5f, 0x29, 0x2c, 0x66, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x62, + 0x29, 0x2c, 0x68, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x5f, 0x29, + 0x7d, 0x76, 0x61, 0x72, 0x20, 0x77, 0x3d, 0x6d, 0x2d, 0x76, 0x2c, + 0x53, 0x3d, 0x79, 0x2d, 0x64, 0x3b, 0x77, 0x3e, 0x53, 0x3f, 0x79, + 0x3d, 0x64, 0x2b, 0x77, 0x3a, 0x6d, 0x3d, 0x76, 0x2b, 0x53, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x6b, 0x3d, 0x73, 0x75, 0x28, 0x29, 0x3b, + 0x69, 0x66, 0x28, 0x6b, 0x2e, 0x61, 0x64, 0x64, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x69, + 0x28, 0x6b, 0x2c, 0x6e, 0x2c, 0x2b, 0x4d, 0x28, 0x6e, 0x2c, 0x2b, + 0x2b, 0x67, 0x29, 0x2c, 0x2b, 0x78, 0x28, 0x6e, 0x2c, 0x67, 0x29, + 0x2c, 0x76, 0x2c, 0x64, 0x2c, 0x6d, 0x2c, 0x79, 0x29, 0x7d, 0x2c, + 0x6b, 0x2e, 0x76, 0x69, 0x73, 0x69, 0x74, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x75, + 0x28, 0x6e, 0x2c, 0x6b, 0x2c, 0x76, 0x2c, 0x64, 0x2c, 0x6d, 0x2c, + 0x79, 0x29, 0x7d, 0x2c, 0x6b, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x75, 0x28, + 0x6b, 0x2c, 0x6e, 0x5b, 0x30, 0x5d, 0x2c, 0x6e, 0x5b, 0x31, 0x5d, + 0x2c, 0x76, 0x2c, 0x64, 0x2c, 0x6d, 0x2c, 0x79, 0x29, 0x7d, 0x2c, + 0x67, 0x3d, 0x2d, 0x31, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, + 0x74, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x3b, 0x2b, 0x2b, 0x67, + 0x3c, 0x70, 0x3b, 0x29, 0x69, 0x28, 0x6b, 0x2c, 0x6e, 0x5b, 0x67, + 0x5d, 0x2c, 0x66, 0x5b, 0x67, 0x5d, 0x2c, 0x68, 0x5b, 0x67, 0x5d, + 0x2c, 0x76, 0x2c, 0x64, 0x2c, 0x6d, 0x2c, 0x79, 0x29, 0x3b, 0x2d, + 0x2d, 0x67, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x6e, 0x2e, 0x66, + 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x6b, 0x2e, 0x61, 0x64, + 0x64, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, + 0x3d, 0x68, 0x3d, 0x6e, 0x3d, 0x73, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, + 0x2c, 0x6b, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x6f, 0x2c, 0x61, 0x3d, + 0x41, 0x72, 0x2c, 0x63, 0x3d, 0x4e, 0x72, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x28, 0x6f, 0x3d, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x29, 0x3f, 0x28, 0x61, 0x3d, 0x63, 0x75, 0x2c, 0x63, 0x3d, 0x6c, + 0x75, 0x2c, 0x33, 0x3d, 0x3d, 0x3d, 0x6f, 0x26, 0x26, 0x28, 0x75, + 0x3d, 0x65, 0x2c, 0x72, 0x3d, 0x74, 0x2c, 0x65, 0x3d, 0x74, 0x3d, + 0x30, 0x29, 0x2c, 0x69, 0x28, 0x6e, 0x29, 0x29, 0x3a, 0x28, 0x69, + 0x2e, 0x78, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x61, 0x3d, 0x6e, 0x2c, + 0x69, 0x29, 0x3a, 0x61, 0x7d, 0x2c, 0x69, 0x2e, 0x79, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3f, 0x28, 0x63, 0x3d, 0x6e, 0x2c, 0x69, 0x29, 0x3a, 0x63, + 0x7d, 0x2c, 0x69, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3f, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x6e, + 0x3f, 0x74, 0x3d, 0x65, 0x3d, 0x72, 0x3d, 0x75, 0x3d, 0x6e, 0x75, + 0x6c, 0x6c, 0x3a, 0x28, 0x74, 0x3d, 0x2b, 0x6e, 0x5b, 0x30, 0x5d, + 0x5b, 0x30, 0x5d, 0x2c, 0x65, 0x3d, 0x2b, 0x6e, 0x5b, 0x30, 0x5d, + 0x5b, 0x31, 0x5d, 0x2c, 0x72, 0x3d, 0x2b, 0x6e, 0x5b, 0x31, 0x5d, + 0x5b, 0x30, 0x5d, 0x2c, 0x75, 0x3d, 0x2b, 0x6e, 0x5b, 0x31, 0x5d, + 0x5b, 0x31, 0x5d, 0x29, 0x2c, 0x69, 0x29, 0x3a, 0x6e, 0x75, 0x6c, + 0x6c, 0x3d, 0x3d, 0x74, 0x3f, 0x6e, 0x75, 0x6c, 0x6c, 0x3a, 0x5b, + 0x5b, 0x74, 0x2c, 0x65, 0x5d, 0x2c, 0x5b, 0x72, 0x2c, 0x75, 0x5d, + 0x5d, 0x7d, 0x2c, 0x69, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3f, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x6e, 0x3f, + 0x74, 0x3d, 0x65, 0x3d, 0x72, 0x3d, 0x75, 0x3d, 0x6e, 0x75, 0x6c, + 0x6c, 0x3a, 0x28, 0x74, 0x3d, 0x65, 0x3d, 0x30, 0x2c, 0x72, 0x3d, + 0x2b, 0x6e, 0x5b, 0x30, 0x5d, 0x2c, 0x75, 0x3d, 0x2b, 0x6e, 0x5b, + 0x31, 0x5d, 0x29, 0x2c, 0x69, 0x29, 0x3a, 0x6e, 0x75, 0x6c, 0x6c, + 0x3d, 0x3d, 0x74, 0x3f, 0x6e, 0x75, 0x6c, 0x6c, 0x3a, 0x5b, 0x72, + 0x2d, 0x74, 0x2c, 0x75, 0x2d, 0x65, 0x5d, 0x7d, 0x2c, 0x69, 0x29, + 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, + 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x67, 0x62, 0x3d, 0x67, 0x75, + 0x2c, 0x74, 0x61, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x6f, + 0x6c, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3d, + 0x70, 0x75, 0x2c, 0x74, 0x61, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x70, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x3d, 0x76, 0x75, 0x2c, 0x74, 0x61, 0x2e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x70, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x3d, 0x64, 0x75, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x69, 0x6c, 0x3d, 0x2f, 0x5b, 0x2d, 0x2b, 0x5d, 0x3f, 0x28, 0x3f, + 0x3a, 0x5c, 0x64, 0x2b, 0x5c, 0x2e, 0x3f, 0x5c, 0x64, 0x2a, 0x7c, + 0x5c, 0x2e, 0x3f, 0x5c, 0x64, 0x2b, 0x29, 0x28, 0x3f, 0x3a, 0x5b, + 0x65, 0x45, 0x5d, 0x5b, 0x2d, 0x2b, 0x5d, 0x3f, 0x5c, 0x64, 0x2b, + 0x29, 0x3f, 0x2f, 0x67, 0x2c, 0x6f, 0x6c, 0x3d, 0x6e, 0x65, 0x77, + 0x20, 0x52, 0x65, 0x67, 0x45, 0x78, 0x70, 0x28, 0x69, 0x6c, 0x2e, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x22, 0x67, 0x22, 0x29, + 0x3b, 0x74, 0x61, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x6f, + 0x6c, 0x61, 0x74, 0x65, 0x3d, 0x6d, 0x75, 0x2c, 0x74, 0x61, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x6f, 0x6c, 0x61, 0x74, 0x6f, + 0x72, 0x73, 0x3d, 0x5b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x65, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x74, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0x3d, 0x3d, 0x3d, 0x65, 0x3f, 0x47, 0x61, + 0x2e, 0x68, 0x61, 0x73, 0x28, 0x74, 0x2e, 0x74, 0x6f, 0x4c, 0x6f, + 0x77, 0x65, 0x72, 0x43, 0x61, 0x73, 0x65, 0x28, 0x29, 0x29, 0x7c, + 0x7c, 0x2f, 0x5e, 0x28, 0x23, 0x7c, 0x72, 0x67, 0x62, 0x5c, 0x28, + 0x7c, 0x68, 0x73, 0x6c, 0x5c, 0x28, 0x29, 0x2f, 0x69, 0x2e, 0x74, + 0x65, 0x73, 0x74, 0x28, 0x74, 0x29, 0x3f, 0x67, 0x75, 0x3a, 0x64, + 0x75, 0x3a, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x6f, 0x66, 0x20, 0x6f, 0x74, 0x3f, 0x67, 0x75, 0x3a, 0x41, + 0x72, 0x72, 0x61, 0x79, 0x2e, 0x69, 0x73, 0x41, 0x72, 0x72, 0x61, + 0x79, 0x28, 0x74, 0x29, 0x3f, 0x79, 0x75, 0x3a, 0x22, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3d, 0x3d, 0x3d, 0x65, 0x26, 0x26, + 0x69, 0x73, 0x4e, 0x61, 0x4e, 0x28, 0x74, 0x29, 0x3f, 0x70, 0x75, + 0x3a, 0x76, 0x75, 0x29, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7d, 0x5d, + 0x2c, 0x74, 0x61, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x6f, + 0x6c, 0x61, 0x74, 0x65, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3d, 0x79, + 0x75, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x61, 0x6c, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x79, 0x7d, 0x2c, 0x63, 0x6c, 0x3d, + 0x74, 0x61, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x7b, 0x6c, 0x69, 0x6e, + 0x65, 0x61, 0x72, 0x3a, 0x61, 0x6c, 0x2c, 0x70, 0x6f, 0x6c, 0x79, + 0x3a, 0x6b, 0x75, 0x2c, 0x71, 0x75, 0x61, 0x64, 0x3a, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x75, 0x7d, 0x2c, 0x63, 0x75, + 0x62, 0x69, 0x63, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x77, 0x75, 0x7d, 0x2c, 0x73, 0x69, 0x6e, 0x3a, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x45, 0x75, 0x7d, 0x2c, 0x65, 0x78, 0x70, + 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x41, 0x75, 0x7d, + 0x2c, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x3a, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x4e, 0x75, 0x7d, 0x2c, 0x65, 0x6c, 0x61, + 0x73, 0x74, 0x69, 0x63, 0x3a, 0x43, 0x75, 0x2c, 0x62, 0x61, 0x63, + 0x6b, 0x3a, 0x7a, 0x75, 0x2c, 0x62, 0x6f, 0x75, 0x6e, 0x63, 0x65, + 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x71, 0x75, 0x7d, + 0x7d, 0x29, 0x2c, 0x6c, 0x6c, 0x3d, 0x74, 0x61, 0x2e, 0x6d, 0x61, + 0x70, 0x28, 0x7b, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x79, 0x2c, 0x6f, + 0x75, 0x74, 0x3a, 0x78, 0x75, 0x2c, 0x22, 0x69, 0x6e, 0x2d, 0x6f, + 0x75, 0x74, 0x22, 0x3a, 0x62, 0x75, 0x2c, 0x22, 0x6f, 0x75, 0x74, + 0x2d, 0x69, 0x6e, 0x22, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x62, 0x75, 0x28, 0x78, 0x75, 0x28, 0x6e, 0x29, 0x29, + 0x7d, 0x7d, 0x29, 0x3b, 0x74, 0x61, 0x2e, 0x65, 0x61, 0x73, 0x65, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x6e, 0x2e, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x22, 0x2d, 0x22, 0x29, + 0x2c, 0x65, 0x3d, 0x74, 0x3e, 0x3d, 0x30, 0x3f, 0x6e, 0x2e, 0x73, + 0x6c, 0x69, 0x63, 0x65, 0x28, 0x30, 0x2c, 0x74, 0x29, 0x3a, 0x6e, + 0x2c, 0x72, 0x3d, 0x74, 0x3e, 0x3d, 0x30, 0x3f, 0x6e, 0x2e, 0x73, + 0x6c, 0x69, 0x63, 0x65, 0x28, 0x74, 0x2b, 0x31, 0x29, 0x3a, 0x22, + 0x69, 0x6e, 0x22, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x65, 0x3d, 0x63, 0x6c, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x65, 0x29, + 0x7c, 0x7c, 0x61, 0x6c, 0x2c, 0x72, 0x3d, 0x6c, 0x6c, 0x2e, 0x67, + 0x65, 0x74, 0x28, 0x72, 0x29, 0x7c, 0x7c, 0x79, 0x2c, 0x4d, 0x75, + 0x28, 0x72, 0x28, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, + 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x65, 0x61, 0x2e, 0x63, 0x61, 0x6c, + 0x6c, 0x28, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x2c, 0x31, 0x29, 0x29, 0x29, 0x29, 0x7d, 0x2c, 0x74, 0x61, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x6f, 0x6c, 0x61, 0x74, 0x65, + 0x48, 0x63, 0x6c, 0x3d, 0x4c, 0x75, 0x2c, 0x74, 0x61, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x70, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x48, + 0x73, 0x6c, 0x3d, 0x54, 0x75, 0x2c, 0x74, 0x61, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x70, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x4c, 0x61, + 0x62, 0x3d, 0x52, 0x75, 0x2c, 0x74, 0x61, 0x2e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x70, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x75, + 0x6e, 0x64, 0x3d, 0x44, 0x75, 0x2c, 0x74, 0x61, 0x2e, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x74, 0x3d, 0x75, 0x61, 0x2e, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4e, 0x53, + 0x28, 0x74, 0x61, 0x2e, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x65, 0x66, + 0x69, 0x78, 0x2e, 0x73, 0x76, 0x67, 0x2c, 0x22, 0x67, 0x22, 0x29, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x74, 0x61, 0x2e, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, + 0x69, 0x66, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, 0x6e, 0x29, + 0x7b, 0x74, 0x2e, 0x73, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x28, 0x22, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x22, 0x2c, 0x6e, 0x29, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x65, 0x3d, 0x74, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x56, 0x61, + 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x28, 0x29, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6e, 0x65, 0x77, 0x20, 0x50, 0x75, 0x28, 0x65, 0x3f, 0x65, + 0x2e, 0x6d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3a, 0x73, 0x6c, 0x29, + 0x7d, 0x29, 0x28, 0x6e, 0x29, 0x7d, 0x2c, 0x50, 0x75, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x74, 0x6f, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x22, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, + 0x65, 0x28, 0x22, 0x2b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, 0x2b, 0x22, 0x29, 0x72, + 0x6f, 0x74, 0x61, 0x74, 0x65, 0x28, 0x22, 0x2b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x2b, 0x22, 0x29, + 0x73, 0x6b, 0x65, 0x77, 0x58, 0x28, 0x22, 0x2b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x73, 0x6b, 0x65, 0x77, 0x2b, 0x22, 0x29, 0x73, 0x63, + 0x61, 0x6c, 0x65, 0x28, 0x22, 0x2b, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2b, 0x22, 0x29, 0x22, 0x7d, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x73, 0x6c, 0x3d, 0x7b, 0x61, 0x3a, 0x31, + 0x2c, 0x62, 0x3a, 0x30, 0x2c, 0x63, 0x3a, 0x30, 0x2c, 0x64, 0x3a, + 0x31, 0x2c, 0x65, 0x3a, 0x30, 0x2c, 0x66, 0x3a, 0x30, 0x7d, 0x3b, + 0x74, 0x61, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x6f, 0x6c, + 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, + 0x6d, 0x3d, 0x48, 0x75, 0x2c, 0x74, 0x61, 0x2e, 0x6c, 0x61, 0x79, + 0x6f, 0x75, 0x74, 0x3d, 0x7b, 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x6c, + 0x61, 0x79, 0x6f, 0x75, 0x74, 0x2e, 0x62, 0x75, 0x6e, 0x64, 0x6c, + 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x66, + 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x5b, 0x5d, + 0x2c, 0x65, 0x3d, 0x2d, 0x31, 0x2c, 0x72, 0x3d, 0x6e, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x2b, 0x2b, 0x65, 0x3c, 0x72, + 0x3b, 0x29, 0x74, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x59, 0x75, + 0x28, 0x6e, 0x5b, 0x65, 0x5d, 0x29, 0x29, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x7d, 0x7d, 0x2c, 0x74, 0x61, 0x2e, + 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x2e, 0x63, 0x68, 0x6f, 0x72, + 0x64, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6e, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6e, 0x2c, 0x6c, + 0x2c, 0x66, 0x2c, 0x68, 0x2c, 0x67, 0x2c, 0x70, 0x3d, 0x7b, 0x7d, + 0x2c, 0x76, 0x3d, 0x5b, 0x5d, 0x2c, 0x64, 0x3d, 0x74, 0x61, 0x2e, + 0x72, 0x61, 0x6e, 0x67, 0x65, 0x28, 0x69, 0x29, 0x2c, 0x6d, 0x3d, + 0x5b, 0x5d, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x65, 0x3d, 0x5b, 0x5d, + 0x2c, 0x72, 0x3d, 0x5b, 0x5d, 0x2c, 0x6e, 0x3d, 0x30, 0x2c, 0x68, + 0x3d, 0x2d, 0x31, 0x3b, 0x2b, 0x2b, 0x68, 0x3c, 0x69, 0x3b, 0x29, + 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x3d, 0x30, 0x2c, 0x67, 0x3d, + 0x2d, 0x31, 0x3b, 0x2b, 0x2b, 0x67, 0x3c, 0x69, 0x3b, 0x29, 0x6c, + 0x2b, 0x3d, 0x75, 0x5b, 0x68, 0x5d, 0x5b, 0x67, 0x5d, 0x3b, 0x76, + 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x6c, 0x29, 0x2c, 0x6d, 0x2e, + 0x70, 0x75, 0x73, 0x68, 0x28, 0x74, 0x61, 0x2e, 0x72, 0x61, 0x6e, + 0x67, 0x65, 0x28, 0x69, 0x29, 0x29, 0x2c, 0x6e, 0x2b, 0x3d, 0x6c, + 0x7d, 0x66, 0x6f, 0x72, 0x28, 0x6f, 0x26, 0x26, 0x64, 0x2e, 0x73, + 0x6f, 0x72, 0x74, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6f, 0x28, 0x76, 0x5b, 0x6e, 0x5d, 0x2c, 0x76, + 0x5b, 0x74, 0x5d, 0x29, 0x7d, 0x29, 0x2c, 0x61, 0x26, 0x26, 0x6d, + 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, + 0x7b, 0x6e, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x28, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x65, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x28, 0x75, 0x5b, + 0x74, 0x5d, 0x5b, 0x6e, 0x5d, 0x2c, 0x75, 0x5b, 0x74, 0x5d, 0x5b, + 0x65, 0x5d, 0x29, 0x7d, 0x29, 0x7d, 0x29, 0x2c, 0x6e, 0x3d, 0x28, + 0x4c, 0x61, 0x2d, 0x73, 0x2a, 0x69, 0x29, 0x2f, 0x6e, 0x2c, 0x6c, + 0x3d, 0x30, 0x2c, 0x68, 0x3d, 0x2d, 0x31, 0x3b, 0x2b, 0x2b, 0x68, + 0x3c, 0x69, 0x3b, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x66, 0x3d, + 0x6c, 0x2c, 0x67, 0x3d, 0x2d, 0x31, 0x3b, 0x2b, 0x2b, 0x67, 0x3c, + 0x69, 0x3b, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x79, 0x3d, 0x64, + 0x5b, 0x68, 0x5d, 0x2c, 0x4d, 0x3d, 0x6d, 0x5b, 0x79, 0x5d, 0x5b, + 0x67, 0x5d, 0x2c, 0x78, 0x3d, 0x75, 0x5b, 0x79, 0x5d, 0x5b, 0x4d, + 0x5d, 0x2c, 0x62, 0x3d, 0x6c, 0x2c, 0x5f, 0x3d, 0x6c, 0x2b, 0x3d, + 0x78, 0x2a, 0x6e, 0x3b, 0x70, 0x5b, 0x79, 0x2b, 0x22, 0x2d, 0x22, + 0x2b, 0x4d, 0x5d, 0x3d, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3a, + 0x79, 0x2c, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3a, + 0x4d, 0x2c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, 0x6e, 0x67, 0x6c, + 0x65, 0x3a, 0x62, 0x2c, 0x65, 0x6e, 0x64, 0x41, 0x6e, 0x67, 0x6c, + 0x65, 0x3a, 0x5f, 0x2c, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x78, + 0x7d, 0x7d, 0x72, 0x5b, 0x79, 0x5d, 0x3d, 0x7b, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x3a, 0x79, 0x2c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, + 0x6e, 0x67, 0x6c, 0x65, 0x3a, 0x66, 0x2c, 0x65, 0x6e, 0x64, 0x41, + 0x6e, 0x67, 0x6c, 0x65, 0x3a, 0x6c, 0x2c, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x28, 0x6c, 0x2d, 0x66, 0x29, 0x2f, 0x6e, 0x7d, 0x2c, + 0x6c, 0x2b, 0x3d, 0x73, 0x7d, 0x66, 0x6f, 0x72, 0x28, 0x68, 0x3d, + 0x2d, 0x31, 0x3b, 0x2b, 0x2b, 0x68, 0x3c, 0x69, 0x3b, 0x29, 0x66, + 0x6f, 0x72, 0x28, 0x67, 0x3d, 0x68, 0x2d, 0x31, 0x3b, 0x2b, 0x2b, + 0x67, 0x3c, 0x69, 0x3b, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x77, + 0x3d, 0x70, 0x5b, 0x68, 0x2b, 0x22, 0x2d, 0x22, 0x2b, 0x67, 0x5d, + 0x2c, 0x53, 0x3d, 0x70, 0x5b, 0x67, 0x2b, 0x22, 0x2d, 0x22, 0x2b, + 0x68, 0x5d, 0x3b, 0x28, 0x77, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x7c, 0x7c, 0x53, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x26, + 0x26, 0x65, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x77, 0x2e, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3c, 0x53, 0x2e, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3f, 0x7b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3a, 0x53, + 0x2c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3a, 0x77, 0x7d, 0x3a, + 0x7b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3a, 0x77, 0x2c, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x3a, 0x53, 0x7d, 0x29, 0x7d, 0x63, + 0x26, 0x26, 0x74, 0x28, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x28, 0x29, 0x7b, 0x65, 0x2e, 0x73, + 0x6f, 0x72, 0x74, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x63, 0x28, 0x28, 0x6e, 0x2e, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2b, 0x6e, + 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2e, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x29, 0x2f, 0x32, 0x2c, 0x28, 0x74, 0x2e, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2b, + 0x74, 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2e, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x29, 0x2f, 0x32, 0x29, 0x7d, 0x29, 0x7d, 0x76, + 0x61, 0x72, 0x20, 0x65, 0x2c, 0x72, 0x2c, 0x75, 0x2c, 0x69, 0x2c, + 0x6f, 0x2c, 0x61, 0x2c, 0x63, 0x2c, 0x6c, 0x3d, 0x7b, 0x7d, 0x2c, + 0x73, 0x3d, 0x30, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6c, 0x2e, 0x6d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3f, 0x28, 0x69, 0x3d, 0x28, 0x75, 0x3d, 0x6e, 0x29, 0x26, 0x26, + 0x75, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x65, 0x3d, + 0x72, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x6c, 0x29, 0x3a, 0x75, + 0x7d, 0x2c, 0x6c, 0x2e, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3f, 0x28, 0x73, 0x3d, 0x6e, 0x2c, 0x65, 0x3d, + 0x72, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x6c, 0x29, 0x3a, 0x73, + 0x7d, 0x2c, 0x6c, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x73, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x6f, 0x3d, 0x6e, + 0x2c, 0x65, 0x3d, 0x72, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x6c, + 0x29, 0x3a, 0x6f, 0x7d, 0x2c, 0x6c, 0x2e, 0x73, 0x6f, 0x72, 0x74, + 0x53, 0x75, 0x62, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3f, 0x28, 0x61, 0x3d, 0x6e, 0x2c, 0x65, 0x3d, 0x6e, 0x75, + 0x6c, 0x6c, 0x2c, 0x6c, 0x29, 0x3a, 0x61, 0x7d, 0x2c, 0x6c, 0x2e, + 0x73, 0x6f, 0x72, 0x74, 0x43, 0x68, 0x6f, 0x72, 0x64, 0x73, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3f, 0x28, 0x63, 0x3d, 0x6e, 0x2c, 0x65, 0x26, 0x26, + 0x74, 0x28, 0x29, 0x2c, 0x6c, 0x29, 0x3a, 0x63, 0x7d, 0x2c, 0x6c, + 0x2e, 0x63, 0x68, 0x6f, 0x72, 0x64, 0x73, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x65, 0x7c, 0x7c, 0x6e, 0x28, 0x29, 0x2c, + 0x65, 0x7d, 0x2c, 0x6c, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x7c, 0x7c, + 0x6e, 0x28, 0x29, 0x2c, 0x72, 0x7d, 0x2c, 0x6c, 0x7d, 0x2c, 0x74, + 0x61, 0x2e, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x6f, + 0x72, 0x63, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x75, 0x29, 0x7b, 0x69, + 0x66, 0x28, 0x74, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x21, 0x3d, + 0x3d, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, 0x74, + 0x2e, 0x63, 0x78, 0x2d, 0x6e, 0x2e, 0x78, 0x2c, 0x6f, 0x3d, 0x74, + 0x2e, 0x63, 0x79, 0x2d, 0x6e, 0x2e, 0x79, 0x2c, 0x61, 0x3d, 0x75, + 0x2d, 0x65, 0x2c, 0x63, 0x3d, 0x69, 0x2a, 0x69, 0x2b, 0x6f, 0x2a, + 0x6f, 0x3b, 0x69, 0x66, 0x28, 0x63, 0x3e, 0x61, 0x2a, 0x61, 0x2f, + 0x64, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x70, 0x3e, 0x63, 0x29, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x6c, 0x3d, 0x74, 0x2e, 0x63, 0x68, 0x61, + 0x72, 0x67, 0x65, 0x2f, 0x63, 0x3b, 0x6e, 0x2e, 0x70, 0x78, 0x2d, + 0x3d, 0x69, 0x2a, 0x6c, 0x2c, 0x6e, 0x2e, 0x70, 0x79, 0x2d, 0x3d, + 0x6f, 0x2a, 0x6c, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x21, + 0x30, 0x7d, 0x69, 0x66, 0x28, 0x74, 0x2e, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x26, 0x26, 0x63, 0x26, 0x26, 0x70, 0x3e, 0x63, 0x29, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x6c, 0x3d, 0x74, 0x2e, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x2f, 0x63, 0x3b, + 0x6e, 0x2e, 0x70, 0x78, 0x2d, 0x3d, 0x69, 0x2a, 0x6c, 0x2c, 0x6e, + 0x2e, 0x70, 0x79, 0x2d, 0x3d, 0x6f, 0x2a, 0x6c, 0x7d, 0x7d, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x21, 0x74, 0x2e, 0x63, 0x68, 0x61, + 0x72, 0x67, 0x65, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x74, 0x28, 0x6e, 0x29, 0x7b, 0x6e, 0x2e, 0x70, + 0x78, 0x3d, 0x74, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, + 0x78, 0x2c, 0x6e, 0x2e, 0x70, 0x79, 0x3d, 0x74, 0x61, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x79, 0x2c, 0x61, 0x2e, 0x72, 0x65, + 0x73, 0x75, 0x6d, 0x65, 0x28, 0x29, 0x7d, 0x76, 0x61, 0x72, 0x20, + 0x65, 0x2c, 0x72, 0x2c, 0x75, 0x2c, 0x69, 0x2c, 0x6f, 0x2c, 0x61, + 0x3d, 0x7b, 0x7d, 0x2c, 0x63, 0x3d, 0x74, 0x61, 0x2e, 0x64, 0x69, + 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x22, 0x2c, 0x22, 0x74, 0x69, 0x63, 0x6b, 0x22, 0x2c, + 0x22, 0x65, 0x6e, 0x64, 0x22, 0x29, 0x2c, 0x6c, 0x3d, 0x5b, 0x31, + 0x2c, 0x31, 0x5d, 0x2c, 0x73, 0x3d, 0x2e, 0x39, 0x2c, 0x66, 0x3d, + 0x66, 0x6c, 0x2c, 0x68, 0x3d, 0x68, 0x6c, 0x2c, 0x67, 0x3d, 0x2d, + 0x33, 0x30, 0x2c, 0x70, 0x3d, 0x67, 0x6c, 0x2c, 0x76, 0x3d, 0x2e, + 0x31, 0x2c, 0x64, 0x3d, 0x2e, 0x36, 0x34, 0x2c, 0x6d, 0x3d, 0x5b, + 0x5d, 0x2c, 0x4d, 0x3d, 0x5b, 0x5d, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x61, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x69, + 0x66, 0x28, 0x28, 0x72, 0x2a, 0x3d, 0x2e, 0x39, 0x39, 0x29, 0x3c, + 0x2e, 0x30, 0x30, 0x35, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x63, 0x2e, 0x65, 0x6e, 0x64, 0x28, 0x7b, 0x74, 0x79, 0x70, + 0x65, 0x3a, 0x22, 0x65, 0x6e, 0x64, 0x22, 0x2c, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x3a, 0x72, 0x3d, 0x30, 0x7d, 0x29, 0x2c, 0x21, 0x30, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x2c, 0x65, 0x2c, 0x61, 0x2c, + 0x66, 0x2c, 0x68, 0x2c, 0x70, 0x2c, 0x64, 0x2c, 0x79, 0x2c, 0x78, + 0x2c, 0x62, 0x3d, 0x6d, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x2c, 0x5f, 0x3d, 0x4d, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x65, 0x3d, 0x30, 0x3b, 0x5f, 0x3e, + 0x65, 0x3b, 0x2b, 0x2b, 0x65, 0x29, 0x61, 0x3d, 0x4d, 0x5b, 0x65, + 0x5d, 0x2c, 0x66, 0x3d, 0x61, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x2c, 0x68, 0x3d, 0x61, 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x2c, 0x79, 0x3d, 0x68, 0x2e, 0x78, 0x2d, 0x66, 0x2e, 0x78, + 0x2c, 0x78, 0x3d, 0x68, 0x2e, 0x79, 0x2d, 0x66, 0x2e, 0x79, 0x2c, + 0x28, 0x70, 0x3d, 0x79, 0x2a, 0x79, 0x2b, 0x78, 0x2a, 0x78, 0x29, + 0x26, 0x26, 0x28, 0x70, 0x3d, 0x72, 0x2a, 0x69, 0x5b, 0x65, 0x5d, + 0x2a, 0x28, 0x28, 0x70, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, + 0x71, 0x72, 0x74, 0x28, 0x70, 0x29, 0x29, 0x2d, 0x75, 0x5b, 0x65, + 0x5d, 0x29, 0x2f, 0x70, 0x2c, 0x79, 0x2a, 0x3d, 0x70, 0x2c, 0x78, + 0x2a, 0x3d, 0x70, 0x2c, 0x68, 0x2e, 0x78, 0x2d, 0x3d, 0x79, 0x2a, + 0x28, 0x64, 0x3d, 0x66, 0x2e, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x2f, 0x28, 0x68, 0x2e, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2b, + 0x66, 0x2e, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, 0x29, 0x2c, + 0x68, 0x2e, 0x79, 0x2d, 0x3d, 0x78, 0x2a, 0x64, 0x2c, 0x66, 0x2e, + 0x78, 0x2b, 0x3d, 0x79, 0x2a, 0x28, 0x64, 0x3d, 0x31, 0x2d, 0x64, + 0x29, 0x2c, 0x66, 0x2e, 0x79, 0x2b, 0x3d, 0x78, 0x2a, 0x64, 0x29, + 0x3b, 0x69, 0x66, 0x28, 0x28, 0x64, 0x3d, 0x72, 0x2a, 0x76, 0x29, + 0x26, 0x26, 0x28, 0x79, 0x3d, 0x6c, 0x5b, 0x30, 0x5d, 0x2f, 0x32, + 0x2c, 0x78, 0x3d, 0x6c, 0x5b, 0x31, 0x5d, 0x2f, 0x32, 0x2c, 0x65, + 0x3d, 0x2d, 0x31, 0x2c, 0x64, 0x29, 0x29, 0x66, 0x6f, 0x72, 0x28, + 0x3b, 0x2b, 0x2b, 0x65, 0x3c, 0x62, 0x3b, 0x29, 0x61, 0x3d, 0x6d, + 0x5b, 0x65, 0x5d, 0x2c, 0x61, 0x2e, 0x78, 0x2b, 0x3d, 0x28, 0x79, + 0x2d, 0x61, 0x2e, 0x78, 0x29, 0x2a, 0x64, 0x2c, 0x61, 0x2e, 0x79, + 0x2b, 0x3d, 0x28, 0x78, 0x2d, 0x61, 0x2e, 0x79, 0x29, 0x2a, 0x64, + 0x3b, 0x69, 0x66, 0x28, 0x67, 0x29, 0x66, 0x6f, 0x72, 0x28, 0x4a, + 0x75, 0x28, 0x74, 0x3d, 0x74, 0x61, 0x2e, 0x67, 0x65, 0x6f, 0x6d, + 0x2e, 0x71, 0x75, 0x61, 0x64, 0x74, 0x72, 0x65, 0x65, 0x28, 0x6d, + 0x29, 0x2c, 0x72, 0x2c, 0x6f, 0x29, 0x2c, 0x65, 0x3d, 0x2d, 0x31, + 0x3b, 0x2b, 0x2b, 0x65, 0x3c, 0x62, 0x3b, 0x29, 0x28, 0x61, 0x3d, + 0x6d, 0x5b, 0x65, 0x5d, 0x29, 0x2e, 0x66, 0x69, 0x78, 0x65, 0x64, + 0x7c, 0x7c, 0x74, 0x2e, 0x76, 0x69, 0x73, 0x69, 0x74, 0x28, 0x6e, + 0x28, 0x61, 0x29, 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x65, 0x3d, + 0x2d, 0x31, 0x3b, 0x2b, 0x2b, 0x65, 0x3c, 0x62, 0x3b, 0x29, 0x61, + 0x3d, 0x6d, 0x5b, 0x65, 0x5d, 0x2c, 0x61, 0x2e, 0x66, 0x69, 0x78, + 0x65, 0x64, 0x3f, 0x28, 0x61, 0x2e, 0x78, 0x3d, 0x61, 0x2e, 0x70, + 0x78, 0x2c, 0x61, 0x2e, 0x79, 0x3d, 0x61, 0x2e, 0x70, 0x79, 0x29, + 0x3a, 0x28, 0x61, 0x2e, 0x78, 0x2d, 0x3d, 0x28, 0x61, 0x2e, 0x70, + 0x78, 0x2d, 0x28, 0x61, 0x2e, 0x70, 0x78, 0x3d, 0x61, 0x2e, 0x78, + 0x29, 0x29, 0x2a, 0x73, 0x2c, 0x61, 0x2e, 0x79, 0x2d, 0x3d, 0x28, + 0x61, 0x2e, 0x70, 0x79, 0x2d, 0x28, 0x61, 0x2e, 0x70, 0x79, 0x3d, + 0x61, 0x2e, 0x79, 0x29, 0x29, 0x2a, 0x73, 0x29, 0x3b, 0x63, 0x2e, + 0x74, 0x69, 0x63, 0x6b, 0x28, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, + 0x22, 0x74, 0x69, 0x63, 0x6b, 0x22, 0x2c, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x3a, 0x72, 0x7d, 0x29, 0x7d, 0x2c, 0x61, 0x2e, 0x6e, 0x6f, + 0x64, 0x65, 0x73, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x6d, 0x3d, 0x6e, + 0x2c, 0x61, 0x29, 0x3a, 0x6d, 0x7d, 0x2c, 0x61, 0x2e, 0x6c, 0x69, + 0x6e, 0x6b, 0x73, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x4d, 0x3d, 0x6e, + 0x2c, 0x61, 0x29, 0x3a, 0x4d, 0x7d, 0x2c, 0x61, 0x2e, 0x73, 0x69, + 0x7a, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x6c, 0x3d, 0x6e, 0x2c, + 0x61, 0x29, 0x3a, 0x6c, 0x7d, 0x2c, 0x61, 0x2e, 0x6c, 0x69, 0x6e, + 0x6b, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3f, 0x28, 0x66, 0x3d, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, + 0x66, 0x20, 0x6e, 0x3f, 0x6e, 0x3a, 0x2b, 0x6e, 0x2c, 0x61, 0x29, + 0x3a, 0x66, 0x7d, 0x2c, 0x61, 0x2e, 0x64, 0x69, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x3d, 0x61, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x44, + 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x2c, 0x61, 0x2e, 0x6c, + 0x69, 0x6e, 0x6b, 0x53, 0x74, 0x72, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3f, 0x28, 0x68, 0x3d, 0x22, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, + 0x65, 0x6f, 0x66, 0x20, 0x6e, 0x3f, 0x6e, 0x3a, 0x2b, 0x6e, 0x2c, + 0x61, 0x29, 0x3a, 0x68, 0x7d, 0x2c, 0x61, 0x2e, 0x66, 0x72, 0x69, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x73, + 0x3d, 0x2b, 0x6e, 0x2c, 0x61, 0x29, 0x3a, 0x73, 0x7d, 0x2c, 0x61, + 0x2e, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, + 0x28, 0x67, 0x3d, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, + 0x6e, 0x3f, 0x6e, 0x3a, 0x2b, 0x6e, 0x2c, 0x61, 0x29, 0x3a, 0x67, + 0x7d, 0x2c, 0x61, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x44, + 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, + 0x28, 0x70, 0x3d, 0x6e, 0x2a, 0x6e, 0x2c, 0x61, 0x29, 0x3a, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x73, 0x71, 0x72, 0x74, 0x28, 0x70, 0x29, + 0x7d, 0x2c, 0x61, 0x2e, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x79, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3f, 0x28, 0x76, 0x3d, 0x2b, 0x6e, 0x2c, 0x61, + 0x29, 0x3a, 0x76, 0x7d, 0x2c, 0x61, 0x2e, 0x74, 0x68, 0x65, 0x74, + 0x61, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x64, 0x3d, 0x6e, 0x2a, 0x6e, + 0x2c, 0x61, 0x29, 0x3a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x71, + 0x72, 0x74, 0x28, 0x64, 0x29, 0x7d, 0x2c, 0x61, 0x2e, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x6e, 0x3d, 0x2b, + 0x6e, 0x2c, 0x72, 0x3f, 0x72, 0x3d, 0x6e, 0x3e, 0x30, 0x3f, 0x6e, + 0x3a, 0x30, 0x3a, 0x6e, 0x3e, 0x30, 0x26, 0x26, 0x28, 0x63, 0x2e, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x28, 0x7b, 0x74, 0x79, 0x70, 0x65, + 0x3a, 0x22, 0x73, 0x74, 0x61, 0x72, 0x74, 0x22, 0x2c, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x3a, 0x72, 0x3d, 0x6e, 0x7d, 0x29, 0x2c, 0x74, + 0x61, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x28, 0x61, 0x2e, 0x74, + 0x69, 0x63, 0x6b, 0x29, 0x29, 0x2c, 0x61, 0x29, 0x3a, 0x72, 0x7d, + 0x2c, 0x61, 0x2e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x28, 0x6e, 0x2c, + 0x72, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x21, 0x65, 0x29, 0x7b, 0x66, + 0x6f, 0x72, 0x28, 0x65, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, + 0x72, 0x61, 0x79, 0x28, 0x63, 0x29, 0x2c, 0x61, 0x3d, 0x30, 0x3b, + 0x63, 0x3e, 0x61, 0x3b, 0x2b, 0x2b, 0x61, 0x29, 0x65, 0x5b, 0x61, + 0x5d, 0x3d, 0x5b, 0x5d, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x61, 0x3d, + 0x30, 0x3b, 0x73, 0x3e, 0x61, 0x3b, 0x2b, 0x2b, 0x61, 0x29, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x75, 0x3d, 0x4d, 0x5b, 0x61, 0x5d, 0x3b, + 0x65, 0x5b, 0x75, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x70, 0x75, 0x73, 0x68, + 0x28, 0x75, 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, 0x2c, + 0x65, 0x5b, 0x75, 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2e, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x70, 0x75, 0x73, 0x68, + 0x28, 0x75, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x7d, + 0x7d, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x69, 0x2c, + 0x6f, 0x3d, 0x65, 0x5b, 0x74, 0x5d, 0x2c, 0x61, 0x3d, 0x2d, 0x31, + 0x2c, 0x6c, 0x3d, 0x6f, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3b, 0x2b, 0x2b, 0x61, 0x3c, 0x6c, 0x3b, 0x29, 0x69, 0x66, 0x28, + 0x21, 0x69, 0x73, 0x4e, 0x61, 0x4e, 0x28, 0x69, 0x3d, 0x6f, 0x5b, + 0x61, 0x5d, 0x5b, 0x6e, 0x5d, 0x29, 0x29, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x69, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x61, 0x6e, 0x64, 0x6f, + 0x6d, 0x28, 0x29, 0x2a, 0x72, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x74, + 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x63, 0x3d, 0x6d, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x73, 0x3d, 0x4d, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x70, 0x3d, 0x6c, 0x5b, 0x30, 0x5d, + 0x2c, 0x76, 0x3d, 0x6c, 0x5b, 0x31, 0x5d, 0x3b, 0x66, 0x6f, 0x72, + 0x28, 0x74, 0x3d, 0x30, 0x3b, 0x63, 0x3e, 0x74, 0x3b, 0x2b, 0x2b, + 0x74, 0x29, 0x28, 0x72, 0x3d, 0x6d, 0x5b, 0x74, 0x5d, 0x29, 0x2e, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3d, 0x74, 0x2c, 0x72, 0x2e, 0x77, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x30, 0x3b, 0x66, 0x6f, 0x72, + 0x28, 0x74, 0x3d, 0x30, 0x3b, 0x73, 0x3e, 0x74, 0x3b, 0x2b, 0x2b, + 0x74, 0x29, 0x72, 0x3d, 0x4d, 0x5b, 0x74, 0x5d, 0x2c, 0x22, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, + 0x65, 0x6f, 0x66, 0x20, 0x72, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x26, 0x26, 0x28, 0x72, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x3d, 0x6d, 0x5b, 0x72, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5d, 0x29, 0x2c, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x72, + 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x26, 0x26, 0x28, 0x72, + 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, 0x6d, 0x5b, 0x72, + 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5d, 0x29, 0x2c, 0x2b, + 0x2b, 0x72, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x77, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x2c, 0x2b, 0x2b, 0x72, 0x2e, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x2e, 0x77, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x74, 0x3d, 0x30, 0x3b, 0x63, + 0x3e, 0x74, 0x3b, 0x2b, 0x2b, 0x74, 0x29, 0x72, 0x3d, 0x6d, 0x5b, + 0x74, 0x5d, 0x2c, 0x69, 0x73, 0x4e, 0x61, 0x4e, 0x28, 0x72, 0x2e, + 0x78, 0x29, 0x26, 0x26, 0x28, 0x72, 0x2e, 0x78, 0x3d, 0x6e, 0x28, + 0x22, 0x78, 0x22, 0x2c, 0x70, 0x29, 0x29, 0x2c, 0x69, 0x73, 0x4e, + 0x61, 0x4e, 0x28, 0x72, 0x2e, 0x79, 0x29, 0x26, 0x26, 0x28, 0x72, + 0x2e, 0x79, 0x3d, 0x6e, 0x28, 0x22, 0x79, 0x22, 0x2c, 0x76, 0x29, + 0x29, 0x2c, 0x69, 0x73, 0x4e, 0x61, 0x4e, 0x28, 0x72, 0x2e, 0x70, + 0x78, 0x29, 0x26, 0x26, 0x28, 0x72, 0x2e, 0x70, 0x78, 0x3d, 0x72, + 0x2e, 0x78, 0x29, 0x2c, 0x69, 0x73, 0x4e, 0x61, 0x4e, 0x28, 0x72, + 0x2e, 0x70, 0x79, 0x29, 0x26, 0x26, 0x28, 0x72, 0x2e, 0x70, 0x79, + 0x3d, 0x72, 0x2e, 0x79, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x75, 0x3d, + 0x5b, 0x5d, 0x2c, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, + 0x66, 0x29, 0x66, 0x6f, 0x72, 0x28, 0x74, 0x3d, 0x30, 0x3b, 0x73, + 0x3e, 0x74, 0x3b, 0x2b, 0x2b, 0x74, 0x29, 0x75, 0x5b, 0x74, 0x5d, + 0x3d, 0x2b, 0x66, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x2c, 0x4d, 0x5b, 0x74, 0x5d, 0x2c, 0x74, 0x29, 0x3b, + 0x65, 0x6c, 0x73, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x28, 0x74, 0x3d, + 0x30, 0x3b, 0x73, 0x3e, 0x74, 0x3b, 0x2b, 0x2b, 0x74, 0x29, 0x75, + 0x5b, 0x74, 0x5d, 0x3d, 0x66, 0x3b, 0x69, 0x66, 0x28, 0x69, 0x3d, + 0x5b, 0x5d, 0x2c, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, + 0x68, 0x29, 0x66, 0x6f, 0x72, 0x28, 0x74, 0x3d, 0x30, 0x3b, 0x73, + 0x3e, 0x74, 0x3b, 0x2b, 0x2b, 0x74, 0x29, 0x69, 0x5b, 0x74, 0x5d, + 0x3d, 0x2b, 0x68, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x2c, 0x4d, 0x5b, 0x74, 0x5d, 0x2c, 0x74, 0x29, 0x3b, + 0x65, 0x6c, 0x73, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x28, 0x74, 0x3d, + 0x30, 0x3b, 0x73, 0x3e, 0x74, 0x3b, 0x2b, 0x2b, 0x74, 0x29, 0x69, + 0x5b, 0x74, 0x5d, 0x3d, 0x68, 0x3b, 0x69, 0x66, 0x28, 0x6f, 0x3d, + 0x5b, 0x5d, 0x2c, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, + 0x67, 0x29, 0x66, 0x6f, 0x72, 0x28, 0x74, 0x3d, 0x30, 0x3b, 0x63, + 0x3e, 0x74, 0x3b, 0x2b, 0x2b, 0x74, 0x29, 0x6f, 0x5b, 0x74, 0x5d, + 0x3d, 0x2b, 0x67, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x2c, 0x6d, 0x5b, 0x74, 0x5d, 0x2c, 0x74, 0x29, 0x3b, + 0x65, 0x6c, 0x73, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x28, 0x74, 0x3d, + 0x30, 0x3b, 0x63, 0x3e, 0x74, 0x3b, 0x2b, 0x2b, 0x74, 0x29, 0x6f, + 0x5b, 0x74, 0x5d, 0x3d, 0x67, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x61, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x28, + 0x29, 0x7d, 0x2c, 0x61, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x65, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x2e, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x28, 0x2e, 0x31, 0x29, 0x7d, 0x2c, 0x61, + 0x2e, 0x73, 0x74, 0x6f, 0x70, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x61, 0x2e, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x28, 0x30, + 0x29, 0x7d, 0x2c, 0x61, 0x2e, 0x64, 0x72, 0x61, 0x67, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x7c, 0x7c, 0x28, 0x65, + 0x3d, 0x74, 0x61, 0x2e, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, + 0x72, 0x2e, 0x64, 0x72, 0x61, 0x67, 0x28, 0x29, 0x2e, 0x6f, 0x72, + 0x69, 0x67, 0x69, 0x6e, 0x28, 0x79, 0x29, 0x2e, 0x6f, 0x6e, 0x28, + 0x22, 0x64, 0x72, 0x61, 0x67, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2e, + 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x2c, 0x58, 0x75, 0x29, 0x2e, + 0x6f, 0x6e, 0x28, 0x22, 0x64, 0x72, 0x61, 0x67, 0x2e, 0x66, 0x6f, + 0x72, 0x63, 0x65, 0x22, 0x2c, 0x74, 0x29, 0x2e, 0x6f, 0x6e, 0x28, + 0x22, 0x64, 0x72, 0x61, 0x67, 0x65, 0x6e, 0x64, 0x2e, 0x66, 0x6f, + 0x72, 0x63, 0x65, 0x22, 0x2c, 0x24, 0x75, 0x29, 0x29, 0x2c, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x6e, 0x28, 0x22, 0x6d, 0x6f, 0x75, + 0x73, 0x65, 0x6f, 0x76, 0x65, 0x72, 0x2e, 0x66, 0x6f, 0x72, 0x63, + 0x65, 0x22, 0x2c, 0x42, 0x75, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x22, + 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x6f, 0x75, 0x74, 0x2e, 0x66, 0x6f, + 0x72, 0x63, 0x65, 0x22, 0x2c, 0x57, 0x75, 0x29, 0x2e, 0x63, 0x61, + 0x6c, 0x6c, 0x28, 0x65, 0x29, 0x3a, 0x65, 0x7d, 0x2c, 0x74, 0x61, + 0x2e, 0x72, 0x65, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x61, 0x2c, 0x63, + 0x2c, 0x22, 0x6f, 0x6e, 0x22, 0x29, 0x7d, 0x3b, 0x76, 0x61, 0x72, + 0x20, 0x66, 0x6c, 0x3d, 0x32, 0x30, 0x2c, 0x68, 0x6c, 0x3d, 0x31, + 0x2c, 0x67, 0x6c, 0x3d, 0x31, 0x2f, 0x30, 0x3b, 0x74, 0x61, 0x2e, + 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x2e, 0x68, 0x69, 0x65, 0x72, + 0x61, 0x72, 0x63, 0x68, 0x79, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x28, 0x75, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x69, 0x2c, 0x6f, 0x3d, 0x5b, 0x75, 0x5d, 0x2c, 0x61, + 0x3d, 0x5b, 0x5d, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x75, 0x2e, 0x64, + 0x65, 0x70, 0x74, 0x68, 0x3d, 0x30, 0x3b, 0x6e, 0x75, 0x6c, 0x6c, + 0x21, 0x3d, 0x28, 0x69, 0x3d, 0x6f, 0x2e, 0x70, 0x6f, 0x70, 0x28, + 0x29, 0x29, 0x3b, 0x29, 0x69, 0x66, 0x28, 0x61, 0x2e, 0x70, 0x75, + 0x73, 0x68, 0x28, 0x69, 0x29, 0x2c, 0x28, 0x6c, 0x3d, 0x65, 0x2e, + 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6e, 0x2c, 0x69, 0x2c, 0x69, 0x2e, + 0x64, 0x65, 0x70, 0x74, 0x68, 0x29, 0x29, 0x26, 0x26, 0x28, 0x63, + 0x3d, 0x6c, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x29, + 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x63, 0x2c, + 0x6c, 0x2c, 0x73, 0x3b, 0x2d, 0x2d, 0x63, 0x3e, 0x3d, 0x30, 0x3b, + 0x29, 0x6f, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x73, 0x3d, 0x6c, + 0x5b, 0x63, 0x5d, 0x29, 0x2c, 0x73, 0x2e, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x3d, 0x69, 0x2c, 0x73, 0x2e, 0x64, 0x65, 0x70, 0x74, + 0x68, 0x3d, 0x69, 0x2e, 0x64, 0x65, 0x70, 0x74, 0x68, 0x2b, 0x31, + 0x3b, 0x72, 0x26, 0x26, 0x28, 0x69, 0x2e, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3d, 0x30, 0x29, 0x2c, 0x69, 0x2e, 0x63, 0x68, 0x69, 0x6c, + 0x64, 0x72, 0x65, 0x6e, 0x3d, 0x6c, 0x7d, 0x65, 0x6c, 0x73, 0x65, + 0x20, 0x72, 0x26, 0x26, 0x28, 0x69, 0x2e, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3d, 0x2b, 0x72, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6e, + 0x2c, 0x69, 0x2c, 0x69, 0x2e, 0x64, 0x65, 0x70, 0x74, 0x68, 0x29, + 0x7c, 0x7c, 0x30, 0x29, 0x2c, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x20, 0x69, 0x2e, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x51, 0x75, 0x28, + 0x75, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x2c, 0x75, 0x3b, + 0x74, 0x26, 0x26, 0x28, 0x65, 0x3d, 0x6e, 0x2e, 0x63, 0x68, 0x69, + 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x29, 0x26, 0x26, 0x65, 0x2e, 0x73, + 0x6f, 0x72, 0x74, 0x28, 0x74, 0x29, 0x2c, 0x72, 0x26, 0x26, 0x28, + 0x75, 0x3d, 0x6e, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, + 0x26, 0x26, 0x28, 0x75, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2b, + 0x3d, 0x6e, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x7d, 0x29, + 0x2c, 0x61, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x65, 0x69, + 0x2c, 0x65, 0x3d, 0x6e, 0x69, 0x2c, 0x72, 0x3d, 0x74, 0x69, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x73, 0x6f, + 0x72, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x74, 0x3d, 0x65, 0x2c, + 0x6e, 0x29, 0x3a, 0x74, 0x7d, 0x2c, 0x6e, 0x2e, 0x63, 0x68, 0x69, + 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x65, + 0x3d, 0x74, 0x2c, 0x6e, 0x29, 0x3a, 0x65, 0x7d, 0x2c, 0x6e, 0x2e, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x72, + 0x3d, 0x74, 0x2c, 0x6e, 0x29, 0x3a, 0x72, 0x7d, 0x2c, 0x6e, 0x2e, + 0x72, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x26, 0x26, 0x28, 0x4b, 0x75, + 0x28, 0x74, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6e, 0x29, 0x7b, 0x6e, 0x2e, 0x63, 0x68, 0x69, 0x6c, 0x64, + 0x72, 0x65, 0x6e, 0x26, 0x26, 0x28, 0x6e, 0x2e, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3d, 0x30, 0x29, 0x7d, 0x29, 0x2c, 0x51, 0x75, 0x28, + 0x74, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3b, 0x74, 0x2e, + 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x7c, 0x7c, 0x28, + 0x74, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x2b, 0x72, 0x2e, + 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x74, 0x2e, + 0x64, 0x65, 0x70, 0x74, 0x68, 0x29, 0x7c, 0x7c, 0x30, 0x29, 0x2c, + 0x28, 0x65, 0x3d, 0x74, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x29, 0x26, 0x26, 0x28, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x2b, 0x3d, 0x74, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x7d, + 0x29, 0x29, 0x2c, 0x74, 0x7d, 0x2c, 0x6e, 0x7d, 0x2c, 0x74, 0x61, + 0x2e, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x2e, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x28, 0x74, 0x2c, 0x65, 0x2c, + 0x72, 0x2c, 0x75, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, + 0x74, 0x2e, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x3b, + 0x69, 0x66, 0x28, 0x74, 0x2e, 0x78, 0x3d, 0x65, 0x2c, 0x74, 0x2e, + 0x79, 0x3d, 0x74, 0x2e, 0x64, 0x65, 0x70, 0x74, 0x68, 0x2a, 0x75, + 0x2c, 0x74, 0x2e, 0x64, 0x78, 0x3d, 0x72, 0x2c, 0x74, 0x2e, 0x64, + 0x79, 0x3d, 0x75, 0x2c, 0x69, 0x26, 0x26, 0x28, 0x6f, 0x3d, 0x69, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x6f, 0x2c, 0x61, 0x2c, 0x63, 0x2c, 0x6c, 0x3d, + 0x2d, 0x31, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x72, 0x3d, 0x74, 0x2e, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3f, 0x72, 0x2f, 0x74, 0x2e, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x30, 0x3b, 0x2b, 0x2b, 0x6c, 0x3c, + 0x6f, 0x3b, 0x29, 0x6e, 0x28, 0x61, 0x3d, 0x69, 0x5b, 0x6c, 0x5d, + 0x2c, 0x65, 0x2c, 0x63, 0x3d, 0x61, 0x2e, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x2a, 0x72, 0x2c, 0x75, 0x29, 0x2c, 0x65, 0x2b, 0x3d, 0x63, + 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x74, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, + 0x6e, 0x2e, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x2c, + 0x72, 0x3d, 0x30, 0x3b, 0x69, 0x66, 0x28, 0x65, 0x26, 0x26, 0x28, + 0x75, 0x3d, 0x65, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, + 0x29, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x75, 0x2c, + 0x69, 0x3d, 0x2d, 0x31, 0x3b, 0x2b, 0x2b, 0x69, 0x3c, 0x75, 0x3b, + 0x29, 0x72, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, + 0x28, 0x72, 0x2c, 0x74, 0x28, 0x65, 0x5b, 0x69, 0x5d, 0x29, 0x29, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x2b, 0x72, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, + 0x28, 0x65, 0x2c, 0x69, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6f, + 0x3d, 0x72, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2c, 0x65, 0x2c, 0x69, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x28, 0x6f, 0x5b, 0x30, 0x5d, 0x2c, 0x30, + 0x2c, 0x75, 0x5b, 0x30, 0x5d, 0x2c, 0x75, 0x5b, 0x31, 0x5d, 0x2f, + 0x74, 0x28, 0x6f, 0x5b, 0x30, 0x5d, 0x29, 0x29, 0x2c, 0x6f, 0x7d, + 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x74, 0x61, 0x2e, 0x6c, 0x61, + 0x79, 0x6f, 0x75, 0x74, 0x2e, 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, + 0x63, 0x68, 0x79, 0x28, 0x29, 0x2c, 0x75, 0x3d, 0x5b, 0x31, 0x2c, + 0x31, 0x5d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, + 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x75, + 0x3d, 0x6e, 0x2c, 0x65, 0x29, 0x3a, 0x75, 0x7d, 0x2c, 0x47, 0x75, + 0x28, 0x65, 0x2c, 0x72, 0x29, 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x6c, + 0x61, 0x79, 0x6f, 0x75, 0x74, 0x2e, 0x70, 0x69, 0x65, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x28, 0x6f, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x61, 0x2c, 0x63, 0x3d, 0x6f, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x6c, 0x3d, 0x6f, + 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x2b, 0x74, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, + 0x6e, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x7d, 0x29, 0x2c, 0x73, 0x3d, + 0x2b, 0x28, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x72, + 0x3f, 0x72, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x29, 0x3a, 0x72, 0x29, 0x2c, 0x66, 0x3d, 0x28, 0x22, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3d, 0x3d, 0x74, + 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x75, 0x3f, 0x75, 0x2e, 0x61, + 0x70, 0x70, 0x6c, 0x79, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x3a, 0x75, + 0x29, 0x2d, 0x73, 0x2c, 0x68, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x6d, 0x69, 0x6e, 0x28, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x61, 0x62, + 0x73, 0x28, 0x66, 0x29, 0x2f, 0x63, 0x2c, 0x2b, 0x28, 0x22, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3d, 0x3d, 0x74, + 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x69, 0x3f, 0x69, 0x2e, 0x61, + 0x70, 0x70, 0x6c, 0x79, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x3a, 0x69, + 0x29, 0x29, 0x2c, 0x67, 0x3d, 0x68, 0x2a, 0x28, 0x30, 0x3e, 0x66, + 0x3f, 0x2d, 0x31, 0x3a, 0x31, 0x29, 0x2c, 0x70, 0x3d, 0x28, 0x66, + 0x2d, 0x63, 0x2a, 0x67, 0x29, 0x2f, 0x74, 0x61, 0x2e, 0x73, 0x75, + 0x6d, 0x28, 0x6c, 0x29, 0x2c, 0x76, 0x3d, 0x74, 0x61, 0x2e, 0x72, + 0x61, 0x6e, 0x67, 0x65, 0x28, 0x63, 0x29, 0x2c, 0x64, 0x3d, 0x5b, + 0x5d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x75, + 0x6c, 0x6c, 0x21, 0x3d, 0x65, 0x26, 0x26, 0x76, 0x2e, 0x73, 0x6f, + 0x72, 0x74, 0x28, 0x65, 0x3d, 0x3d, 0x3d, 0x70, 0x6c, 0x3f, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x5b, + 0x74, 0x5d, 0x2d, 0x6c, 0x5b, 0x6e, 0x5d, 0x7d, 0x3a, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x28, 0x6f, + 0x5b, 0x6e, 0x5d, 0x2c, 0x6f, 0x5b, 0x74, 0x5d, 0x29, 0x7d, 0x29, + 0x2c, 0x76, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, + 0x7b, 0x64, 0x5b, 0x6e, 0x5d, 0x3d, 0x7b, 0x64, 0x61, 0x74, 0x61, + 0x3a, 0x6f, 0x5b, 0x6e, 0x5d, 0x2c, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x61, 0x3d, 0x6c, 0x5b, 0x6e, 0x5d, 0x2c, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x41, 0x6e, 0x67, 0x6c, 0x65, 0x3a, 0x73, 0x2c, 0x65, + 0x6e, 0x64, 0x41, 0x6e, 0x67, 0x6c, 0x65, 0x3a, 0x73, 0x2b, 0x3d, + 0x61, 0x2a, 0x70, 0x2b, 0x67, 0x2c, 0x70, 0x61, 0x64, 0x41, 0x6e, + 0x67, 0x6c, 0x65, 0x3a, 0x68, 0x7d, 0x7d, 0x29, 0x2c, 0x64, 0x7d, + 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x2c, 0x65, 0x3d, 0x70, 0x6c, 0x2c, 0x72, 0x3d, 0x30, 0x2c, + 0x75, 0x3d, 0x4c, 0x61, 0x2c, 0x69, 0x3d, 0x30, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x74, 0x3d, 0x65, 0x2c, 0x6e, + 0x29, 0x3a, 0x74, 0x7d, 0x2c, 0x6e, 0x2e, 0x73, 0x6f, 0x72, 0x74, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3f, 0x28, 0x65, 0x3d, 0x74, 0x2c, 0x6e, 0x29, + 0x3a, 0x65, 0x7d, 0x2c, 0x6e, 0x2e, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x41, 0x6e, 0x67, 0x6c, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x72, + 0x3d, 0x74, 0x2c, 0x6e, 0x29, 0x3a, 0x72, 0x7d, 0x2c, 0x6e, 0x2e, + 0x65, 0x6e, 0x64, 0x41, 0x6e, 0x67, 0x6c, 0x65, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3f, 0x28, 0x75, 0x3d, 0x74, 0x2c, 0x6e, 0x29, 0x3a, 0x75, 0x7d, + 0x2c, 0x6e, 0x2e, 0x70, 0x61, 0x64, 0x41, 0x6e, 0x67, 0x6c, 0x65, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3f, 0x28, 0x69, 0x3d, 0x74, 0x2c, 0x6e, 0x29, + 0x3a, 0x69, 0x7d, 0x2c, 0x6e, 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x70, 0x6c, 0x3d, 0x7b, 0x7d, 0x3b, 0x74, 0x61, 0x2e, 0x6c, 0x61, + 0x79, 0x6f, 0x75, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x28, + 0x61, 0x2c, 0x63, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x21, 0x28, 0x68, + 0x3d, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x29, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x6c, 0x3d, 0x61, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x2c, 0x72, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, + 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6e, 0x2c, 0x65, 0x2c, 0x72, 0x29, + 0x7d, 0x29, 0x2c, 0x73, 0x3d, 0x6c, 0x2e, 0x6d, 0x61, 0x70, 0x28, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, 0x6d, + 0x61, 0x70, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x5b, 0x69, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6e, 0x2c, + 0x74, 0x2c, 0x65, 0x29, 0x2c, 0x6f, 0x2e, 0x63, 0x61, 0x6c, 0x6c, + 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x5d, 0x7d, 0x29, 0x7d, + 0x29, 0x2c, 0x66, 0x3d, 0x65, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, + 0x6e, 0x2c, 0x73, 0x2c, 0x63, 0x29, 0x3b, 0x6c, 0x3d, 0x74, 0x61, + 0x2e, 0x70, 0x65, 0x72, 0x6d, 0x75, 0x74, 0x65, 0x28, 0x6c, 0x2c, + 0x66, 0x29, 0x2c, 0x73, 0x3d, 0x74, 0x61, 0x2e, 0x70, 0x65, 0x72, + 0x6d, 0x75, 0x74, 0x65, 0x28, 0x73, 0x2c, 0x66, 0x29, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x68, 0x2c, 0x67, 0x2c, 0x70, 0x2c, 0x76, 0x2c, + 0x64, 0x3d, 0x72, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6e, 0x2c, + 0x73, 0x2c, 0x63, 0x29, 0x2c, 0x6d, 0x3d, 0x6c, 0x5b, 0x30, 0x5d, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x66, 0x6f, 0x72, + 0x28, 0x70, 0x3d, 0x30, 0x3b, 0x6d, 0x3e, 0x70, 0x3b, 0x2b, 0x2b, + 0x70, 0x29, 0x66, 0x6f, 0x72, 0x28, 0x75, 0x2e, 0x63, 0x61, 0x6c, + 0x6c, 0x28, 0x6e, 0x2c, 0x6c, 0x5b, 0x30, 0x5d, 0x5b, 0x70, 0x5d, + 0x2c, 0x76, 0x3d, 0x64, 0x5b, 0x70, 0x5d, 0x2c, 0x73, 0x5b, 0x30, + 0x5d, 0x5b, 0x70, 0x5d, 0x5b, 0x31, 0x5d, 0x29, 0x2c, 0x67, 0x3d, + 0x31, 0x3b, 0x68, 0x3e, 0x67, 0x3b, 0x2b, 0x2b, 0x67, 0x29, 0x75, + 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6e, 0x2c, 0x6c, 0x5b, 0x67, + 0x5d, 0x5b, 0x70, 0x5d, 0x2c, 0x76, 0x2b, 0x3d, 0x73, 0x5b, 0x67, + 0x2d, 0x31, 0x5d, 0x5b, 0x70, 0x5d, 0x5b, 0x31, 0x5d, 0x2c, 0x73, + 0x5b, 0x67, 0x5d, 0x5b, 0x70, 0x5d, 0x5b, 0x31, 0x5d, 0x29, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x7d, 0x76, 0x61, + 0x72, 0x20, 0x74, 0x3d, 0x79, 0x2c, 0x65, 0x3d, 0x61, 0x69, 0x2c, + 0x72, 0x3d, 0x63, 0x69, 0x2c, 0x75, 0x3d, 0x6f, 0x69, 0x2c, 0x69, + 0x3d, 0x75, 0x69, 0x2c, 0x6f, 0x3d, 0x69, 0x69, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x74, 0x3d, 0x65, 0x2c, + 0x6e, 0x29, 0x3a, 0x74, 0x7d, 0x2c, 0x6e, 0x2e, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x65, 0x3d, 0x22, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3d, 0x3d, 0x74, + 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x74, 0x3f, 0x74, 0x3a, 0x76, + 0x6c, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x74, 0x29, 0x7c, 0x7c, 0x61, + 0x69, 0x2c, 0x6e, 0x29, 0x3a, 0x65, 0x7d, 0x2c, 0x6e, 0x2e, 0x6f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x72, + 0x3d, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3d, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x74, 0x3f, + 0x74, 0x3a, 0x64, 0x6c, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x74, 0x29, + 0x7c, 0x7c, 0x63, 0x69, 0x2c, 0x6e, 0x29, 0x3a, 0x72, 0x7d, 0x2c, + 0x6e, 0x2e, 0x78, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x69, 0x3d, 0x74, + 0x2c, 0x6e, 0x29, 0x3a, 0x69, 0x7d, 0x2c, 0x6e, 0x2e, 0x79, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3f, 0x28, 0x6f, 0x3d, 0x74, 0x2c, 0x6e, 0x29, 0x3a, + 0x6f, 0x7d, 0x2c, 0x6e, 0x2e, 0x6f, 0x75, 0x74, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3f, 0x28, 0x75, 0x3d, 0x74, 0x2c, 0x6e, 0x29, 0x3a, 0x75, 0x7d, + 0x2c, 0x6e, 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x76, 0x6c, 0x3d, + 0x74, 0x61, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x7b, 0x22, 0x69, 0x6e, + 0x73, 0x69, 0x64, 0x65, 0x2d, 0x6f, 0x75, 0x74, 0x22, 0x3a, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x3d, 0x6e, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x75, 0x3d, 0x6e, + 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6c, 0x69, 0x29, 0x2c, 0x69, 0x3d, + 0x6e, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x73, 0x69, 0x29, 0x2c, 0x6f, + 0x3d, 0x74, 0x61, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x28, 0x72, + 0x29, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x28, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x5b, 0x6e, 0x5d, 0x2d, + 0x75, 0x5b, 0x74, 0x5d, 0x7d, 0x29, 0x2c, 0x61, 0x3d, 0x30, 0x2c, + 0x63, 0x3d, 0x30, 0x2c, 0x6c, 0x3d, 0x5b, 0x5d, 0x2c, 0x73, 0x3d, + 0x5b, 0x5d, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x74, 0x3d, 0x30, 0x3b, + 0x72, 0x3e, 0x74, 0x3b, 0x2b, 0x2b, 0x74, 0x29, 0x65, 0x3d, 0x6f, + 0x5b, 0x74, 0x5d, 0x2c, 0x63, 0x3e, 0x61, 0x3f, 0x28, 0x61, 0x2b, + 0x3d, 0x69, 0x5b, 0x65, 0x5d, 0x2c, 0x6c, 0x2e, 0x70, 0x75, 0x73, + 0x68, 0x28, 0x65, 0x29, 0x29, 0x3a, 0x28, 0x63, 0x2b, 0x3d, 0x69, + 0x5b, 0x65, 0x5d, 0x2c, 0x73, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, + 0x65, 0x29, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x73, 0x2e, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x28, 0x29, + 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6c, 0x29, 0x7d, + 0x2c, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x3a, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x2e, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x28, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x29, 0x2e, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x28, + 0x29, 0x7d, 0x2c, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x22, 0x3a, 0x61, 0x69, 0x7d, 0x29, 0x2c, 0x64, 0x6c, 0x3d, 0x74, + 0x61, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x7b, 0x73, 0x69, 0x6c, 0x68, + 0x6f, 0x75, 0x65, 0x74, 0x74, 0x65, 0x3a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x75, 0x3d, 0x6e, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x69, 0x3d, 0x6e, 0x5b, + 0x30, 0x5d, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x6f, + 0x3d, 0x5b, 0x5d, 0x2c, 0x61, 0x3d, 0x30, 0x2c, 0x63, 0x3d, 0x5b, + 0x5d, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x65, 0x3d, 0x30, 0x3b, 0x69, + 0x3e, 0x65, 0x3b, 0x2b, 0x2b, 0x65, 0x29, 0x7b, 0x66, 0x6f, 0x72, + 0x28, 0x74, 0x3d, 0x30, 0x2c, 0x72, 0x3d, 0x30, 0x3b, 0x75, 0x3e, + 0x74, 0x3b, 0x74, 0x2b, 0x2b, 0x29, 0x72, 0x2b, 0x3d, 0x6e, 0x5b, + 0x74, 0x5d, 0x5b, 0x65, 0x5d, 0x5b, 0x31, 0x5d, 0x3b, 0x72, 0x3e, + 0x61, 0x26, 0x26, 0x28, 0x61, 0x3d, 0x72, 0x29, 0x2c, 0x6f, 0x2e, + 0x70, 0x75, 0x73, 0x68, 0x28, 0x72, 0x29, 0x7d, 0x66, 0x6f, 0x72, + 0x28, 0x65, 0x3d, 0x30, 0x3b, 0x69, 0x3e, 0x65, 0x3b, 0x2b, 0x2b, + 0x65, 0x29, 0x63, 0x5b, 0x65, 0x5d, 0x3d, 0x28, 0x61, 0x2d, 0x6f, + 0x5b, 0x65, 0x5d, 0x29, 0x2f, 0x32, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x63, 0x7d, 0x2c, 0x77, 0x69, 0x67, 0x67, 0x6c, + 0x65, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x2c, 0x65, 0x2c, + 0x72, 0x2c, 0x75, 0x2c, 0x69, 0x2c, 0x6f, 0x2c, 0x61, 0x2c, 0x63, + 0x2c, 0x6c, 0x2c, 0x73, 0x3d, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x2c, 0x66, 0x3d, 0x6e, 0x5b, 0x30, 0x5d, 0x2c, 0x68, + 0x3d, 0x66, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x67, + 0x3d, 0x5b, 0x5d, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x67, 0x5b, 0x30, + 0x5d, 0x3d, 0x63, 0x3d, 0x6c, 0x3d, 0x30, 0x2c, 0x65, 0x3d, 0x31, + 0x3b, 0x68, 0x3e, 0x65, 0x3b, 0x2b, 0x2b, 0x65, 0x29, 0x7b, 0x66, + 0x6f, 0x72, 0x28, 0x74, 0x3d, 0x30, 0x2c, 0x75, 0x3d, 0x30, 0x3b, + 0x73, 0x3e, 0x74, 0x3b, 0x2b, 0x2b, 0x74, 0x29, 0x75, 0x2b, 0x3d, + 0x6e, 0x5b, 0x74, 0x5d, 0x5b, 0x65, 0x5d, 0x5b, 0x31, 0x5d, 0x3b, + 0x66, 0x6f, 0x72, 0x28, 0x74, 0x3d, 0x30, 0x2c, 0x69, 0x3d, 0x30, + 0x2c, 0x61, 0x3d, 0x66, 0x5b, 0x65, 0x5d, 0x5b, 0x30, 0x5d, 0x2d, + 0x66, 0x5b, 0x65, 0x2d, 0x31, 0x5d, 0x5b, 0x30, 0x5d, 0x3b, 0x73, + 0x3e, 0x74, 0x3b, 0x2b, 0x2b, 0x74, 0x29, 0x7b, 0x66, 0x6f, 0x72, + 0x28, 0x72, 0x3d, 0x30, 0x2c, 0x6f, 0x3d, 0x28, 0x6e, 0x5b, 0x74, + 0x5d, 0x5b, 0x65, 0x5d, 0x5b, 0x31, 0x5d, 0x2d, 0x6e, 0x5b, 0x74, + 0x5d, 0x5b, 0x65, 0x2d, 0x31, 0x5d, 0x5b, 0x31, 0x5d, 0x29, 0x2f, + 0x28, 0x32, 0x2a, 0x61, 0x29, 0x3b, 0x74, 0x3e, 0x72, 0x3b, 0x2b, + 0x2b, 0x72, 0x29, 0x6f, 0x2b, 0x3d, 0x28, 0x6e, 0x5b, 0x72, 0x5d, + 0x5b, 0x65, 0x5d, 0x5b, 0x31, 0x5d, 0x2d, 0x6e, 0x5b, 0x72, 0x5d, + 0x5b, 0x65, 0x2d, 0x31, 0x5d, 0x5b, 0x31, 0x5d, 0x29, 0x2f, 0x61, + 0x3b, 0x69, 0x2b, 0x3d, 0x6f, 0x2a, 0x6e, 0x5b, 0x74, 0x5d, 0x5b, + 0x65, 0x5d, 0x5b, 0x31, 0x5d, 0x7d, 0x67, 0x5b, 0x65, 0x5d, 0x3d, + 0x63, 0x2d, 0x3d, 0x75, 0x3f, 0x69, 0x2f, 0x75, 0x2a, 0x61, 0x3a, + 0x30, 0x2c, 0x6c, 0x3e, 0x63, 0x26, 0x26, 0x28, 0x6c, 0x3d, 0x63, + 0x29, 0x7d, 0x66, 0x6f, 0x72, 0x28, 0x65, 0x3d, 0x30, 0x3b, 0x68, + 0x3e, 0x65, 0x3b, 0x2b, 0x2b, 0x65, 0x29, 0x67, 0x5b, 0x65, 0x5d, + 0x2d, 0x3d, 0x6c, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x67, 0x7d, 0x2c, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x3a, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x75, + 0x3d, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x69, + 0x3d, 0x6e, 0x5b, 0x30, 0x5d, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x2c, 0x6f, 0x3d, 0x31, 0x2f, 0x75, 0x2c, 0x61, 0x3d, 0x5b, + 0x5d, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x65, 0x3d, 0x30, 0x3b, 0x69, + 0x3e, 0x65, 0x3b, 0x2b, 0x2b, 0x65, 0x29, 0x7b, 0x66, 0x6f, 0x72, + 0x28, 0x74, 0x3d, 0x30, 0x2c, 0x72, 0x3d, 0x30, 0x3b, 0x75, 0x3e, + 0x74, 0x3b, 0x74, 0x2b, 0x2b, 0x29, 0x72, 0x2b, 0x3d, 0x6e, 0x5b, + 0x74, 0x5d, 0x5b, 0x65, 0x5d, 0x5b, 0x31, 0x5d, 0x3b, 0x69, 0x66, + 0x28, 0x72, 0x29, 0x66, 0x6f, 0x72, 0x28, 0x74, 0x3d, 0x30, 0x3b, + 0x75, 0x3e, 0x74, 0x3b, 0x74, 0x2b, 0x2b, 0x29, 0x6e, 0x5b, 0x74, + 0x5d, 0x5b, 0x65, 0x5d, 0x5b, 0x31, 0x5d, 0x2f, 0x3d, 0x72, 0x3b, + 0x65, 0x6c, 0x73, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x28, 0x74, 0x3d, + 0x30, 0x3b, 0x75, 0x3e, 0x74, 0x3b, 0x74, 0x2b, 0x2b, 0x29, 0x6e, + 0x5b, 0x74, 0x5d, 0x5b, 0x65, 0x5d, 0x5b, 0x31, 0x5d, 0x3d, 0x6f, + 0x7d, 0x66, 0x6f, 0x72, 0x28, 0x65, 0x3d, 0x30, 0x3b, 0x69, 0x3e, + 0x65, 0x3b, 0x2b, 0x2b, 0x65, 0x29, 0x61, 0x5b, 0x65, 0x5d, 0x3d, + 0x30, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x7d, + 0x2c, 0x7a, 0x65, 0x72, 0x6f, 0x3a, 0x63, 0x69, 0x7d, 0x29, 0x3b, + 0x74, 0x61, 0x2e, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x2e, 0x68, + 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x28, 0x6e, 0x2c, + 0x69, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, + 0x6f, 0x2c, 0x61, 0x2c, 0x63, 0x3d, 0x5b, 0x5d, 0x2c, 0x6c, 0x3d, + 0x6e, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x65, 0x2c, 0x74, 0x68, 0x69, + 0x73, 0x29, 0x2c, 0x73, 0x3d, 0x72, 0x2e, 0x63, 0x61, 0x6c, 0x6c, + 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x6c, 0x2c, 0x69, 0x29, 0x2c, + 0x66, 0x3d, 0x75, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x2c, 0x73, 0x2c, 0x6c, 0x2c, 0x69, 0x29, 0x2c, 0x69, + 0x3d, 0x2d, 0x31, 0x2c, 0x68, 0x3d, 0x6c, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x2c, 0x67, 0x3d, 0x66, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x2d, 0x31, 0x2c, 0x70, 0x3d, 0x74, 0x3f, 0x31, + 0x3a, 0x31, 0x2f, 0x68, 0x3b, 0x2b, 0x2b, 0x69, 0x3c, 0x67, 0x3b, + 0x29, 0x6f, 0x3d, 0x63, 0x5b, 0x69, 0x5d, 0x3d, 0x5b, 0x5d, 0x2c, + 0x6f, 0x2e, 0x64, 0x78, 0x3d, 0x66, 0x5b, 0x69, 0x2b, 0x31, 0x5d, + 0x2d, 0x28, 0x6f, 0x2e, 0x78, 0x3d, 0x66, 0x5b, 0x69, 0x5d, 0x29, + 0x2c, 0x6f, 0x2e, 0x79, 0x3d, 0x30, 0x3b, 0x69, 0x66, 0x28, 0x67, + 0x3e, 0x30, 0x29, 0x66, 0x6f, 0x72, 0x28, 0x69, 0x3d, 0x2d, 0x31, + 0x3b, 0x2b, 0x2b, 0x69, 0x3c, 0x68, 0x3b, 0x29, 0x61, 0x3d, 0x6c, + 0x5b, 0x69, 0x5d, 0x2c, 0x61, 0x3e, 0x3d, 0x73, 0x5b, 0x30, 0x5d, + 0x26, 0x26, 0x61, 0x3c, 0x3d, 0x73, 0x5b, 0x31, 0x5d, 0x26, 0x26, + 0x28, 0x6f, 0x3d, 0x63, 0x5b, 0x74, 0x61, 0x2e, 0x62, 0x69, 0x73, + 0x65, 0x63, 0x74, 0x28, 0x66, 0x2c, 0x61, 0x2c, 0x31, 0x2c, 0x67, + 0x29, 0x2d, 0x31, 0x5d, 0x2c, 0x6f, 0x2e, 0x79, 0x2b, 0x3d, 0x70, + 0x2c, 0x6f, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x6e, 0x5b, 0x69, + 0x5d, 0x29, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x63, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x21, 0x30, 0x2c, + 0x65, 0x3d, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2c, 0x72, 0x3d, + 0x70, 0x69, 0x2c, 0x75, 0x3d, 0x68, 0x69, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3f, 0x28, 0x65, 0x3d, 0x74, 0x2c, 0x6e, 0x29, + 0x3a, 0x65, 0x7d, 0x2c, 0x6e, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3f, 0x28, 0x72, 0x3d, 0x45, 0x74, 0x28, 0x74, + 0x29, 0x2c, 0x6e, 0x29, 0x3a, 0x72, 0x7d, 0x2c, 0x6e, 0x2e, 0x62, + 0x69, 0x6e, 0x73, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x75, 0x3d, 0x22, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x3d, 0x3d, 0x74, 0x79, + 0x70, 0x65, 0x6f, 0x66, 0x20, 0x74, 0x3f, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x67, 0x69, 0x28, 0x6e, 0x2c, 0x74, 0x29, + 0x7d, 0x3a, 0x45, 0x74, 0x28, 0x74, 0x29, 0x2c, 0x6e, 0x29, 0x3a, + 0x75, 0x7d, 0x2c, 0x6e, 0x2e, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x79, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x74, 0x3d, 0x21, + 0x21, 0x65, 0x2c, 0x6e, 0x29, 0x3a, 0x74, 0x7d, 0x2c, 0x6e, 0x7d, + 0x2c, 0x74, 0x61, 0x2e, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x2e, + 0x70, 0x61, 0x63, 0x6b, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6e, 0x28, 0x6e, 0x2c, 0x69, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x6f, 0x3d, 0x65, 0x2e, 0x63, 0x61, 0x6c, 0x6c, + 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x6e, 0x2c, 0x69, 0x29, 0x2c, + 0x61, 0x3d, 0x6f, 0x5b, 0x30, 0x5d, 0x2c, 0x63, 0x3d, 0x75, 0x5b, + 0x30, 0x5d, 0x2c, 0x6c, 0x3d, 0x75, 0x5b, 0x31, 0x5d, 0x2c, 0x73, + 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x74, 0x3f, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x73, 0x71, 0x72, 0x74, 0x3a, 0x22, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3d, 0x3d, 0x74, 0x79, + 0x70, 0x65, 0x6f, 0x66, 0x20, 0x74, 0x3f, 0x74, 0x3a, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x7d, 0x3b, 0x69, 0x66, 0x28, + 0x61, 0x2e, 0x78, 0x3d, 0x61, 0x2e, 0x79, 0x3d, 0x30, 0x2c, 0x51, + 0x75, 0x28, 0x61, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x6e, 0x2e, 0x72, 0x3d, 0x2b, 0x73, + 0x28, 0x6e, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x7d, 0x29, + 0x2c, 0x51, 0x75, 0x28, 0x61, 0x2c, 0x4d, 0x69, 0x29, 0x2c, 0x72, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x66, 0x3d, 0x72, 0x2a, 0x28, + 0x74, 0x3f, 0x31, 0x3a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, + 0x78, 0x28, 0x32, 0x2a, 0x61, 0x2e, 0x72, 0x2f, 0x63, 0x2c, 0x32, + 0x2a, 0x61, 0x2e, 0x72, 0x2f, 0x6c, 0x29, 0x29, 0x2f, 0x32, 0x3b, + 0x51, 0x75, 0x28, 0x61, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x6e, 0x2e, 0x72, 0x2b, 0x3d, + 0x66, 0x7d, 0x29, 0x2c, 0x51, 0x75, 0x28, 0x61, 0x2c, 0x4d, 0x69, + 0x29, 0x2c, 0x51, 0x75, 0x28, 0x61, 0x2c, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x6e, 0x2e, 0x72, + 0x2d, 0x3d, 0x66, 0x7d, 0x29, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x5f, 0x69, 0x28, 0x61, 0x2c, 0x63, 0x2f, 0x32, 0x2c, + 0x6c, 0x2f, 0x32, 0x2c, 0x74, 0x3f, 0x31, 0x3a, 0x31, 0x2f, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x32, 0x2a, 0x61, + 0x2e, 0x72, 0x2f, 0x63, 0x2c, 0x32, 0x2a, 0x61, 0x2e, 0x72, 0x2f, + 0x6c, 0x29, 0x29, 0x2c, 0x6f, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x74, + 0x2c, 0x65, 0x3d, 0x74, 0x61, 0x2e, 0x6c, 0x61, 0x79, 0x6f, 0x75, + 0x74, 0x2e, 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, + 0x28, 0x29, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x28, 0x76, 0x69, 0x29, + 0x2c, 0x72, 0x3d, 0x30, 0x2c, 0x75, 0x3d, 0x5b, 0x31, 0x2c, 0x31, + 0x5d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, + 0x73, 0x69, 0x7a, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x75, 0x3d, + 0x74, 0x2c, 0x6e, 0x29, 0x3a, 0x75, 0x7d, 0x2c, 0x6e, 0x2e, 0x72, + 0x61, 0x64, 0x69, 0x75, 0x73, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x74, + 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x65, 0x7c, 0x7c, 0x22, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3d, 0x3d, + 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x65, 0x3f, 0x65, 0x3a, + 0x2b, 0x65, 0x2c, 0x6e, 0x29, 0x3a, 0x74, 0x7d, 0x2c, 0x6e, 0x2e, + 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, + 0x28, 0x72, 0x3d, 0x2b, 0x74, 0x2c, 0x6e, 0x29, 0x3a, 0x72, 0x7d, + 0x2c, 0x47, 0x75, 0x28, 0x6e, 0x2c, 0x65, 0x29, 0x7d, 0x2c, 0x74, + 0x61, 0x2e, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x2e, 0x74, 0x72, + 0x65, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6e, 0x28, 0x6e, 0x2c, 0x75, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x73, 0x3d, 0x6f, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2c, 0x6e, 0x2c, 0x75, 0x29, 0x2c, 0x66, 0x3d, + 0x73, 0x5b, 0x30, 0x5d, 0x2c, 0x68, 0x3d, 0x74, 0x28, 0x66, 0x29, + 0x3b, 0x69, 0x66, 0x28, 0x51, 0x75, 0x28, 0x68, 0x2c, 0x65, 0x29, + 0x2c, 0x68, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2e, 0x6d, + 0x3d, 0x2d, 0x68, 0x2e, 0x7a, 0x2c, 0x4b, 0x75, 0x28, 0x68, 0x2c, + 0x72, 0x29, 0x2c, 0x6c, 0x29, 0x4b, 0x75, 0x28, 0x66, 0x2c, 0x69, + 0x29, 0x3b, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x67, 0x3d, 0x66, 0x2c, 0x70, 0x3d, 0x66, 0x2c, 0x76, 0x3d, 0x66, + 0x3b, 0x4b, 0x75, 0x28, 0x66, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x6e, 0x2e, 0x78, 0x3c, + 0x67, 0x2e, 0x78, 0x26, 0x26, 0x28, 0x67, 0x3d, 0x6e, 0x29, 0x2c, + 0x6e, 0x2e, 0x78, 0x3e, 0x70, 0x2e, 0x78, 0x26, 0x26, 0x28, 0x70, + 0x3d, 0x6e, 0x29, 0x2c, 0x6e, 0x2e, 0x64, 0x65, 0x70, 0x74, 0x68, + 0x3e, 0x76, 0x2e, 0x64, 0x65, 0x70, 0x74, 0x68, 0x26, 0x26, 0x28, + 0x76, 0x3d, 0x6e, 0x29, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x64, 0x3d, 0x61, 0x28, 0x67, 0x2c, 0x70, 0x29, 0x2f, 0x32, 0x2d, + 0x67, 0x2e, 0x78, 0x2c, 0x6d, 0x3d, 0x63, 0x5b, 0x30, 0x5d, 0x2f, + 0x28, 0x70, 0x2e, 0x78, 0x2b, 0x61, 0x28, 0x70, 0x2c, 0x67, 0x29, + 0x2f, 0x32, 0x2b, 0x64, 0x29, 0x2c, 0x79, 0x3d, 0x63, 0x5b, 0x31, + 0x5d, 0x2f, 0x28, 0x76, 0x2e, 0x64, 0x65, 0x70, 0x74, 0x68, 0x7c, + 0x7c, 0x31, 0x29, 0x3b, 0x4b, 0x75, 0x28, 0x66, 0x2c, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x6e, + 0x2e, 0x78, 0x3d, 0x28, 0x6e, 0x2e, 0x78, 0x2b, 0x64, 0x29, 0x2a, + 0x6d, 0x2c, 0x6e, 0x2e, 0x79, 0x3d, 0x6e, 0x2e, 0x64, 0x65, 0x70, + 0x74, 0x68, 0x2a, 0x79, 0x7d, 0x29, 0x7d, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x73, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x74, 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x6f, 0x72, + 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x2c, 0x65, 0x3d, 0x7b, 0x41, + 0x3a, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x63, 0x68, 0x69, 0x6c, 0x64, + 0x72, 0x65, 0x6e, 0x3a, 0x5b, 0x6e, 0x5d, 0x7d, 0x2c, 0x72, 0x3d, + 0x5b, 0x65, 0x5d, 0x3b, 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, 0x28, + 0x74, 0x3d, 0x72, 0x2e, 0x70, 0x6f, 0x70, 0x28, 0x29, 0x29, 0x3b, + 0x29, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x75, 0x2c, + 0x69, 0x3d, 0x74, 0x2e, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, + 0x6e, 0x2c, 0x6f, 0x3d, 0x30, 0x2c, 0x61, 0x3d, 0x69, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x61, 0x3e, 0x6f, 0x3b, 0x2b, + 0x2b, 0x6f, 0x29, 0x72, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x28, + 0x69, 0x5b, 0x6f, 0x5d, 0x3d, 0x75, 0x3d, 0x7b, 0x5f, 0x3a, 0x69, + 0x5b, 0x6f, 0x5d, 0x2c, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3a, + 0x74, 0x2c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x3a, + 0x28, 0x75, 0x3d, 0x69, 0x5b, 0x6f, 0x5d, 0x2e, 0x63, 0x68, 0x69, + 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x29, 0x26, 0x26, 0x75, 0x2e, 0x73, + 0x6c, 0x69, 0x63, 0x65, 0x28, 0x29, 0x7c, 0x7c, 0x5b, 0x5d, 0x2c, + 0x41, 0x3a, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x61, 0x3a, 0x6e, 0x75, + 0x6c, 0x6c, 0x2c, 0x7a, 0x3a, 0x30, 0x2c, 0x6d, 0x3a, 0x30, 0x2c, + 0x63, 0x3a, 0x30, 0x2c, 0x73, 0x3a, 0x30, 0x2c, 0x74, 0x3a, 0x6e, + 0x75, 0x6c, 0x6c, 0x2c, 0x69, 0x3a, 0x6f, 0x7d, 0x29, 0x2e, 0x61, + 0x3d, 0x75, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x65, 0x2e, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x5b, + 0x30, 0x5d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x65, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, + 0x3d, 0x6e, 0x2e, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, + 0x2c, 0x65, 0x3d, 0x6e, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x2e, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x2c, 0x72, + 0x3d, 0x6e, 0x2e, 0x69, 0x3f, 0x65, 0x5b, 0x6e, 0x2e, 0x69, 0x2d, + 0x31, 0x5d, 0x3a, 0x6e, 0x75, 0x6c, 0x6c, 0x3b, 0x69, 0x66, 0x28, + 0x74, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x7b, 0x4e, + 0x69, 0x28, 0x6e, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, + 0x28, 0x74, 0x5b, 0x30, 0x5d, 0x2e, 0x7a, 0x2b, 0x74, 0x5b, 0x74, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, 0x5d, 0x2e, + 0x7a, 0x29, 0x2f, 0x32, 0x3b, 0x72, 0x3f, 0x28, 0x6e, 0x2e, 0x7a, + 0x3d, 0x72, 0x2e, 0x7a, 0x2b, 0x61, 0x28, 0x6e, 0x2e, 0x5f, 0x2c, + 0x72, 0x2e, 0x5f, 0x29, 0x2c, 0x6e, 0x2e, 0x6d, 0x3d, 0x6e, 0x2e, + 0x7a, 0x2d, 0x69, 0x29, 0x3a, 0x6e, 0x2e, 0x7a, 0x3d, 0x69, 0x7d, + 0x65, 0x6c, 0x73, 0x65, 0x20, 0x72, 0x26, 0x26, 0x28, 0x6e, 0x2e, + 0x7a, 0x3d, 0x72, 0x2e, 0x7a, 0x2b, 0x61, 0x28, 0x6e, 0x2e, 0x5f, + 0x2c, 0x72, 0x2e, 0x5f, 0x29, 0x29, 0x3b, 0x6e, 0x2e, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x3d, 0x75, 0x28, 0x6e, 0x2c, + 0x72, 0x2c, 0x6e, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2e, + 0x41, 0x7c, 0x7c, 0x65, 0x5b, 0x30, 0x5d, 0x29, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x28, 0x6e, 0x29, + 0x7b, 0x6e, 0x2e, 0x5f, 0x2e, 0x78, 0x3d, 0x6e, 0x2e, 0x7a, 0x2b, + 0x6e, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2e, 0x6d, 0x2c, + 0x6e, 0x2e, 0x6d, 0x2b, 0x3d, 0x6e, 0x2e, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x2e, 0x6d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x75, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, + 0x7b, 0x69, 0x66, 0x28, 0x74, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, + 0x76, 0x61, 0x72, 0x20, 0x72, 0x2c, 0x75, 0x3d, 0x6e, 0x2c, 0x69, + 0x3d, 0x6e, 0x2c, 0x6f, 0x3d, 0x74, 0x2c, 0x63, 0x3d, 0x75, 0x2e, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x68, 0x69, 0x6c, + 0x64, 0x72, 0x65, 0x6e, 0x5b, 0x30, 0x5d, 0x2c, 0x6c, 0x3d, 0x75, + 0x2e, 0x6d, 0x2c, 0x73, 0x3d, 0x69, 0x2e, 0x6d, 0x2c, 0x66, 0x3d, + 0x6f, 0x2e, 0x6d, 0x2c, 0x68, 0x3d, 0x63, 0x2e, 0x6d, 0x3b, 0x6f, + 0x3d, 0x45, 0x69, 0x28, 0x6f, 0x29, 0x2c, 0x75, 0x3d, 0x6b, 0x69, + 0x28, 0x75, 0x29, 0x2c, 0x6f, 0x26, 0x26, 0x75, 0x3b, 0x29, 0x63, + 0x3d, 0x6b, 0x69, 0x28, 0x63, 0x29, 0x2c, 0x69, 0x3d, 0x45, 0x69, + 0x28, 0x69, 0x29, 0x2c, 0x69, 0x2e, 0x61, 0x3d, 0x6e, 0x2c, 0x72, + 0x3d, 0x6f, 0x2e, 0x7a, 0x2b, 0x66, 0x2d, 0x75, 0x2e, 0x7a, 0x2d, + 0x6c, 0x2b, 0x61, 0x28, 0x6f, 0x2e, 0x5f, 0x2c, 0x75, 0x2e, 0x5f, + 0x29, 0x2c, 0x72, 0x3e, 0x30, 0x26, 0x26, 0x28, 0x41, 0x69, 0x28, + 0x43, 0x69, 0x28, 0x6f, 0x2c, 0x6e, 0x2c, 0x65, 0x29, 0x2c, 0x6e, + 0x2c, 0x72, 0x29, 0x2c, 0x6c, 0x2b, 0x3d, 0x72, 0x2c, 0x73, 0x2b, + 0x3d, 0x72, 0x29, 0x2c, 0x66, 0x2b, 0x3d, 0x6f, 0x2e, 0x6d, 0x2c, + 0x6c, 0x2b, 0x3d, 0x75, 0x2e, 0x6d, 0x2c, 0x68, 0x2b, 0x3d, 0x63, + 0x2e, 0x6d, 0x2c, 0x73, 0x2b, 0x3d, 0x69, 0x2e, 0x6d, 0x3b, 0x6f, + 0x26, 0x26, 0x21, 0x45, 0x69, 0x28, 0x69, 0x29, 0x26, 0x26, 0x28, + 0x69, 0x2e, 0x74, 0x3d, 0x6f, 0x2c, 0x69, 0x2e, 0x6d, 0x2b, 0x3d, + 0x66, 0x2d, 0x73, 0x29, 0x2c, 0x75, 0x26, 0x26, 0x21, 0x6b, 0x69, + 0x28, 0x63, 0x29, 0x26, 0x26, 0x28, 0x63, 0x2e, 0x74, 0x3d, 0x75, + 0x2c, 0x63, 0x2e, 0x6d, 0x2b, 0x3d, 0x6c, 0x2d, 0x68, 0x2c, 0x65, + 0x3d, 0x6e, 0x29, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x65, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x69, 0x28, 0x6e, 0x29, 0x7b, 0x6e, 0x2e, 0x78, 0x2a, 0x3d, 0x63, + 0x5b, 0x30, 0x5d, 0x2c, 0x6e, 0x2e, 0x79, 0x3d, 0x6e, 0x2e, 0x64, + 0x65, 0x70, 0x74, 0x68, 0x2a, 0x63, 0x5b, 0x31, 0x5d, 0x7d, 0x76, + 0x61, 0x72, 0x20, 0x6f, 0x3d, 0x74, 0x61, 0x2e, 0x6c, 0x61, 0x79, + 0x6f, 0x75, 0x74, 0x2e, 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, + 0x68, 0x79, 0x28, 0x29, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x28, 0x6e, + 0x75, 0x6c, 0x6c, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, + 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x2c, 0x61, 0x3d, 0x53, 0x69, 0x2c, + 0x63, 0x3d, 0x5b, 0x31, 0x2c, 0x31, 0x5d, 0x2c, 0x6c, 0x3d, 0x6e, + 0x75, 0x6c, 0x6c, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x2e, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x61, 0x3d, 0x74, 0x2c, 0x6e, + 0x29, 0x3a, 0x61, 0x7d, 0x2c, 0x6e, 0x2e, 0x73, 0x69, 0x7a, 0x65, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3f, 0x28, 0x6c, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, + 0x3d, 0x3d, 0x28, 0x63, 0x3d, 0x74, 0x29, 0x3f, 0x69, 0x3a, 0x6e, + 0x75, 0x6c, 0x6c, 0x2c, 0x6e, 0x29, 0x3a, 0x6c, 0x3f, 0x6e, 0x75, + 0x6c, 0x6c, 0x3a, 0x63, 0x7d, 0x2c, 0x6e, 0x2e, 0x6e, 0x6f, 0x64, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x6c, + 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x28, 0x63, 0x3d, 0x74, + 0x29, 0x3f, 0x6e, 0x75, 0x6c, 0x6c, 0x3a, 0x69, 0x2c, 0x6e, 0x29, + 0x3a, 0x6c, 0x3f, 0x63, 0x3a, 0x6e, 0x75, 0x6c, 0x6c, 0x7d, 0x2c, + 0x47, 0x75, 0x28, 0x6e, 0x2c, 0x6f, 0x29, 0x7d, 0x2c, 0x74, 0x61, + 0x2e, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x2e, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6e, 0x28, 0x6e, 0x2c, 0x69, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x6f, 0x2c, 0x61, 0x3d, 0x74, 0x2e, 0x63, 0x61, + 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x6e, 0x2c, 0x69, + 0x29, 0x2c, 0x63, 0x3d, 0x61, 0x5b, 0x30, 0x5d, 0x2c, 0x6c, 0x3d, + 0x30, 0x3b, 0x51, 0x75, 0x28, 0x63, 0x2c, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x74, 0x3d, 0x6e, 0x2e, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, + 0x65, 0x6e, 0x3b, 0x74, 0x26, 0x26, 0x74, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3f, 0x28, 0x6e, 0x2e, 0x78, 0x3d, 0x71, 0x69, + 0x28, 0x74, 0x29, 0x2c, 0x6e, 0x2e, 0x79, 0x3d, 0x7a, 0x69, 0x28, + 0x74, 0x29, 0x29, 0x3a, 0x28, 0x6e, 0x2e, 0x78, 0x3d, 0x6f, 0x3f, + 0x6c, 0x2b, 0x3d, 0x65, 0x28, 0x6e, 0x2c, 0x6f, 0x29, 0x3a, 0x30, + 0x2c, 0x6e, 0x2e, 0x79, 0x3d, 0x30, 0x2c, 0x6f, 0x3d, 0x6e, 0x29, + 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x73, 0x3d, 0x4c, 0x69, + 0x28, 0x63, 0x29, 0x2c, 0x66, 0x3d, 0x54, 0x69, 0x28, 0x63, 0x29, + 0x2c, 0x68, 0x3d, 0x73, 0x2e, 0x78, 0x2d, 0x65, 0x28, 0x73, 0x2c, + 0x66, 0x29, 0x2f, 0x32, 0x2c, 0x67, 0x3d, 0x66, 0x2e, 0x78, 0x2b, + 0x65, 0x28, 0x66, 0x2c, 0x73, 0x29, 0x2f, 0x32, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x51, 0x75, 0x28, 0x63, 0x2c, 0x75, + 0x3f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x29, 0x7b, 0x6e, 0x2e, 0x78, 0x3d, 0x28, 0x6e, 0x2e, 0x78, 0x2d, + 0x63, 0x2e, 0x78, 0x29, 0x2a, 0x72, 0x5b, 0x30, 0x5d, 0x2c, 0x6e, + 0x2e, 0x79, 0x3d, 0x28, 0x63, 0x2e, 0x79, 0x2d, 0x6e, 0x2e, 0x79, + 0x29, 0x2a, 0x72, 0x5b, 0x31, 0x5d, 0x7d, 0x3a, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x6e, 0x2e, + 0x78, 0x3d, 0x28, 0x6e, 0x2e, 0x78, 0x2d, 0x68, 0x29, 0x2f, 0x28, + 0x67, 0x2d, 0x68, 0x29, 0x2a, 0x72, 0x5b, 0x30, 0x5d, 0x2c, 0x6e, + 0x2e, 0x79, 0x3d, 0x28, 0x31, 0x2d, 0x28, 0x63, 0x2e, 0x79, 0x3f, + 0x6e, 0x2e, 0x79, 0x2f, 0x63, 0x2e, 0x79, 0x3a, 0x31, 0x29, 0x29, + 0x2a, 0x72, 0x5b, 0x31, 0x5d, 0x7d, 0x29, 0x2c, 0x61, 0x7d, 0x76, + 0x61, 0x72, 0x20, 0x74, 0x3d, 0x74, 0x61, 0x2e, 0x6c, 0x61, 0x79, + 0x6f, 0x75, 0x74, 0x2e, 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, + 0x68, 0x79, 0x28, 0x29, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x28, 0x6e, + 0x75, 0x6c, 0x6c, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, + 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x2c, 0x65, 0x3d, 0x53, 0x69, 0x2c, + 0x72, 0x3d, 0x5b, 0x31, 0x2c, 0x31, 0x5d, 0x2c, 0x75, 0x3d, 0x21, + 0x31, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, + 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3f, 0x28, 0x65, 0x3d, 0x74, 0x2c, 0x6e, 0x29, 0x3a, + 0x65, 0x7d, 0x2c, 0x6e, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3f, 0x28, 0x75, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, + 0x28, 0x72, 0x3d, 0x74, 0x29, 0x2c, 0x6e, 0x29, 0x3a, 0x75, 0x3f, + 0x6e, 0x75, 0x6c, 0x6c, 0x3a, 0x72, 0x7d, 0x2c, 0x6e, 0x2e, 0x6e, + 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, + 0x28, 0x75, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, 0x28, 0x72, + 0x3d, 0x74, 0x29, 0x2c, 0x6e, 0x29, 0x3a, 0x75, 0x3f, 0x72, 0x3a, + 0x6e, 0x75, 0x6c, 0x6c, 0x7d, 0x2c, 0x47, 0x75, 0x28, 0x6e, 0x2c, + 0x74, 0x29, 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x6c, 0x61, 0x79, 0x6f, + 0x75, 0x74, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x6d, 0x61, 0x70, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x28, + 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, + 0x72, 0x20, 0x65, 0x2c, 0x72, 0x2c, 0x75, 0x3d, 0x2d, 0x31, 0x2c, + 0x69, 0x3d, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, + 0x2b, 0x2b, 0x75, 0x3c, 0x69, 0x3b, 0x29, 0x72, 0x3d, 0x28, 0x65, + 0x3d, 0x6e, 0x5b, 0x75, 0x5d, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x2a, 0x28, 0x30, 0x3e, 0x74, 0x3f, 0x30, 0x3a, 0x74, 0x29, + 0x2c, 0x65, 0x2e, 0x61, 0x72, 0x65, 0x61, 0x3d, 0x69, 0x73, 0x4e, + 0x61, 0x4e, 0x28, 0x72, 0x29, 0x7c, 0x7c, 0x30, 0x3e, 0x3d, 0x72, + 0x3f, 0x30, 0x3a, 0x72, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x74, 0x28, 0x65, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x69, 0x3d, 0x65, 0x2e, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, + 0x65, 0x6e, 0x3b, 0x69, 0x66, 0x28, 0x69, 0x26, 0x26, 0x69, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x6f, 0x2c, 0x61, 0x2c, 0x63, 0x2c, 0x6c, 0x3d, 0x66, 0x28, + 0x65, 0x29, 0x2c, 0x73, 0x3d, 0x5b, 0x5d, 0x2c, 0x68, 0x3d, 0x69, + 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x29, 0x2c, 0x70, 0x3d, + 0x31, 0x2f, 0x30, 0x2c, 0x76, 0x3d, 0x22, 0x73, 0x6c, 0x69, 0x63, + 0x65, 0x22, 0x3d, 0x3d, 0x3d, 0x67, 0x3f, 0x6c, 0x2e, 0x64, 0x78, + 0x3a, 0x22, 0x64, 0x69, 0x63, 0x65, 0x22, 0x3d, 0x3d, 0x3d, 0x67, + 0x3f, 0x6c, 0x2e, 0x64, 0x79, 0x3a, 0x22, 0x73, 0x6c, 0x69, 0x63, + 0x65, 0x2d, 0x64, 0x69, 0x63, 0x65, 0x22, 0x3d, 0x3d, 0x3d, 0x67, + 0x3f, 0x31, 0x26, 0x65, 0x2e, 0x64, 0x65, 0x70, 0x74, 0x68, 0x3f, + 0x6c, 0x2e, 0x64, 0x79, 0x3a, 0x6c, 0x2e, 0x64, 0x78, 0x3a, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x6c, 0x2e, 0x64, + 0x78, 0x2c, 0x6c, 0x2e, 0x64, 0x79, 0x29, 0x3b, 0x66, 0x6f, 0x72, + 0x28, 0x6e, 0x28, 0x68, 0x2c, 0x6c, 0x2e, 0x64, 0x78, 0x2a, 0x6c, + 0x2e, 0x64, 0x79, 0x2f, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x29, 0x2c, 0x73, 0x2e, 0x61, 0x72, 0x65, 0x61, 0x3d, 0x30, 0x3b, + 0x28, 0x63, 0x3d, 0x68, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x29, 0x3e, 0x30, 0x3b, 0x29, 0x73, 0x2e, 0x70, 0x75, 0x73, 0x68, + 0x28, 0x6f, 0x3d, 0x68, 0x5b, 0x63, 0x2d, 0x31, 0x5d, 0x29, 0x2c, + 0x73, 0x2e, 0x61, 0x72, 0x65, 0x61, 0x2b, 0x3d, 0x6f, 0x2e, 0x61, + 0x72, 0x65, 0x61, 0x2c, 0x22, 0x73, 0x71, 0x75, 0x61, 0x72, 0x69, + 0x66, 0x79, 0x22, 0x21, 0x3d, 0x3d, 0x67, 0x7c, 0x7c, 0x28, 0x61, + 0x3d, 0x72, 0x28, 0x73, 0x2c, 0x76, 0x29, 0x29, 0x3c, 0x3d, 0x70, + 0x3f, 0x28, 0x68, 0x2e, 0x70, 0x6f, 0x70, 0x28, 0x29, 0x2c, 0x70, + 0x3d, 0x61, 0x29, 0x3a, 0x28, 0x73, 0x2e, 0x61, 0x72, 0x65, 0x61, + 0x2d, 0x3d, 0x73, 0x2e, 0x70, 0x6f, 0x70, 0x28, 0x29, 0x2e, 0x61, + 0x72, 0x65, 0x61, 0x2c, 0x75, 0x28, 0x73, 0x2c, 0x76, 0x2c, 0x6c, + 0x2c, 0x21, 0x31, 0x29, 0x2c, 0x76, 0x3d, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x6c, 0x2e, 0x64, 0x78, 0x2c, 0x6c, + 0x2e, 0x64, 0x79, 0x29, 0x2c, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3d, 0x73, 0x2e, 0x61, 0x72, 0x65, 0x61, 0x3d, 0x30, + 0x2c, 0x70, 0x3d, 0x31, 0x2f, 0x30, 0x29, 0x3b, 0x73, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x26, 0x26, 0x28, 0x75, 0x28, 0x73, + 0x2c, 0x76, 0x2c, 0x6c, 0x2c, 0x21, 0x30, 0x29, 0x2c, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3d, 0x73, 0x2e, 0x61, 0x72, + 0x65, 0x61, 0x3d, 0x30, 0x29, 0x2c, 0x69, 0x2e, 0x66, 0x6f, 0x72, + 0x45, 0x61, 0x63, 0x68, 0x28, 0x74, 0x29, 0x7d, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x28, 0x74, 0x29, + 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x74, 0x2e, 0x63, 0x68, + 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x3b, 0x69, 0x66, 0x28, 0x72, + 0x26, 0x26, 0x72, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, + 0x7b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x2c, 0x6f, 0x3d, 0x66, 0x28, + 0x74, 0x29, 0x2c, 0x61, 0x3d, 0x72, 0x2e, 0x73, 0x6c, 0x69, 0x63, + 0x65, 0x28, 0x29, 0x2c, 0x63, 0x3d, 0x5b, 0x5d, 0x3b, 0x66, 0x6f, + 0x72, 0x28, 0x6e, 0x28, 0x61, 0x2c, 0x6f, 0x2e, 0x64, 0x78, 0x2a, + 0x6f, 0x2e, 0x64, 0x79, 0x2f, 0x74, 0x2e, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x29, 0x2c, 0x63, 0x2e, 0x61, 0x72, 0x65, 0x61, 0x3d, 0x30, + 0x3b, 0x69, 0x3d, 0x61, 0x2e, 0x70, 0x6f, 0x70, 0x28, 0x29, 0x3b, + 0x29, 0x63, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x69, 0x29, 0x2c, + 0x63, 0x2e, 0x61, 0x72, 0x65, 0x61, 0x2b, 0x3d, 0x69, 0x2e, 0x61, + 0x72, 0x65, 0x61, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, 0x69, + 0x2e, 0x7a, 0x26, 0x26, 0x28, 0x75, 0x28, 0x63, 0x2c, 0x69, 0x2e, + 0x7a, 0x3f, 0x6f, 0x2e, 0x64, 0x78, 0x3a, 0x6f, 0x2e, 0x64, 0x79, + 0x2c, 0x6f, 0x2c, 0x21, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x29, 0x2c, 0x63, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3d, 0x63, 0x2e, 0x61, 0x72, 0x65, 0x61, 0x3d, 0x30, 0x29, 0x3b, + 0x72, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x65, + 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x72, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x66, 0x6f, 0x72, + 0x28, 0x76, 0x61, 0x72, 0x20, 0x65, 0x2c, 0x72, 0x3d, 0x6e, 0x2e, + 0x61, 0x72, 0x65, 0x61, 0x2c, 0x75, 0x3d, 0x30, 0x2c, 0x69, 0x3d, + 0x31, 0x2f, 0x30, 0x2c, 0x6f, 0x3d, 0x2d, 0x31, 0x2c, 0x61, 0x3d, + 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x2b, 0x2b, + 0x6f, 0x3c, 0x61, 0x3b, 0x29, 0x28, 0x65, 0x3d, 0x6e, 0x5b, 0x6f, + 0x5d, 0x2e, 0x61, 0x72, 0x65, 0x61, 0x29, 0x26, 0x26, 0x28, 0x69, + 0x3e, 0x65, 0x26, 0x26, 0x28, 0x69, 0x3d, 0x65, 0x29, 0x2c, 0x65, + 0x3e, 0x75, 0x26, 0x26, 0x28, 0x75, 0x3d, 0x65, 0x29, 0x29, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x2a, 0x3d, 0x72, + 0x2c, 0x74, 0x2a, 0x3d, 0x74, 0x2c, 0x72, 0x3f, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x74, 0x2a, 0x75, 0x2a, 0x70, + 0x2f, 0x72, 0x2c, 0x72, 0x2f, 0x28, 0x74, 0x2a, 0x69, 0x2a, 0x70, + 0x29, 0x29, 0x3a, 0x31, 0x2f, 0x30, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x28, 0x6e, 0x2c, 0x74, 0x2c, + 0x65, 0x2c, 0x72, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x75, 0x2c, + 0x69, 0x3d, 0x2d, 0x31, 0x2c, 0x6f, 0x3d, 0x6e, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x61, 0x3d, 0x65, 0x2e, 0x78, 0x2c, + 0x6c, 0x3d, 0x65, 0x2e, 0x79, 0x2c, 0x73, 0x3d, 0x74, 0x3f, 0x63, + 0x28, 0x6e, 0x2e, 0x61, 0x72, 0x65, 0x61, 0x2f, 0x74, 0x29, 0x3a, + 0x30, 0x3b, 0x69, 0x66, 0x28, 0x74, 0x3d, 0x3d, 0x65, 0x2e, 0x64, + 0x78, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x28, 0x72, 0x7c, 0x7c, + 0x73, 0x3e, 0x65, 0x2e, 0x64, 0x79, 0x29, 0x26, 0x26, 0x28, 0x73, + 0x3d, 0x65, 0x2e, 0x64, 0x79, 0x29, 0x3b, 0x2b, 0x2b, 0x69, 0x3c, + 0x6f, 0x3b, 0x29, 0x75, 0x3d, 0x6e, 0x5b, 0x69, 0x5d, 0x2c, 0x75, + 0x2e, 0x78, 0x3d, 0x61, 0x2c, 0x75, 0x2e, 0x79, 0x3d, 0x6c, 0x2c, + 0x75, 0x2e, 0x64, 0x79, 0x3d, 0x73, 0x2c, 0x61, 0x2b, 0x3d, 0x75, + 0x2e, 0x64, 0x78, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x69, + 0x6e, 0x28, 0x65, 0x2e, 0x78, 0x2b, 0x65, 0x2e, 0x64, 0x78, 0x2d, + 0x61, 0x2c, 0x73, 0x3f, 0x63, 0x28, 0x75, 0x2e, 0x61, 0x72, 0x65, + 0x61, 0x2f, 0x73, 0x29, 0x3a, 0x30, 0x29, 0x3b, 0x75, 0x2e, 0x7a, + 0x3d, 0x21, 0x30, 0x2c, 0x75, 0x2e, 0x64, 0x78, 0x2b, 0x3d, 0x65, + 0x2e, 0x78, 0x2b, 0x65, 0x2e, 0x64, 0x78, 0x2d, 0x61, 0x2c, 0x65, + 0x2e, 0x79, 0x2b, 0x3d, 0x73, 0x2c, 0x65, 0x2e, 0x64, 0x79, 0x2d, + 0x3d, 0x73, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x66, 0x6f, 0x72, + 0x28, 0x28, 0x72, 0x7c, 0x7c, 0x73, 0x3e, 0x65, 0x2e, 0x64, 0x78, + 0x29, 0x26, 0x26, 0x28, 0x73, 0x3d, 0x65, 0x2e, 0x64, 0x78, 0x29, + 0x3b, 0x2b, 0x2b, 0x69, 0x3c, 0x6f, 0x3b, 0x29, 0x75, 0x3d, 0x6e, + 0x5b, 0x69, 0x5d, 0x2c, 0x75, 0x2e, 0x78, 0x3d, 0x61, 0x2c, 0x75, + 0x2e, 0x79, 0x3d, 0x6c, 0x2c, 0x75, 0x2e, 0x64, 0x78, 0x3d, 0x73, + 0x2c, 0x6c, 0x2b, 0x3d, 0x75, 0x2e, 0x64, 0x79, 0x3d, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x65, 0x2e, 0x79, 0x2b, + 0x65, 0x2e, 0x64, 0x79, 0x2d, 0x6c, 0x2c, 0x73, 0x3f, 0x63, 0x28, + 0x75, 0x2e, 0x61, 0x72, 0x65, 0x61, 0x2f, 0x73, 0x29, 0x3a, 0x30, + 0x29, 0x3b, 0x75, 0x2e, 0x7a, 0x3d, 0x21, 0x31, 0x2c, 0x75, 0x2e, + 0x64, 0x79, 0x2b, 0x3d, 0x65, 0x2e, 0x79, 0x2b, 0x65, 0x2e, 0x64, + 0x79, 0x2d, 0x6c, 0x2c, 0x65, 0x2e, 0x78, 0x2b, 0x3d, 0x73, 0x2c, + 0x65, 0x2e, 0x64, 0x78, 0x2d, 0x3d, 0x73, 0x7d, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x28, 0x72, 0x29, + 0x7b, 0x76, 0x61, 0x72, 0x20, 0x75, 0x3d, 0x6f, 0x7c, 0x7c, 0x61, + 0x28, 0x72, 0x29, 0x2c, 0x69, 0x3d, 0x75, 0x5b, 0x30, 0x5d, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x2e, 0x78, 0x3d, + 0x30, 0x2c, 0x69, 0x2e, 0x79, 0x3d, 0x30, 0x2c, 0x69, 0x2e, 0x64, + 0x78, 0x3d, 0x6c, 0x5b, 0x30, 0x5d, 0x2c, 0x69, 0x2e, 0x64, 0x79, + 0x3d, 0x6c, 0x5b, 0x31, 0x5d, 0x2c, 0x6f, 0x26, 0x26, 0x61, 0x2e, + 0x72, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x69, 0x29, 0x2c, + 0x6e, 0x28, 0x5b, 0x69, 0x5d, 0x2c, 0x69, 0x2e, 0x64, 0x78, 0x2a, + 0x69, 0x2e, 0x64, 0x79, 0x2f, 0x69, 0x2e, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x29, 0x2c, 0x28, 0x6f, 0x3f, 0x65, 0x3a, 0x74, 0x29, 0x28, + 0x69, 0x29, 0x2c, 0x68, 0x26, 0x26, 0x28, 0x6f, 0x3d, 0x75, 0x29, + 0x2c, 0x75, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x6f, 0x2c, 0x61, 0x3d, + 0x74, 0x61, 0x2e, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x2e, 0x68, + 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x28, 0x29, 0x2c, + 0x63, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x2c, 0x6c, 0x3d, 0x5b, 0x31, 0x2c, 0x31, 0x5d, 0x2c, 0x73, + 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x66, 0x3d, 0x52, 0x69, 0x2c, + 0x68, 0x3d, 0x21, 0x31, 0x2c, 0x67, 0x3d, 0x22, 0x73, 0x71, 0x75, + 0x61, 0x72, 0x69, 0x66, 0x79, 0x22, 0x2c, 0x70, 0x3d, 0x2e, 0x35, + 0x2a, 0x28, 0x31, 0x2b, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x71, + 0x72, 0x74, 0x28, 0x35, 0x29, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x69, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3f, 0x28, 0x6c, 0x3d, 0x6e, 0x2c, 0x69, 0x29, 0x3a, 0x6c, + 0x7d, 0x2c, 0x69, 0x2e, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x74, 0x28, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, + 0x6e, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x69, 0x2c, 0x74, 0x2c, + 0x74, 0x2e, 0x64, 0x65, 0x70, 0x74, 0x68, 0x29, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, + 0x65, 0x3f, 0x52, 0x69, 0x28, 0x74, 0x29, 0x3a, 0x44, 0x69, 0x28, + 0x74, 0x2c, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x3d, + 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x65, 0x3f, 0x5b, + 0x65, 0x2c, 0x65, 0x2c, 0x65, 0x2c, 0x65, 0x5d, 0x3a, 0x65, 0x29, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, + 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x44, 0x69, 0x28, 0x74, 0x2c, 0x6e, 0x29, 0x7d, 0x69, 0x66, 0x28, + 0x21, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x73, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x3d, 0x6e, 0x75, + 0x6c, 0x6c, 0x3d, 0x3d, 0x28, 0x73, 0x3d, 0x6e, 0x29, 0x3f, 0x52, + 0x69, 0x3a, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3d, 0x3d, 0x28, 0x72, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, + 0x66, 0x20, 0x6e, 0x29, 0x3f, 0x74, 0x3a, 0x22, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x22, 0x3d, 0x3d, 0x3d, 0x72, 0x3f, 0x28, 0x6e, + 0x3d, 0x5b, 0x6e, 0x2c, 0x6e, 0x2c, 0x6e, 0x2c, 0x6e, 0x5d, 0x2c, + 0x65, 0x29, 0x3a, 0x65, 0x2c, 0x69, 0x7d, 0x2c, 0x69, 0x2e, 0x72, + 0x6f, 0x75, 0x6e, 0x64, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x63, 0x3d, + 0x6e, 0x3f, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x3a, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2c, 0x69, 0x29, + 0x3a, 0x63, 0x21, 0x3d, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x7d, + 0x2c, 0x69, 0x2e, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x79, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3f, 0x28, 0x68, 0x3d, 0x6e, 0x2c, 0x6f, 0x3d, 0x6e, 0x75, + 0x6c, 0x6c, 0x2c, 0x69, 0x29, 0x3a, 0x68, 0x7d, 0x2c, 0x69, 0x2e, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x70, + 0x3d, 0x6e, 0x2c, 0x69, 0x29, 0x3a, 0x70, 0x7d, 0x2c, 0x69, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x67, 0x3d, + 0x6e, 0x2b, 0x22, 0x22, 0x2c, 0x69, 0x29, 0x3a, 0x67, 0x7d, 0x2c, + 0x47, 0x75, 0x28, 0x69, 0x2c, 0x61, 0x29, 0x7d, 0x2c, 0x74, 0x61, + 0x2e, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x3d, 0x7b, 0x6e, 0x6f, + 0x72, 0x6d, 0x61, 0x6c, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x65, 0x3d, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x32, 0x3e, 0x65, 0x26, 0x26, 0x28, + 0x74, 0x3d, 0x31, 0x29, 0x2c, 0x31, 0x3e, 0x65, 0x26, 0x26, 0x28, + 0x6e, 0x3d, 0x30, 0x29, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x2c, + 0x72, 0x2c, 0x75, 0x3b, 0x64, 0x6f, 0x20, 0x65, 0x3d, 0x32, 0x2a, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, + 0x28, 0x29, 0x2d, 0x31, 0x2c, 0x72, 0x3d, 0x32, 0x2a, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x28, 0x29, + 0x2d, 0x31, 0x2c, 0x75, 0x3d, 0x65, 0x2a, 0x65, 0x2b, 0x72, 0x2a, + 0x72, 0x3b, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x21, 0x75, 0x7c, + 0x7c, 0x75, 0x3e, 0x31, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x2b, 0x74, 0x2a, 0x65, 0x2a, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x73, 0x71, 0x72, 0x74, 0x28, 0x2d, 0x32, 0x2a, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x75, 0x29, 0x2f, + 0x75, 0x29, 0x7d, 0x7d, 0x2c, 0x6c, 0x6f, 0x67, 0x4e, 0x6f, 0x72, + 0x6d, 0x61, 0x6c, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6e, 0x3d, 0x74, + 0x61, 0x2e, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x2e, 0x6e, 0x6f, + 0x72, 0x6d, 0x61, 0x6c, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, + 0x74, 0x61, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x65, 0x78, 0x70, 0x28, 0x6e, 0x28, 0x29, 0x29, 0x7d, 0x7d, 0x2c, + 0x62, 0x61, 0x74, 0x65, 0x73, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x74, 0x3d, 0x74, 0x61, 0x2e, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, + 0x2e, 0x69, 0x72, 0x77, 0x69, 0x6e, 0x48, 0x61, 0x6c, 0x6c, 0x28, + 0x6e, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x28, 0x29, 0x2f, 0x6e, + 0x7d, 0x7d, 0x2c, 0x69, 0x72, 0x77, 0x69, 0x6e, 0x48, 0x61, 0x6c, + 0x6c, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x66, + 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x30, 0x2c, + 0x65, 0x3d, 0x30, 0x3b, 0x6e, 0x3e, 0x65, 0x3b, 0x65, 0x2b, 0x2b, + 0x29, 0x74, 0x2b, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x61, + 0x6e, 0x64, 0x6f, 0x6d, 0x28, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x74, 0x7d, 0x7d, 0x7d, 0x2c, 0x74, 0x61, 0x2e, + 0x73, 0x63, 0x61, 0x6c, 0x65, 0x3d, 0x7b, 0x7d, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x6d, 0x6c, 0x3d, 0x7b, 0x66, 0x6c, 0x6f, 0x6f, 0x72, + 0x3a, 0x79, 0x2c, 0x63, 0x65, 0x69, 0x6c, 0x3a, 0x79, 0x7d, 0x3b, + 0x74, 0x61, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x6c, 0x69, + 0x6e, 0x65, 0x61, 0x72, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x49, 0x69, 0x28, 0x5b, 0x30, 0x2c, 0x31, 0x5d, 0x2c, 0x5b, + 0x30, 0x2c, 0x31, 0x5d, 0x2c, 0x6d, 0x75, 0x2c, 0x21, 0x31, 0x29, + 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x79, 0x6c, 0x3d, 0x7b, 0x73, + 0x3a, 0x31, 0x2c, 0x67, 0x3a, 0x31, 0x2c, 0x70, 0x3a, 0x31, 0x2c, + 0x72, 0x3a, 0x31, 0x2c, 0x65, 0x3a, 0x31, 0x7d, 0x3b, 0x74, 0x61, + 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4a, 0x69, 0x28, 0x74, + 0x61, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x6c, 0x69, 0x6e, + 0x65, 0x61, 0x72, 0x28, 0x29, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x28, 0x5b, 0x30, 0x2c, 0x31, 0x5d, 0x29, 0x2c, 0x31, 0x30, + 0x2c, 0x21, 0x30, 0x2c, 0x5b, 0x31, 0x2c, 0x31, 0x30, 0x5d, 0x29, + 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x4d, 0x6c, 0x3d, 0x74, 0x61, + 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x2e, 0x30, + 0x65, 0x22, 0x29, 0x2c, 0x78, 0x6c, 0x3d, 0x7b, 0x66, 0x6c, 0x6f, + 0x6f, 0x72, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x2d, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x65, 0x69, 0x6c, 0x28, 0x2d, + 0x6e, 0x29, 0x7d, 0x2c, 0x63, 0x65, 0x69, 0x6c, 0x3a, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x2d, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x2d, 0x6e, 0x29, 0x7d, 0x7d, + 0x3b, 0x74, 0x61, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x70, + 0x6f, 0x77, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x47, + 0x69, 0x28, 0x74, 0x61, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, + 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x28, 0x29, 0x2c, 0x31, 0x2c, + 0x5b, 0x30, 0x2c, 0x31, 0x5d, 0x29, 0x7d, 0x2c, 0x74, 0x61, 0x2e, + 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x73, 0x71, 0x72, 0x74, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x2e, 0x73, + 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x70, 0x6f, 0x77, 0x28, 0x29, 0x2e, + 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x28, 0x2e, 0x35, + 0x29, 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, + 0x2e, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x51, 0x69, 0x28, 0x5b, 0x5d, 0x2c, + 0x7b, 0x74, 0x3a, 0x22, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x2c, + 0x61, 0x3a, 0x5b, 0x5b, 0x5d, 0x5d, 0x7d, 0x29, 0x7d, 0x2c, 0x74, + 0x61, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x63, 0x61, 0x74, + 0x65, 0x67, 0x6f, 0x72, 0x79, 0x31, 0x30, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x2e, 0x73, 0x63, 0x61, 0x6c, + 0x65, 0x2e, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x28, 0x29, + 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x28, 0x62, 0x6c, 0x29, 0x7d, + 0x2c, 0x74, 0x61, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x63, + 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x32, 0x30, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x2e, 0x73, 0x63, + 0x61, 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, + 0x28, 0x29, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x28, 0x5f, 0x6c, + 0x29, 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, + 0x2e, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x32, 0x30, + 0x62, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, + 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x64, 0x69, + 0x6e, 0x61, 0x6c, 0x28, 0x29, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, + 0x28, 0x77, 0x6c, 0x29, 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x73, 0x63, + 0x61, 0x6c, 0x65, 0x2e, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, + 0x79, 0x32, 0x30, 0x63, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x61, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x6f, + 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x28, 0x29, 0x2e, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x28, 0x53, 0x6c, 0x29, 0x7d, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x62, 0x6c, 0x3d, 0x5b, 0x32, 0x30, 0x36, 0x32, 0x32, + 0x36, 0x30, 0x2c, 0x31, 0x36, 0x37, 0x34, 0x34, 0x32, 0x30, 0x36, + 0x2c, 0x32, 0x39, 0x32, 0x34, 0x35, 0x38, 0x38, 0x2c, 0x31, 0x34, + 0x30, 0x33, 0x34, 0x37, 0x32, 0x38, 0x2c, 0x39, 0x37, 0x32, 0x35, + 0x38, 0x38, 0x35, 0x2c, 0x39, 0x31, 0x39, 0x37, 0x31, 0x33, 0x31, + 0x2c, 0x31, 0x34, 0x39, 0x30, 0x37, 0x33, 0x33, 0x30, 0x2c, 0x38, + 0x33, 0x35, 0x35, 0x37, 0x31, 0x31, 0x2c, 0x31, 0x32, 0x33, 0x36, + 0x39, 0x31, 0x38, 0x36, 0x2c, 0x31, 0x35, 0x35, 0x36, 0x31, 0x37, + 0x35, 0x5d, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x4d, 0x74, 0x29, 0x2c, + 0x5f, 0x6c, 0x3d, 0x5b, 0x32, 0x30, 0x36, 0x32, 0x32, 0x36, 0x30, + 0x2c, 0x31, 0x31, 0x34, 0x35, 0x34, 0x34, 0x34, 0x30, 0x2c, 0x31, + 0x36, 0x37, 0x34, 0x34, 0x32, 0x30, 0x36, 0x2c, 0x31, 0x36, 0x37, + 0x35, 0x39, 0x36, 0x37, 0x32, 0x2c, 0x32, 0x39, 0x32, 0x34, 0x35, + 0x38, 0x38, 0x2c, 0x31, 0x30, 0x30, 0x31, 0x38, 0x36, 0x39, 0x38, + 0x2c, 0x31, 0x34, 0x30, 0x33, 0x34, 0x37, 0x32, 0x38, 0x2c, 0x31, + 0x36, 0x37, 0x35, 0x30, 0x37, 0x34, 0x32, 0x2c, 0x39, 0x37, 0x32, + 0x35, 0x38, 0x38, 0x35, 0x2c, 0x31, 0x32, 0x39, 0x35, 0x35, 0x38, + 0x36, 0x31, 0x2c, 0x39, 0x31, 0x39, 0x37, 0x31, 0x33, 0x31, 0x2c, + 0x31, 0x32, 0x38, 0x38, 0x35, 0x31, 0x34, 0x30, 0x2c, 0x31, 0x34, + 0x39, 0x30, 0x37, 0x33, 0x33, 0x30, 0x2c, 0x31, 0x36, 0x32, 0x33, + 0x34, 0x31, 0x39, 0x34, 0x2c, 0x38, 0x33, 0x35, 0x35, 0x37, 0x31, + 0x31, 0x2c, 0x31, 0x33, 0x30, 0x39, 0x32, 0x38, 0x30, 0x37, 0x2c, + 0x31, 0x32, 0x33, 0x36, 0x39, 0x31, 0x38, 0x36, 0x2c, 0x31, 0x34, + 0x34, 0x30, 0x38, 0x35, 0x38, 0x39, 0x2c, 0x31, 0x35, 0x35, 0x36, + 0x31, 0x37, 0x35, 0x2c, 0x31, 0x30, 0x34, 0x31, 0x30, 0x37, 0x32, + 0x35, 0x5d, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x4d, 0x74, 0x29, 0x2c, + 0x77, 0x6c, 0x3d, 0x5b, 0x33, 0x37, 0x35, 0x30, 0x37, 0x37, 0x37, + 0x2c, 0x35, 0x33, 0x39, 0x35, 0x36, 0x31, 0x39, 0x2c, 0x37, 0x30, + 0x34, 0x30, 0x37, 0x31, 0x39, 0x2c, 0x31, 0x30, 0x32, 0x36, 0x34, + 0x32, 0x38, 0x36, 0x2c, 0x36, 0x35, 0x31, 0x39, 0x30, 0x39, 0x37, + 0x2c, 0x39, 0x32, 0x31, 0x36, 0x35, 0x39, 0x34, 0x2c, 0x31, 0x31, + 0x39, 0x31, 0x35, 0x31, 0x31, 0x35, 0x2c, 0x31, 0x33, 0x35, 0x35, + 0x36, 0x36, 0x33, 0x36, 0x2c, 0x39, 0x32, 0x30, 0x32, 0x39, 0x39, + 0x33, 0x2c, 0x31, 0x32, 0x34, 0x32, 0x36, 0x38, 0x30, 0x39, 0x2c, + 0x31, 0x35, 0x31, 0x38, 0x36, 0x35, 0x31, 0x34, 0x2c, 0x31, 0x35, + 0x31, 0x39, 0x30, 0x39, 0x33, 0x32, 0x2c, 0x38, 0x36, 0x36, 0x36, + 0x31, 0x36, 0x39, 0x2c, 0x31, 0x31, 0x33, 0x35, 0x36, 0x34, 0x39, + 0x30, 0x2c, 0x31, 0x34, 0x30, 0x34, 0x39, 0x36, 0x34, 0x33, 0x2c, + 0x31, 0x35, 0x31, 0x37, 0x37, 0x33, 0x37, 0x32, 0x2c, 0x38, 0x30, + 0x37, 0x37, 0x36, 0x38, 0x33, 0x2c, 0x31, 0x30, 0x38, 0x33, 0x34, + 0x33, 0x32, 0x34, 0x2c, 0x31, 0x33, 0x35, 0x32, 0x38, 0x35, 0x30, + 0x39, 0x2c, 0x31, 0x34, 0x35, 0x38, 0x39, 0x36, 0x35, 0x34, 0x5d, + 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x4d, 0x74, 0x29, 0x2c, 0x53, 0x6c, + 0x3d, 0x5b, 0x33, 0x32, 0x34, 0x34, 0x37, 0x33, 0x33, 0x2c, 0x37, + 0x30, 0x35, 0x37, 0x31, 0x31, 0x30, 0x2c, 0x31, 0x30, 0x34, 0x30, + 0x36, 0x36, 0x32, 0x35, 0x2c, 0x31, 0x33, 0x30, 0x33, 0x32, 0x34, + 0x33, 0x31, 0x2c, 0x31, 0x35, 0x30, 0x39, 0x35, 0x30, 0x35, 0x33, + 0x2c, 0x31, 0x36, 0x36, 0x31, 0x36, 0x37, 0x36, 0x34, 0x2c, 0x31, + 0x36, 0x36, 0x32, 0x35, 0x32, 0x35, 0x39, 0x2c, 0x31, 0x36, 0x36, + 0x33, 0x34, 0x30, 0x31, 0x38, 0x2c, 0x33, 0x32, 0x35, 0x33, 0x30, + 0x37, 0x36, 0x2c, 0x37, 0x36, 0x35, 0x32, 0x34, 0x37, 0x30, 0x2c, + 0x31, 0x30, 0x36, 0x30, 0x37, 0x30, 0x30, 0x33, 0x2c, 0x31, 0x33, + 0x31, 0x30, 0x31, 0x35, 0x30, 0x34, 0x2c, 0x37, 0x36, 0x39, 0x35, + 0x32, 0x38, 0x31, 0x2c, 0x31, 0x30, 0x33, 0x39, 0x34, 0x33, 0x31, + 0x32, 0x2c, 0x31, 0x32, 0x33, 0x36, 0x39, 0x33, 0x37, 0x32, 0x2c, + 0x31, 0x34, 0x33, 0x34, 0x32, 0x38, 0x39, 0x31, 0x2c, 0x36, 0x35, + 0x31, 0x33, 0x35, 0x30, 0x37, 0x2c, 0x39, 0x38, 0x36, 0x38, 0x39, + 0x35, 0x30, 0x2c, 0x31, 0x32, 0x34, 0x33, 0x34, 0x38, 0x37, 0x37, + 0x2c, 0x31, 0x34, 0x32, 0x37, 0x37, 0x30, 0x38, 0x31, 0x5d, 0x2e, + 0x6d, 0x61, 0x70, 0x28, 0x4d, 0x74, 0x29, 0x3b, 0x74, 0x61, 0x2e, + 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x71, 0x75, 0x61, 0x6e, 0x74, + 0x69, 0x6c, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x6f, 0x28, 0x5b, 0x5d, 0x2c, 0x5b, 0x5d, 0x29, 0x7d, 0x2c, + 0x74, 0x61, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x71, 0x75, + 0x61, 0x6e, 0x74, 0x69, 0x7a, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x74, 0x6f, 0x28, 0x30, 0x2c, 0x31, 0x2c, 0x5b, + 0x30, 0x2c, 0x31, 0x5d, 0x29, 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x73, + 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, + 0x6f, 0x6c, 0x64, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x65, 0x6f, 0x28, 0x5b, 0x2e, 0x35, 0x5d, 0x2c, 0x5b, 0x30, 0x2c, + 0x31, 0x5d, 0x29, 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x73, 0x63, 0x61, + 0x6c, 0x65, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x6f, 0x28, + 0x5b, 0x30, 0x2c, 0x31, 0x5d, 0x29, 0x7d, 0x2c, 0x74, 0x61, 0x2e, + 0x73, 0x76, 0x67, 0x3d, 0x7b, 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x73, + 0x76, 0x67, 0x2e, 0x61, 0x72, 0x63, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x28, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x6e, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, + 0x78, 0x28, 0x30, 0x2c, 0x2b, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x6c, + 0x79, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x29, 0x2c, 0x6c, 0x3d, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x30, 0x2c, 0x2b, + 0x72, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x29, 0x29, 0x2c, 0x73, 0x3d, 0x6f, 0x2e, 0x61, 0x70, 0x70, 0x6c, + 0x79, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x2d, 0x52, 0x61, 0x2c, 0x66, + 0x3d, 0x61, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x29, 0x2d, 0x52, 0x61, 0x2c, 0x68, 0x3d, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x61, 0x62, 0x73, 0x28, 0x66, 0x2d, 0x73, 0x29, 0x2c, + 0x67, 0x3d, 0x73, 0x3e, 0x66, 0x3f, 0x30, 0x3a, 0x31, 0x3b, 0x69, + 0x66, 0x28, 0x6e, 0x3e, 0x6c, 0x26, 0x26, 0x28, 0x70, 0x3d, 0x6c, + 0x2c, 0x6c, 0x3d, 0x6e, 0x2c, 0x6e, 0x3d, 0x70, 0x29, 0x2c, 0x68, + 0x3e, 0x3d, 0x54, 0x61, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x28, 0x6c, 0x2c, 0x67, 0x29, 0x2b, 0x28, 0x6e, 0x3f, + 0x74, 0x28, 0x6e, 0x2c, 0x31, 0x2d, 0x67, 0x29, 0x3a, 0x22, 0x22, + 0x29, 0x2b, 0x22, 0x5a, 0x22, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x70, + 0x2c, 0x76, 0x2c, 0x64, 0x2c, 0x6d, 0x2c, 0x79, 0x2c, 0x4d, 0x2c, + 0x78, 0x2c, 0x62, 0x2c, 0x5f, 0x2c, 0x77, 0x2c, 0x53, 0x2c, 0x6b, + 0x2c, 0x45, 0x3d, 0x30, 0x2c, 0x41, 0x3d, 0x30, 0x2c, 0x4e, 0x3d, + 0x5b, 0x5d, 0x3b, 0x69, 0x66, 0x28, 0x28, 0x6d, 0x3d, 0x28, 0x2b, + 0x63, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x29, 0x7c, 0x7c, 0x30, 0x29, 0x2f, 0x32, 0x29, 0x26, 0x26, 0x28, + 0x64, 0x3d, 0x69, 0x3d, 0x3d, 0x3d, 0x6b, 0x6c, 0x3f, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x73, 0x71, 0x72, 0x74, 0x28, 0x6e, 0x2a, 0x6e, + 0x2b, 0x6c, 0x2a, 0x6c, 0x29, 0x3a, 0x2b, 0x69, 0x2e, 0x61, 0x70, + 0x70, 0x6c, 0x79, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x2c, 0x67, 0x7c, + 0x7c, 0x28, 0x41, 0x2a, 0x3d, 0x2d, 0x31, 0x29, 0x2c, 0x6c, 0x26, + 0x26, 0x28, 0x41, 0x3d, 0x74, 0x74, 0x28, 0x64, 0x2f, 0x6c, 0x2a, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x6d, 0x29, + 0x29, 0x29, 0x2c, 0x6e, 0x26, 0x26, 0x28, 0x45, 0x3d, 0x74, 0x74, + 0x28, 0x64, 0x2f, 0x6e, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, + 0x69, 0x6e, 0x28, 0x6d, 0x29, 0x29, 0x29, 0x29, 0x2c, 0x6c, 0x29, + 0x7b, 0x79, 0x3d, 0x6c, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, + 0x6f, 0x73, 0x28, 0x73, 0x2b, 0x41, 0x29, 0x2c, 0x4d, 0x3d, 0x6c, + 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x73, + 0x2b, 0x41, 0x29, 0x2c, 0x78, 0x3d, 0x6c, 0x2a, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x66, 0x2d, 0x41, 0x29, 0x2c, + 0x62, 0x3d, 0x6c, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, + 0x6e, 0x28, 0x66, 0x2d, 0x41, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x43, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x61, 0x62, 0x73, 0x28, + 0x66, 0x2d, 0x73, 0x2d, 0x32, 0x2a, 0x41, 0x29, 0x3c, 0x3d, 0x71, + 0x61, 0x3f, 0x30, 0x3a, 0x31, 0x3b, 0x69, 0x66, 0x28, 0x41, 0x26, + 0x26, 0x73, 0x6f, 0x28, 0x79, 0x2c, 0x4d, 0x2c, 0x78, 0x2c, 0x62, + 0x29, 0x3d, 0x3d, 0x3d, 0x67, 0x5e, 0x43, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x7a, 0x3d, 0x28, 0x73, 0x2b, 0x66, 0x29, 0x2f, 0x32, + 0x3b, 0x79, 0x3d, 0x6c, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, + 0x6f, 0x73, 0x28, 0x7a, 0x29, 0x2c, 0x4d, 0x3d, 0x6c, 0x2a, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x7a, 0x29, 0x2c, + 0x78, 0x3d, 0x62, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x7d, 0x7d, 0x65, + 0x6c, 0x73, 0x65, 0x20, 0x79, 0x3d, 0x4d, 0x3d, 0x30, 0x3b, 0x69, + 0x66, 0x28, 0x6e, 0x29, 0x7b, 0x5f, 0x3d, 0x6e, 0x2a, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x66, 0x2d, 0x45, 0x29, + 0x2c, 0x77, 0x3d, 0x6e, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, + 0x69, 0x6e, 0x28, 0x66, 0x2d, 0x45, 0x29, 0x2c, 0x53, 0x3d, 0x6e, + 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x73, + 0x2b, 0x45, 0x29, 0x2c, 0x6b, 0x3d, 0x6e, 0x2a, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x73, 0x2b, 0x45, 0x29, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x71, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x61, 0x62, 0x73, 0x28, 0x73, 0x2d, 0x66, 0x2b, 0x32, 0x2a, 0x45, + 0x29, 0x3c, 0x3d, 0x71, 0x61, 0x3f, 0x30, 0x3a, 0x31, 0x3b, 0x69, + 0x66, 0x28, 0x45, 0x26, 0x26, 0x73, 0x6f, 0x28, 0x5f, 0x2c, 0x77, + 0x2c, 0x53, 0x2c, 0x6b, 0x29, 0x3d, 0x3d, 0x3d, 0x31, 0x2d, 0x67, + 0x5e, 0x71, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x4c, 0x3d, 0x28, + 0x73, 0x2b, 0x66, 0x29, 0x2f, 0x32, 0x3b, 0x5f, 0x3d, 0x6e, 0x2a, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x4c, 0x29, + 0x2c, 0x77, 0x3d, 0x6e, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, + 0x69, 0x6e, 0x28, 0x4c, 0x29, 0x2c, 0x53, 0x3d, 0x6b, 0x3d, 0x6e, + 0x75, 0x6c, 0x6c, 0x7d, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x5f, + 0x3d, 0x77, 0x3d, 0x30, 0x3b, 0x69, 0x66, 0x28, 0x28, 0x70, 0x3d, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x61, 0x62, 0x73, 0x28, 0x6c, 0x2d, 0x6e, 0x29, + 0x2f, 0x32, 0x2c, 0x2b, 0x75, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, + 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x29, 0x29, 0x29, 0x3e, 0x2e, 0x30, 0x30, + 0x31, 0x29, 0x7b, 0x76, 0x3d, 0x6c, 0x3e, 0x6e, 0x5e, 0x67, 0x3f, + 0x30, 0x3a, 0x31, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x54, 0x3d, 0x6e, + 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x53, 0x3f, 0x5b, 0x5f, 0x2c, 0x77, + 0x5d, 0x3a, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x78, 0x3f, 0x5b, + 0x79, 0x2c, 0x4d, 0x5d, 0x3a, 0x4c, 0x72, 0x28, 0x5b, 0x79, 0x2c, + 0x4d, 0x5d, 0x2c, 0x5b, 0x53, 0x2c, 0x6b, 0x5d, 0x2c, 0x5b, 0x78, + 0x2c, 0x62, 0x5d, 0x2c, 0x5b, 0x5f, 0x2c, 0x77, 0x5d, 0x29, 0x2c, + 0x52, 0x3d, 0x79, 0x2d, 0x54, 0x5b, 0x30, 0x5d, 0x2c, 0x44, 0x3d, + 0x4d, 0x2d, 0x54, 0x5b, 0x31, 0x5d, 0x2c, 0x50, 0x3d, 0x78, 0x2d, + 0x54, 0x5b, 0x30, 0x5d, 0x2c, 0x55, 0x3d, 0x62, 0x2d, 0x54, 0x5b, + 0x31, 0x5d, 0x2c, 0x6a, 0x3d, 0x31, 0x2f, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x61, + 0x63, 0x6f, 0x73, 0x28, 0x28, 0x52, 0x2a, 0x50, 0x2b, 0x44, 0x2a, + 0x55, 0x29, 0x2f, 0x28, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x71, + 0x72, 0x74, 0x28, 0x52, 0x2a, 0x52, 0x2b, 0x44, 0x2a, 0x44, 0x29, + 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x71, 0x72, 0x74, 0x28, + 0x50, 0x2a, 0x50, 0x2b, 0x55, 0x2a, 0x55, 0x29, 0x29, 0x29, 0x2f, + 0x32, 0x29, 0x2c, 0x46, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, + 0x71, 0x72, 0x74, 0x28, 0x54, 0x5b, 0x30, 0x5d, 0x2a, 0x54, 0x5b, + 0x30, 0x5d, 0x2b, 0x54, 0x5b, 0x31, 0x5d, 0x2a, 0x54, 0x5b, 0x31, + 0x5d, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x21, + 0x3d, 0x78, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x48, 0x3d, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x70, 0x2c, 0x28, + 0x6c, 0x2d, 0x46, 0x29, 0x2f, 0x28, 0x6a, 0x2b, 0x31, 0x29, 0x29, + 0x2c, 0x4f, 0x3d, 0x66, 0x6f, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, + 0x3d, 0x53, 0x3f, 0x5b, 0x5f, 0x2c, 0x77, 0x5d, 0x3a, 0x5b, 0x53, + 0x2c, 0x6b, 0x5d, 0x2c, 0x5b, 0x79, 0x2c, 0x4d, 0x5d, 0x2c, 0x6c, + 0x2c, 0x48, 0x2c, 0x67, 0x29, 0x2c, 0x49, 0x3d, 0x66, 0x6f, 0x28, + 0x5b, 0x78, 0x2c, 0x62, 0x5d, 0x2c, 0x5b, 0x5f, 0x2c, 0x77, 0x5d, + 0x2c, 0x6c, 0x2c, 0x48, 0x2c, 0x67, 0x29, 0x3b, 0x70, 0x3d, 0x3d, + 0x3d, 0x48, 0x3f, 0x4e, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x22, + 0x4d, 0x22, 0x2c, 0x4f, 0x5b, 0x30, 0x5d, 0x2c, 0x22, 0x41, 0x22, + 0x2c, 0x48, 0x2c, 0x22, 0x2c, 0x22, 0x2c, 0x48, 0x2c, 0x22, 0x20, + 0x30, 0x20, 0x30, 0x2c, 0x22, 0x2c, 0x76, 0x2c, 0x22, 0x20, 0x22, + 0x2c, 0x4f, 0x5b, 0x31, 0x5d, 0x2c, 0x22, 0x41, 0x22, 0x2c, 0x6c, + 0x2c, 0x22, 0x2c, 0x22, 0x2c, 0x6c, 0x2c, 0x22, 0x20, 0x30, 0x20, + 0x22, 0x2c, 0x31, 0x2d, 0x67, 0x5e, 0x73, 0x6f, 0x28, 0x4f, 0x5b, + 0x31, 0x5d, 0x5b, 0x30, 0x5d, 0x2c, 0x4f, 0x5b, 0x31, 0x5d, 0x5b, + 0x31, 0x5d, 0x2c, 0x49, 0x5b, 0x31, 0x5d, 0x5b, 0x30, 0x5d, 0x2c, + 0x49, 0x5b, 0x31, 0x5d, 0x5b, 0x31, 0x5d, 0x29, 0x2c, 0x22, 0x2c, + 0x22, 0x2c, 0x67, 0x2c, 0x22, 0x20, 0x22, 0x2c, 0x49, 0x5b, 0x31, + 0x5d, 0x2c, 0x22, 0x41, 0x22, 0x2c, 0x48, 0x2c, 0x22, 0x2c, 0x22, + 0x2c, 0x48, 0x2c, 0x22, 0x20, 0x30, 0x20, 0x30, 0x2c, 0x22, 0x2c, + 0x76, 0x2c, 0x22, 0x20, 0x22, 0x2c, 0x49, 0x5b, 0x30, 0x5d, 0x29, + 0x3a, 0x4e, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x22, 0x4d, 0x22, + 0x2c, 0x4f, 0x5b, 0x30, 0x5d, 0x2c, 0x22, 0x41, 0x22, 0x2c, 0x48, + 0x2c, 0x22, 0x2c, 0x22, 0x2c, 0x48, 0x2c, 0x22, 0x20, 0x30, 0x20, + 0x31, 0x2c, 0x22, 0x2c, 0x76, 0x2c, 0x22, 0x20, 0x22, 0x2c, 0x49, + 0x5b, 0x30, 0x5d, 0x29, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x4e, + 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x22, 0x4d, 0x22, 0x2c, 0x79, + 0x2c, 0x22, 0x2c, 0x22, 0x2c, 0x4d, 0x29, 0x3b, 0x69, 0x66, 0x28, + 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, 0x53, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x59, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x69, + 0x6e, 0x28, 0x70, 0x2c, 0x28, 0x6e, 0x2d, 0x46, 0x29, 0x2f, 0x28, + 0x6a, 0x2d, 0x31, 0x29, 0x29, 0x2c, 0x5a, 0x3d, 0x66, 0x6f, 0x28, + 0x5b, 0x79, 0x2c, 0x4d, 0x5d, 0x2c, 0x5b, 0x53, 0x2c, 0x6b, 0x5d, + 0x2c, 0x6e, 0x2c, 0x2d, 0x59, 0x2c, 0x67, 0x29, 0x2c, 0x56, 0x3d, + 0x66, 0x6f, 0x28, 0x5b, 0x5f, 0x2c, 0x77, 0x5d, 0x2c, 0x6e, 0x75, + 0x6c, 0x6c, 0x3d, 0x3d, 0x78, 0x3f, 0x5b, 0x79, 0x2c, 0x4d, 0x5d, + 0x3a, 0x5b, 0x78, 0x2c, 0x62, 0x5d, 0x2c, 0x6e, 0x2c, 0x2d, 0x59, + 0x2c, 0x67, 0x29, 0x3b, 0x70, 0x3d, 0x3d, 0x3d, 0x59, 0x3f, 0x4e, + 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x22, 0x4c, 0x22, 0x2c, 0x56, + 0x5b, 0x30, 0x5d, 0x2c, 0x22, 0x41, 0x22, 0x2c, 0x59, 0x2c, 0x22, + 0x2c, 0x22, 0x2c, 0x59, 0x2c, 0x22, 0x20, 0x30, 0x20, 0x30, 0x2c, + 0x22, 0x2c, 0x76, 0x2c, 0x22, 0x20, 0x22, 0x2c, 0x56, 0x5b, 0x31, + 0x5d, 0x2c, 0x22, 0x41, 0x22, 0x2c, 0x6e, 0x2c, 0x22, 0x2c, 0x22, + 0x2c, 0x6e, 0x2c, 0x22, 0x20, 0x30, 0x20, 0x22, 0x2c, 0x67, 0x5e, + 0x73, 0x6f, 0x28, 0x56, 0x5b, 0x31, 0x5d, 0x5b, 0x30, 0x5d, 0x2c, + 0x56, 0x5b, 0x31, 0x5d, 0x5b, 0x31, 0x5d, 0x2c, 0x5a, 0x5b, 0x31, + 0x5d, 0x5b, 0x30, 0x5d, 0x2c, 0x5a, 0x5b, 0x31, 0x5d, 0x5b, 0x31, + 0x5d, 0x29, 0x2c, 0x22, 0x2c, 0x22, 0x2c, 0x31, 0x2d, 0x67, 0x2c, + 0x22, 0x20, 0x22, 0x2c, 0x5a, 0x5b, 0x31, 0x5d, 0x2c, 0x22, 0x41, + 0x22, 0x2c, 0x59, 0x2c, 0x22, 0x2c, 0x22, 0x2c, 0x59, 0x2c, 0x22, + 0x20, 0x30, 0x20, 0x30, 0x2c, 0x22, 0x2c, 0x76, 0x2c, 0x22, 0x20, + 0x22, 0x2c, 0x5a, 0x5b, 0x30, 0x5d, 0x29, 0x3a, 0x4e, 0x2e, 0x70, + 0x75, 0x73, 0x68, 0x28, 0x22, 0x4c, 0x22, 0x2c, 0x56, 0x5b, 0x30, + 0x5d, 0x2c, 0x22, 0x41, 0x22, 0x2c, 0x59, 0x2c, 0x22, 0x2c, 0x22, + 0x2c, 0x59, 0x2c, 0x22, 0x20, 0x30, 0x20, 0x30, 0x2c, 0x22, 0x2c, + 0x76, 0x2c, 0x22, 0x20, 0x22, 0x2c, 0x5a, 0x5b, 0x30, 0x5d, 0x29, + 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x4e, 0x2e, 0x70, 0x75, 0x73, + 0x68, 0x28, 0x22, 0x4c, 0x22, 0x2c, 0x5f, 0x2c, 0x22, 0x2c, 0x22, + 0x2c, 0x77, 0x29, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x4e, 0x2e, + 0x70, 0x75, 0x73, 0x68, 0x28, 0x22, 0x4d, 0x22, 0x2c, 0x79, 0x2c, + 0x22, 0x2c, 0x22, 0x2c, 0x4d, 0x29, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, + 0x21, 0x3d, 0x78, 0x26, 0x26, 0x4e, 0x2e, 0x70, 0x75, 0x73, 0x68, + 0x28, 0x22, 0x41, 0x22, 0x2c, 0x6c, 0x2c, 0x22, 0x2c, 0x22, 0x2c, + 0x6c, 0x2c, 0x22, 0x20, 0x30, 0x20, 0x22, 0x2c, 0x43, 0x2c, 0x22, + 0x2c, 0x22, 0x2c, 0x67, 0x2c, 0x22, 0x20, 0x22, 0x2c, 0x78, 0x2c, + 0x22, 0x2c, 0x22, 0x2c, 0x62, 0x29, 0x2c, 0x4e, 0x2e, 0x70, 0x75, + 0x73, 0x68, 0x28, 0x22, 0x4c, 0x22, 0x2c, 0x5f, 0x2c, 0x22, 0x2c, + 0x22, 0x2c, 0x77, 0x29, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, + 0x53, 0x26, 0x26, 0x4e, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x22, + 0x41, 0x22, 0x2c, 0x6e, 0x2c, 0x22, 0x2c, 0x22, 0x2c, 0x6e, 0x2c, + 0x22, 0x20, 0x30, 0x20, 0x22, 0x2c, 0x71, 0x2c, 0x22, 0x2c, 0x22, + 0x2c, 0x31, 0x2d, 0x67, 0x2c, 0x22, 0x20, 0x22, 0x2c, 0x53, 0x2c, + 0x22, 0x2c, 0x22, 0x2c, 0x6b, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x4e, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x22, + 0x5a, 0x22, 0x29, 0x2c, 0x4e, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, + 0x22, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x74, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x22, 0x4d, 0x30, 0x2c, 0x22, 0x2b, 0x6e, + 0x2b, 0x22, 0x41, 0x22, 0x2b, 0x6e, 0x2b, 0x22, 0x2c, 0x22, 0x2b, + 0x6e, 0x2b, 0x22, 0x20, 0x30, 0x20, 0x31, 0x2c, 0x22, 0x2b, 0x74, + 0x2b, 0x22, 0x20, 0x30, 0x2c, 0x22, 0x2b, 0x2d, 0x6e, 0x2b, 0x22, + 0x41, 0x22, 0x2b, 0x6e, 0x2b, 0x22, 0x2c, 0x22, 0x2b, 0x6e, 0x2b, + 0x22, 0x20, 0x30, 0x20, 0x31, 0x2c, 0x22, 0x2b, 0x74, 0x2b, 0x22, + 0x20, 0x30, 0x2c, 0x22, 0x2b, 0x6e, 0x7d, 0x76, 0x61, 0x72, 0x20, + 0x65, 0x3d, 0x69, 0x6f, 0x2c, 0x72, 0x3d, 0x6f, 0x6f, 0x2c, 0x75, + 0x3d, 0x75, 0x6f, 0x2c, 0x69, 0x3d, 0x6b, 0x6c, 0x2c, 0x6f, 0x3d, + 0x61, 0x6f, 0x2c, 0x61, 0x3d, 0x63, 0x6f, 0x2c, 0x63, 0x3d, 0x6c, + 0x6f, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, + 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3f, 0x28, 0x65, 0x3d, 0x45, 0x74, 0x28, 0x74, + 0x29, 0x2c, 0x6e, 0x29, 0x3a, 0x65, 0x7d, 0x2c, 0x6e, 0x2e, 0x6f, + 0x75, 0x74, 0x65, 0x72, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3f, 0x28, 0x72, 0x3d, 0x45, 0x74, 0x28, 0x74, 0x29, + 0x2c, 0x6e, 0x29, 0x3a, 0x72, 0x7d, 0x2c, 0x6e, 0x2e, 0x63, 0x6f, + 0x72, 0x6e, 0x65, 0x72, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3f, 0x28, 0x75, 0x3d, 0x45, 0x74, 0x28, 0x74, 0x29, + 0x2c, 0x6e, 0x29, 0x3a, 0x75, 0x7d, 0x2c, 0x6e, 0x2e, 0x70, 0x61, + 0x64, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, + 0x28, 0x69, 0x3d, 0x74, 0x3d, 0x3d, 0x6b, 0x6c, 0x3f, 0x6b, 0x6c, + 0x3a, 0x45, 0x74, 0x28, 0x74, 0x29, 0x2c, 0x6e, 0x29, 0x3a, 0x69, + 0x7d, 0x2c, 0x6e, 0x2e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, 0x6e, + 0x67, 0x6c, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x6f, 0x3d, 0x45, + 0x74, 0x28, 0x74, 0x29, 0x2c, 0x6e, 0x29, 0x3a, 0x6f, 0x7d, 0x2c, + 0x6e, 0x2e, 0x65, 0x6e, 0x64, 0x41, 0x6e, 0x67, 0x6c, 0x65, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3f, 0x28, 0x61, 0x3d, 0x45, 0x74, 0x28, 0x74, 0x29, + 0x2c, 0x6e, 0x29, 0x3a, 0x61, 0x7d, 0x2c, 0x6e, 0x2e, 0x70, 0x61, + 0x64, 0x41, 0x6e, 0x67, 0x6c, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, + 0x63, 0x3d, 0x45, 0x74, 0x28, 0x74, 0x29, 0x2c, 0x6e, 0x29, 0x3a, + 0x63, 0x7d, 0x2c, 0x6e, 0x2e, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x6f, + 0x69, 0x64, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6e, 0x3d, 0x28, 0x2b, + 0x65, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x29, 0x2b, 0x20, 0x2b, 0x72, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, + 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x29, 0x29, 0x2f, 0x32, 0x2c, 0x74, 0x3d, + 0x28, 0x2b, 0x6f, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x29, 0x2b, 0x20, 0x2b, 0x61, 0x2e, 0x61, 0x70, 0x70, + 0x6c, 0x79, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x29, 0x2f, 0x32, 0x2d, + 0x52, 0x61, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, 0x74, 0x29, 0x2a, + 0x6e, 0x2c, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, + 0x74, 0x29, 0x2a, 0x6e, 0x5d, 0x7d, 0x2c, 0x6e, 0x7d, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x6b, 0x6c, 0x3d, 0x22, 0x61, 0x75, 0x74, 0x6f, + 0x22, 0x3b, 0x74, 0x61, 0x2e, 0x73, 0x76, 0x67, 0x2e, 0x6c, 0x69, + 0x6e, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, + 0x6f, 0x28, 0x79, 0x29, 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x45, + 0x6c, 0x3d, 0x74, 0x61, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x7b, 0x6c, + 0x69, 0x6e, 0x65, 0x61, 0x72, 0x3a, 0x67, 0x6f, 0x2c, 0x22, 0x6c, + 0x69, 0x6e, 0x65, 0x61, 0x72, 0x2d, 0x63, 0x6c, 0x6f, 0x73, 0x65, + 0x64, 0x22, 0x3a, 0x70, 0x6f, 0x2c, 0x73, 0x74, 0x65, 0x70, 0x3a, + 0x76, 0x6f, 0x2c, 0x22, 0x73, 0x74, 0x65, 0x70, 0x2d, 0x62, 0x65, + 0x66, 0x6f, 0x72, 0x65, 0x22, 0x3a, 0x6d, 0x6f, 0x2c, 0x22, 0x73, + 0x74, 0x65, 0x70, 0x2d, 0x61, 0x66, 0x74, 0x65, 0x72, 0x22, 0x3a, + 0x79, 0x6f, 0x2c, 0x62, 0x61, 0x73, 0x69, 0x73, 0x3a, 0x53, 0x6f, + 0x2c, 0x22, 0x62, 0x61, 0x73, 0x69, 0x73, 0x2d, 0x6f, 0x70, 0x65, + 0x6e, 0x22, 0x3a, 0x6b, 0x6f, 0x2c, 0x22, 0x62, 0x61, 0x73, 0x69, + 0x73, 0x2d, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x22, 0x3a, 0x45, + 0x6f, 0x2c, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x3a, 0x41, 0x6f, + 0x2c, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x3a, 0x62, + 0x6f, 0x2c, 0x22, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, + 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x22, 0x3a, 0x4d, 0x6f, 0x2c, 0x22, + 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x2d, 0x63, 0x6c, + 0x6f, 0x73, 0x65, 0x64, 0x22, 0x3a, 0x78, 0x6f, 0x2c, 0x6d, 0x6f, + 0x6e, 0x6f, 0x74, 0x6f, 0x6e, 0x65, 0x3a, 0x54, 0x6f, 0x7d, 0x29, + 0x3b, 0x45, 0x6c, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, + 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x2c, 0x74, 0x29, 0x7b, 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x3d, 0x6e, + 0x2c, 0x74, 0x2e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x3d, 0x2f, + 0x2d, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x24, 0x2f, 0x2e, 0x74, + 0x65, 0x73, 0x74, 0x28, 0x6e, 0x29, 0x7d, 0x29, 0x3b, 0x76, 0x61, + 0x72, 0x20, 0x41, 0x6c, 0x3d, 0x5b, 0x30, 0x2c, 0x32, 0x2f, 0x33, + 0x2c, 0x31, 0x2f, 0x33, 0x2c, 0x30, 0x5d, 0x2c, 0x4e, 0x6c, 0x3d, + 0x5b, 0x30, 0x2c, 0x31, 0x2f, 0x33, 0x2c, 0x32, 0x2f, 0x33, 0x2c, + 0x30, 0x5d, 0x2c, 0x43, 0x6c, 0x3d, 0x5b, 0x30, 0x2c, 0x31, 0x2f, + 0x36, 0x2c, 0x32, 0x2f, 0x33, 0x2c, 0x31, 0x2f, 0x36, 0x5d, 0x3b, + 0x74, 0x61, 0x2e, 0x73, 0x76, 0x67, 0x2e, 0x6c, 0x69, 0x6e, 0x65, + 0x2e, 0x72, 0x61, 0x64, 0x69, 0x61, 0x6c, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x6e, 0x3d, 0x68, 0x6f, 0x28, 0x52, 0x6f, 0x29, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x72, 0x61, 0x64, + 0x69, 0x75, 0x73, 0x3d, 0x6e, 0x2e, 0x78, 0x2c, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x20, 0x6e, 0x2e, 0x78, 0x2c, 0x6e, 0x2e, 0x61, + 0x6e, 0x67, 0x6c, 0x65, 0x3d, 0x6e, 0x2e, 0x79, 0x2c, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6e, 0x2e, 0x79, 0x2c, 0x6e, 0x7d, + 0x2c, 0x6d, 0x6f, 0x2e, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, + 0x3d, 0x79, 0x6f, 0x2c, 0x79, 0x6f, 0x2e, 0x72, 0x65, 0x76, 0x65, + 0x72, 0x73, 0x65, 0x3d, 0x6d, 0x6f, 0x2c, 0x74, 0x61, 0x2e, 0x73, + 0x76, 0x67, 0x2e, 0x61, 0x72, 0x65, 0x61, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x44, 0x6f, 0x28, 0x79, 0x29, 0x7d, 0x2c, + 0x74, 0x61, 0x2e, 0x73, 0x76, 0x67, 0x2e, 0x61, 0x72, 0x65, 0x61, + 0x2e, 0x72, 0x61, 0x64, 0x69, 0x61, 0x6c, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x6e, 0x3d, 0x44, 0x6f, 0x28, 0x52, 0x6f, 0x29, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x72, 0x61, 0x64, + 0x69, 0x75, 0x73, 0x3d, 0x6e, 0x2e, 0x78, 0x2c, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x20, 0x6e, 0x2e, 0x78, 0x2c, 0x6e, 0x2e, 0x69, + 0x6e, 0x6e, 0x65, 0x72, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3d, + 0x6e, 0x2e, 0x78, 0x30, 0x2c, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x20, 0x6e, 0x2e, 0x78, 0x30, 0x2c, 0x6e, 0x2e, 0x6f, 0x75, 0x74, + 0x65, 0x72, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3d, 0x6e, 0x2e, + 0x78, 0x31, 0x2c, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6e, + 0x2e, 0x78, 0x31, 0x2c, 0x6e, 0x2e, 0x61, 0x6e, 0x67, 0x6c, 0x65, + 0x3d, 0x6e, 0x2e, 0x79, 0x2c, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x20, 0x6e, 0x2e, 0x79, 0x2c, 0x6e, 0x2e, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x41, 0x6e, 0x67, 0x6c, 0x65, 0x3d, 0x6e, 0x2e, 0x79, 0x30, + 0x2c, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6e, 0x2e, 0x79, + 0x30, 0x2c, 0x6e, 0x2e, 0x65, 0x6e, 0x64, 0x41, 0x6e, 0x67, 0x6c, + 0x65, 0x3d, 0x6e, 0x2e, 0x79, 0x31, 0x2c, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x20, 0x6e, 0x2e, 0x79, 0x31, 0x2c, 0x6e, 0x7d, 0x2c, + 0x74, 0x61, 0x2e, 0x73, 0x76, 0x67, 0x2e, 0x63, 0x68, 0x6f, 0x72, + 0x64, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6e, 0x28, 0x6e, 0x2c, 0x61, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x63, 0x3d, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x69, 0x2c, + 0x6e, 0x2c, 0x61, 0x29, 0x2c, 0x6c, 0x3d, 0x74, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x2c, 0x6f, 0x2c, 0x6e, 0x2c, 0x61, 0x29, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x4d, 0x22, 0x2b, 0x63, 0x2e, + 0x70, 0x30, 0x2b, 0x72, 0x28, 0x63, 0x2e, 0x72, 0x2c, 0x63, 0x2e, + 0x70, 0x31, 0x2c, 0x63, 0x2e, 0x61, 0x31, 0x2d, 0x63, 0x2e, 0x61, + 0x30, 0x29, 0x2b, 0x28, 0x65, 0x28, 0x63, 0x2c, 0x6c, 0x29, 0x3f, + 0x75, 0x28, 0x63, 0x2e, 0x72, 0x2c, 0x63, 0x2e, 0x70, 0x31, 0x2c, + 0x63, 0x2e, 0x72, 0x2c, 0x63, 0x2e, 0x70, 0x30, 0x29, 0x3a, 0x75, + 0x28, 0x63, 0x2e, 0x72, 0x2c, 0x63, 0x2e, 0x70, 0x31, 0x2c, 0x6c, + 0x2e, 0x72, 0x2c, 0x6c, 0x2e, 0x70, 0x30, 0x29, 0x2b, 0x72, 0x28, + 0x6c, 0x2e, 0x72, 0x2c, 0x6c, 0x2e, 0x70, 0x31, 0x2c, 0x6c, 0x2e, + 0x61, 0x31, 0x2d, 0x6c, 0x2e, 0x61, 0x30, 0x29, 0x2b, 0x75, 0x28, + 0x6c, 0x2e, 0x72, 0x2c, 0x6c, 0x2e, 0x70, 0x31, 0x2c, 0x63, 0x2e, + 0x72, 0x2c, 0x63, 0x2e, 0x70, 0x30, 0x29, 0x29, 0x2b, 0x22, 0x5a, + 0x22, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x74, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x75, 0x3d, 0x74, 0x2e, 0x63, 0x61, 0x6c, + 0x6c, 0x28, 0x6e, 0x2c, 0x65, 0x2c, 0x72, 0x29, 0x2c, 0x69, 0x3d, + 0x61, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6e, 0x2c, 0x75, 0x2c, + 0x72, 0x29, 0x2c, 0x6f, 0x3d, 0x63, 0x2e, 0x63, 0x61, 0x6c, 0x6c, + 0x28, 0x6e, 0x2c, 0x75, 0x2c, 0x72, 0x29, 0x2d, 0x52, 0x61, 0x2c, + 0x73, 0x3d, 0x6c, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6e, 0x2c, + 0x75, 0x2c, 0x72, 0x29, 0x2d, 0x52, 0x61, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x7b, 0x72, 0x3a, 0x69, 0x2c, 0x61, 0x30, 0x3a, + 0x6f, 0x2c, 0x61, 0x31, 0x3a, 0x73, 0x2c, 0x70, 0x30, 0x3a, 0x5b, + 0x69, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, + 0x6f, 0x29, 0x2c, 0x69, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, + 0x69, 0x6e, 0x28, 0x6f, 0x29, 0x5d, 0x2c, 0x70, 0x31, 0x3a, 0x5b, + 0x69, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x6f, 0x73, 0x28, + 0x73, 0x29, 0x2c, 0x69, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, + 0x69, 0x6e, 0x28, 0x73, 0x29, 0x5d, 0x7d, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x28, 0x6e, 0x2c, 0x74, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, + 0x61, 0x30, 0x3d, 0x3d, 0x74, 0x2e, 0x61, 0x30, 0x26, 0x26, 0x6e, + 0x2e, 0x61, 0x31, 0x3d, 0x3d, 0x74, 0x2e, 0x61, 0x31, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x28, 0x6e, + 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x22, 0x41, 0x22, 0x2b, 0x6e, 0x2b, 0x22, 0x2c, 0x22, 0x2b, + 0x6e, 0x2b, 0x22, 0x20, 0x30, 0x20, 0x22, 0x2b, 0x20, 0x2b, 0x28, + 0x65, 0x3e, 0x71, 0x61, 0x29, 0x2b, 0x22, 0x2c, 0x31, 0x20, 0x22, + 0x2b, 0x74, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x75, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x51, 0x20, 0x30, + 0x2c, 0x30, 0x20, 0x22, 0x2b, 0x72, 0x7d, 0x76, 0x61, 0x72, 0x20, + 0x69, 0x3d, 0x6d, 0x72, 0x2c, 0x6f, 0x3d, 0x79, 0x72, 0x2c, 0x61, + 0x3d, 0x50, 0x6f, 0x2c, 0x63, 0x3d, 0x61, 0x6f, 0x2c, 0x6c, 0x3d, + 0x63, 0x6f, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x2e, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, + 0x28, 0x61, 0x3d, 0x45, 0x74, 0x28, 0x74, 0x29, 0x2c, 0x6e, 0x29, + 0x3a, 0x61, 0x7d, 0x2c, 0x6e, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x69, 0x3d, 0x45, 0x74, 0x28, + 0x74, 0x29, 0x2c, 0x6e, 0x29, 0x3a, 0x69, 0x7d, 0x2c, 0x6e, 0x2e, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, + 0x6f, 0x3d, 0x45, 0x74, 0x28, 0x74, 0x29, 0x2c, 0x6e, 0x29, 0x3a, + 0x6f, 0x7d, 0x2c, 0x6e, 0x2e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, + 0x6e, 0x67, 0x6c, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x63, 0x3d, + 0x45, 0x74, 0x28, 0x74, 0x29, 0x2c, 0x6e, 0x29, 0x3a, 0x63, 0x7d, + 0x2c, 0x6e, 0x2e, 0x65, 0x6e, 0x64, 0x41, 0x6e, 0x67, 0x6c, 0x65, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3f, 0x28, 0x6c, 0x3d, 0x45, 0x74, 0x28, 0x74, + 0x29, 0x2c, 0x6e, 0x29, 0x3a, 0x6c, 0x7d, 0x2c, 0x6e, 0x7d, 0x2c, + 0x74, 0x61, 0x2e, 0x73, 0x76, 0x67, 0x2e, 0x64, 0x69, 0x61, 0x67, + 0x6f, 0x6e, 0x61, 0x6c, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6e, 0x28, 0x6e, 0x2c, 0x75, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x69, 0x3d, 0x74, 0x2e, 0x63, 0x61, 0x6c, 0x6c, + 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x6e, 0x2c, 0x75, 0x29, 0x2c, + 0x6f, 0x3d, 0x65, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x2c, 0x6e, 0x2c, 0x75, 0x29, 0x2c, 0x61, 0x3d, 0x28, + 0x69, 0x2e, 0x79, 0x2b, 0x6f, 0x2e, 0x79, 0x29, 0x2f, 0x32, 0x2c, + 0x63, 0x3d, 0x5b, 0x69, 0x2c, 0x7b, 0x78, 0x3a, 0x69, 0x2e, 0x78, + 0x2c, 0x79, 0x3a, 0x61, 0x7d, 0x2c, 0x7b, 0x78, 0x3a, 0x6f, 0x2e, + 0x78, 0x2c, 0x79, 0x3a, 0x61, 0x7d, 0x2c, 0x6f, 0x5d, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x3d, 0x63, 0x2e, 0x6d, + 0x61, 0x70, 0x28, 0x72, 0x29, 0x2c, 0x22, 0x4d, 0x22, 0x2b, 0x63, + 0x5b, 0x30, 0x5d, 0x2b, 0x22, 0x43, 0x22, 0x2b, 0x63, 0x5b, 0x31, + 0x5d, 0x2b, 0x22, 0x20, 0x22, 0x2b, 0x63, 0x5b, 0x32, 0x5d, 0x2b, + 0x22, 0x20, 0x22, 0x2b, 0x63, 0x5b, 0x33, 0x5d, 0x7d, 0x76, 0x61, + 0x72, 0x20, 0x74, 0x3d, 0x6d, 0x72, 0x2c, 0x65, 0x3d, 0x79, 0x72, + 0x2c, 0x72, 0x3d, 0x55, 0x6f, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3f, 0x28, 0x74, 0x3d, 0x45, 0x74, 0x28, 0x65, 0x29, + 0x2c, 0x6e, 0x29, 0x3a, 0x74, 0x7d, 0x2c, 0x6e, 0x2e, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x65, 0x3d, + 0x45, 0x74, 0x28, 0x74, 0x29, 0x2c, 0x6e, 0x29, 0x3a, 0x65, 0x7d, + 0x2c, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x72, 0x3d, 0x74, 0x2c, + 0x6e, 0x29, 0x3a, 0x72, 0x7d, 0x2c, 0x6e, 0x7d, 0x2c, 0x74, 0x61, + 0x2e, 0x73, 0x76, 0x67, 0x2e, 0x64, 0x69, 0x61, 0x67, 0x6f, 0x6e, + 0x61, 0x6c, 0x2e, 0x72, 0x61, 0x64, 0x69, 0x61, 0x6c, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x6e, 0x3d, 0x74, 0x61, 0x2e, 0x73, 0x76, 0x67, + 0x2e, 0x64, 0x69, 0x61, 0x67, 0x6f, 0x6e, 0x61, 0x6c, 0x28, 0x29, + 0x2c, 0x74, 0x3d, 0x55, 0x6f, 0x2c, 0x65, 0x3d, 0x6e, 0x2e, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, + 0x65, 0x28, 0x6a, 0x6f, 0x28, 0x74, 0x3d, 0x6e, 0x29, 0x29, 0x3a, + 0x74, 0x7d, 0x2c, 0x6e, 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x73, 0x76, + 0x67, 0x2e, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x28, 0x6e, 0x2c, + 0x72, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x7a, + 0x6c, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x74, 0x2e, 0x63, 0x61, 0x6c, + 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x6e, 0x2c, 0x72, 0x29, + 0x29, 0x7c, 0x7c, 0x4f, 0x6f, 0x29, 0x28, 0x65, 0x2e, 0x63, 0x61, + 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x6e, 0x2c, 0x72, + 0x29, 0x29, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x48, 0x6f, + 0x2c, 0x65, 0x3d, 0x46, 0x6f, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3f, 0x28, 0x74, 0x3d, 0x45, 0x74, 0x28, 0x65, 0x29, 0x2c, 0x6e, + 0x29, 0x3a, 0x74, 0x7d, 0x2c, 0x6e, 0x2e, 0x73, 0x69, 0x7a, 0x65, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3f, 0x28, 0x65, 0x3d, 0x45, 0x74, 0x28, 0x74, + 0x29, 0x2c, 0x6e, 0x29, 0x3a, 0x65, 0x7d, 0x2c, 0x6e, 0x7d, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x7a, 0x6c, 0x3d, 0x74, 0x61, 0x2e, 0x6d, + 0x61, 0x70, 0x28, 0x7b, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x3a, + 0x4f, 0x6f, 0x2c, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x3a, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x74, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, + 0x71, 0x72, 0x74, 0x28, 0x6e, 0x2f, 0x35, 0x29, 0x2f, 0x32, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x4d, 0x22, 0x2b, 0x2d, + 0x33, 0x2a, 0x74, 0x2b, 0x22, 0x2c, 0x22, 0x2b, 0x2d, 0x74, 0x2b, + 0x22, 0x48, 0x22, 0x2b, 0x2d, 0x74, 0x2b, 0x22, 0x56, 0x22, 0x2b, + 0x2d, 0x33, 0x2a, 0x74, 0x2b, 0x22, 0x48, 0x22, 0x2b, 0x74, 0x2b, + 0x22, 0x56, 0x22, 0x2b, 0x2d, 0x74, 0x2b, 0x22, 0x48, 0x22, 0x2b, + 0x33, 0x2a, 0x74, 0x2b, 0x22, 0x56, 0x22, 0x2b, 0x74, 0x2b, 0x22, + 0x48, 0x22, 0x2b, 0x74, 0x2b, 0x22, 0x56, 0x22, 0x2b, 0x33, 0x2a, + 0x74, 0x2b, 0x22, 0x48, 0x22, 0x2b, 0x2d, 0x74, 0x2b, 0x22, 0x56, + 0x22, 0x2b, 0x74, 0x2b, 0x22, 0x48, 0x22, 0x2b, 0x2d, 0x33, 0x2a, + 0x74, 0x2b, 0x22, 0x5a, 0x22, 0x7d, 0x2c, 0x64, 0x69, 0x61, 0x6d, + 0x6f, 0x6e, 0x64, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x71, 0x72, 0x74, 0x28, 0x6e, + 0x2f, 0x28, 0x32, 0x2a, 0x4c, 0x6c, 0x29, 0x29, 0x2c, 0x65, 0x3d, + 0x74, 0x2a, 0x4c, 0x6c, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x22, 0x4d, 0x30, 0x2c, 0x22, 0x2b, 0x2d, 0x74, 0x2b, 0x22, 0x4c, + 0x22, 0x2b, 0x65, 0x2b, 0x22, 0x2c, 0x30, 0x20, 0x30, 0x2c, 0x22, + 0x2b, 0x74, 0x2b, 0x22, 0x20, 0x22, 0x2b, 0x2d, 0x65, 0x2b, 0x22, + 0x2c, 0x30, 0x5a, 0x22, 0x7d, 0x2c, 0x73, 0x71, 0x75, 0x61, 0x72, + 0x65, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x73, 0x71, 0x72, 0x74, 0x28, 0x6e, 0x29, 0x2f, + 0x32, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x4d, 0x22, + 0x2b, 0x2d, 0x74, 0x2b, 0x22, 0x2c, 0x22, 0x2b, 0x2d, 0x74, 0x2b, + 0x22, 0x4c, 0x22, 0x2b, 0x74, 0x2b, 0x22, 0x2c, 0x22, 0x2b, 0x2d, + 0x74, 0x2b, 0x22, 0x20, 0x22, 0x2b, 0x74, 0x2b, 0x22, 0x2c, 0x22, + 0x2b, 0x74, 0x2b, 0x22, 0x20, 0x22, 0x2b, 0x2d, 0x74, 0x2b, 0x22, + 0x2c, 0x22, 0x2b, 0x74, 0x2b, 0x22, 0x5a, 0x22, 0x7d, 0x2c, 0x22, + 0x74, 0x72, 0x69, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x2d, 0x64, 0x6f, + 0x77, 0x6e, 0x22, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x71, 0x72, 0x74, 0x28, 0x6e, + 0x2f, 0x71, 0x6c, 0x29, 0x2c, 0x65, 0x3d, 0x74, 0x2a, 0x71, 0x6c, + 0x2f, 0x32, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x4d, + 0x30, 0x2c, 0x22, 0x2b, 0x65, 0x2b, 0x22, 0x4c, 0x22, 0x2b, 0x74, + 0x2b, 0x22, 0x2c, 0x22, 0x2b, 0x2d, 0x65, 0x2b, 0x22, 0x20, 0x22, + 0x2b, 0x2d, 0x74, 0x2b, 0x22, 0x2c, 0x22, 0x2b, 0x2d, 0x65, 0x2b, + 0x22, 0x5a, 0x22, 0x7d, 0x2c, 0x22, 0x74, 0x72, 0x69, 0x61, 0x6e, + 0x67, 0x6c, 0x65, 0x2d, 0x75, 0x70, 0x22, 0x3a, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x74, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x71, + 0x72, 0x74, 0x28, 0x6e, 0x2f, 0x71, 0x6c, 0x29, 0x2c, 0x65, 0x3d, + 0x74, 0x2a, 0x71, 0x6c, 0x2f, 0x32, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x22, 0x4d, 0x30, 0x2c, 0x22, 0x2b, 0x2d, 0x65, 0x2b, + 0x22, 0x4c, 0x22, 0x2b, 0x74, 0x2b, 0x22, 0x2c, 0x22, 0x2b, 0x65, + 0x2b, 0x22, 0x20, 0x22, 0x2b, 0x2d, 0x74, 0x2b, 0x22, 0x2c, 0x22, + 0x2b, 0x65, 0x2b, 0x22, 0x5a, 0x22, 0x7d, 0x7d, 0x29, 0x3b, 0x74, + 0x61, 0x2e, 0x73, 0x76, 0x67, 0x2e, 0x73, 0x79, 0x6d, 0x62, 0x6f, + 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x3d, 0x7a, 0x6c, 0x2e, 0x6b, + 0x65, 0x79, 0x73, 0x28, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x71, + 0x6c, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x71, 0x72, 0x74, + 0x28, 0x33, 0x29, 0x2c, 0x4c, 0x6c, 0x3d, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x74, 0x61, 0x6e, 0x28, 0x33, 0x30, 0x2a, 0x44, 0x61, 0x29, + 0x3b, 0x5f, 0x61, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, + 0x72, 0x20, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x3d, 0x54, 0x6c, 0x7c, + 0x7c, 0x2b, 0x2b, 0x55, 0x6c, 0x2c, 0x75, 0x3d, 0x58, 0x6f, 0x28, + 0x6e, 0x29, 0x2c, 0x69, 0x3d, 0x5b, 0x5d, 0x2c, 0x6f, 0x3d, 0x52, + 0x6c, 0x7c, 0x7c, 0x7b, 0x74, 0x69, 0x6d, 0x65, 0x3a, 0x44, 0x61, + 0x74, 0x65, 0x2e, 0x6e, 0x6f, 0x77, 0x28, 0x29, 0x2c, 0x65, 0x61, + 0x73, 0x65, 0x3a, 0x53, 0x75, 0x2c, 0x64, 0x65, 0x6c, 0x61, 0x79, + 0x3a, 0x30, 0x2c, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x3a, 0x32, 0x35, 0x30, 0x7d, 0x2c, 0x61, 0x3d, 0x2d, 0x31, 0x2c, + 0x63, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3b, 0x2b, 0x2b, 0x61, 0x3c, 0x63, 0x3b, 0x29, 0x7b, + 0x69, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x74, 0x3d, 0x5b, 0x5d, + 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x6c, + 0x3d, 0x74, 0x68, 0x69, 0x73, 0x5b, 0x61, 0x5d, 0x2c, 0x73, 0x3d, + 0x2d, 0x31, 0x2c, 0x66, 0x3d, 0x6c, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3b, 0x2b, 0x2b, 0x73, 0x3c, 0x66, 0x3b, 0x29, 0x28, + 0x65, 0x3d, 0x6c, 0x5b, 0x73, 0x5d, 0x29, 0x26, 0x26, 0x24, 0x6f, + 0x28, 0x65, 0x2c, 0x73, 0x2c, 0x75, 0x2c, 0x72, 0x2c, 0x6f, 0x29, + 0x2c, 0x74, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x65, 0x29, 0x7d, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x59, 0x6f, 0x28, 0x69, + 0x2c, 0x75, 0x2c, 0x72, 0x29, 0x7d, 0x2c, 0x5f, 0x61, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x65, 0x61, 0x63, 0x68, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, + 0x6e, 0x3f, 0x44, 0x6c, 0x3a, 0x49, 0x6f, 0x28, 0x58, 0x6f, 0x28, + 0x6e, 0x29, 0x29, 0x29, 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x54, + 0x6c, 0x2c, 0x52, 0x6c, 0x2c, 0x44, 0x6c, 0x3d, 0x49, 0x6f, 0x28, + 0x58, 0x6f, 0x28, 0x29, 0x29, 0x2c, 0x50, 0x6c, 0x3d, 0x5b, 0x5d, + 0x2c, 0x55, 0x6c, 0x3d, 0x30, 0x3b, 0x50, 0x6c, 0x2e, 0x63, 0x61, + 0x6c, 0x6c, 0x3d, 0x5f, 0x61, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x2c, + 0x50, 0x6c, 0x2e, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x3d, 0x5f, 0x61, + 0x2e, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x50, 0x6c, 0x2e, 0x6e, + 0x6f, 0x64, 0x65, 0x3d, 0x5f, 0x61, 0x2e, 0x6e, 0x6f, 0x64, 0x65, + 0x2c, 0x50, 0x6c, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x3d, 0x5f, 0x61, + 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x74, 0x61, 0x2e, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x26, 0x26, + 0x6e, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x3f, 0x54, 0x6c, 0x3f, 0x6e, 0x2e, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x3a, 0x6e, + 0x3a, 0x74, 0x61, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7d, 0x2c, 0x74, 0x61, + 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x3d, + 0x50, 0x6c, 0x2c, 0x50, 0x6c, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x2c, 0x65, 0x2c, + 0x72, 0x2c, 0x75, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x64, + 0x2c, 0x69, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2c, 0x6f, 0x3d, 0x5b, 0x5d, + 0x3b, 0x6e, 0x3d, 0x4e, 0x28, 0x6e, 0x29, 0x3b, 0x66, 0x6f, 0x72, + 0x28, 0x76, 0x61, 0x72, 0x20, 0x61, 0x3d, 0x2d, 0x31, 0x2c, 0x63, + 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3b, 0x2b, 0x2b, 0x61, 0x3c, 0x63, 0x3b, 0x29, 0x7b, 0x6f, + 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x74, 0x3d, 0x5b, 0x5d, 0x29, + 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x6c, 0x3d, + 0x74, 0x68, 0x69, 0x73, 0x5b, 0x61, 0x5d, 0x2c, 0x73, 0x3d, 0x2d, + 0x31, 0x2c, 0x66, 0x3d, 0x6c, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3b, 0x2b, 0x2b, 0x73, 0x3c, 0x66, 0x3b, 0x29, 0x28, 0x72, + 0x3d, 0x6c, 0x5b, 0x73, 0x5d, 0x29, 0x26, 0x26, 0x28, 0x65, 0x3d, + 0x6e, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x72, 0x2e, + 0x5f, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x5f, 0x2c, 0x73, 0x2c, + 0x61, 0x29, 0x29, 0x3f, 0x28, 0x22, 0x5f, 0x5f, 0x64, 0x61, 0x74, + 0x61, 0x5f, 0x5f, 0x22, 0x69, 0x6e, 0x20, 0x72, 0x26, 0x26, 0x28, + 0x65, 0x2e, 0x5f, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x5f, 0x3d, + 0x72, 0x2e, 0x5f, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x5f, 0x29, + 0x2c, 0x24, 0x6f, 0x28, 0x65, 0x2c, 0x73, 0x2c, 0x69, 0x2c, 0x75, + 0x2c, 0x72, 0x5b, 0x69, 0x5d, 0x5b, 0x75, 0x5d, 0x29, 0x2c, 0x74, + 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x65, 0x29, 0x29, 0x3a, 0x74, + 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, + 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x59, 0x6f, 0x28, + 0x6f, 0x2c, 0x69, 0x2c, 0x75, 0x29, 0x7d, 0x2c, 0x50, 0x6c, 0x2e, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x41, 0x6c, 0x6c, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x75, + 0x2c, 0x69, 0x2c, 0x6f, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, + 0x64, 0x2c, 0x61, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2c, 0x63, 0x3d, 0x5b, + 0x5d, 0x3b, 0x6e, 0x3d, 0x43, 0x28, 0x6e, 0x29, 0x3b, 0x66, 0x6f, + 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x6c, 0x3d, 0x2d, 0x31, 0x2c, + 0x73, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3b, 0x2b, 0x2b, 0x6c, 0x3c, 0x73, 0x3b, 0x29, 0x66, + 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x66, 0x3d, 0x74, 0x68, + 0x69, 0x73, 0x5b, 0x6c, 0x5d, 0x2c, 0x68, 0x3d, 0x2d, 0x31, 0x2c, + 0x67, 0x3d, 0x66, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, + 0x2b, 0x2b, 0x68, 0x3c, 0x67, 0x3b, 0x29, 0x69, 0x66, 0x28, 0x72, + 0x3d, 0x66, 0x5b, 0x68, 0x5d, 0x29, 0x7b, 0x69, 0x3d, 0x72, 0x5b, + 0x61, 0x5d, 0x5b, 0x6f, 0x5d, 0x2c, 0x65, 0x3d, 0x6e, 0x2e, 0x63, + 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x72, 0x2e, 0x5f, 0x5f, 0x64, + 0x61, 0x74, 0x61, 0x5f, 0x5f, 0x2c, 0x68, 0x2c, 0x6c, 0x29, 0x2c, + 0x63, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x74, 0x3d, 0x5b, 0x5d, + 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x70, + 0x3d, 0x2d, 0x31, 0x2c, 0x76, 0x3d, 0x65, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3b, 0x2b, 0x2b, 0x70, 0x3c, 0x76, 0x3b, 0x29, + 0x28, 0x75, 0x3d, 0x65, 0x5b, 0x70, 0x5d, 0x29, 0x26, 0x26, 0x24, + 0x6f, 0x28, 0x75, 0x2c, 0x70, 0x2c, 0x61, 0x2c, 0x6f, 0x2c, 0x69, + 0x29, 0x2c, 0x74, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x75, 0x29, + 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x59, 0x6f, 0x28, + 0x63, 0x2c, 0x61, 0x2c, 0x6f, 0x29, 0x7d, 0x2c, 0x50, 0x6c, 0x2e, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x74, 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x75, 0x3d, 0x5b, 0x5d, + 0x3b, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x21, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x6e, 0x26, + 0x26, 0x28, 0x6e, 0x3d, 0x4f, 0x28, 0x6e, 0x29, 0x29, 0x3b, 0x66, + 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, 0x30, 0x2c, + 0x6f, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3b, 0x6f, 0x3e, 0x69, 0x3b, 0x69, 0x2b, 0x2b, 0x29, + 0x7b, 0x75, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x74, 0x3d, 0x5b, + 0x5d, 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, + 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x5b, 0x69, 0x5d, 0x2c, 0x61, + 0x3d, 0x30, 0x2c, 0x63, 0x3d, 0x65, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3b, 0x63, 0x3e, 0x61, 0x3b, 0x61, 0x2b, 0x2b, 0x29, + 0x28, 0x72, 0x3d, 0x65, 0x5b, 0x61, 0x5d, 0x29, 0x26, 0x26, 0x6e, + 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x72, 0x2e, 0x5f, + 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x5f, 0x2c, 0x61, 0x2c, 0x69, + 0x29, 0x26, 0x26, 0x74, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x72, + 0x29, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x59, 0x6f, + 0x28, 0x75, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2c, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x69, 0x64, 0x29, 0x7d, 0x2c, 0x50, 0x6c, 0x2e, 0x74, 0x77, + 0x65, 0x65, 0x6e, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x64, 0x2c, 0x72, + 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3c, 0x32, 0x3f, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x28, 0x29, 0x5b, 0x72, + 0x5d, 0x5b, 0x65, 0x5d, 0x2e, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x2e, + 0x67, 0x65, 0x74, 0x28, 0x6e, 0x29, 0x3a, 0x59, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x74, 0x3f, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, + 0x7b, 0x74, 0x5b, 0x72, 0x5d, 0x5b, 0x65, 0x5d, 0x2e, 0x74, 0x77, + 0x65, 0x65, 0x6e, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, + 0x6e, 0x29, 0x7d, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x75, 0x29, 0x7b, 0x75, 0x5b, 0x72, 0x5d, 0x5b, 0x65, + 0x5d, 0x2e, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x2e, 0x73, 0x65, 0x74, + 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7d, 0x29, 0x7d, 0x2c, 0x50, 0x6c, + 0x2e, 0x61, 0x74, 0x74, 0x72, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x28, 0x29, 0x7b, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x61, + 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x72, 0x28, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x65, 0x4e, 0x53, 0x28, 0x61, 0x2e, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x2c, 0x61, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x29, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x28, + 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x6e, 0x3f, 0x65, 0x3a, 0x28, 0x6e, + 0x2b, 0x3d, 0x22, 0x22, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x2c, + 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x41, + 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x61, 0x29, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x21, 0x3d, + 0x3d, 0x6e, 0x26, 0x26, 0x28, 0x74, 0x3d, 0x6f, 0x28, 0x65, 0x2c, + 0x6e, 0x29, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6e, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, + 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, + 0x61, 0x2c, 0x74, 0x28, 0x6e, 0x29, 0x29, 0x7d, 0x29, 0x7d, 0x29, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, + 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x6e, 0x3f, 0x72, 0x3a, 0x28, + 0x6e, 0x2b, 0x3d, 0x22, 0x22, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, + 0x2c, 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x67, 0x65, 0x74, + 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x4e, 0x53, + 0x28, 0x61, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2c, 0x61, 0x2e, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x65, 0x21, 0x3d, 0x3d, 0x6e, 0x26, 0x26, 0x28, + 0x74, 0x3d, 0x6f, 0x28, 0x65, 0x2c, 0x6e, 0x29, 0x2c, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x65, 0x4e, 0x53, 0x28, 0x61, 0x2e, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x2c, 0x61, 0x2e, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x2c, 0x74, 0x28, 0x6e, 0x29, 0x29, 0x7d, 0x29, 0x7d, 0x29, + 0x7d, 0x69, 0x66, 0x28, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3c, 0x32, + 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x74, 0x20, 0x69, 0x6e, 0x20, + 0x6e, 0x29, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x74, 0x74, 0x72, + 0x28, 0x74, 0x2c, 0x6e, 0x5b, 0x74, 0x5d, 0x29, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x7d, 0x76, + 0x61, 0x72, 0x20, 0x6f, 0x3d, 0x22, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x22, 0x3d, 0x3d, 0x6e, 0x3f, 0x48, 0x75, + 0x3a, 0x6d, 0x75, 0x2c, 0x61, 0x3d, 0x74, 0x61, 0x2e, 0x6e, 0x73, + 0x2e, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x79, 0x28, 0x6e, 0x29, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5a, 0x6f, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x2c, 0x22, 0x61, 0x74, 0x74, 0x72, 0x2e, + 0x22, 0x2b, 0x6e, 0x2c, 0x74, 0x2c, 0x61, 0x2e, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x3f, 0x69, 0x3a, 0x75, 0x29, 0x7d, 0x2c, 0x50, 0x6c, + 0x2e, 0x61, 0x74, 0x74, 0x72, 0x54, 0x77, 0x65, 0x65, 0x6e, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, + 0x74, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x65, 0x28, 0x6e, 0x2c, 0x65, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x72, 0x3d, 0x74, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2c, 0x6e, 0x2c, 0x65, 0x2c, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x65, 0x28, 0x75, 0x29, 0x29, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x72, 0x26, 0x26, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x73, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x65, 0x28, 0x75, 0x2c, 0x72, 0x28, 0x6e, 0x29, 0x29, + 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x72, 0x28, 0x6e, 0x2c, 0x65, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x72, 0x3d, 0x74, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x2c, 0x6e, 0x2c, 0x65, 0x2c, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x67, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x65, 0x4e, 0x53, 0x28, 0x75, 0x2e, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x2c, 0x75, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x29, 0x29, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x26, 0x26, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, + 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x41, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x4e, 0x53, 0x28, 0x75, + 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2c, 0x75, 0x2e, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x2c, 0x72, 0x28, 0x6e, 0x29, 0x29, 0x7d, 0x7d, + 0x76, 0x61, 0x72, 0x20, 0x75, 0x3d, 0x74, 0x61, 0x2e, 0x6e, 0x73, + 0x2e, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x79, 0x28, 0x6e, 0x29, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x28, 0x22, 0x61, 0x74, + 0x74, 0x72, 0x2e, 0x22, 0x2b, 0x6e, 0x2c, 0x75, 0x2e, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x3f, 0x72, 0x3a, 0x65, 0x29, 0x7d, 0x2c, 0x50, + 0x6c, 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x65, 0x2c, 0x72, + 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x75, 0x28, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x6e, 0x29, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x28, + 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x65, 0x3f, 0x75, 0x3a, 0x28, 0x65, + 0x2b, 0x3d, 0x22, 0x22, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x75, 0x2c, + 0x69, 0x3d, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x2e, 0x67, + 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x53, + 0x74, 0x79, 0x6c, 0x65, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x6e, + 0x75, 0x6c, 0x6c, 0x29, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, + 0x6e, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, + 0x21, 0x3d, 0x3d, 0x65, 0x26, 0x26, 0x28, 0x75, 0x3d, 0x6d, 0x75, + 0x28, 0x69, 0x2c, 0x65, 0x29, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x6e, 0x2c, 0x75, + 0x28, 0x74, 0x29, 0x2c, 0x72, 0x29, 0x7d, 0x29, 0x7d, 0x29, 0x7d, + 0x76, 0x61, 0x72, 0x20, 0x6f, 0x3d, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3b, 0x69, 0x66, 0x28, 0x33, 0x3e, 0x6f, 0x29, 0x7b, 0x69, 0x66, + 0x28, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x21, 0x3d, + 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x6e, 0x29, 0x7b, 0x32, + 0x3e, 0x6f, 0x26, 0x26, 0x28, 0x65, 0x3d, 0x22, 0x22, 0x29, 0x3b, + 0x66, 0x6f, 0x72, 0x28, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x6e, 0x29, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x28, + 0x72, 0x2c, 0x6e, 0x5b, 0x72, 0x5d, 0x2c, 0x65, 0x29, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x7d, + 0x72, 0x3d, 0x22, 0x22, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x5a, 0x6f, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x22, 0x73, + 0x74, 0x79, 0x6c, 0x65, 0x2e, 0x22, 0x2b, 0x6e, 0x2c, 0x65, 0x2c, + 0x69, 0x29, 0x7d, 0x2c, 0x50, 0x6c, 0x2e, 0x73, 0x74, 0x79, 0x6c, + 0x65, 0x54, 0x77, 0x65, 0x65, 0x6e, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x65, 0x2c, 0x72, 0x29, + 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, + 0x28, 0x75, 0x2c, 0x69, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6f, + 0x3d, 0x65, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2c, 0x75, 0x2c, 0x69, 0x2c, 0x74, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x29, 0x2e, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x75, + 0x74, 0x65, 0x64, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x2e, 0x67, 0x65, + 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x28, 0x6e, 0x29, 0x29, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x26, 0x26, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x2e, 0x73, 0x65, 0x74, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x6e, 0x2c, + 0x6f, 0x28, 0x74, 0x29, 0x2c, 0x72, 0x29, 0x7d, 0x7d, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3c, + 0x33, 0x26, 0x26, 0x28, 0x72, 0x3d, 0x22, 0x22, 0x29, 0x2c, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x28, 0x22, + 0x73, 0x74, 0x79, 0x6c, 0x65, 0x2e, 0x22, 0x2b, 0x6e, 0x2c, 0x75, + 0x29, 0x7d, 0x2c, 0x50, 0x6c, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5a, 0x6f, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x2c, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, + 0x2c, 0x6e, 0x2c, 0x56, 0x6f, 0x29, 0x7d, 0x2c, 0x50, 0x6c, 0x2e, + 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x6e, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x61, 0x63, 0x68, + 0x28, 0x22, 0x65, 0x6e, 0x64, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x74, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x5b, 0x6e, 0x5d, 0x2e, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x3c, 0x32, 0x26, 0x26, 0x28, 0x74, 0x3d, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x4e, 0x6f, 0x64, 0x65, 0x29, 0x26, 0x26, 0x74, 0x2e, 0x72, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x29, 0x7d, 0x29, 0x7d, 0x2c, 0x50, 0x6c, 0x2e, + 0x65, 0x61, 0x73, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, + 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x64, 0x2c, 0x65, 0x3d, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3c, 0x31, 0x3f, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x28, 0x29, 0x5b, 0x65, 0x5d, + 0x5b, 0x74, 0x5d, 0x2e, 0x65, 0x61, 0x73, 0x65, 0x3a, 0x28, 0x22, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x21, 0x3d, + 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x6e, 0x26, 0x26, 0x28, + 0x6e, 0x3d, 0x74, 0x61, 0x2e, 0x65, 0x61, 0x73, 0x65, 0x2e, 0x61, + 0x70, 0x70, 0x6c, 0x79, 0x28, 0x74, 0x61, 0x2c, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x29, 0x2c, 0x59, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x72, 0x29, 0x7b, 0x72, 0x5b, 0x65, 0x5d, 0x5b, + 0x74, 0x5d, 0x2e, 0x65, 0x61, 0x73, 0x65, 0x3d, 0x6e, 0x7d, 0x29, + 0x29, 0x7d, 0x2c, 0x50, 0x6c, 0x2e, 0x64, 0x65, 0x6c, 0x61, 0x79, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x69, 0x64, 0x2c, 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3c, 0x31, 0x3f, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6e, 0x6f, + 0x64, 0x65, 0x28, 0x29, 0x5b, 0x65, 0x5d, 0x5b, 0x74, 0x5d, 0x2e, + 0x64, 0x65, 0x6c, 0x61, 0x79, 0x3a, 0x59, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2c, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x6e, + 0x3f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x72, + 0x2c, 0x75, 0x2c, 0x69, 0x29, 0x7b, 0x72, 0x5b, 0x65, 0x5d, 0x5b, + 0x74, 0x5d, 0x2e, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x3d, 0x2b, 0x6e, + 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x72, 0x2e, 0x5f, + 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x5f, 0x2c, 0x75, 0x2c, 0x69, + 0x29, 0x7d, 0x3a, 0x28, 0x6e, 0x3d, 0x2b, 0x6e, 0x2c, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x72, 0x29, 0x7b, 0x72, + 0x5b, 0x65, 0x5d, 0x5b, 0x74, 0x5d, 0x2e, 0x64, 0x65, 0x6c, 0x61, + 0x79, 0x3d, 0x6e, 0x7d, 0x29, 0x29, 0x7d, 0x2c, 0x50, 0x6c, 0x2e, + 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x74, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, + 0x64, 0x2c, 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3c, 0x31, + 0x3f, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x28, + 0x29, 0x5b, 0x65, 0x5d, 0x5b, 0x74, 0x5d, 0x2e, 0x64, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x59, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2c, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x6e, + 0x3f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x72, + 0x2c, 0x75, 0x2c, 0x69, 0x29, 0x7b, 0x72, 0x5b, 0x65, 0x5d, 0x5b, + 0x74, 0x5d, 0x2e, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x31, + 0x2c, 0x6e, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x2c, 0x72, + 0x2e, 0x5f, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x5f, 0x2c, 0x75, + 0x2c, 0x69, 0x29, 0x29, 0x7d, 0x3a, 0x28, 0x6e, 0x3d, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x31, 0x2c, 0x6e, 0x29, + 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x72, + 0x29, 0x7b, 0x72, 0x5b, 0x65, 0x5d, 0x5b, 0x74, 0x5d, 0x2e, 0x64, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x6e, 0x7d, 0x29, + 0x29, 0x7d, 0x2c, 0x50, 0x6c, 0x2e, 0x65, 0x61, 0x63, 0x68, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, + 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x69, 0x64, 0x2c, 0x72, 0x3d, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x3b, 0x69, 0x66, 0x28, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3c, 0x32, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x75, 0x3d, 0x52, 0x6c, 0x2c, + 0x69, 0x3d, 0x54, 0x6c, 0x3b, 0x74, 0x72, 0x79, 0x7b, 0x54, 0x6c, + 0x3d, 0x65, 0x2c, 0x59, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x2c, 0x75, + 0x2c, 0x69, 0x29, 0x7b, 0x52, 0x6c, 0x3d, 0x74, 0x5b, 0x72, 0x5d, + 0x5b, 0x65, 0x5d, 0x2c, 0x6e, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, + 0x74, 0x2c, 0x74, 0x2e, 0x5f, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, + 0x5f, 0x2c, 0x75, 0x2c, 0x69, 0x29, 0x7d, 0x29, 0x7d, 0x66, 0x69, + 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x7b, 0x52, 0x6c, 0x3d, 0x75, 0x2c, + 0x54, 0x6c, 0x3d, 0x69, 0x7d, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, + 0x59, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x75, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x69, 0x3d, 0x75, 0x5b, 0x72, 0x5d, 0x5b, 0x65, 0x5d, 0x3b, + 0x28, 0x69, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x7c, 0x7c, 0x28, + 0x69, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x74, 0x61, 0x2e, + 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x22, 0x2c, 0x22, 0x65, 0x6e, 0x64, 0x22, + 0x2c, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, + 0x22, 0x29, 0x29, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, + 0x29, 0x7d, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x7d, 0x2c, 0x50, 0x6c, 0x2e, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x66, 0x6f, + 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x6e, 0x2c, 0x74, 0x2c, 0x65, + 0x2c, 0x72, 0x2c, 0x75, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, + 0x64, 0x2c, 0x69, 0x3d, 0x2b, 0x2b, 0x55, 0x6c, 0x2c, 0x6f, 0x3d, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x2c, 0x61, 0x3d, 0x5b, 0x5d, 0x2c, 0x63, 0x3d, + 0x30, 0x2c, 0x6c, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x6c, 0x3e, 0x63, 0x3b, 0x63, 0x2b, + 0x2b, 0x29, 0x7b, 0x61, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x6e, + 0x3d, 0x5b, 0x5d, 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, + 0x72, 0x20, 0x74, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x5b, 0x63, 0x5d, + 0x2c, 0x73, 0x3d, 0x30, 0x2c, 0x66, 0x3d, 0x74, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x66, 0x3e, 0x73, 0x3b, 0x73, 0x2b, + 0x2b, 0x29, 0x28, 0x65, 0x3d, 0x74, 0x5b, 0x73, 0x5d, 0x29, 0x26, + 0x26, 0x28, 0x72, 0x3d, 0x65, 0x5b, 0x6f, 0x5d, 0x5b, 0x75, 0x5d, + 0x2c, 0x24, 0x6f, 0x28, 0x65, 0x2c, 0x73, 0x2c, 0x6f, 0x2c, 0x69, + 0x2c, 0x7b, 0x74, 0x69, 0x6d, 0x65, 0x3a, 0x72, 0x2e, 0x74, 0x69, + 0x6d, 0x65, 0x2c, 0x65, 0x61, 0x73, 0x65, 0x3a, 0x72, 0x2e, 0x65, + 0x61, 0x73, 0x65, 0x2c, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x3a, 0x72, + 0x2e, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x2b, 0x72, 0x2e, 0x64, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x64, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x72, 0x2e, 0x64, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x29, 0x29, 0x2c, 0x6e, 0x2e, 0x70, + 0x75, 0x73, 0x68, 0x28, 0x65, 0x29, 0x7d, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x59, 0x6f, 0x28, 0x61, 0x2c, 0x6f, 0x2c, 0x69, + 0x29, 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x73, 0x76, 0x67, 0x2e, 0x61, + 0x78, 0x69, 0x73, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x6e, 0x2e, 0x65, 0x61, + 0x63, 0x68, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6e, 0x2c, 0x6c, 0x3d, + 0x74, 0x61, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x29, 0x2c, 0x73, 0x3d, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x5f, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x74, 0x5f, 0x5f, 0x7c, + 0x7c, 0x65, 0x2c, 0x66, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, + 0x5f, 0x63, 0x68, 0x61, 0x72, 0x74, 0x5f, 0x5f, 0x3d, 0x65, 0x2e, + 0x63, 0x6f, 0x70, 0x79, 0x28, 0x29, 0x2c, 0x68, 0x3d, 0x6e, 0x75, + 0x6c, 0x6c, 0x3d, 0x3d, 0x63, 0x3f, 0x66, 0x2e, 0x74, 0x69, 0x63, + 0x6b, 0x73, 0x3f, 0x66, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x73, 0x2e, + 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x66, 0x2c, 0x61, 0x29, 0x3a, + 0x66, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x3a, + 0x63, 0x2c, 0x67, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x74, + 0x3f, 0x66, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x46, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x3f, 0x66, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x46, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, + 0x66, 0x2c, 0x61, 0x29, 0x3a, 0x79, 0x3a, 0x74, 0x2c, 0x70, 0x3d, + 0x6c, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x41, 0x6c, 0x6c, + 0x28, 0x22, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x22, 0x29, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x28, 0x68, 0x2c, 0x66, 0x29, 0x2c, 0x76, 0x3d, + 0x70, 0x2e, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x28, 0x29, 0x2e, 0x69, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x22, 0x67, 0x22, 0x2c, 0x22, + 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x29, 0x2e, 0x61, + 0x74, 0x74, 0x72, 0x28, 0x22, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x22, + 0x2c, 0x22, 0x74, 0x69, 0x63, 0x6b, 0x22, 0x29, 0x2e, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x28, 0x22, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, + 0x79, 0x22, 0x2c, 0x43, 0x61, 0x29, 0x2c, 0x64, 0x3d, 0x74, 0x61, + 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x70, 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, 0x29, 0x29, 0x2e, + 0x73, 0x74, 0x79, 0x6c, 0x65, 0x28, 0x22, 0x6f, 0x70, 0x61, 0x63, + 0x69, 0x74, 0x79, 0x22, 0x2c, 0x43, 0x61, 0x29, 0x2e, 0x72, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x29, 0x2c, 0x6d, 0x3d, 0x74, 0x61, + 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x70, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x28, 0x29, 0x29, + 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x28, 0x22, 0x6f, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x22, 0x2c, 0x31, 0x29, 0x2c, 0x4d, 0x3d, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x75, 0x2c, + 0x30, 0x29, 0x2b, 0x6f, 0x2c, 0x78, 0x3d, 0x55, 0x69, 0x28, 0x66, + 0x29, 0x2c, 0x62, 0x3d, 0x6c, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x41, 0x6c, 0x6c, 0x28, 0x22, 0x2e, 0x64, 0x6f, 0x6d, 0x61, + 0x69, 0x6e, 0x22, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x28, 0x5b, + 0x30, 0x5d, 0x29, 0x2c, 0x5f, 0x3d, 0x28, 0x62, 0x2e, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x28, 0x29, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, + 0x64, 0x28, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x29, 0x2e, 0x61, + 0x74, 0x74, 0x72, 0x28, 0x22, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x22, + 0x2c, 0x22, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x29, 0x2c, + 0x74, 0x61, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x62, 0x29, 0x29, 0x3b, 0x76, 0x2e, 0x61, 0x70, + 0x70, 0x65, 0x6e, 0x64, 0x28, 0x22, 0x6c, 0x69, 0x6e, 0x65, 0x22, + 0x29, 0x2c, 0x76, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, + 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x29, 0x3b, 0x76, 0x61, 0x72, + 0x20, 0x77, 0x2c, 0x53, 0x2c, 0x6b, 0x2c, 0x45, 0x2c, 0x41, 0x3d, + 0x76, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x22, 0x6c, + 0x69, 0x6e, 0x65, 0x22, 0x29, 0x2c, 0x4e, 0x3d, 0x6d, 0x2e, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x22, 0x6c, 0x69, 0x6e, 0x65, + 0x22, 0x29, 0x2c, 0x43, 0x3d, 0x70, 0x2e, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x28, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x29, 0x2e, + 0x74, 0x65, 0x78, 0x74, 0x28, 0x67, 0x29, 0x2c, 0x7a, 0x3d, 0x76, + 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x22, 0x74, 0x65, + 0x78, 0x74, 0x22, 0x29, 0x2c, 0x71, 0x3d, 0x6d, 0x2e, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x28, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, + 0x29, 0x2c, 0x4c, 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x22, 0x3d, 0x3d, + 0x3d, 0x72, 0x7c, 0x7c, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x22, 0x3d, + 0x3d, 0x3d, 0x72, 0x3f, 0x2d, 0x31, 0x3a, 0x31, 0x3b, 0x69, 0x66, + 0x28, 0x22, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x22, 0x3d, 0x3d, + 0x3d, 0x72, 0x7c, 0x7c, 0x22, 0x74, 0x6f, 0x70, 0x22, 0x3d, 0x3d, + 0x3d, 0x72, 0x3f, 0x28, 0x6e, 0x3d, 0x42, 0x6f, 0x2c, 0x77, 0x3d, + 0x22, 0x78, 0x22, 0x2c, 0x6b, 0x3d, 0x22, 0x79, 0x22, 0x2c, 0x53, + 0x3d, 0x22, 0x78, 0x32, 0x22, 0x2c, 0x45, 0x3d, 0x22, 0x79, 0x32, + 0x22, 0x2c, 0x43, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x22, 0x64, + 0x79, 0x22, 0x2c, 0x30, 0x3e, 0x4c, 0x3f, 0x22, 0x30, 0x65, 0x6d, + 0x22, 0x3a, 0x22, 0x2e, 0x37, 0x31, 0x65, 0x6d, 0x22, 0x29, 0x2e, + 0x73, 0x74, 0x79, 0x6c, 0x65, 0x28, 0x22, 0x74, 0x65, 0x78, 0x74, + 0x2d, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x22, 0x2c, 0x22, 0x6d, + 0x69, 0x64, 0x64, 0x6c, 0x65, 0x22, 0x29, 0x2c, 0x5f, 0x2e, 0x61, + 0x74, 0x74, 0x72, 0x28, 0x22, 0x64, 0x22, 0x2c, 0x22, 0x4d, 0x22, + 0x2b, 0x78, 0x5b, 0x30, 0x5d, 0x2b, 0x22, 0x2c, 0x22, 0x2b, 0x4c, + 0x2a, 0x69, 0x2b, 0x22, 0x56, 0x30, 0x48, 0x22, 0x2b, 0x78, 0x5b, + 0x31, 0x5d, 0x2b, 0x22, 0x56, 0x22, 0x2b, 0x4c, 0x2a, 0x69, 0x29, + 0x29, 0x3a, 0x28, 0x6e, 0x3d, 0x57, 0x6f, 0x2c, 0x77, 0x3d, 0x22, + 0x79, 0x22, 0x2c, 0x6b, 0x3d, 0x22, 0x78, 0x22, 0x2c, 0x53, 0x3d, + 0x22, 0x79, 0x32, 0x22, 0x2c, 0x45, 0x3d, 0x22, 0x78, 0x32, 0x22, + 0x2c, 0x43, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x22, 0x64, 0x79, + 0x22, 0x2c, 0x22, 0x2e, 0x33, 0x32, 0x65, 0x6d, 0x22, 0x29, 0x2e, + 0x73, 0x74, 0x79, 0x6c, 0x65, 0x28, 0x22, 0x74, 0x65, 0x78, 0x74, + 0x2d, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x22, 0x2c, 0x30, 0x3e, + 0x4c, 0x3f, 0x22, 0x65, 0x6e, 0x64, 0x22, 0x3a, 0x22, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x22, 0x29, 0x2c, 0x5f, 0x2e, 0x61, 0x74, 0x74, + 0x72, 0x28, 0x22, 0x64, 0x22, 0x2c, 0x22, 0x4d, 0x22, 0x2b, 0x4c, + 0x2a, 0x69, 0x2b, 0x22, 0x2c, 0x22, 0x2b, 0x78, 0x5b, 0x30, 0x5d, + 0x2b, 0x22, 0x48, 0x30, 0x56, 0x22, 0x2b, 0x78, 0x5b, 0x31, 0x5d, + 0x2b, 0x22, 0x48, 0x22, 0x2b, 0x4c, 0x2a, 0x69, 0x29, 0x29, 0x2c, + 0x41, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x45, 0x2c, 0x4c, 0x2a, + 0x75, 0x29, 0x2c, 0x7a, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x6b, + 0x2c, 0x4c, 0x2a, 0x4d, 0x29, 0x2c, 0x4e, 0x2e, 0x61, 0x74, 0x74, + 0x72, 0x28, 0x53, 0x2c, 0x30, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, + 0x28, 0x45, 0x2c, 0x4c, 0x2a, 0x75, 0x29, 0x2c, 0x71, 0x2e, 0x61, + 0x74, 0x74, 0x72, 0x28, 0x77, 0x2c, 0x30, 0x29, 0x2e, 0x61, 0x74, + 0x74, 0x72, 0x28, 0x6b, 0x2c, 0x4c, 0x2a, 0x4d, 0x29, 0x2c, 0x66, + 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x61, 0x6e, 0x64, 0x29, + 0x7b, 0x76, 0x61, 0x72, 0x20, 0x54, 0x3d, 0x66, 0x2c, 0x52, 0x3d, + 0x54, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x61, 0x6e, 0x64, + 0x28, 0x29, 0x2f, 0x32, 0x3b, 0x73, 0x3d, 0x66, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x54, 0x28, 0x6e, 0x29, 0x2b, + 0x52, 0x7d, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x73, 0x2e, 0x72, + 0x61, 0x6e, 0x67, 0x65, 0x42, 0x61, 0x6e, 0x64, 0x3f, 0x73, 0x3d, + 0x66, 0x3a, 0x64, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6e, 0x2c, + 0x66, 0x2c, 0x73, 0x29, 0x3b, 0x76, 0x2e, 0x63, 0x61, 0x6c, 0x6c, + 0x28, 0x6e, 0x2c, 0x73, 0x2c, 0x66, 0x29, 0x2c, 0x6d, 0x2e, 0x63, + 0x61, 0x6c, 0x6c, 0x28, 0x6e, 0x2c, 0x66, 0x2c, 0x66, 0x29, 0x7d, + 0x29, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x74, 0x2c, 0x65, 0x3d, 0x74, + 0x61, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x6c, 0x69, 0x6e, + 0x65, 0x61, 0x72, 0x28, 0x29, 0x2c, 0x72, 0x3d, 0x6a, 0x6c, 0x2c, + 0x75, 0x3d, 0x36, 0x2c, 0x69, 0x3d, 0x36, 0x2c, 0x6f, 0x3d, 0x33, + 0x2c, 0x61, 0x3d, 0x5b, 0x31, 0x30, 0x5d, 0x2c, 0x63, 0x3d, 0x6e, + 0x75, 0x6c, 0x6c, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, + 0x28, 0x65, 0x3d, 0x74, 0x2c, 0x6e, 0x29, 0x3a, 0x65, 0x7d, 0x2c, + 0x6e, 0x2e, 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x3d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3f, 0x28, 0x72, 0x3d, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x46, 0x6c, + 0x3f, 0x74, 0x2b, 0x22, 0x22, 0x3a, 0x6a, 0x6c, 0x2c, 0x6e, 0x29, + 0x3a, 0x72, 0x7d, 0x2c, 0x6e, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x73, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3f, 0x28, 0x61, 0x3d, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x6e, 0x29, 0x3a, 0x61, 0x7d, 0x2c, + 0x6e, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x63, 0x3d, 0x74, 0x2c, 0x6e, + 0x29, 0x3a, 0x63, 0x7d, 0x2c, 0x6e, 0x2e, 0x74, 0x69, 0x63, 0x6b, + 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, + 0x74, 0x3d, 0x65, 0x2c, 0x6e, 0x29, 0x3a, 0x74, 0x7d, 0x2c, 0x6e, + 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x3f, 0x28, + 0x75, 0x3d, 0x2b, 0x74, 0x2c, 0x69, 0x3d, 0x2b, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5b, 0x65, 0x2d, 0x31, 0x5d, + 0x2c, 0x6e, 0x29, 0x3a, 0x75, 0x7d, 0x2c, 0x6e, 0x2e, 0x69, 0x6e, + 0x6e, 0x65, 0x72, 0x54, 0x69, 0x63, 0x6b, 0x53, 0x69, 0x7a, 0x65, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3f, 0x28, 0x75, 0x3d, 0x2b, 0x74, 0x2c, 0x6e, + 0x29, 0x3a, 0x75, 0x7d, 0x2c, 0x6e, 0x2e, 0x6f, 0x75, 0x74, 0x65, + 0x72, 0x54, 0x69, 0x63, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3f, 0x28, 0x69, 0x3d, 0x2b, 0x74, 0x2c, 0x6e, 0x29, 0x3a, + 0x69, 0x7d, 0x2c, 0x6e, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x50, 0x61, + 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x6f, + 0x3d, 0x2b, 0x74, 0x2c, 0x6e, 0x29, 0x3a, 0x6f, 0x7d, 0x2c, 0x6e, + 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x53, 0x75, 0x62, 0x64, 0x69, 0x76, + 0x69, 0x64, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x26, 0x26, 0x6e, 0x7d, 0x2c, 0x6e, + 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x6a, 0x6c, 0x3d, 0x22, 0x62, + 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x22, 0x2c, 0x46, 0x6c, 0x3d, 0x7b, + 0x74, 0x6f, 0x70, 0x3a, 0x31, 0x2c, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x3a, 0x31, 0x2c, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x31, + 0x2c, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x31, 0x7d, 0x3b, 0x74, 0x61, + 0x2e, 0x73, 0x76, 0x67, 0x2e, 0x62, 0x72, 0x75, 0x73, 0x68, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x28, + 0x74, 0x29, 0x7b, 0x74, 0x2e, 0x65, 0x61, 0x63, 0x68, 0x28, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x74, 0x3d, 0x74, 0x61, 0x2e, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x2e, 0x73, + 0x74, 0x79, 0x6c, 0x65, 0x28, 0x22, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x2d, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x2c, + 0x22, 0x61, 0x6c, 0x6c, 0x22, 0x29, 0x2e, 0x73, 0x74, 0x79, 0x6c, + 0x65, 0x28, 0x22, 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, + 0x74, 0x61, 0x70, 0x2d, 0x68, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, + 0x68, 0x74, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x22, 0x2c, 0x22, + 0x72, 0x67, 0x62, 0x61, 0x28, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, + 0x30, 0x29, 0x22, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x22, 0x6d, 0x6f, + 0x75, 0x73, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x2e, 0x62, 0x72, 0x75, + 0x73, 0x68, 0x22, 0x2c, 0x69, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x22, + 0x74, 0x6f, 0x75, 0x63, 0x68, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2e, + 0x62, 0x72, 0x75, 0x73, 0x68, 0x22, 0x2c, 0x69, 0x29, 0x2c, 0x6f, + 0x3d, 0x74, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x41, 0x6c, + 0x6c, 0x28, 0x22, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, + 0x75, 0x6e, 0x64, 0x22, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x28, + 0x5b, 0x30, 0x5d, 0x29, 0x3b, 0x6f, 0x2e, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x28, 0x29, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, + 0x22, 0x72, 0x65, 0x63, 0x74, 0x22, 0x29, 0x2e, 0x61, 0x74, 0x74, + 0x72, 0x28, 0x22, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x22, 0x2c, 0x22, + 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x22, + 0x29, 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x28, 0x22, 0x76, 0x69, + 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22, 0x2c, 0x22, + 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x22, 0x29, 0x2e, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x28, 0x22, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, + 0x22, 0x2c, 0x22, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x68, 0x61, 0x69, + 0x72, 0x22, 0x29, 0x2c, 0x74, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x41, 0x6c, 0x6c, 0x28, 0x22, 0x2e, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x28, 0x5b, + 0x30, 0x5d, 0x29, 0x2e, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x28, 0x29, + 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x22, 0x72, 0x65, + 0x63, 0x74, 0x22, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x22, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x22, 0x2c, 0x22, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x29, 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, + 0x28, 0x22, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x2c, 0x22, + 0x6d, 0x6f, 0x76, 0x65, 0x22, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, + 0x61, 0x3d, 0x74, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x41, + 0x6c, 0x6c, 0x28, 0x22, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, + 0x22, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x28, 0x76, 0x2c, 0x79, + 0x29, 0x3b, 0x61, 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, 0x29, 0x2e, + 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x29, 0x2c, 0x61, 0x2e, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x28, 0x29, 0x2e, 0x61, 0x70, 0x70, + 0x65, 0x6e, 0x64, 0x28, 0x22, 0x67, 0x22, 0x29, 0x2e, 0x61, 0x74, + 0x74, 0x72, 0x28, 0x22, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x22, 0x2c, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x72, 0x65, 0x73, + 0x69, 0x7a, 0x65, 0x20, 0x22, 0x2b, 0x6e, 0x7d, 0x29, 0x2e, 0x73, + 0x74, 0x79, 0x6c, 0x65, 0x28, 0x22, 0x63, 0x75, 0x72, 0x73, 0x6f, + 0x72, 0x22, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x48, 0x6c, 0x5b, 0x6e, 0x5d, 0x7d, 0x29, 0x2e, 0x61, 0x70, 0x70, + 0x65, 0x6e, 0x64, 0x28, 0x22, 0x72, 0x65, 0x63, 0x74, 0x22, 0x29, + 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x22, 0x78, 0x22, 0x2c, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x2f, 0x5b, 0x65, 0x77, 0x5d, + 0x24, 0x2f, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x28, 0x6e, 0x29, 0x3f, + 0x2d, 0x33, 0x3a, 0x6e, 0x75, 0x6c, 0x6c, 0x7d, 0x29, 0x2e, 0x61, + 0x74, 0x74, 0x72, 0x28, 0x22, 0x79, 0x22, 0x2c, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x2f, 0x5e, 0x5b, 0x6e, 0x73, 0x5d, 0x2f, + 0x2e, 0x74, 0x65, 0x73, 0x74, 0x28, 0x6e, 0x29, 0x3f, 0x2d, 0x33, + 0x3a, 0x6e, 0x75, 0x6c, 0x6c, 0x7d, 0x29, 0x2e, 0x61, 0x74, 0x74, + 0x72, 0x28, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x22, 0x2c, 0x36, + 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x22, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x22, 0x2c, 0x36, 0x29, 0x2e, 0x73, 0x74, 0x79, + 0x6c, 0x65, 0x28, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x79, 0x22, 0x2c, 0x22, 0x68, 0x69, 0x64, 0x64, 0x65, + 0x6e, 0x22, 0x29, 0x2c, 0x61, 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, + 0x28, 0x22, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x22, 0x2c, + 0x6e, 0x2e, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x28, 0x29, 0x3f, 0x22, + 0x6e, 0x6f, 0x6e, 0x65, 0x22, 0x3a, 0x6e, 0x75, 0x6c, 0x6c, 0x29, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x63, 0x2c, 0x66, 0x3d, 0x74, 0x61, + 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x74, 0x29, 0x2c, 0x68, 0x3d, 0x74, 0x61, 0x2e, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6f, 0x29, + 0x3b, 0x6c, 0x26, 0x26, 0x28, 0x63, 0x3d, 0x55, 0x69, 0x28, 0x6c, + 0x29, 0x2c, 0x68, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x22, 0x78, + 0x22, 0x2c, 0x63, 0x5b, 0x30, 0x5d, 0x29, 0x2e, 0x61, 0x74, 0x74, + 0x72, 0x28, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x22, 0x2c, 0x63, + 0x5b, 0x31, 0x5d, 0x2d, 0x63, 0x5b, 0x30, 0x5d, 0x29, 0x2c, 0x72, + 0x28, 0x66, 0x29, 0x29, 0x2c, 0x73, 0x26, 0x26, 0x28, 0x63, 0x3d, + 0x55, 0x69, 0x28, 0x73, 0x29, 0x2c, 0x68, 0x2e, 0x61, 0x74, 0x74, + 0x72, 0x28, 0x22, 0x79, 0x22, 0x2c, 0x63, 0x5b, 0x30, 0x5d, 0x29, + 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x22, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x22, 0x2c, 0x63, 0x5b, 0x31, 0x5d, 0x2d, 0x63, 0x5b, + 0x30, 0x5d, 0x29, 0x2c, 0x75, 0x28, 0x66, 0x29, 0x29, 0x2c, 0x65, + 0x28, 0x66, 0x29, 0x7d, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x28, 0x6e, 0x29, 0x7b, 0x6e, 0x2e, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x41, 0x6c, 0x6c, 0x28, 0x22, + 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x29, 0x2e, 0x61, + 0x74, 0x74, 0x72, 0x28, 0x22, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x6f, 0x72, 0x6d, 0x22, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x22, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, + 0x28, 0x22, 0x2b, 0x66, 0x5b, 0x2b, 0x2f, 0x65, 0x24, 0x2f, 0x2e, + 0x74, 0x65, 0x73, 0x74, 0x28, 0x6e, 0x29, 0x5d, 0x2b, 0x22, 0x2c, + 0x22, 0x2b, 0x68, 0x5b, 0x2b, 0x2f, 0x5e, 0x73, 0x2f, 0x2e, 0x74, + 0x65, 0x73, 0x74, 0x28, 0x6e, 0x29, 0x5d, 0x2b, 0x22, 0x29, 0x22, + 0x7d, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x72, 0x28, 0x6e, 0x29, 0x7b, 0x6e, 0x2e, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x28, 0x22, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x22, 0x78, + 0x22, 0x2c, 0x66, 0x5b, 0x30, 0x5d, 0x29, 0x2c, 0x6e, 0x2e, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x41, 0x6c, 0x6c, 0x28, 0x22, 0x2e, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x2c, 0x2e, 0x6e, 0x3e, 0x72, + 0x65, 0x63, 0x74, 0x2c, 0x2e, 0x73, 0x3e, 0x72, 0x65, 0x63, 0x74, + 0x22, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x22, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x22, 0x2c, 0x66, 0x5b, 0x31, 0x5d, 0x2d, 0x66, + 0x5b, 0x30, 0x5d, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x75, 0x28, 0x6e, 0x29, 0x7b, 0x6e, 0x2e, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x22, 0x2e, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, + 0x22, 0x79, 0x22, 0x2c, 0x68, 0x5b, 0x30, 0x5d, 0x29, 0x2c, 0x6e, + 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x41, 0x6c, 0x6c, 0x28, + 0x22, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x2c, 0x2e, 0x65, + 0x3e, 0x72, 0x65, 0x63, 0x74, 0x2c, 0x2e, 0x77, 0x3e, 0x72, 0x65, + 0x63, 0x74, 0x22, 0x29, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x22, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x2c, 0x68, 0x5b, 0x31, + 0x5d, 0x2d, 0x68, 0x5b, 0x30, 0x5d, 0x29, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x28, 0x29, 0x7b, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x28, 0x29, + 0x7b, 0x33, 0x32, 0x3d, 0x3d, 0x74, 0x61, 0x2e, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x26, + 0x26, 0x28, 0x43, 0x7c, 0x7c, 0x28, 0x4d, 0x3d, 0x6e, 0x75, 0x6c, + 0x6c, 0x2c, 0x71, 0x5b, 0x30, 0x5d, 0x2d, 0x3d, 0x66, 0x5b, 0x31, + 0x5d, 0x2c, 0x71, 0x5b, 0x31, 0x5d, 0x2d, 0x3d, 0x68, 0x5b, 0x31, + 0x5d, 0x2c, 0x43, 0x3d, 0x32, 0x29, 0x2c, 0x53, 0x28, 0x29, 0x29, + 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, + 0x28, 0x29, 0x7b, 0x33, 0x32, 0x3d, 0x3d, 0x74, 0x61, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x43, 0x6f, 0x64, + 0x65, 0x26, 0x26, 0x32, 0x3d, 0x3d, 0x43, 0x26, 0x26, 0x28, 0x71, + 0x5b, 0x30, 0x5d, 0x2b, 0x3d, 0x66, 0x5b, 0x31, 0x5d, 0x2c, 0x71, + 0x5b, 0x31, 0x5d, 0x2b, 0x3d, 0x68, 0x5b, 0x31, 0x5d, 0x2c, 0x43, + 0x3d, 0x30, 0x2c, 0x53, 0x28, 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x28, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x6e, 0x3d, 0x74, 0x61, 0x2e, 0x6d, 0x6f, 0x75, + 0x73, 0x65, 0x28, 0x62, 0x29, 0x2c, 0x74, 0x3d, 0x21, 0x31, 0x3b, + 0x78, 0x26, 0x26, 0x28, 0x6e, 0x5b, 0x30, 0x5d, 0x2b, 0x3d, 0x78, + 0x5b, 0x30, 0x5d, 0x2c, 0x6e, 0x5b, 0x31, 0x5d, 0x2b, 0x3d, 0x78, + 0x5b, 0x31, 0x5d, 0x29, 0x2c, 0x43, 0x7c, 0x7c, 0x28, 0x74, 0x61, + 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x6c, 0x74, 0x4b, + 0x65, 0x79, 0x3f, 0x28, 0x4d, 0x7c, 0x7c, 0x28, 0x4d, 0x3d, 0x5b, + 0x28, 0x66, 0x5b, 0x30, 0x5d, 0x2b, 0x66, 0x5b, 0x31, 0x5d, 0x29, + 0x2f, 0x32, 0x2c, 0x28, 0x68, 0x5b, 0x30, 0x5d, 0x2b, 0x68, 0x5b, + 0x31, 0x5d, 0x29, 0x2f, 0x32, 0x5d, 0x29, 0x2c, 0x71, 0x5b, 0x30, + 0x5d, 0x3d, 0x66, 0x5b, 0x2b, 0x28, 0x6e, 0x5b, 0x30, 0x5d, 0x3c, + 0x4d, 0x5b, 0x30, 0x5d, 0x29, 0x5d, 0x2c, 0x71, 0x5b, 0x31, 0x5d, + 0x3d, 0x68, 0x5b, 0x2b, 0x28, 0x6e, 0x5b, 0x31, 0x5d, 0x3c, 0x4d, + 0x5b, 0x31, 0x5d, 0x29, 0x5d, 0x29, 0x3a, 0x4d, 0x3d, 0x6e, 0x75, + 0x6c, 0x6c, 0x29, 0x2c, 0x41, 0x26, 0x26, 0x6d, 0x28, 0x6e, 0x2c, + 0x6c, 0x2c, 0x30, 0x29, 0x26, 0x26, 0x28, 0x72, 0x28, 0x6b, 0x29, + 0x2c, 0x74, 0x3d, 0x21, 0x30, 0x29, 0x2c, 0x4e, 0x26, 0x26, 0x6d, + 0x28, 0x6e, 0x2c, 0x73, 0x2c, 0x31, 0x29, 0x26, 0x26, 0x28, 0x75, + 0x28, 0x6b, 0x29, 0x2c, 0x74, 0x3d, 0x21, 0x30, 0x29, 0x2c, 0x74, + 0x26, 0x26, 0x28, 0x65, 0x28, 0x6b, 0x29, 0x2c, 0x77, 0x28, 0x7b, + 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x62, 0x72, 0x75, 0x73, 0x68, + 0x22, 0x2c, 0x6d, 0x6f, 0x64, 0x65, 0x3a, 0x43, 0x3f, 0x22, 0x6d, + 0x6f, 0x76, 0x65, 0x22, 0x3a, 0x22, 0x72, 0x65, 0x73, 0x69, 0x7a, + 0x65, 0x22, 0x7d, 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x2c, 0x75, 0x2c, 0x69, + 0x3d, 0x55, 0x69, 0x28, 0x74, 0x29, 0x2c, 0x63, 0x3d, 0x69, 0x5b, + 0x30, 0x5d, 0x2c, 0x6c, 0x3d, 0x69, 0x5b, 0x31, 0x5d, 0x2c, 0x73, + 0x3d, 0x71, 0x5b, 0x65, 0x5d, 0x2c, 0x76, 0x3d, 0x65, 0x3f, 0x68, + 0x3a, 0x66, 0x2c, 0x64, 0x3d, 0x76, 0x5b, 0x31, 0x5d, 0x2d, 0x76, + 0x5b, 0x30, 0x5d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x43, 0x26, 0x26, 0x28, 0x63, 0x2d, 0x3d, 0x73, 0x2c, 0x6c, 0x2d, + 0x3d, 0x64, 0x2b, 0x73, 0x29, 0x2c, 0x72, 0x3d, 0x28, 0x65, 0x3f, + 0x70, 0x3a, 0x67, 0x29, 0x3f, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, + 0x61, 0x78, 0x28, 0x63, 0x2c, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, + 0x69, 0x6e, 0x28, 0x6c, 0x2c, 0x6e, 0x5b, 0x65, 0x5d, 0x29, 0x29, + 0x3a, 0x6e, 0x5b, 0x65, 0x5d, 0x2c, 0x43, 0x3f, 0x75, 0x3d, 0x28, + 0x72, 0x2b, 0x3d, 0x73, 0x29, 0x2b, 0x64, 0x3a, 0x28, 0x4d, 0x26, + 0x26, 0x28, 0x73, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, + 0x78, 0x28, 0x63, 0x2c, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x69, + 0x6e, 0x28, 0x6c, 0x2c, 0x32, 0x2a, 0x4d, 0x5b, 0x65, 0x5d, 0x2d, + 0x72, 0x29, 0x29, 0x29, 0x2c, 0x72, 0x3e, 0x73, 0x3f, 0x28, 0x75, + 0x3d, 0x72, 0x2c, 0x72, 0x3d, 0x73, 0x29, 0x3a, 0x75, 0x3d, 0x73, + 0x29, 0x2c, 0x76, 0x5b, 0x30, 0x5d, 0x21, 0x3d, 0x72, 0x7c, 0x7c, + 0x76, 0x5b, 0x31, 0x5d, 0x21, 0x3d, 0x75, 0x3f, 0x28, 0x65, 0x3f, + 0x61, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x3a, 0x6f, 0x3d, 0x6e, 0x75, + 0x6c, 0x6c, 0x2c, 0x76, 0x5b, 0x30, 0x5d, 0x3d, 0x72, 0x2c, 0x76, + 0x5b, 0x31, 0x5d, 0x3d, 0x75, 0x2c, 0x21, 0x30, 0x29, 0x3a, 0x76, + 0x6f, 0x69, 0x64, 0x20, 0x30, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x79, 0x28, 0x29, 0x7b, 0x64, 0x28, 0x29, + 0x2c, 0x6b, 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x28, 0x22, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x2d, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x22, 0x2c, 0x22, 0x61, 0x6c, 0x6c, 0x22, 0x29, 0x2e, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x41, 0x6c, 0x6c, 0x28, 0x22, + 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x29, 0x2e, 0x73, + 0x74, 0x79, 0x6c, 0x65, 0x28, 0x22, 0x64, 0x69, 0x73, 0x70, 0x6c, + 0x61, 0x79, 0x22, 0x2c, 0x6e, 0x2e, 0x65, 0x6d, 0x70, 0x74, 0x79, + 0x28, 0x29, 0x3f, 0x22, 0x6e, 0x6f, 0x6e, 0x65, 0x22, 0x3a, 0x6e, + 0x75, 0x6c, 0x6c, 0x29, 0x2c, 0x74, 0x61, 0x2e, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x28, 0x22, 0x62, 0x6f, 0x64, 0x79, 0x22, 0x29, + 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x28, 0x22, 0x63, 0x75, 0x72, + 0x73, 0x6f, 0x72, 0x22, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x2c, + 0x4c, 0x2e, 0x6f, 0x6e, 0x28, 0x22, 0x6d, 0x6f, 0x75, 0x73, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x2e, 0x62, 0x72, 0x75, 0x73, 0x68, 0x22, + 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x22, + 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x75, 0x70, 0x2e, 0x62, 0x72, 0x75, + 0x73, 0x68, 0x22, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x2e, 0x6f, + 0x6e, 0x28, 0x22, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x6d, 0x6f, 0x76, + 0x65, 0x2e, 0x62, 0x72, 0x75, 0x73, 0x68, 0x22, 0x2c, 0x6e, 0x75, + 0x6c, 0x6c, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x22, 0x74, 0x6f, 0x75, + 0x63, 0x68, 0x65, 0x6e, 0x64, 0x2e, 0x62, 0x72, 0x75, 0x73, 0x68, + 0x22, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x2e, 0x6f, 0x6e, 0x28, + 0x22, 0x6b, 0x65, 0x79, 0x64, 0x6f, 0x77, 0x6e, 0x2e, 0x62, 0x72, + 0x75, 0x73, 0x68, 0x22, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x2e, + 0x6f, 0x6e, 0x28, 0x22, 0x6b, 0x65, 0x79, 0x75, 0x70, 0x2e, 0x62, + 0x72, 0x75, 0x73, 0x68, 0x22, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x29, + 0x2c, 0x7a, 0x28, 0x29, 0x2c, 0x77, 0x28, 0x7b, 0x74, 0x79, 0x70, + 0x65, 0x3a, 0x22, 0x62, 0x72, 0x75, 0x73, 0x68, 0x65, 0x6e, 0x64, + 0x22, 0x7d, 0x29, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x4d, 0x2c, 0x78, + 0x2c, 0x62, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x5f, 0x3d, 0x74, + 0x61, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x74, 0x61, + 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x29, 0x2c, 0x77, 0x3d, 0x63, 0x2e, 0x6f, 0x66, 0x28, + 0x62, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x29, 0x2c, 0x6b, 0x3d, 0x74, 0x61, 0x2e, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x28, 0x62, 0x29, 0x2c, 0x45, 0x3d, 0x5f, 0x2e, 0x64, + 0x61, 0x74, 0x75, 0x6d, 0x28, 0x29, 0x2c, 0x41, 0x3d, 0x21, 0x2f, + 0x5e, 0x28, 0x6e, 0x7c, 0x73, 0x29, 0x24, 0x2f, 0x2e, 0x74, 0x65, + 0x73, 0x74, 0x28, 0x45, 0x29, 0x26, 0x26, 0x6c, 0x2c, 0x4e, 0x3d, + 0x21, 0x2f, 0x5e, 0x28, 0x65, 0x7c, 0x77, 0x29, 0x24, 0x2f, 0x2e, + 0x74, 0x65, 0x73, 0x74, 0x28, 0x45, 0x29, 0x26, 0x26, 0x73, 0x2c, + 0x43, 0x3d, 0x5f, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x64, + 0x28, 0x22, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x2c, + 0x7a, 0x3d, 0x57, 0x28, 0x62, 0x29, 0x2c, 0x71, 0x3d, 0x74, 0x61, + 0x2e, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x28, 0x62, 0x29, 0x2c, 0x4c, + 0x3d, 0x74, 0x61, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, + 0x74, 0x28, 0x62, 0x29, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x22, 0x6b, + 0x65, 0x79, 0x64, 0x6f, 0x77, 0x6e, 0x2e, 0x62, 0x72, 0x75, 0x73, + 0x68, 0x22, 0x2c, 0x69, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x22, 0x6b, + 0x65, 0x79, 0x75, 0x70, 0x2e, 0x62, 0x72, 0x75, 0x73, 0x68, 0x22, + 0x2c, 0x76, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x74, 0x61, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x64, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x73, 0x3f, 0x4c, 0x2e, + 0x6f, 0x6e, 0x28, 0x22, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x6d, 0x6f, + 0x76, 0x65, 0x2e, 0x62, 0x72, 0x75, 0x73, 0x68, 0x22, 0x2c, 0x64, + 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x22, 0x74, 0x6f, 0x75, 0x63, 0x68, + 0x65, 0x6e, 0x64, 0x2e, 0x62, 0x72, 0x75, 0x73, 0x68, 0x22, 0x2c, + 0x79, 0x29, 0x3a, 0x4c, 0x2e, 0x6f, 0x6e, 0x28, 0x22, 0x6d, 0x6f, + 0x75, 0x73, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x2e, 0x62, 0x72, 0x75, + 0x73, 0x68, 0x22, 0x2c, 0x64, 0x29, 0x2e, 0x6f, 0x6e, 0x28, 0x22, + 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x75, 0x70, 0x2e, 0x62, 0x72, 0x75, + 0x73, 0x68, 0x22, 0x2c, 0x79, 0x29, 0x2c, 0x6b, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x28, 0x29, 0x2e, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x41, 0x6c, 0x6c, 0x28, 0x22, 0x2a, + 0x22, 0x29, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, + 0x74, 0x28, 0x29, 0x2c, 0x43, 0x29, 0x71, 0x5b, 0x30, 0x5d, 0x3d, + 0x66, 0x5b, 0x30, 0x5d, 0x2d, 0x71, 0x5b, 0x30, 0x5d, 0x2c, 0x71, + 0x5b, 0x31, 0x5d, 0x3d, 0x68, 0x5b, 0x30, 0x5d, 0x2d, 0x71, 0x5b, + 0x31, 0x5d, 0x3b, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, + 0x45, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x54, 0x3d, 0x2b, 0x2f, + 0x77, 0x24, 0x2f, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x28, 0x45, 0x29, + 0x2c, 0x52, 0x3d, 0x2b, 0x2f, 0x5e, 0x6e, 0x2f, 0x2e, 0x74, 0x65, + 0x73, 0x74, 0x28, 0x45, 0x29, 0x3b, 0x78, 0x3d, 0x5b, 0x66, 0x5b, + 0x31, 0x2d, 0x54, 0x5d, 0x2d, 0x71, 0x5b, 0x30, 0x5d, 0x2c, 0x68, + 0x5b, 0x31, 0x2d, 0x52, 0x5d, 0x2d, 0x71, 0x5b, 0x31, 0x5d, 0x5d, + 0x2c, 0x71, 0x5b, 0x30, 0x5d, 0x3d, 0x66, 0x5b, 0x54, 0x5d, 0x2c, + 0x71, 0x5b, 0x31, 0x5d, 0x3d, 0x68, 0x5b, 0x52, 0x5d, 0x7d, 0x65, + 0x6c, 0x73, 0x65, 0x20, 0x74, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x2e, 0x61, 0x6c, 0x74, 0x4b, 0x65, 0x79, 0x26, 0x26, 0x28, + 0x4d, 0x3d, 0x71, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x29, + 0x29, 0x3b, 0x6b, 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x28, 0x22, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x2d, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x22, 0x2c, 0x22, 0x6e, 0x6f, 0x6e, 0x65, 0x22, + 0x29, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x41, 0x6c, 0x6c, + 0x28, 0x22, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x29, + 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x28, 0x22, 0x64, 0x69, 0x73, + 0x70, 0x6c, 0x61, 0x79, 0x22, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x29, + 0x2c, 0x74, 0x61, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, + 0x22, 0x62, 0x6f, 0x64, 0x79, 0x22, 0x29, 0x2e, 0x73, 0x74, 0x79, + 0x6c, 0x65, 0x28, 0x22, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, + 0x2c, 0x5f, 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x28, 0x22, 0x63, + 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x29, 0x29, 0x2c, 0x77, 0x28, + 0x7b, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x62, 0x72, 0x75, 0x73, + 0x68, 0x73, 0x74, 0x61, 0x72, 0x74, 0x22, 0x7d, 0x29, 0x2c, 0x64, + 0x28, 0x29, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x6f, 0x2c, 0x61, 0x2c, + 0x63, 0x3d, 0x45, 0x28, 0x6e, 0x2c, 0x22, 0x62, 0x72, 0x75, 0x73, + 0x68, 0x73, 0x74, 0x61, 0x72, 0x74, 0x22, 0x2c, 0x22, 0x62, 0x72, + 0x75, 0x73, 0x68, 0x22, 0x2c, 0x22, 0x62, 0x72, 0x75, 0x73, 0x68, + 0x65, 0x6e, 0x64, 0x22, 0x29, 0x2c, 0x6c, 0x3d, 0x6e, 0x75, 0x6c, + 0x6c, 0x2c, 0x73, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x66, 0x3d, + 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x68, 0x3d, 0x5b, 0x30, 0x2c, + 0x30, 0x5d, 0x2c, 0x67, 0x3d, 0x21, 0x30, 0x2c, 0x70, 0x3d, 0x21, + 0x30, 0x2c, 0x76, 0x3d, 0x4f, 0x6c, 0x5b, 0x30, 0x5d, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6e, 0x29, 0x7b, 0x6e, 0x2e, 0x65, 0x61, 0x63, 0x68, 0x28, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x6e, 0x3d, 0x63, 0x2e, 0x6f, 0x66, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x29, 0x2c, 0x74, 0x3d, 0x7b, 0x78, 0x3a, 0x66, + 0x2c, 0x79, 0x3a, 0x68, 0x2c, 0x69, 0x3a, 0x6f, 0x2c, 0x6a, 0x3a, + 0x61, 0x7d, 0x2c, 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, + 0x5f, 0x63, 0x68, 0x61, 0x72, 0x74, 0x5f, 0x5f, 0x7c, 0x7c, 0x74, + 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x5f, 0x5f, 0x63, 0x68, 0x61, + 0x72, 0x74, 0x5f, 0x5f, 0x3d, 0x74, 0x2c, 0x54, 0x6c, 0x3f, 0x74, + 0x61, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x29, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x2e, 0x65, 0x61, 0x63, 0x68, 0x28, + 0x22, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2e, 0x62, 0x72, 0x75, 0x73, + 0x68, 0x22, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x7b, 0x6f, 0x3d, 0x65, 0x2e, 0x69, 0x2c, 0x61, 0x3d, + 0x65, 0x2e, 0x6a, 0x2c, 0x66, 0x3d, 0x65, 0x2e, 0x78, 0x2c, 0x68, + 0x3d, 0x65, 0x2e, 0x79, 0x2c, 0x6e, 0x28, 0x7b, 0x74, 0x79, 0x70, + 0x65, 0x3a, 0x22, 0x62, 0x72, 0x75, 0x73, 0x68, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x22, 0x7d, 0x29, 0x7d, 0x29, 0x2e, 0x74, 0x77, 0x65, + 0x65, 0x6e, 0x28, 0x22, 0x62, 0x72, 0x75, 0x73, 0x68, 0x3a, 0x62, + 0x72, 0x75, 0x73, 0x68, 0x22, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, + 0x3d, 0x79, 0x75, 0x28, 0x66, 0x2c, 0x74, 0x2e, 0x78, 0x29, 0x2c, + 0x72, 0x3d, 0x79, 0x75, 0x28, 0x68, 0x2c, 0x74, 0x2e, 0x79, 0x29, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x3d, 0x61, + 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x75, 0x29, 0x7b, 0x66, 0x3d, 0x74, 0x2e, + 0x78, 0x3d, 0x65, 0x28, 0x75, 0x29, 0x2c, 0x68, 0x3d, 0x74, 0x2e, + 0x79, 0x3d, 0x72, 0x28, 0x75, 0x29, 0x2c, 0x6e, 0x28, 0x7b, 0x74, + 0x79, 0x70, 0x65, 0x3a, 0x22, 0x62, 0x72, 0x75, 0x73, 0x68, 0x22, + 0x2c, 0x6d, 0x6f, 0x64, 0x65, 0x3a, 0x22, 0x72, 0x65, 0x73, 0x69, + 0x7a, 0x65, 0x22, 0x7d, 0x29, 0x7d, 0x7d, 0x29, 0x2e, 0x65, 0x61, + 0x63, 0x68, 0x28, 0x22, 0x65, 0x6e, 0x64, 0x2e, 0x62, 0x72, 0x75, + 0x73, 0x68, 0x22, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x7b, 0x6f, 0x3d, 0x74, 0x2e, 0x69, 0x2c, 0x61, + 0x3d, 0x74, 0x2e, 0x6a, 0x2c, 0x6e, 0x28, 0x7b, 0x74, 0x79, 0x70, + 0x65, 0x3a, 0x22, 0x62, 0x72, 0x75, 0x73, 0x68, 0x22, 0x2c, 0x6d, + 0x6f, 0x64, 0x65, 0x3a, 0x22, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, + 0x22, 0x7d, 0x29, 0x2c, 0x6e, 0x28, 0x7b, 0x74, 0x79, 0x70, 0x65, + 0x3a, 0x22, 0x62, 0x72, 0x75, 0x73, 0x68, 0x65, 0x6e, 0x64, 0x22, + 0x7d, 0x29, 0x7d, 0x29, 0x3a, 0x28, 0x6e, 0x28, 0x7b, 0x74, 0x79, + 0x70, 0x65, 0x3a, 0x22, 0x62, 0x72, 0x75, 0x73, 0x68, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x22, 0x7d, 0x29, 0x2c, 0x6e, 0x28, 0x7b, 0x74, + 0x79, 0x70, 0x65, 0x3a, 0x22, 0x62, 0x72, 0x75, 0x73, 0x68, 0x22, + 0x2c, 0x6d, 0x6f, 0x64, 0x65, 0x3a, 0x22, 0x72, 0x65, 0x73, 0x69, + 0x7a, 0x65, 0x22, 0x7d, 0x29, 0x2c, 0x6e, 0x28, 0x7b, 0x74, 0x79, + 0x70, 0x65, 0x3a, 0x22, 0x62, 0x72, 0x75, 0x73, 0x68, 0x65, 0x6e, + 0x64, 0x22, 0x7d, 0x29, 0x29, 0x7d, 0x29, 0x7d, 0x2c, 0x6e, 0x2e, + 0x78, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x6c, 0x3d, 0x74, 0x2c, 0x76, + 0x3d, 0x4f, 0x6c, 0x5b, 0x21, 0x6c, 0x3c, 0x3c, 0x31, 0x7c, 0x21, + 0x73, 0x5d, 0x2c, 0x6e, 0x29, 0x3a, 0x6c, 0x7d, 0x2c, 0x6e, 0x2e, + 0x79, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x73, 0x3d, 0x74, 0x2c, 0x76, + 0x3d, 0x4f, 0x6c, 0x5b, 0x21, 0x6c, 0x3c, 0x3c, 0x31, 0x7c, 0x21, + 0x73, 0x5d, 0x2c, 0x6e, 0x29, 0x3a, 0x73, 0x7d, 0x2c, 0x6e, 0x2e, + 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x6c, + 0x26, 0x26, 0x73, 0x3f, 0x28, 0x67, 0x3d, 0x21, 0x21, 0x74, 0x5b, + 0x30, 0x5d, 0x2c, 0x70, 0x3d, 0x21, 0x21, 0x74, 0x5b, 0x31, 0x5d, + 0x29, 0x3a, 0x6c, 0x3f, 0x67, 0x3d, 0x21, 0x21, 0x74, 0x3a, 0x73, + 0x26, 0x26, 0x28, 0x70, 0x3d, 0x21, 0x21, 0x74, 0x29, 0x2c, 0x6e, + 0x29, 0x3a, 0x6c, 0x26, 0x26, 0x73, 0x3f, 0x5b, 0x67, 0x2c, 0x70, + 0x5d, 0x3a, 0x6c, 0x3f, 0x67, 0x3a, 0x73, 0x3f, 0x70, 0x3a, 0x6e, + 0x75, 0x6c, 0x6c, 0x7d, 0x2c, 0x6e, 0x2e, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x2c, 0x72, + 0x2c, 0x75, 0x2c, 0x69, 0x2c, 0x63, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x28, 0x6c, + 0x26, 0x26, 0x28, 0x65, 0x3d, 0x74, 0x5b, 0x30, 0x5d, 0x2c, 0x72, + 0x3d, 0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x73, 0x26, 0x26, 0x28, 0x65, + 0x3d, 0x65, 0x5b, 0x30, 0x5d, 0x2c, 0x72, 0x3d, 0x72, 0x5b, 0x30, + 0x5d, 0x29, 0x2c, 0x6f, 0x3d, 0x5b, 0x65, 0x2c, 0x72, 0x5d, 0x2c, + 0x6c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x26, 0x26, 0x28, + 0x65, 0x3d, 0x6c, 0x28, 0x65, 0x29, 0x2c, 0x72, 0x3d, 0x6c, 0x28, + 0x72, 0x29, 0x29, 0x2c, 0x65, 0x3e, 0x72, 0x26, 0x26, 0x28, 0x63, + 0x3d, 0x65, 0x2c, 0x65, 0x3d, 0x72, 0x2c, 0x72, 0x3d, 0x63, 0x29, + 0x2c, 0x28, 0x65, 0x21, 0x3d, 0x66, 0x5b, 0x30, 0x5d, 0x7c, 0x7c, + 0x72, 0x21, 0x3d, 0x66, 0x5b, 0x31, 0x5d, 0x29, 0x26, 0x26, 0x28, + 0x66, 0x3d, 0x5b, 0x65, 0x2c, 0x72, 0x5d, 0x29, 0x29, 0x2c, 0x73, + 0x26, 0x26, 0x28, 0x75, 0x3d, 0x74, 0x5b, 0x30, 0x5d, 0x2c, 0x69, + 0x3d, 0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x6c, 0x26, 0x26, 0x28, 0x75, + 0x3d, 0x75, 0x5b, 0x31, 0x5d, 0x2c, 0x69, 0x3d, 0x69, 0x5b, 0x31, + 0x5d, 0x29, 0x2c, 0x61, 0x3d, 0x5b, 0x75, 0x2c, 0x69, 0x5d, 0x2c, + 0x73, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x26, 0x26, 0x28, + 0x75, 0x3d, 0x73, 0x28, 0x75, 0x29, 0x2c, 0x69, 0x3d, 0x73, 0x28, + 0x69, 0x29, 0x29, 0x2c, 0x75, 0x3e, 0x69, 0x26, 0x26, 0x28, 0x63, + 0x3d, 0x75, 0x2c, 0x75, 0x3d, 0x69, 0x2c, 0x69, 0x3d, 0x63, 0x29, + 0x2c, 0x28, 0x75, 0x21, 0x3d, 0x68, 0x5b, 0x30, 0x5d, 0x7c, 0x7c, + 0x69, 0x21, 0x3d, 0x68, 0x5b, 0x31, 0x5d, 0x29, 0x26, 0x26, 0x28, + 0x68, 0x3d, 0x5b, 0x75, 0x2c, 0x69, 0x5d, 0x29, 0x29, 0x2c, 0x6e, + 0x29, 0x3a, 0x28, 0x6c, 0x26, 0x26, 0x28, 0x6f, 0x3f, 0x28, 0x65, + 0x3d, 0x6f, 0x5b, 0x30, 0x5d, 0x2c, 0x72, 0x3d, 0x6f, 0x5b, 0x31, + 0x5d, 0x29, 0x3a, 0x28, 0x65, 0x3d, 0x66, 0x5b, 0x30, 0x5d, 0x2c, + 0x72, 0x3d, 0x66, 0x5b, 0x31, 0x5d, 0x2c, 0x6c, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x72, 0x74, 0x26, 0x26, 0x28, 0x65, 0x3d, 0x6c, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x28, 0x65, 0x29, 0x2c, 0x72, + 0x3d, 0x6c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x28, 0x72, + 0x29, 0x29, 0x2c, 0x65, 0x3e, 0x72, 0x26, 0x26, 0x28, 0x63, 0x3d, + 0x65, 0x2c, 0x65, 0x3d, 0x72, 0x2c, 0x72, 0x3d, 0x63, 0x29, 0x29, + 0x29, 0x2c, 0x73, 0x26, 0x26, 0x28, 0x61, 0x3f, 0x28, 0x75, 0x3d, + 0x61, 0x5b, 0x30, 0x5d, 0x2c, 0x69, 0x3d, 0x61, 0x5b, 0x31, 0x5d, + 0x29, 0x3a, 0x28, 0x75, 0x3d, 0x68, 0x5b, 0x30, 0x5d, 0x2c, 0x69, + 0x3d, 0x68, 0x5b, 0x31, 0x5d, 0x2c, 0x73, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x72, 0x74, 0x26, 0x26, 0x28, 0x75, 0x3d, 0x73, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x72, 0x74, 0x28, 0x75, 0x29, 0x2c, 0x69, 0x3d, + 0x73, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x28, 0x69, 0x29, + 0x29, 0x2c, 0x75, 0x3e, 0x69, 0x26, 0x26, 0x28, 0x63, 0x3d, 0x75, + 0x2c, 0x75, 0x3d, 0x69, 0x2c, 0x69, 0x3d, 0x63, 0x29, 0x29, 0x29, + 0x2c, 0x6c, 0x26, 0x26, 0x73, 0x3f, 0x5b, 0x5b, 0x65, 0x2c, 0x75, + 0x5d, 0x2c, 0x5b, 0x72, 0x2c, 0x69, 0x5d, 0x5d, 0x3a, 0x6c, 0x3f, + 0x5b, 0x65, 0x2c, 0x72, 0x5d, 0x3a, 0x73, 0x26, 0x26, 0x5b, 0x75, + 0x2c, 0x69, 0x5d, 0x29, 0x7d, 0x2c, 0x6e, 0x2e, 0x63, 0x6c, 0x65, + 0x61, 0x72, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x2e, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x28, 0x29, 0x7c, 0x7c, 0x28, + 0x66, 0x3d, 0x5b, 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x68, 0x3d, 0x5b, + 0x30, 0x2c, 0x30, 0x5d, 0x2c, 0x6f, 0x3d, 0x61, 0x3d, 0x6e, 0x75, + 0x6c, 0x6c, 0x29, 0x2c, 0x6e, 0x7d, 0x2c, 0x6e, 0x2e, 0x65, 0x6d, + 0x70, 0x74, 0x79, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x21, + 0x21, 0x6c, 0x26, 0x26, 0x66, 0x5b, 0x30, 0x5d, 0x3d, 0x3d, 0x66, + 0x5b, 0x31, 0x5d, 0x7c, 0x7c, 0x21, 0x21, 0x73, 0x26, 0x26, 0x68, + 0x5b, 0x30, 0x5d, 0x3d, 0x3d, 0x68, 0x5b, 0x31, 0x5d, 0x7d, 0x2c, + 0x74, 0x61, 0x2e, 0x72, 0x65, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x6e, + 0x2c, 0x63, 0x2c, 0x22, 0x6f, 0x6e, 0x22, 0x29, 0x7d, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x48, 0x6c, 0x3d, 0x7b, 0x6e, 0x3a, 0x22, 0x6e, + 0x73, 0x2d, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0x65, + 0x3a, 0x22, 0x65, 0x77, 0x2d, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, + 0x22, 0x2c, 0x73, 0x3a, 0x22, 0x6e, 0x73, 0x2d, 0x72, 0x65, 0x73, + 0x69, 0x7a, 0x65, 0x22, 0x2c, 0x77, 0x3a, 0x22, 0x65, 0x77, 0x2d, + 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0x6e, 0x77, 0x3a, + 0x22, 0x6e, 0x77, 0x73, 0x65, 0x2d, 0x72, 0x65, 0x73, 0x69, 0x7a, + 0x65, 0x22, 0x2c, 0x6e, 0x65, 0x3a, 0x22, 0x6e, 0x65, 0x73, 0x77, + 0x2d, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0x73, 0x65, + 0x3a, 0x22, 0x6e, 0x77, 0x73, 0x65, 0x2d, 0x72, 0x65, 0x73, 0x69, + 0x7a, 0x65, 0x22, 0x2c, 0x73, 0x77, 0x3a, 0x22, 0x6e, 0x65, 0x73, + 0x77, 0x2d, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x7d, 0x2c, + 0x4f, 0x6c, 0x3d, 0x5b, 0x5b, 0x22, 0x6e, 0x22, 0x2c, 0x22, 0x65, + 0x22, 0x2c, 0x22, 0x73, 0x22, 0x2c, 0x22, 0x77, 0x22, 0x2c, 0x22, + 0x6e, 0x77, 0x22, 0x2c, 0x22, 0x6e, 0x65, 0x22, 0x2c, 0x22, 0x73, + 0x65, 0x22, 0x2c, 0x22, 0x73, 0x77, 0x22, 0x5d, 0x2c, 0x5b, 0x22, + 0x65, 0x22, 0x2c, 0x22, 0x77, 0x22, 0x5d, 0x2c, 0x5b, 0x22, 0x6e, + 0x22, 0x2c, 0x22, 0x73, 0x22, 0x5d, 0x2c, 0x5b, 0x5d, 0x5d, 0x2c, + 0x49, 0x6c, 0x3d, 0x61, 0x63, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x3d, 0x67, 0x63, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x2c, 0x59, 0x6c, 0x3d, 0x49, 0x6c, 0x2e, + 0x75, 0x74, 0x63, 0x2c, 0x5a, 0x6c, 0x3d, 0x59, 0x6c, 0x28, 0x22, + 0x25, 0x59, 0x2d, 0x25, 0x6d, 0x2d, 0x25, 0x64, 0x54, 0x25, 0x48, + 0x3a, 0x25, 0x4d, 0x3a, 0x25, 0x53, 0x2e, 0x25, 0x4c, 0x5a, 0x22, + 0x29, 0x3b, 0x49, 0x6c, 0x2e, 0x69, 0x73, 0x6f, 0x3d, 0x44, 0x61, + 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, + 0x65, 0x2e, 0x74, 0x6f, 0x49, 0x53, 0x4f, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x26, 0x26, 0x2b, 0x6e, 0x65, 0x77, 0x20, 0x44, 0x61, + 0x74, 0x65, 0x28, 0x22, 0x32, 0x30, 0x30, 0x30, 0x2d, 0x30, 0x31, + 0x2d, 0x30, 0x31, 0x54, 0x30, 0x30, 0x3a, 0x30, 0x30, 0x3a, 0x30, + 0x30, 0x2e, 0x30, 0x30, 0x30, 0x5a, 0x22, 0x29, 0x3f, 0x4a, 0x6f, + 0x3a, 0x5a, 0x6c, 0x2c, 0x4a, 0x6f, 0x2e, 0x70, 0x61, 0x72, 0x73, + 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x6e, 0x65, + 0x77, 0x20, 0x44, 0x61, 0x74, 0x65, 0x28, 0x6e, 0x29, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x73, 0x4e, 0x61, 0x4e, + 0x28, 0x74, 0x29, 0x3f, 0x6e, 0x75, 0x6c, 0x6c, 0x3a, 0x74, 0x7d, + 0x2c, 0x4a, 0x6f, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x3d, 0x5a, 0x6c, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x2c, 0x61, 0x63, 0x2e, 0x73, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x3d, 0x46, 0x74, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x63, 0x63, 0x28, 0x31, 0x65, + 0x33, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6c, 0x6f, 0x6f, + 0x72, 0x28, 0x6e, 0x2f, 0x31, 0x65, 0x33, 0x29, 0x29, 0x7d, 0x2c, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, + 0x74, 0x29, 0x7b, 0x6e, 0x2e, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x28, 0x6e, 0x2e, 0x67, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, + 0x28, 0x29, 0x2b, 0x31, 0x65, 0x33, 0x2a, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x74, 0x29, 0x29, 0x7d, + 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, + 0x67, 0x65, 0x74, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x28, + 0x29, 0x7d, 0x29, 0x2c, 0x61, 0x63, 0x2e, 0x73, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x73, 0x3d, 0x61, 0x63, 0x2e, 0x73, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x2c, 0x61, 0x63, + 0x2e, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x2e, 0x75, 0x74, + 0x63, 0x3d, 0x61, 0x63, 0x2e, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x2e, 0x75, 0x74, 0x63, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x2c, + 0x61, 0x63, 0x2e, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x3d, 0x46, + 0x74, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x65, 0x77, 0x20, 0x63, 0x63, 0x28, 0x36, 0x65, 0x34, 0x2a, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x6e, + 0x2f, 0x36, 0x65, 0x34, 0x29, 0x29, 0x7d, 0x2c, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, + 0x6e, 0x2e, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x28, 0x6e, + 0x2e, 0x67, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x28, 0x29, 0x2b, + 0x36, 0x65, 0x34, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6c, + 0x6f, 0x6f, 0x72, 0x28, 0x74, 0x29, 0x29, 0x7d, 0x2c, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x67, 0x65, 0x74, + 0x4d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x28, 0x29, 0x7d, 0x29, + 0x2c, 0x61, 0x63, 0x2e, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, + 0x3d, 0x61, 0x63, 0x2e, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x2e, + 0x72, 0x61, 0x6e, 0x67, 0x65, 0x2c, 0x61, 0x63, 0x2e, 0x6d, 0x69, + 0x6e, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x75, 0x74, 0x63, 0x3d, 0x61, + 0x63, 0x2e, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x2e, 0x75, 0x74, + 0x63, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x2c, 0x61, 0x63, 0x2e, + 0x68, 0x6f, 0x75, 0x72, 0x3d, 0x46, 0x74, 0x28, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x74, 0x3d, 0x6e, 0x2e, 0x67, 0x65, 0x74, 0x54, 0x69, + 0x6d, 0x65, 0x7a, 0x6f, 0x6e, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x28, 0x29, 0x2f, 0x36, 0x30, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x63, 0x63, 0x28, 0x33, + 0x36, 0x65, 0x35, 0x2a, 0x28, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x66, + 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x6e, 0x2f, 0x33, 0x36, 0x65, 0x35, + 0x2d, 0x74, 0x29, 0x2b, 0x74, 0x29, 0x29, 0x7d, 0x2c, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, + 0x7b, 0x6e, 0x2e, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x28, + 0x6e, 0x2e, 0x67, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x28, 0x29, + 0x2b, 0x33, 0x36, 0x65, 0x35, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x74, 0x29, 0x29, 0x7d, 0x2c, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x67, + 0x65, 0x74, 0x48, 0x6f, 0x75, 0x72, 0x73, 0x28, 0x29, 0x7d, 0x29, + 0x2c, 0x61, 0x63, 0x2e, 0x68, 0x6f, 0x75, 0x72, 0x73, 0x3d, 0x61, + 0x63, 0x2e, 0x68, 0x6f, 0x75, 0x72, 0x2e, 0x72, 0x61, 0x6e, 0x67, + 0x65, 0x2c, 0x61, 0x63, 0x2e, 0x68, 0x6f, 0x75, 0x72, 0x73, 0x2e, + 0x75, 0x74, 0x63, 0x3d, 0x61, 0x63, 0x2e, 0x68, 0x6f, 0x75, 0x72, + 0x2e, 0x75, 0x74, 0x63, 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x2c, + 0x61, 0x63, 0x2e, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x3d, 0x46, 0x74, + 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x3d, + 0x61, 0x63, 0x2e, 0x64, 0x61, 0x79, 0x28, 0x6e, 0x29, 0x2c, 0x6e, + 0x2e, 0x73, 0x65, 0x74, 0x44, 0x61, 0x74, 0x65, 0x28, 0x31, 0x29, + 0x2c, 0x6e, 0x7d, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x6e, 0x2e, 0x73, 0x65, + 0x74, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x28, 0x6e, 0x2e, 0x67, 0x65, + 0x74, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x28, 0x29, 0x2b, 0x74, 0x29, + 0x7d, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x2e, 0x67, 0x65, 0x74, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x28, 0x29, + 0x7d, 0x29, 0x2c, 0x61, 0x63, 0x2e, 0x6d, 0x6f, 0x6e, 0x74, 0x68, + 0x73, 0x3d, 0x61, 0x63, 0x2e, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x2e, + 0x72, 0x61, 0x6e, 0x67, 0x65, 0x2c, 0x61, 0x63, 0x2e, 0x6d, 0x6f, + 0x6e, 0x74, 0x68, 0x73, 0x2e, 0x75, 0x74, 0x63, 0x3d, 0x61, 0x63, + 0x2e, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x2e, 0x75, 0x74, 0x63, 0x2e, + 0x72, 0x61, 0x6e, 0x67, 0x65, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x56, + 0x6c, 0x3d, 0x5b, 0x31, 0x65, 0x33, 0x2c, 0x35, 0x65, 0x33, 0x2c, + 0x31, 0x35, 0x65, 0x33, 0x2c, 0x33, 0x65, 0x34, 0x2c, 0x36, 0x65, + 0x34, 0x2c, 0x33, 0x65, 0x35, 0x2c, 0x39, 0x65, 0x35, 0x2c, 0x31, + 0x38, 0x65, 0x35, 0x2c, 0x33, 0x36, 0x65, 0x35, 0x2c, 0x31, 0x30, + 0x38, 0x65, 0x35, 0x2c, 0x32, 0x31, 0x36, 0x65, 0x35, 0x2c, 0x34, + 0x33, 0x32, 0x65, 0x35, 0x2c, 0x38, 0x36, 0x34, 0x65, 0x35, 0x2c, + 0x31, 0x37, 0x32, 0x38, 0x65, 0x35, 0x2c, 0x36, 0x30, 0x34, 0x38, + 0x65, 0x35, 0x2c, 0x32, 0x35, 0x39, 0x32, 0x65, 0x36, 0x2c, 0x37, + 0x37, 0x37, 0x36, 0x65, 0x36, 0x2c, 0x33, 0x31, 0x35, 0x33, 0x36, + 0x65, 0x36, 0x5d, 0x2c, 0x58, 0x6c, 0x3d, 0x5b, 0x5b, 0x61, 0x63, + 0x2e, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x31, 0x5d, 0x2c, + 0x5b, 0x61, 0x63, 0x2e, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x2c, + 0x35, 0x5d, 0x2c, 0x5b, 0x61, 0x63, 0x2e, 0x73, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x2c, 0x31, 0x35, 0x5d, 0x2c, 0x5b, 0x61, 0x63, 0x2e, + 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x33, 0x30, 0x5d, 0x2c, + 0x5b, 0x61, 0x63, 0x2e, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x2c, + 0x31, 0x5d, 0x2c, 0x5b, 0x61, 0x63, 0x2e, 0x6d, 0x69, 0x6e, 0x75, + 0x74, 0x65, 0x2c, 0x35, 0x5d, 0x2c, 0x5b, 0x61, 0x63, 0x2e, 0x6d, + 0x69, 0x6e, 0x75, 0x74, 0x65, 0x2c, 0x31, 0x35, 0x5d, 0x2c, 0x5b, + 0x61, 0x63, 0x2e, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x2c, 0x33, + 0x30, 0x5d, 0x2c, 0x5b, 0x61, 0x63, 0x2e, 0x68, 0x6f, 0x75, 0x72, + 0x2c, 0x31, 0x5d, 0x2c, 0x5b, 0x61, 0x63, 0x2e, 0x68, 0x6f, 0x75, + 0x72, 0x2c, 0x33, 0x5d, 0x2c, 0x5b, 0x61, 0x63, 0x2e, 0x68, 0x6f, + 0x75, 0x72, 0x2c, 0x36, 0x5d, 0x2c, 0x5b, 0x61, 0x63, 0x2e, 0x68, + 0x6f, 0x75, 0x72, 0x2c, 0x31, 0x32, 0x5d, 0x2c, 0x5b, 0x61, 0x63, + 0x2e, 0x64, 0x61, 0x79, 0x2c, 0x31, 0x5d, 0x2c, 0x5b, 0x61, 0x63, + 0x2e, 0x64, 0x61, 0x79, 0x2c, 0x32, 0x5d, 0x2c, 0x5b, 0x61, 0x63, + 0x2e, 0x77, 0x65, 0x65, 0x6b, 0x2c, 0x31, 0x5d, 0x2c, 0x5b, 0x61, + 0x63, 0x2e, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x2c, 0x31, 0x5d, 0x2c, + 0x5b, 0x61, 0x63, 0x2e, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x2c, 0x33, + 0x5d, 0x2c, 0x5b, 0x61, 0x63, 0x2e, 0x79, 0x65, 0x61, 0x72, 0x2c, + 0x31, 0x5d, 0x5d, 0x2c, 0x24, 0x6c, 0x3d, 0x49, 0x6c, 0x2e, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x28, 0x5b, 0x5b, 0x22, 0x2e, 0x25, 0x4c, + 0x22, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x2e, 0x67, 0x65, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x28, 0x29, 0x7d, 0x5d, 0x2c, 0x5b, + 0x22, 0x3a, 0x25, 0x53, 0x22, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x67, 0x65, 0x74, 0x53, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x73, 0x28, 0x29, 0x7d, 0x5d, 0x2c, 0x5b, 0x22, + 0x25, 0x49, 0x3a, 0x25, 0x4d, 0x22, 0x2c, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x67, 0x65, 0x74, 0x4d, 0x69, + 0x6e, 0x75, 0x74, 0x65, 0x73, 0x28, 0x29, 0x7d, 0x5d, 0x2c, 0x5b, + 0x22, 0x25, 0x49, 0x20, 0x25, 0x70, 0x22, 0x2c, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x67, 0x65, 0x74, 0x48, + 0x6f, 0x75, 0x72, 0x73, 0x28, 0x29, 0x7d, 0x5d, 0x2c, 0x5b, 0x22, + 0x25, 0x61, 0x20, 0x25, 0x64, 0x22, 0x2c, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x67, 0x65, 0x74, 0x44, 0x61, + 0x79, 0x28, 0x29, 0x26, 0x26, 0x31, 0x21, 0x3d, 0x6e, 0x2e, 0x67, + 0x65, 0x74, 0x44, 0x61, 0x74, 0x65, 0x28, 0x29, 0x7d, 0x5d, 0x2c, + 0x5b, 0x22, 0x25, 0x62, 0x20, 0x25, 0x64, 0x22, 0x2c, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x21, 0x3d, 0x6e, 0x2e, + 0x67, 0x65, 0x74, 0x44, 0x61, 0x74, 0x65, 0x28, 0x29, 0x7d, 0x5d, + 0x2c, 0x5b, 0x22, 0x25, 0x42, 0x22, 0x2c, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x67, 0x65, 0x74, 0x4d, 0x6f, + 0x6e, 0x74, 0x68, 0x28, 0x29, 0x7d, 0x5d, 0x2c, 0x5b, 0x22, 0x25, + 0x59, 0x22, 0x2c, 0x4e, 0x65, 0x5d, 0x5d, 0x29, 0x2c, 0x42, 0x6c, + 0x3d, 0x7b, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, + 0x2e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x28, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x63, 0x65, 0x69, 0x6c, 0x28, 0x6e, 0x2f, 0x65, 0x29, 0x2a, + 0x65, 0x2c, 0x2b, 0x74, 0x2c, 0x65, 0x29, 0x2e, 0x6d, 0x61, 0x70, + 0x28, 0x4b, 0x6f, 0x29, 0x7d, 0x2c, 0x66, 0x6c, 0x6f, 0x6f, 0x72, + 0x3a, 0x79, 0x2c, 0x63, 0x65, 0x69, 0x6c, 0x3a, 0x79, 0x7d, 0x3b, + 0x58, 0x6c, 0x2e, 0x79, 0x65, 0x61, 0x72, 0x3d, 0x61, 0x63, 0x2e, + 0x79, 0x65, 0x61, 0x72, 0x2c, 0x61, 0x63, 0x2e, 0x73, 0x63, 0x61, + 0x6c, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x47, + 0x6f, 0x28, 0x74, 0x61, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, + 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x28, 0x29, 0x2c, 0x58, 0x6c, + 0x2c, 0x24, 0x6c, 0x29, 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x57, + 0x6c, 0x3d, 0x58, 0x6c, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, 0x6e, 0x5b, 0x30, 0x5d, 0x2e, + 0x75, 0x74, 0x63, 0x2c, 0x6e, 0x5b, 0x31, 0x5d, 0x5d, 0x7d, 0x29, + 0x2c, 0x4a, 0x6c, 0x3d, 0x59, 0x6c, 0x2e, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x28, 0x5b, 0x5b, 0x22, 0x2e, 0x25, 0x4c, 0x22, 0x2c, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x67, 0x65, + 0x74, 0x55, 0x54, 0x43, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x28, 0x29, 0x7d, 0x5d, 0x2c, 0x5b, + 0x22, 0x3a, 0x25, 0x53, 0x22, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x67, 0x65, 0x74, 0x55, 0x54, 0x43, + 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x28, 0x29, 0x7d, 0x5d, + 0x2c, 0x5b, 0x22, 0x25, 0x49, 0x3a, 0x25, 0x4d, 0x22, 0x2c, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x67, 0x65, + 0x74, 0x55, 0x54, 0x43, 0x4d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, + 0x28, 0x29, 0x7d, 0x5d, 0x2c, 0x5b, 0x22, 0x25, 0x49, 0x20, 0x25, + 0x70, 0x22, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x2e, 0x67, 0x65, 0x74, 0x55, 0x54, 0x43, 0x48, 0x6f, 0x75, + 0x72, 0x73, 0x28, 0x29, 0x7d, 0x5d, 0x2c, 0x5b, 0x22, 0x25, 0x61, + 0x20, 0x25, 0x64, 0x22, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x2e, 0x67, 0x65, 0x74, 0x55, 0x54, 0x43, 0x44, + 0x61, 0x79, 0x28, 0x29, 0x26, 0x26, 0x31, 0x21, 0x3d, 0x6e, 0x2e, + 0x67, 0x65, 0x74, 0x55, 0x54, 0x43, 0x44, 0x61, 0x74, 0x65, 0x28, + 0x29, 0x7d, 0x5d, 0x2c, 0x5b, 0x22, 0x25, 0x62, 0x20, 0x25, 0x64, + 0x22, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, + 0x21, 0x3d, 0x6e, 0x2e, 0x67, 0x65, 0x74, 0x55, 0x54, 0x43, 0x44, + 0x61, 0x74, 0x65, 0x28, 0x29, 0x7d, 0x5d, 0x2c, 0x5b, 0x22, 0x25, + 0x42, 0x22, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x2e, 0x67, 0x65, 0x74, 0x55, 0x54, 0x43, 0x4d, 0x6f, 0x6e, + 0x74, 0x68, 0x28, 0x29, 0x7d, 0x5d, 0x2c, 0x5b, 0x22, 0x25, 0x59, + 0x22, 0x2c, 0x4e, 0x65, 0x5d, 0x5d, 0x29, 0x3b, 0x57, 0x6c, 0x2e, + 0x79, 0x65, 0x61, 0x72, 0x3d, 0x61, 0x63, 0x2e, 0x79, 0x65, 0x61, + 0x72, 0x2e, 0x75, 0x74, 0x63, 0x2c, 0x61, 0x63, 0x2e, 0x73, 0x63, + 0x61, 0x6c, 0x65, 0x2e, 0x75, 0x74, 0x63, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x47, 0x6f, 0x28, 0x74, 0x61, 0x2e, 0x73, + 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, + 0x28, 0x29, 0x2c, 0x57, 0x6c, 0x2c, 0x4a, 0x6c, 0x29, 0x7d, 0x2c, + 0x74, 0x61, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x3d, 0x41, 0x74, 0x28, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x65, 0x78, 0x74, + 0x7d, 0x29, 0x2c, 0x74, 0x61, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x3d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, + 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4e, + 0x74, 0x28, 0x6e, 0x2c, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, + 0x2c, 0x51, 0x6f, 0x2c, 0x74, 0x29, 0x7d, 0x2c, 0x74, 0x61, 0x2e, + 0x68, 0x74, 0x6d, 0x6c, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x4e, 0x74, 0x28, 0x6e, 0x2c, 0x22, 0x74, + 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x2c, 0x6e, + 0x61, 0x2c, 0x74, 0x29, 0x7d, 0x2c, 0x74, 0x61, 0x2e, 0x78, 0x6d, + 0x6c, 0x3d, 0x41, 0x74, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x2e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x58, 0x4d, 0x4c, 0x7d, 0x29, 0x2c, 0x22, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, + 0x65, 0x6f, 0x66, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x26, + 0x26, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x2e, 0x61, 0x6d, 0x64, + 0x3f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x28, 0x74, 0x61, 0x29, + 0x3a, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3d, 0x3d, + 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x6d, 0x6f, 0x64, 0x75, + 0x6c, 0x65, 0x26, 0x26, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2e, + 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x26, 0x26, 0x28, 0x6d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x73, 0x3d, 0x74, 0x61, 0x29, 0x2c, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x64, 0x33, 0x3d, 0x74, 0x61, 0x7d, 0x28, 0x29, 0x3b, 0x00 +}; + +const int d3_js_length = 151140; diff --git a/goaccess++/src/error.c b/goaccess++/src/error.c new file mode 100644 index 0000000..7738eed --- /dev/null +++ b/goaccess++/src/error.c @@ -0,0 +1,237 @@ +/** + * error.c -- error handling + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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. + */ + +#if HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <signal.h> +#if defined(__GLIBC__) +#include <execinfo.h> +#endif +#include <sys/types.h> +#include <unistd.h> + +#include "error.h" +#include "labels.h" +#include "parser.h" + +static FILE *access_log; +static FILE *log_file; +static FILE *log_invalid; +static GLog *log_data; + +/* Open a debug file whose name is specified in the given path. */ +void +dbg_log_open (const char *path) +{ + if (path != NULL) { + log_file = fopen (path, "w"); + if (log_file == NULL) + return; + } +} + +/* Close the debug file. */ +void +dbg_log_close (void) +{ + if (log_file != NULL) + fclose (log_file); +} + +/* Open the invalid requests log file whose name is specified in the + * given path. */ +void +invalid_log_open (const char *path) +{ + if (path != NULL) { + log_invalid = fopen (path, "w"); + if (log_invalid == NULL) + return; + } +} + +/* Close the invalid requests log file. */ +void +invalid_log_close (void) +{ + if (log_invalid != NULL) + fclose (log_invalid); +} + +/* Set current overall parsed log data. */ +void +set_signal_data (void *p) +{ + log_data = p; +} + +/* Open the WebSocket access log file whose name is specified in the + * given path. */ +int +access_log_open (const char *path) +{ + if (path == NULL) + return 0; + + if (access (path, F_OK) != -1) + access_log = fopen (path, "a"); + else + access_log = fopen (path, "w"); + if (access_log == NULL) + return 1; + + return 0; +} + +/* Close the WebSocket access log file. */ +void +access_log_close (void) +{ + if (access_log != NULL) + fclose (access_log); +} + +/* Dump to the standard output the values of the overall parsed log + * data. */ +static void +dump_struct (FILE * fp) +{ + int pid = getpid (); + if (!log_data) + return; + + fprintf (fp, "==%d== VALUES AT CRASH POINT\n", pid); + fprintf (fp, "==%d==\n", pid); + fprintf (fp, "==%d== Line number: %u\n", pid, log_data->processed); + fprintf (fp, "==%d== Offset: %u\n", pid, log_data->offset); + fprintf (fp, "==%d== Invalid data: %u\n", pid, log_data->invalid); + fprintf (fp, "==%d== Piping: %d\n", pid, log_data->piping); + fprintf (fp, "==%d== Response size: %llu bytes\n", pid, log_data->resp_size); + fprintf (fp, "==%d==\n", pid); +} + +/* Custom SIGSEGV handler. */ +void +sigsegv_handler (int sig) +{ + FILE *fp = stderr; + int pid = getpid (); + +#if defined(__GLIBC__) + char **messages; + size_t size, i; + void *trace_stack[TRACE_SIZE]; +#endif + + (void) endwin (); + fprintf (fp, "\n"); + fprintf (fp, "==%d== GoAccess %s crashed by Sig %d\n", pid, GO_VERSION, sig); + fprintf (fp, "==%d==\n", pid); + + dump_struct (fp); + +#if defined(__GLIBC__) + size = backtrace (trace_stack, TRACE_SIZE); + messages = backtrace_symbols (trace_stack, size); + + fprintf (fp, "==%d== STACK TRACE:\n", pid); + fprintf (fp, "==%d==\n", pid); + + for (i = 0; i < size; i++) + fprintf (fp, "==%d== %zu %s\n", pid, i, messages[i]); +#endif + + fprintf (fp, "==%d==\n", pid); + fprintf (fp, "==%d== %s:\n", pid, ERR_PLEASE_REPORT); + fprintf (fp, "==%d== https://github.com/allinurl/goaccess/issues\n\n", pid); + exit (EXIT_FAILURE); +} + +#pragma GCC diagnostic ignored "-Wformat-nonliteral" +/* Write formatted debug log data to the logfile. */ +void +dbg_fprintf (const char *fmt, ...) +{ + va_list args; + + if (!log_file) + return; + + va_start (args, fmt); + vfprintf (log_file, fmt, args); + fflush (log_file); + va_end (args); +} + +/* Write formatted invalid requests log data to the logfile. */ +void +invalid_fprintf (const char *fmt, ...) +{ + va_list args; + + if (!log_invalid) + return; + + va_start (args, fmt); + vfprintf (log_invalid, fmt, args); + fflush (log_invalid); + va_end (args); +} + +/* Debug otuput */ +void +dbg_printf (const char *fmt, ...) +{ + va_list args; + va_start (args, fmt); + vfprintf (stderr, fmt, args); + va_end (args); +} + +/* Write formatted access log data to the logfile. */ +void +access_fprintf (const char *fmt, ...) +{ + va_list args; + + if (!access_log) + return; + + va_start (args, fmt); + vfprintf (access_log, fmt, args); + fflush (access_log); + va_end (args); +} + +#pragma GCC diagnostic warning "-Wformat-nonliteral" diff --git a/goaccess++/src/error.h b/goaccess++/src/error.h new file mode 100644 index 0000000..08b754e --- /dev/null +++ b/goaccess++/src/error.h @@ -0,0 +1,94 @@ +/** + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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 ERROR_H_INCLUDED +#define ERROR_H_INCLUDED + +#ifndef COMMONS +#include "commons.h" +#endif + +#ifdef HAVE_NCURSESW_NCURSES_H +#include <ncursesw/ncurses.h> +#elif HAVE_NCURSES_NCURSES_H +#include <ncurses/ncurses.h> +#elif HAVE_NCURSES_H +#include <ncurses.h> +#elif HAVE_CURSES_H +#include <curses.h> +#endif + +#include "settings.h" + +#define TRACE_SIZE 128 + +#define FATAL(fmt, ...) do { \ + (void) endwin (); \ + fprintf (stderr, "\nGoAccess - version %s - %s %s\n", GO_VERSION, __DATE__, \ + __TIME__); \ + fprintf (stderr, "Config file: %s\n", conf.iconfigfile ?: NO_CONFIG_FILE); \ + fprintf (stderr, "\nFatal error has occurred"); \ + fprintf (stderr, "\nError occurred at: %s - %s - %d\n", __FILE__, \ + __FUNCTION__, __LINE__); \ + fprintf (stderr, fmt, ##__VA_ARGS__); \ + fprintf (stderr, "\n\n"); \ + LOG_DEBUG ((fmt, ##__VA_ARGS__)); \ + exit(EXIT_FAILURE); \ +} while (0) + +#ifdef DEBUG +#define DEBUG_TEST 1 +#else +#define DEBUG_TEST 0 +#endif + +/* access requests log */ +#define ACCESS_LOG(x, ...) do { access_fprintf x; } while (0) +/* debug log */ +#define LOG_DEBUG(x, ...) do { dbg_fprintf x; } while (0) +/* invalid requests log */ +#define LOG_INVALID(x, ...) do { invalid_fprintf x; } while (0) +/* log debug wrapper */ +#define LOG(x) do { if (DEBUG_TEST) dbg_printf x; } while (0) + +int access_log_open (const char *path); +void access_fprintf (const char *fmt, ...); +void access_log_close (void); +void dbg_printf (const char *fmt, ...); + +void dbg_fprintf (const char *fmt, ...); +void dbg_log_close (void); +void dbg_log_open (const char *file); +void invalid_fprintf (const char *fmt, ...); +void invalid_log_close (void); +void invalid_log_open (const char *path); +void set_signal_data (void *p); +void sigsegv_handler (int sig); + +#endif diff --git a/goaccess++/src/error.o b/goaccess++/src/error.o new file mode 100644 index 0000000000000000000000000000000000000000..67efa2a14d7c0588508bd81200b091948a4f8bbc GIT binary patch literal 8208 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 Q@m1UyU{Bgf?d^>JC)Q9mNdN!< literal 0 HcmV?d00001 diff --git a/goaccess++/src/facss.h b/goaccess++/src/facss.h new file mode 100644 index 0000000..af7a141 --- /dev/null +++ b/goaccess++/src/facss.h @@ -0,0 +1,1683 @@ +const char fa_css[18459] = { + 0x40, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x66, 0x61, 0x63, 0x65, 0x20, + 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x66, 0x61, 0x6d, 0x69, 0x6c, + 0x79, 0x3a, 0x20, 0x27, 0x66, 0x61, 0x27, 0x3b, 0x73, 0x72, 0x63, + 0x3a, 0x20, 0x75, 0x72, 0x6c, 0x28, 0x64, 0x61, 0x74, 0x61, 0x3a, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x6f, 0x66, 0x66, 0x3b, + 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x75, 0x74, 0x66, + 0x2d, 0x38, 0x3b, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2c, 0x64, + 0x30, 0x39, 0x47, 0x52, 0x67, 0x41, 0x42, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x43, 0x32, 0x73, 0x41, 0x41, 0x73, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x4c, 0x57, 0x41, 0x41, 0x41, 0x51, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x42, 0x50, 0x55, 0x79, 0x38, 0x79, 0x41, 0x41, 0x41, + 0x42, 0x43, 0x41, 0x41, 0x41, 0x41, 0x47, 0x41, 0x41, 0x41, 0x41, + 0x42, 0x67, 0x44, 0x78, 0x49, 0x50, 0x48, 0x47, 0x4e, 0x74, 0x59, + 0x58, 0x41, 0x41, 0x41, 0x41, 0x46, 0x6f, 0x41, 0x41, 0x41, 0x42, + 0x62, 0x41, 0x41, 0x41, 0x41, 0x57, 0x7a, 0x7a, 0x59, 0x50, 0x4e, + 0x38, 0x5a, 0x32, 0x46, 0x7a, 0x63, 0x41, 0x41, 0x41, 0x41, 0x74, + 0x51, 0x41, 0x41, 0x41, 0x41, 0x49, 0x41, 0x41, 0x41, 0x41, 0x43, + 0x41, 0x41, 0x41, 0x41, 0x42, 0x42, 0x6e, 0x62, 0x48, 0x6c, 0x6d, + 0x41, 0x41, 0x41, 0x43, 0x33, 0x41, 0x41, 0x41, 0x4a, 0x37, 0x51, + 0x41, 0x41, 0x43, 0x65, 0x30, 0x50, 0x71, 0x52, 0x50, 0x66, 0x32, + 0x68, 0x6c, 0x59, 0x57, 0x51, 0x41, 0x41, 0x43, 0x71, 0x51, 0x41, + 0x41, 0x41, 0x41, 0x4e, 0x67, 0x41, 0x41, 0x41, 0x44, 0x59, 0x53, + 0x42, 0x68, 0x72, 0x48, 0x61, 0x47, 0x68, 0x6c, 0x59, 0x51, 0x41, + 0x41, 0x4b, 0x73, 0x67, 0x41, 0x41, 0x41, 0x41, 0x6b, 0x41, 0x41, + 0x41, 0x41, 0x4a, 0x41, 0x68, 0x55, 0x42, 0x49, 0x5a, 0x6f, 0x62, + 0x58, 0x52, 0x34, 0x41, 0x41, 0x41, 0x71, 0x37, 0x41, 0x41, 0x41, + 0x41, 0x4d, 0x77, 0x41, 0x41, 0x41, 0x44, 0x4d, 0x70, 0x43, 0x6f, + 0x43, 0x43, 0x32, 0x78, 0x76, 0x59, 0x32, 0x45, 0x41, 0x41, 0x43, + 0x75, 0x34, 0x41, 0x41, 0x41, 0x41, 0x61, 0x41, 0x41, 0x41, 0x41, + 0x47, 0x6a, 0x79, 0x72, 0x76, 0x75, 0x65, 0x62, 0x57, 0x46, 0x34, + 0x63, 0x41, 0x41, 0x41, 0x4c, 0x43, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x67, 0x41, 0x41, 0x41, 0x41, 0x49, 0x41, 0x41, 0x2b, 0x41, 0x56, + 0x64, 0x75, 0x59, 0x57, 0x31, 0x6c, 0x41, 0x41, 0x41, 0x73, 0x51, + 0x41, 0x41, 0x41, 0x41, 0x55, 0x6f, 0x41, 0x41, 0x41, 0x46, 0x4b, + 0x49, 0x68, 0x57, 0x54, 0x73, 0x6e, 0x42, 0x76, 0x63, 0x33, 0x51, + 0x41, 0x41, 0x43, 0x32, 0x4d, 0x41, 0x41, 0x41, 0x41, 0x49, 0x41, + 0x41, 0x41, 0x41, 0x43, 0x41, 0x41, 0x41, 0x77, 0x41, 0x41, 0x41, + 0x41, 0x4d, 0x44, 0x56, 0x67, 0x47, 0x51, 0x41, 0x41, 0x55, 0x41, + 0x41, 0x41, 0x4b, 0x5a, 0x41, 0x73, 0x77, 0x41, 0x41, 0x41, 0x43, + 0x50, 0x41, 0x70, 0x6b, 0x43, 0x7a, 0x41, 0x41, 0x41, 0x41, 0x65, + 0x73, 0x41, 0x4d, 0x77, 0x45, 0x4a, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x52, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x51, 0x41, 0x41, 0x41, 0x38, + 0x70, 0x77, 0x44, 0x77, 0x50, 0x2f, 0x41, 0x41, 0x45, 0x41, 0x44, + 0x77, 0x41, 0x42, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x51, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x49, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x77, 0x41, 0x41, 0x41, 0x41, 0x4d, 0x41, 0x41, 0x41, 0x41, 0x63, + 0x41, 0x41, 0x45, 0x41, 0x41, 0x77, 0x41, 0x41, 0x41, 0x42, 0x77, + 0x41, 0x41, 0x77, 0x41, 0x42, 0x41, 0x41, 0x41, 0x41, 0x48, 0x41, + 0x41, 0x45, 0x41, 0x56, 0x41, 0x41, 0x41, 0x41, 0x42, 0x51, 0x41, + 0x45, 0x41, 0x41, 0x42, 0x51, 0x41, 0x51, 0x41, 0x41, 0x45, 0x41, + 0x49, 0x50, 0x41, 0x48, 0x38, 0x41, 0x6e, 0x77, 0x44, 0x66, 0x41, + 0x54, 0x38, 0x42, 0x66, 0x77, 0x49, 0x76, 0x41, 0x36, 0x38, 0x45, + 0x48, 0x77, 0x52, 0x76, 0x42, 0x55, 0x38, 0x48, 0x48, 0x77, 0x67, + 0x50, 0x43, 0x46, 0x38, 0x49, 0x37, 0x77, 0x6c, 0x76, 0x43, 0x69, + 0x38, 0x4d, 0x44, 0x77, 0x79, 0x66, 0x44, 0x4f, 0x38, 0x4e, 0x72, + 0x77, 0x33, 0x50, 0x44, 0x6b, 0x38, 0x51, 0x48, 0x78, 0x42, 0x66, + 0x45, 0x49, 0x38, 0x51, 0x7a, 0x78, 0x45, 0x66, 0x45, 0x68, 0x38, + 0x56, 0x7a, 0x78, 0x6f, 0x50, 0x48, 0x4f, 0x38, 0x66, 0x66, 0x78, + 0x2f, 0x76, 0x4a, 0x6f, 0x38, 0x70, 0x4c, 0x79, 0x6e, 0x50, 0x2f, + 0x39, 0x2f, 0x2f, 0x38, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x43, + 0x44, 0x77, 0x42, 0x2f, 0x41, 0x4a, 0x38, 0x41, 0x76, 0x77, 0x45, + 0x2f, 0x41, 0x57, 0x38, 0x43, 0x48, 0x77, 0x4f, 0x76, 0x42, 0x42, + 0x38, 0x45, 0x62, 0x77, 0x55, 0x2f, 0x42, 0x78, 0x38, 0x49, 0x44, + 0x77, 0x68, 0x66, 0x43, 0x4f, 0x38, 0x4a, 0x62, 0x77, 0x6f, 0x76, + 0x44, 0x41, 0x38, 0x4d, 0x6e, 0x77, 0x7a, 0x76, 0x44, 0x58, 0x38, + 0x4e, 0x7a, 0x77, 0x35, 0x50, 0x45, 0x41, 0x38, 0x51, 0x54, 0x78, + 0x43, 0x50, 0x45, 0x4d, 0x38, 0x52, 0x48, 0x78, 0x49, 0x66, 0x46, + 0x62, 0x38, 0x61, 0x44, 0x78, 0x7a, 0x76, 0x48, 0x33, 0x38, 0x66, + 0x37, 0x79, 0x61, 0x50, 0x4b, 0x53, 0x38, 0x70, 0x7a, 0x2f, 0x2f, + 0x66, 0x2f, 0x2f, 0x41, 0x41, 0x48, 0x2f, 0x34, 0x77, 0x2f, 0x39, + 0x44, 0x2f, 0x77, 0x50, 0x2b, 0x77, 0x2f, 0x32, 0x44, 0x2f, 0x51, + 0x50, 0x36, 0x77, 0x2f, 0x55, 0x44, 0x38, 0x34, 0x50, 0x79, 0x67, + 0x2b, 0x2b, 0x44, 0x36, 0x49, 0x50, 0x6c, 0x41, 0x2b, 0x51, 0x44, + 0x34, 0x67, 0x50, 0x67, 0x51, 0x39, 0x32, 0x44, 0x31, 0x6b, 0x50, + 0x55, 0x51, 0x39, 0x4e, 0x44, 0x30, 0x55, 0x50, 0x52, 0x41, 0x38, + 0x39, 0x44, 0x79, 0x49, 0x50, 0x49, 0x41, 0x38, 0x65, 0x44, 0x78, + 0x73, 0x50, 0x46, 0x77, 0x38, 0x49, 0x44, 0x73, 0x38, 0x4f, 0x6a, + 0x41, 0x35, 0x66, 0x44, 0x6a, 0x63, 0x4f, 0x4d, 0x51, 0x33, 0x49, + 0x44, 0x5a, 0x38, 0x4e, 0x6c, 0x67, 0x41, 0x44, 0x41, 0x41, 0x45, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, 0x41, + 0x41, 0x48, 0x2f, 0x2f, 0x77, 0x41, 0x50, 0x41, 0x41, 0x45, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x43, 0x41, 0x41, 0x41, 0x33, 0x4f, 0x51, 0x45, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x51, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x49, 0x41, 0x41, 0x44, 0x63, 0x35, + 0x41, 0x51, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x67, + 0x41, 0x41, 0x4e, 0x7a, 0x6b, 0x42, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x49, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x74, 0x73, 0x44, + 0x62, 0x67, 0x41, 0x62, 0x41, 0x44, 0x63, 0x41, 0x41, 0x43, 0x55, + 0x55, 0x42, 0x69, 0x4d, 0x68, 0x49, 0x69, 0x59, 0x31, 0x4e, 0x44, + 0x63, 0x2b, 0x41, 0x54, 0x63, 0x32, 0x4d, 0x78, 0x34, 0x42, 0x4d, + 0x7a, 0x49, 0x32, 0x4e, 0x7a, 0x49, 0x58, 0x48, 0x67, 0x45, 0x58, + 0x46, 0x68, 0x55, 0x44, 0x46, 0x41, 0x63, 0x4f, 0x41, 0x51, 0x63, + 0x47, 0x49, 0x79, 0x49, 0x6e, 0x4c, 0x67, 0x45, 0x6e, 0x4a, 0x6a, + 0x55, 0x30, 0x4e, 0x7a, 0x34, 0x42, 0x4e, 0x7a, 0x59, 0x7a, 0x4d, + 0x68, 0x63, 0x65, 0x41, 0x52, 0x63, 0x57, 0x41, 0x74, 0x74, 0x48, + 0x4d, 0x76, 0x34, 0x59, 0x4d, 0x6b, 0x67, 0x49, 0x43, 0x43, 0x6f, + 0x6c, 0x4a, 0x44, 0x67, 0x6a, 0x57, 0x7a, 0x55, 0x30, 0x58, 0x43, + 0x4d, 0x34, 0x4a, 0x43, 0x51, 0x71, 0x43, 0x41, 0x69, 0x53, 0x45, + 0x52, 0x45, 0x38, 0x4b, 0x43, 0x67, 0x74, 0x4c, 0x69, 0x67, 0x6f, + 0x4f, 0x78, 0x45, 0x53, 0x45, 0x68, 0x45, 0x37, 0x4b, 0x43, 0x67, + 0x75, 0x4c, 0x53, 0x67, 0x6f, 0x50, 0x42, 0x45, 0x52, 0x6c, 0x7a, + 0x35, 0x5a, 0x57, 0x54, 0x34, 0x35, 0x4f, 0x54, 0x70, 0x64, 0x48, + 0x68, 0x30, 0x68, 0x4b, 0x43, 0x67, 0x68, 0x48, 0x52, 0x35, 0x64, + 0x4f, 0x6a, 0x6b, 0x35, 0x41, 0x66, 0x73, 0x74, 0x4b, 0x43, 0x67, + 0x38, 0x45, 0x52, 0x45, 0x52, 0x45, 0x54, 0x77, 0x6f, 0x4b, 0x43, + 0x30, 0x75, 0x4b, 0x43, 0x67, 0x37, 0x45, 0x52, 0x49, 0x53, 0x45, + 0x54, 0x73, 0x6f, 0x4b, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x45, + 0x41, 0x41, 0x41, 0x41, 0x53, 0x51, 0x4f, 0x33, 0x41, 0x32, 0x34, + 0x41, 0x45, 0x41, 0x41, 0x68, 0x41, 0x44, 0x45, 0x41, 0x51, 0x51, + 0x41, 0x41, 0x41, 0x52, 0x55, 0x55, 0x42, 0x69, 0x4d, 0x68, 0x49, + 0x69, 0x59, 0x39, 0x41, 0x54, 0x51, 0x32, 0x4d, 0x79, 0x45, 0x79, + 0x46, 0x68, 0x55, 0x52, 0x46, 0x52, 0x51, 0x47, 0x49, 0x79, 0x45, + 0x69, 0x4a, 0x6a, 0x30, 0x42, 0x4e, 0x44, 0x59, 0x7a, 0x49, 0x54, + 0x49, 0x57, 0x46, 0x51, 0x45, 0x56, 0x46, 0x41, 0x59, 0x6a, 0x49, + 0x53, 0x49, 0x6d, 0x50, 0x51, 0x45, 0x30, 0x4e, 0x6a, 0x4d, 0x68, + 0x4d, 0x68, 0x59, 0x52, 0x46, 0x52, 0x51, 0x47, 0x49, 0x79, 0x45, + 0x69, 0x4a, 0x6a, 0x30, 0x42, 0x4e, 0x44, 0x59, 0x7a, 0x49, 0x54, + 0x49, 0x57, 0x41, 0x62, 0x63, 0x72, 0x48, 0x76, 0x37, 0x62, 0x48, + 0x69, 0x73, 0x72, 0x48, 0x67, 0x45, 0x6c, 0x48, 0x69, 0x73, 0x72, + 0x48, 0x76, 0x37, 0x62, 0x48, 0x69, 0x73, 0x72, 0x48, 0x67, 0x45, + 0x6c, 0x48, 0x69, 0x73, 0x43, 0x41, 0x43, 0x73, 0x65, 0x2f, 0x74, + 0x73, 0x65, 0x4b, 0x79, 0x73, 0x65, 0x41, 0x53, 0x55, 0x65, 0x4b, + 0x79, 0x73, 0x65, 0x2f, 0x74, 0x73, 0x65, 0x4b, 0x79, 0x73, 0x65, + 0x41, 0x53, 0x55, 0x65, 0x4b, 0x77, 0x46, 0x75, 0x33, 0x42, 0x34, + 0x72, 0x4b, 0x78, 0x37, 0x63, 0x48, 0x69, 0x73, 0x72, 0x48, 0x67, + 0x47, 0x33, 0x33, 0x42, 0x34, 0x72, 0x4b, 0x78, 0x37, 0x63, 0x48, + 0x69, 0x73, 0x72, 0x48, 0x76, 0x35, 0x4a, 0x33, 0x42, 0x34, 0x72, + 0x4b, 0x78, 0x37, 0x63, 0x48, 0x69, 0x73, 0x72, 0x41, 0x5a, 0x6e, + 0x63, 0x48, 0x69, 0x73, 0x72, 0x48, 0x74, 0x77, 0x65, 0x4b, 0x79, + 0x73, 0x41, 0x42, 0x67, 0x41, 0x41, 0x41, 0x45, 0x6b, 0x45, 0x41, + 0x41, 0x4e, 0x75, 0x41, 0x41, 0x38, 0x41, 0x48, 0x77, 0x41, 0x76, + 0x41, 0x44, 0x38, 0x41, 0x54, 0x77, 0x42, 0x66, 0x41, 0x41, 0x41, + 0x6c, 0x46, 0x52, 0x51, 0x47, 0x4b, 0x77, 0x45, 0x69, 0x4a, 0x6a, + 0x30, 0x42, 0x4e, 0x44, 0x59, 0x37, 0x41, 0x54, 0x49, 0x57, 0x45, + 0x52, 0x55, 0x55, 0x42, 0x69, 0x73, 0x42, 0x49, 0x69, 0x59, 0x39, + 0x41, 0x54, 0x51, 0x32, 0x4f, 0x77, 0x45, 0x79, 0x46, 0x67, 0x45, + 0x56, 0x46, 0x41, 0x59, 0x6a, 0x49, 0x53, 0x49, 0x6d, 0x50, 0x51, + 0x45, 0x30, 0x4e, 0x6a, 0x4d, 0x68, 0x4d, 0x68, 0x59, 0x42, 0x46, + 0x52, 0x51, 0x47, 0x4b, 0x77, 0x45, 0x69, 0x4a, 0x6a, 0x30, 0x42, + 0x4e, 0x44, 0x59, 0x37, 0x41, 0x54, 0x49, 0x57, 0x41, 0x52, 0x55, + 0x55, 0x42, 0x69, 0x4d, 0x68, 0x49, 0x69, 0x59, 0x39, 0x41, 0x54, + 0x51, 0x32, 0x4d, 0x79, 0x45, 0x79, 0x46, 0x68, 0x45, 0x56, 0x46, + 0x41, 0x59, 0x6a, 0x49, 0x53, 0x49, 0x6d, 0x50, 0x51, 0x45, 0x30, + 0x4e, 0x6a, 0x4d, 0x68, 0x4d, 0x68, 0x59, 0x42, 0x4a, 0x53, 0x45, + 0x57, 0x74, 0x78, 0x63, 0x67, 0x49, 0x42, 0x65, 0x33, 0x46, 0x69, + 0x45, 0x68, 0x46, 0x72, 0x63, 0x58, 0x49, 0x43, 0x41, 0x58, 0x74, + 0x78, 0x59, 0x68, 0x41, 0x74, 0x73, 0x67, 0x46, 0x2f, 0x33, 0x63, + 0x46, 0x79, 0x41, 0x67, 0x46, 0x77, 0x49, 0x6b, 0x46, 0x79, 0x44, + 0x39, 0x4a, 0x53, 0x45, 0x57, 0x74, 0x78, 0x63, 0x67, 0x49, 0x42, + 0x65, 0x33, 0x46, 0x69, 0x45, 0x43, 0x32, 0x79, 0x41, 0x58, 0x2f, + 0x64, 0x77, 0x58, 0x49, 0x43, 0x41, 0x58, 0x41, 0x69, 0x51, 0x58, + 0x49, 0x43, 0x41, 0x58, 0x2f, 0x64, 0x77, 0x58, 0x49, 0x43, 0x41, + 0x58, 0x41, 0x69, 0x51, 0x58, 0x49, 0x4f, 0x35, 0x75, 0x46, 0x79, + 0x41, 0x67, 0x46, 0x32, 0x34, 0x57, 0x49, 0x53, 0x45, 0x42, 0x44, + 0x6d, 0x30, 0x58, 0x49, 0x43, 0x41, 0x58, 0x62, 0x52, 0x63, 0x67, + 0x49, 0x50, 0x37, 0x46, 0x62, 0x68, 0x63, 0x67, 0x49, 0x42, 0x64, + 0x75, 0x46, 0x69, 0x45, 0x68, 0x41, 0x6a, 0x4e, 0x75, 0x46, 0x79, + 0x41, 0x67, 0x46, 0x32, 0x34, 0x58, 0x49, 0x43, 0x44, 0x2b, 0x78, + 0x47, 0x30, 0x58, 0x49, 0x43, 0x41, 0x58, 0x62, 0x52, 0x63, 0x67, + 0x49, 0x41, 0x45, 0x4f, 0x62, 0x68, 0x63, 0x67, 0x49, 0x42, 0x64, + 0x75, 0x46, 0x79, 0x41, 0x67, 0x41, 0x41, 0x41, 0x42, 0x41, 0x45, + 0x55, 0x41, 0x55, 0x51, 0x4f, 0x37, 0x41, 0x76, 0x67, 0x41, 0x4a, + 0x41, 0x41, 0x41, 0x41, 0x52, 0x51, 0x47, 0x42, 0x77, 0x45, 0x4f, + 0x41, 0x53, 0x4d, 0x69, 0x4a, 0x69, 0x63, 0x42, 0x4c, 0x67, 0x45, + 0x31, 0x4e, 0x44, 0x59, 0x2f, 0x41, 0x54, 0x34, 0x42, 0x4d, 0x7a, + 0x49, 0x57, 0x48, 0x77, 0x45, 0x42, 0x50, 0x67, 0x45, 0x7a, 0x4d, + 0x68, 0x59, 0x66, 0x41, 0x52, 0x34, 0x42, 0x46, 0x51, 0x4f, 0x37, + 0x43, 0x41, 0x6a, 0x2b, 0x46, 0x41, 0x63, 0x56, 0x43, 0x67, 0x73, + 0x56, 0x42, 0x2f, 0x37, 0x6a, 0x43, 0x41, 0x67, 0x49, 0x43, 0x45, + 0x34, 0x49, 0x46, 0x41, 0x73, 0x4b, 0x46, 0x51, 0x69, 0x6f, 0x41, + 0x58, 0x59, 0x49, 0x46, 0x51, 0x6f, 0x4c, 0x46, 0x41, 0x68, 0x4f, + 0x43, 0x41, 0x67, 0x43, 0x63, 0x77, 0x6f, 0x56, 0x42, 0x2f, 0x34, + 0x55, 0x43, 0x41, 0x67, 0x49, 0x43, 0x41, 0x45, 0x64, 0x42, 0x78, + 0x55, 0x4c, 0x43, 0x68, 0x55, 0x48, 0x54, 0x67, 0x67, 0x49, 0x43, + 0x41, 0x69, 0x6f, 0x41, 0x58, 0x63, 0x49, 0x43, 0x41, 0x67, 0x49, + 0x54, 0x67, 0x63, 0x56, 0x43, 0x77, 0x41, 0x41, 0x41, 0x51, 0x41, + 0x2f, 0x41, 0x44, 0x38, 0x43, 0x35, 0x67, 0x4c, 0x6d, 0x41, 0x44, + 0x77, 0x41, 0x41, 0x43, 0x55, 0x55, 0x42, 0x67, 0x38, 0x42, 0x44, + 0x67, 0x45, 0x6a, 0x49, 0x69, 0x59, 0x76, 0x41, 0x51, 0x63, 0x4f, + 0x41, 0x53, 0x4d, 0x69, 0x4a, 0x69, 0x38, 0x42, 0x4c, 0x67, 0x45, + 0x31, 0x4e, 0x44, 0x59, 0x2f, 0x41, 0x53, 0x63, 0x75, 0x41, 0x54, + 0x55, 0x30, 0x4e, 0x6a, 0x38, 0x42, 0x50, 0x67, 0x45, 0x7a, 0x4d, + 0x68, 0x59, 0x66, 0x41, 0x54, 0x63, 0x2b, 0x41, 0x54, 0x4d, 0x79, + 0x46, 0x68, 0x38, 0x42, 0x48, 0x67, 0x45, 0x56, 0x46, 0x41, 0x59, + 0x50, 0x41, 0x52, 0x63, 0x65, 0x41, 0x52, 0x55, 0x43, 0x35, 0x67, + 0x6b, 0x48, 0x54, 0x67, 0x67, 0x55, 0x43, 0x77, 0x73, 0x55, 0x43, + 0x4b, 0x69, 0x6f, 0x42, 0x78, 0x55, 0x4c, 0x43, 0x68, 0x55, 0x48, + 0x54, 0x67, 0x67, 0x49, 0x43, 0x41, 0x69, 0x6f, 0x71, 0x41, 0x67, + 0x49, 0x43, 0x41, 0x68, 0x4f, 0x42, 0x78, 0x55, 0x4b, 0x43, 0x78, + 0x55, 0x48, 0x71, 0x4b, 0x67, 0x49, 0x46, 0x41, 0x73, 0x4c, 0x46, + 0x41, 0x68, 0x4f, 0x42, 0x77, 0x6b, 0x4a, 0x42, 0x36, 0x69, 0x6f, + 0x42, 0x77, 0x6e, 0x44, 0x43, 0x68, 0x55, 0x48, 0x54, 0x67, 0x67, + 0x49, 0x43, 0x41, 0x69, 0x6f, 0x71, 0x41, 0x67, 0x49, 0x43, 0x41, + 0x68, 0x4f, 0x42, 0x78, 0x55, 0x4b, 0x43, 0x78, 0x55, 0x48, 0x71, + 0x4b, 0x67, 0x49, 0x46, 0x41, 0x73, 0x4c, 0x46, 0x41, 0x68, 0x4f, + 0x42, 0x77, 0x6b, 0x4a, 0x42, 0x36, 0x69, 0x6f, 0x42, 0x77, 0x6b, + 0x4a, 0x42, 0x30, 0x34, 0x49, 0x46, 0x41, 0x73, 0x4c, 0x46, 0x41, + 0x69, 0x6f, 0x71, 0x41, 0x63, 0x56, 0x43, 0x77, 0x41, 0x41, 0x41, + 0x41, 0x49, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x32, 0x34, 0x44, + 0x62, 0x67, 0x41, 0x4c, 0x41, 0x4a, 0x49, 0x41, 0x41, 0x41, 0x45, + 0x30, 0x4a, 0x69, 0x4d, 0x69, 0x42, 0x68, 0x55, 0x55, 0x46, 0x6a, + 0x4d, 0x79, 0x4e, 0x69, 0x55, 0x56, 0x46, 0x41, 0x59, 0x50, 0x41, + 0x51, 0x34, 0x42, 0x42, 0x78, 0x34, 0x42, 0x46, 0x78, 0x34, 0x42, + 0x46, 0x52, 0x51, 0x47, 0x42, 0x77, 0x34, 0x42, 0x49, 0x79, 0x49, + 0x6d, 0x4c, 0x77, 0x45, 0x4f, 0x41, 0x51, 0x63, 0x4f, 0x41, 0x51, + 0x63, 0x4f, 0x41, 0x53, 0x73, 0x42, 0x49, 0x69, 0x59, 0x76, 0x41, + 0x53, 0x34, 0x42, 0x4a, 0x77, 0x63, 0x4f, 0x41, 0x53, 0x4d, 0x69, + 0x4a, 0x69, 0x63, 0x75, 0x41, 0x53, 0x63, 0x75, 0x41, 0x54, 0x55, + 0x30, 0x4e, 0x6a, 0x63, 0x2b, 0x41, 0x54, 0x63, 0x75, 0x41, 0x53, + 0x38, 0x42, 0x4c, 0x67, 0x45, 0x39, 0x41, 0x54, 0x51, 0x32, 0x50, + 0x77, 0x45, 0x2b, 0x41, 0x54, 0x63, 0x75, 0x41, 0x53, 0x63, 0x75, + 0x41, 0x54, 0x55, 0x30, 0x4e, 0x6a, 0x63, 0x2b, 0x41, 0x54, 0x4d, + 0x79, 0x46, 0x68, 0x38, 0x42, 0x50, 0x67, 0x45, 0x33, 0x50, 0x67, + 0x45, 0x33, 0x50, 0x67, 0x45, 0x37, 0x41, 0x54, 0x49, 0x57, 0x48, + 0x77, 0x45, 0x65, 0x41, 0x52, 0x63, 0x33, 0x50, 0x67, 0x45, 0x7a, + 0x4d, 0x68, 0x59, 0x58, 0x48, 0x67, 0x45, 0x58, 0x48, 0x67, 0x45, + 0x56, 0x46, 0x41, 0x59, 0x48, 0x44, 0x67, 0x45, 0x48, 0x48, 0x67, + 0x45, 0x66, 0x41, 0x52, 0x34, 0x42, 0x46, 0x51, 0x4a, 0x4a, 0x56, + 0x6a, 0x77, 0x39, 0x56, 0x56, 0x55, 0x39, 0x50, 0x46, 0x59, 0x42, + 0x4a, 0x51, 0x6b, 0x48, 0x61, 0x67, 0x55, 0x4b, 0x42, 0x77, 0x34, + 0x66, 0x45, 0x41, 0x49, 0x45, 0x41, 0x77, 0x4d, 0x4b, 0x56, 0x51, + 0x38, 0x45, 0x42, 0x77, 0x52, 0x50, 0x44, 0x42, 0x6f, 0x4f, 0x41, + 0x77, 0x59, 0x48, 0x41, 0x67, 0x73, 0x49, 0x66, 0x77, 0x63, 0x4d, + 0x41, 0x52, 0x41, 0x4e, 0x47, 0x67, 0x31, 0x51, 0x41, 0x77, 0x67, + 0x44, 0x42, 0x41, 0x67, 0x44, 0x46, 0x6a, 0x59, 0x53, 0x41, 0x67, + 0x49, 0x43, 0x41, 0x77, 0x34, 0x66, 0x44, 0x77, 0x67, 0x4d, 0x42, + 0x47, 0x67, 0x49, 0x43, 0x51, 0x6b, 0x47, 0x61, 0x77, 0x51, 0x4c, + 0x42, 0x77, 0x38, 0x65, 0x45, 0x41, 0x4d, 0x44, 0x41, 0x77, 0x49, + 0x4c, 0x56, 0x51, 0x38, 0x44, 0x43, 0x41, 0x4e, 0x50, 0x44, 0x52, + 0x6f, 0x4e, 0x41, 0x77, 0x63, 0x48, 0x41, 0x67, 0x73, 0x48, 0x66, + 0x77, 0x67, 0x4d, 0x41, 0x52, 0x41, 0x4e, 0x47, 0x67, 0x78, 0x52, + 0x41, 0x77, 0x63, 0x45, 0x42, 0x41, 0x63, 0x44, 0x46, 0x7a, 0x59, + 0x53, 0x41, 0x67, 0x49, 0x44, 0x41, 0x67, 0x34, 0x66, 0x44, 0x77, + 0x63, 0x4d, 0x42, 0x57, 0x67, 0x48, 0x43, 0x67, 0x47, 0x33, 0x50, + 0x46, 0x5a, 0x57, 0x50, 0x44, 0x31, 0x56, 0x56, 0x58, 0x74, 0x2f, + 0x42, 0x67, 0x30, 0x42, 0x45, 0x41, 0x34, 0x61, 0x44, 0x42, 0x55, + 0x6e, 0x45, 0x77, 0x4d, 0x49, 0x41, 0x77, 0x51, 0x48, 0x41, 0x77, + 0x31, 0x5a, 0x41, 0x77, 0x49, 0x2b, 0x42, 0x67, 0x73, 0x46, 0x47, + 0x6a, 0x59, 0x61, 0x42, 0x77, 0x6b, 0x4b, 0x42, 0x32, 0x6b, 0x46, + 0x43, 0x67, 0x59, 0x39, 0x41, 0x67, 0x4d, 0x44, 0x41, 0x78, 0x55, + 0x7a, 0x47, 0x41, 0x4d, 0x48, 0x42, 0x41, 0x4d, 0x48, 0x41, 0x78, + 0x4d, 0x6e, 0x46, 0x41, 0x34, 0x63, 0x44, 0x77, 0x38, 0x42, 0x44, + 0x41, 0x68, 0x2b, 0x42, 0x77, 0x30, 0x42, 0x45, 0x41, 0x34, 0x61, + 0x44, 0x52, 0x51, 0x6e, 0x45, 0x77, 0x4d, 0x48, 0x42, 0x41, 0x51, + 0x47, 0x41, 0x77, 0x35, 0x5a, 0x42, 0x41, 0x49, 0x39, 0x42, 0x67, + 0x73, 0x45, 0x47, 0x7a, 0x59, 0x61, 0x42, 0x77, 0x6b, 0x4b, 0x42, + 0x32, 0x6f, 0x45, 0x43, 0x67, 0x63, 0x39, 0x41, 0x77, 0x4d, 0x45, + 0x41, 0x68, 0x55, 0x7a, 0x47, 0x51, 0x4d, 0x47, 0x42, 0x41, 0x51, + 0x47, 0x41, 0x78, 0x51, 0x6d, 0x46, 0x41, 0x34, 0x63, 0x44, 0x68, + 0x41, 0x43, 0x44, 0x41, 0x63, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x77, 0x41, 0x41, 0x2f, 0x37, 0x63, 0x44, 0x62, 0x67, 0x4f, 0x33, + 0x41, 0x42, 0x4d, 0x41, 0x48, 0x41, 0x41, 0x6d, 0x41, 0x41, 0x41, + 0x42, 0x48, 0x67, 0x45, 0x56, 0x45, 0x52, 0x51, 0x47, 0x49, 0x79, + 0x45, 0x69, 0x4a, 0x6a, 0x55, 0x52, 0x4e, 0x44, 0x59, 0x7a, 0x49, + 0x54, 0x49, 0x57, 0x46, 0x77, 0x63, 0x56, 0x4d, 0x79, 0x34, 0x42, + 0x4c, 0x77, 0x45, 0x75, 0x41, 0x52, 0x4d, 0x52, 0x49, 0x79, 0x49, + 0x6d, 0x50, 0x51, 0x45, 0x68, 0x45, 0x53, 0x45, 0x44, 0x52, 0x78, + 0x41, 0x58, 0x49, 0x42, 0x66, 0x39, 0x41, 0x42, 0x63, 0x67, 0x49, + 0x42, 0x63, 0x43, 0x41, 0x42, 0x63, 0x33, 0x45, 0x45, 0x7a, 0x58, + 0x41, 0x77, 0x63, 0x44, 0x73, 0x67, 0x4d, 0x4f, 0x31, 0x65, 0x34, + 0x58, 0x49, 0x50, 0x35, 0x4a, 0x41, 0x74, 0x77, 0x43, 0x33, 0x68, + 0x41, 0x33, 0x46, 0x2f, 0x31, 0x75, 0x46, 0x79, 0x41, 0x67, 0x46, + 0x77, 0x4f, 0x53, 0x46, 0x79, 0x41, 0x58, 0x45, 0x43, 0x66, 0x58, + 0x43, 0x41, 0x30, 0x44, 0x73, 0x77, 0x4d, 0x48, 0x2f, 0x4a, 0x6b, + 0x43, 0x53, 0x53, 0x41, 0x58, 0x37, 0x76, 0x79, 0x53, 0x41, 0x41, + 0x4d, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x32, 0x34, 0x44, 0x62, + 0x67, 0x41, 0x56, 0x41, 0x44, 0x45, 0x41, 0x54, 0x51, 0x41, 0x41, + 0x41, 0x52, 0x45, 0x55, 0x42, 0x69, 0x73, 0x42, 0x49, 0x69, 0x59, + 0x39, 0x41, 0x54, 0x51, 0x32, 0x4f, 0x77, 0x45, 0x31, 0x4e, 0x44, + 0x59, 0x37, 0x41, 0x54, 0x49, 0x57, 0x46, 0x52, 0x63, 0x30, 0x4a, + 0x79, 0x34, 0x42, 0x4a, 0x79, 0x59, 0x6a, 0x49, 0x67, 0x63, 0x4f, + 0x41, 0x51, 0x63, 0x47, 0x46, 0x52, 0x51, 0x58, 0x48, 0x67, 0x45, + 0x58, 0x46, 0x6a, 0x4d, 0x79, 0x4e, 0x7a, 0x34, 0x42, 0x4e, 0x7a, + 0x59, 0x33, 0x46, 0x41, 0x63, 0x4f, 0x41, 0x51, 0x63, 0x47, 0x49, + 0x79, 0x49, 0x6e, 0x4c, 0x67, 0x45, 0x6e, 0x4a, 0x6a, 0x55, 0x30, + 0x4e, 0x7a, 0x34, 0x42, 0x4e, 0x7a, 0x59, 0x7a, 0x4d, 0x68, 0x63, + 0x65, 0x41, 0x52, 0x63, 0x57, 0x41, 0x67, 0x41, 0x4c, 0x42, 0x37, + 0x63, 0x49, 0x43, 0x67, 0x6f, 0x49, 0x67, 0x41, 0x6f, 0x49, 0x4a, + 0x51, 0x63, 0x4c, 0x37, 0x68, 0x6b, 0x59, 0x56, 0x54, 0x67, 0x35, + 0x51, 0x45, 0x41, 0x35, 0x4f, 0x56, 0x51, 0x5a, 0x47, 0x42, 0x67, + 0x5a, 0x56, 0x44, 0x6b, 0x35, 0x51, 0x45, 0x41, 0x35, 0x4f, 0x46, + 0x55, 0x59, 0x47, 0x59, 0x41, 0x6a, 0x49, 0x6e, 0x64, 0x51, 0x55, + 0x46, 0x74, 0x62, 0x55, 0x46, 0x42, 0x33, 0x49, 0x79, 0x49, 0x69, + 0x49, 0x33, 0x64, 0x51, 0x55, 0x46, 0x74, 0x62, 0x55, 0x46, 0x42, + 0x33, 0x49, 0x69, 0x4d, 0x43, 0x67, 0x50, 0x38, 0x41, 0x43, 0x41, + 0x6f, 0x4b, 0x43, 0x43, 0x55, 0x48, 0x43, 0x38, 0x6b, 0x49, 0x43, + 0x67, 0x6f, 0x49, 0x79, 0x55, 0x41, 0x35, 0x4f, 0x46, 0x55, 0x59, + 0x47, 0x52, 0x6b, 0x59, 0x56, 0x54, 0x67, 0x35, 0x51, 0x45, 0x41, + 0x35, 0x4f, 0x56, 0x51, 0x5a, 0x47, 0x42, 0x67, 0x5a, 0x56, 0x44, + 0x6b, 0x35, 0x51, 0x46, 0x74, 0x51, 0x55, 0x48, 0x63, 0x69, 0x49, + 0x79, 0x4d, 0x69, 0x64, 0x31, 0x42, 0x51, 0x57, 0x31, 0x74, 0x51, + 0x55, 0x48, 0x63, 0x69, 0x49, 0x79, 0x4d, 0x69, 0x64, 0x31, 0x42, + 0x51, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x49, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x32, 0x34, 0x44, 0x62, 0x67, 0x41, 0x30, 0x41, + 0x47, 0x63, 0x41, 0x41, 0x41, 0x45, 0x77, 0x46, 0x42, 0x55, 0x47, + 0x42, 0x77, 0x34, 0x42, 0x42, 0x77, 0x59, 0x6a, 0x49, 0x69, 0x63, + 0x75, 0x41, 0x53, 0x63, 0x6d, 0x4a, 0x77, 0x63, 0x4f, 0x41, 0x53, + 0x4d, 0x69, 0x4a, 0x6a, 0x55, 0x52, 0x4e, 0x44, 0x59, 0x7a, 0x49, + 0x54, 0x49, 0x57, 0x46, 0x52, 0x51, 0x47, 0x44, 0x77, 0x45, 0x65, + 0x41, 0x54, 0x4d, 0x79, 0x4e, 0x6a, 0x63, 0x2b, 0x41, 0x54, 0x63, + 0x2b, 0x41, 0x54, 0x73, 0x42, 0x4d, 0x68, 0x59, 0x56, 0x45, 0x78, + 0x45, 0x55, 0x42, 0x69, 0x4d, 0x68, 0x49, 0x69, 0x59, 0x31, 0x4e, + 0x44, 0x59, 0x2f, 0x41, 0x53, 0x34, 0x42, 0x49, 0x79, 0x49, 0x47, + 0x42, 0x77, 0x34, 0x42, 0x42, 0x77, 0x34, 0x42, 0x4b, 0x77, 0x45, + 0x69, 0x4a, 0x6a, 0x30, 0x42, 0x4e, 0x6a, 0x63, 0x2b, 0x41, 0x54, + 0x63, 0x32, 0x4d, 0x7a, 0x49, 0x58, 0x48, 0x67, 0x45, 0x58, 0x46, + 0x68, 0x63, 0x33, 0x50, 0x67, 0x45, 0x7a, 0x4d, 0x68, 0x59, 0x56, + 0x41, 0x31, 0x38, 0x53, 0x4b, 0x43, 0x64, 0x76, 0x52, 0x6b, 0x56, + 0x50, 0x4b, 0x69, 0x6b, 0x70, 0x54, 0x43, 0x4d, 0x6b, 0x48, 0x6b, + 0x6f, 0x46, 0x44, 0x51, 0x63, 0x50, 0x46, 0x68, 0x59, 0x50, 0x41, + 0x51, 0x41, 0x50, 0x46, 0x51, 0x59, 0x46, 0x54, 0x69, 0x68, 0x6f, + 0x4e, 0x30, 0x79, 0x46, 0x4b, 0x41, 0x6f, 0x4e, 0x42, 0x77, 0x49, + 0x4a, 0x42, 0x6d, 0x34, 0x49, 0x43, 0x67, 0x38, 0x57, 0x44, 0x2f, + 0x38, 0x41, 0x44, 0x78, 0x55, 0x46, 0x42, 0x55, 0x38, 0x6f, 0x61, + 0x44, 0x64, 0x4d, 0x68, 0x53, 0x67, 0x4c, 0x44, 0x41, 0x67, 0x43, + 0x43, 0x41, 0x64, 0x78, 0x43, 0x41, 0x73, 0x54, 0x4a, 0x79, 0x68, + 0x77, 0x52, 0x6b, 0x5a, 0x50, 0x4b, 0x69, 0x6b, 0x70, 0x54, 0x53, + 0x4d, 0x6b, 0x48, 0x6b, 0x6f, 0x47, 0x44, 0x51, 0x63, 0x50, 0x46, + 0x67, 0x46, 0x62, 0x41, 0x77, 0x46, 0x4c, 0x51, 0x44, 0x39, 0x62, + 0x47, 0x52, 0x6b, 0x49, 0x43, 0x42, 0x38, 0x58, 0x46, 0x68, 0x31, + 0x4b, 0x42, 0x51, 0x55, 0x56, 0x44, 0x77, 0x45, 0x41, 0x44, 0x78, + 0x59, 0x57, 0x44, 0x77, 0x63, 0x4e, 0x42, 0x6b, 0x34, 0x6d, 0x4b, + 0x55, 0x74, 0x42, 0x45, 0x43, 0x45, 0x53, 0x42, 0x67, 0x63, 0x4c, + 0x43, 0x41, 0x48, 0x4b, 0x2f, 0x77, 0x41, 0x50, 0x46, 0x68, 0x59, + 0x50, 0x42, 0x77, 0x30, 0x46, 0x54, 0x79, 0x59, 0x6f, 0x53, 0x6b, + 0x45, 0x52, 0x49, 0x52, 0x45, 0x47, 0x42, 0x77, 0x73, 0x48, 0x42, + 0x45, 0x78, 0x41, 0x50, 0x31, 0x6f, 0x61, 0x47, 0x51, 0x67, 0x4a, + 0x48, 0x78, 0x59, 0x58, 0x48, 0x45, 0x6b, 0x46, 0x42, 0x68, 0x55, + 0x50, 0x41, 0x41, 0x41, 0x41, 0x43, 0x41, 0x41, 0x41, 0x41, 0x45, + 0x6b, 0x45, 0x41, 0x41, 0x4e, 0x75, 0x41, 0x42, 0x41, 0x41, 0x49, + 0x41, 0x41, 0x77, 0x41, 0x45, 0x45, 0x41, 0x55, 0x67, 0x42, 0x6a, + 0x41, 0x48, 0x51, 0x41, 0x68, 0x41, 0x41, 0x41, 0x45, 0x78, 0x55, + 0x55, 0x42, 0x69, 0x73, 0x42, 0x49, 0x69, 0x59, 0x39, 0x41, 0x54, + 0x51, 0x32, 0x4f, 0x77, 0x45, 0x79, 0x46, 0x68, 0x55, 0x31, 0x46, + 0x52, 0x51, 0x47, 0x4b, 0x77, 0x45, 0x69, 0x4a, 0x6a, 0x30, 0x42, + 0x4e, 0x44, 0x59, 0x37, 0x41, 0x54, 0x49, 0x57, 0x4e, 0x52, 0x55, + 0x55, 0x42, 0x69, 0x73, 0x42, 0x49, 0x69, 0x59, 0x39, 0x41, 0x54, + 0x51, 0x32, 0x4f, 0x77, 0x45, 0x79, 0x46, 0x67, 0x45, 0x56, 0x46, + 0x41, 0x59, 0x6a, 0x49, 0x53, 0x49, 0x6d, 0x50, 0x51, 0x45, 0x30, + 0x4e, 0x6a, 0x4d, 0x68, 0x4d, 0x68, 0x59, 0x56, 0x4e, 0x52, 0x55, + 0x55, 0x42, 0x69, 0x4d, 0x68, 0x49, 0x69, 0x59, 0x39, 0x41, 0x54, + 0x51, 0x32, 0x4d, 0x79, 0x45, 0x79, 0x46, 0x68, 0x55, 0x31, 0x46, + 0x52, 0x51, 0x47, 0x49, 0x79, 0x45, 0x69, 0x4a, 0x6a, 0x30, 0x42, + 0x4e, 0x44, 0x59, 0x7a, 0x49, 0x54, 0x49, 0x57, 0x46, 0x52, 0x4d, + 0x52, 0x4e, 0x43, 0x59, 0x6a, 0x49, 0x53, 0x49, 0x47, 0x46, 0x52, + 0x45, 0x55, 0x46, 0x6a, 0x4d, 0x68, 0x4d, 0x6a, 0x59, 0x31, 0x45, + 0x78, 0x45, 0x55, 0x42, 0x69, 0x4d, 0x68, 0x49, 0x69, 0x59, 0x31, + 0x45, 0x54, 0x51, 0x32, 0x4d, 0x79, 0x45, 0x79, 0x46, 0x74, 0x73, + 0x4c, 0x42, 0x79, 0x51, 0x49, 0x43, 0x77, 0x73, 0x49, 0x4a, 0x41, + 0x63, 0x4c, 0x43, 0x77, 0x63, 0x6b, 0x43, 0x41, 0x73, 0x4c, 0x43, + 0x43, 0x51, 0x48, 0x43, 0x77, 0x73, 0x48, 0x4a, 0x41, 0x67, 0x4c, + 0x43, 0x77, 0x67, 0x6b, 0x42, 0x77, 0x73, 0x43, 0x6b, 0x77, 0x73, + 0x49, 0x2f, 0x64, 0x77, 0x48, 0x43, 0x77, 0x73, 0x48, 0x41, 0x69, + 0x51, 0x49, 0x43, 0x77, 0x73, 0x49, 0x2f, 0x64, 0x77, 0x48, 0x43, + 0x77, 0x73, 0x48, 0x41, 0x69, 0x51, 0x49, 0x43, 0x77, 0x73, 0x49, + 0x2f, 0x64, 0x77, 0x48, 0x43, 0x77, 0x73, 0x48, 0x41, 0x69, 0x51, + 0x49, 0x43, 0x30, 0x6b, 0x4c, 0x42, 0x2f, 0x79, 0x32, 0x42, 0x77, + 0x73, 0x4c, 0x42, 0x77, 0x4e, 0x4b, 0x42, 0x77, 0x74, 0x4a, 0x4e, + 0x69, 0x58, 0x38, 0x74, 0x69, 0x55, 0x32, 0x4e, 0x69, 0x55, 0x44, + 0x53, 0x69, 0x55, 0x32, 0x41, 0x52, 0x49, 0x6b, 0x43, 0x41, 0x73, + 0x4c, 0x43, 0x43, 0x51, 0x49, 0x43, 0x77, 0x73, 0x49, 0x6b, 0x79, + 0x55, 0x48, 0x43, 0x77, 0x73, 0x48, 0x4a, 0x51, 0x63, 0x4c, 0x43, + 0x34, 0x73, 0x6c, 0x42, 0x77, 0x73, 0x4c, 0x42, 0x79, 0x55, 0x48, + 0x43, 0x77, 0x76, 0x2b, 0x31, 0x43, 0x51, 0x49, 0x43, 0x77, 0x73, + 0x49, 0x4a, 0x41, 0x67, 0x4c, 0x43, 0x77, 0x69, 0x54, 0x4a, 0x51, + 0x63, 0x4c, 0x43, 0x77, 0x63, 0x6c, 0x42, 0x77, 0x73, 0x4c, 0x42, + 0x35, 0x49, 0x6c, 0x42, 0x77, 0x73, 0x4c, 0x42, 0x79, 0x55, 0x48, + 0x43, 0x77, 0x73, 0x48, 0x2f, 0x6d, 0x34, 0x42, 0x32, 0x77, 0x63, + 0x4c, 0x43, 0x77, 0x66, 0x2b, 0x4a, 0x51, 0x67, 0x4c, 0x43, 0x77, + 0x67, 0x43, 0x62, 0x66, 0x32, 0x54, 0x4a, 0x6a, 0x59, 0x32, 0x4a, + 0x67, 0x4a, 0x74, 0x4a, 0x6a, 0x59, 0x32, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x67, 0x41, 0x41, 0x41, 0x42, 0x4a, 0x42, 0x41, 0x41, + 0x44, 0x62, 0x67, 0x41, 0x51, 0x41, 0x43, 0x45, 0x41, 0x4d, 0x51, + 0x42, 0x43, 0x41, 0x46, 0x49, 0x41, 0x59, 0x77, 0x42, 0x7a, 0x41, + 0x49, 0x4d, 0x41, 0x41, 0x44, 0x63, 0x56, 0x46, 0x41, 0x59, 0x72, + 0x41, 0x53, 0x49, 0x6d, 0x50, 0x51, 0x45, 0x30, 0x4e, 0x6a, 0x73, + 0x42, 0x4d, 0x68, 0x59, 0x56, 0x4e, 0x52, 0x55, 0x55, 0x42, 0x69, + 0x73, 0x42, 0x49, 0x69, 0x59, 0x39, 0x41, 0x54, 0x51, 0x32, 0x4f, + 0x77, 0x45, 0x79, 0x46, 0x68, 0x55, 0x31, 0x46, 0x52, 0x51, 0x47, + 0x4b, 0x77, 0x45, 0x69, 0x4a, 0x6a, 0x30, 0x42, 0x4e, 0x44, 0x59, + 0x37, 0x41, 0x54, 0x49, 0x57, 0x41, 0x52, 0x55, 0x55, 0x42, 0x69, + 0x4d, 0x68, 0x49, 0x69, 0x59, 0x39, 0x41, 0x54, 0x51, 0x32, 0x4d, + 0x79, 0x45, 0x79, 0x46, 0x68, 0x55, 0x42, 0x46, 0x52, 0x51, 0x47, + 0x4b, 0x77, 0x45, 0x69, 0x4a, 0x6a, 0x30, 0x42, 0x4e, 0x44, 0x59, + 0x37, 0x41, 0x54, 0x49, 0x57, 0x41, 0x52, 0x55, 0x55, 0x42, 0x69, + 0x4d, 0x68, 0x49, 0x69, 0x59, 0x39, 0x41, 0x54, 0x51, 0x32, 0x4d, + 0x79, 0x45, 0x79, 0x46, 0x68, 0x55, 0x31, 0x46, 0x52, 0x51, 0x47, + 0x49, 0x79, 0x45, 0x69, 0x4a, 0x6a, 0x30, 0x42, 0x4e, 0x44, 0x59, + 0x7a, 0x49, 0x54, 0x49, 0x57, 0x4e, 0x52, 0x55, 0x55, 0x42, 0x69, + 0x4d, 0x68, 0x49, 0x69, 0x59, 0x39, 0x41, 0x54, 0x51, 0x32, 0x4d, + 0x79, 0x45, 0x79, 0x46, 0x70, 0x49, 0x4c, 0x42, 0x32, 0x34, 0x48, + 0x43, 0x77, 0x73, 0x48, 0x62, 0x67, 0x63, 0x4c, 0x43, 0x77, 0x64, + 0x75, 0x42, 0x77, 0x73, 0x4c, 0x42, 0x32, 0x34, 0x48, 0x43, 0x77, + 0x73, 0x48, 0x62, 0x67, 0x63, 0x4c, 0x43, 0x77, 0x64, 0x75, 0x42, + 0x77, 0x73, 0x44, 0x62, 0x67, 0x73, 0x48, 0x2f, 0x51, 0x41, 0x49, + 0x43, 0x77, 0x73, 0x49, 0x41, 0x77, 0x41, 0x48, 0x43, 0x2f, 0x79, + 0x53, 0x43, 0x77, 0x64, 0x75, 0x42, 0x77, 0x73, 0x4c, 0x42, 0x32, + 0x34, 0x48, 0x43, 0x77, 0x4e, 0x75, 0x43, 0x77, 0x66, 0x39, 0x41, + 0x41, 0x67, 0x4c, 0x43, 0x77, 0x67, 0x44, 0x41, 0x41, 0x63, 0x4c, + 0x43, 0x77, 0x66, 0x39, 0x41, 0x41, 0x67, 0x4c, 0x43, 0x77, 0x67, + 0x44, 0x41, 0x41, 0x63, 0x4c, 0x43, 0x77, 0x66, 0x39, 0x41, 0x41, + 0x67, 0x4c, 0x43, 0x77, 0x67, 0x44, 0x41, 0x41, 0x63, 0x4c, 0x79, + 0x57, 0x34, 0x48, 0x43, 0x77, 0x73, 0x48, 0x62, 0x67, 0x63, 0x4c, + 0x43, 0x77, 0x66, 0x63, 0x62, 0x67, 0x63, 0x4c, 0x43, 0x77, 0x64, + 0x75, 0x42, 0x77, 0x73, 0x4c, 0x42, 0x39, 0x74, 0x75, 0x42, 0x77, + 0x73, 0x4c, 0x42, 0x32, 0x34, 0x48, 0x43, 0x77, 0x76, 0x2b, 0x51, + 0x6d, 0x34, 0x48, 0x43, 0x77, 0x73, 0x48, 0x62, 0x67, 0x63, 0x4c, + 0x43, 0x77, 0x63, 0x43, 0x6b, 0x6d, 0x30, 0x49, 0x43, 0x77, 0x73, + 0x49, 0x62, 0x51, 0x67, 0x4c, 0x43, 0x2f, 0x35, 0x43, 0x62, 0x67, + 0x63, 0x4c, 0x43, 0x77, 0x64, 0x75, 0x42, 0x77, 0x73, 0x4c, 0x42, + 0x39, 0x74, 0x75, 0x42, 0x77, 0x73, 0x4c, 0x42, 0x32, 0x34, 0x48, + 0x43, 0x77, 0x76, 0x55, 0x62, 0x51, 0x67, 0x4c, 0x43, 0x77, 0x68, + 0x74, 0x43, 0x41, 0x73, 0x4c, 0x41, 0x41, 0x41, 0x41, 0x41, 0x67, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x43, 0x53, 0x51, 0x4e, 0x75, 0x41, + 0x41, 0x73, 0x41, 0x4b, 0x41, 0x41, 0x41, 0x41, 0x54, 0x51, 0x6d, + 0x49, 0x79, 0x49, 0x47, 0x46, 0x52, 0x51, 0x57, 0x4d, 0x7a, 0x49, + 0x32, 0x4e, 0x78, 0x51, 0x47, 0x42, 0x77, 0x4d, 0x4f, 0x41, 0x53, + 0x4d, 0x69, 0x4a, 0x69, 0x63, 0x44, 0x4c, 0x67, 0x45, 0x31, 0x4e, + 0x44, 0x63, 0x2b, 0x41, 0x54, 0x63, 0x32, 0x4d, 0x7a, 0x49, 0x58, + 0x48, 0x67, 0x45, 0x58, 0x46, 0x68, 0x55, 0x42, 0x74, 0x31, 0x59, + 0x38, 0x50, 0x56, 0x5a, 0x57, 0x50, 0x54, 0x78, 0x57, 0x6b, 0x67, + 0x67, 0x4c, 0x30, 0x41, 0x6b, 0x6b, 0x46, 0x42, 0x55, 0x6b, 0x43, + 0x64, 0x41, 0x4c, 0x43, 0x42, 0x63, 0x58, 0x54, 0x7a, 0x59, 0x31, + 0x50, 0x54, 0x77, 0x32, 0x4e, 0x55, 0x38, 0x58, 0x46, 0x77, 0x4a, + 0x4a, 0x50, 0x56, 0x56, 0x56, 0x50, 0x54, 0x78, 0x57, 0x56, 0x6a, + 0x77, 0x61, 0x4e, 0x52, 0x66, 0x2b, 0x52, 0x68, 0x4d, 0x57, 0x46, + 0x68, 0x4d, 0x42, 0x75, 0x68, 0x63, 0x31, 0x47, 0x6a, 0x30, 0x31, + 0x4e, 0x56, 0x41, 0x58, 0x46, 0x78, 0x63, 0x58, 0x55, 0x44, 0x55, + 0x31, 0x50, 0x51, 0x41, 0x43, 0x41, 0x41, 0x41, 0x41, 0x53, 0x51, + 0x4f, 0x70, 0x41, 0x32, 0x34, 0x41, 0x4f, 0x67, 0x42, 0x51, 0x41, + 0x41, 0x41, 0x42, 0x46, 0x52, 0x51, 0x47, 0x49, 0x79, 0x45, 0x69, + 0x4a, 0x6a, 0x55, 0x52, 0x4e, 0x44, 0x59, 0x7a, 0x49, 0x54, 0x49, + 0x57, 0x46, 0x78, 0x34, 0x42, 0x46, 0x78, 0x59, 0x47, 0x44, 0x77, + 0x45, 0x4f, 0x41, 0x53, 0x4d, 0x69, 0x4a, 0x69, 0x4d, 0x75, 0x41, + 0x53, 0x4d, 0x68, 0x49, 0x67, 0x59, 0x56, 0x45, 0x52, 0x51, 0x57, + 0x4d, 0x79, 0x45, 0x79, 0x4e, 0x6a, 0x30, 0x42, 0x4e, 0x44, 0x59, + 0x2f, 0x41, 0x54, 0x34, 0x42, 0x4d, 0x7a, 0x49, 0x57, 0x46, 0x78, + 0x34, 0x42, 0x46, 0x52, 0x4d, 0x42, 0x42, 0x69, 0x49, 0x76, 0x41, + 0x53, 0x59, 0x30, 0x50, 0x77, 0x45, 0x32, 0x4d, 0x68, 0x38, 0x42, + 0x41, 0x54, 0x59, 0x79, 0x48, 0x77, 0x45, 0x57, 0x46, 0x41, 0x63, + 0x44, 0x4a, 0x57, 0x46, 0x45, 0x2f, 0x69, 0x56, 0x46, 0x59, 0x47, + 0x42, 0x46, 0x41, 0x64, 0x73, 0x52, 0x49, 0x68, 0x41, 0x45, 0x42, + 0x51, 0x45, 0x42, 0x41, 0x77, 0x4d, 0x63, 0x41, 0x77, 0x63, 0x44, + 0x41, 0x51, 0x4d, 0x42, 0x42, 0x77, 0x30, 0x47, 0x2f, 0x69, 0x55, + 0x6d, 0x4e, 0x6a, 0x59, 0x6d, 0x41, 0x64, 0x73, 0x6d, 0x4e, 0x51, + 0x4d, 0x44, 0x4a, 0x41, 0x4d, 0x48, 0x41, 0x77, 0x49, 0x44, 0x41, + 0x67, 0x55, 0x48, 0x68, 0x50, 0x34, 0x75, 0x44, 0x53, 0x59, 0x4f, + 0x39, 0x51, 0x34, 0x4f, 0x50, 0x67, 0x34, 0x6d, 0x44, 0x70, 0x59, + 0x42, 0x63, 0x67, 0x30, 0x6d, 0x44, 0x6a, 0x38, 0x4e, 0x44, 0x51, + 0x47, 0x6a, 0x74, 0x55, 0x52, 0x68, 0x59, 0x55, 0x51, 0x42, 0x32, + 0x30, 0x52, 0x68, 0x42, 0x77, 0x67, 0x42, 0x42, 0x77, 0x55, 0x45, + 0x43, 0x51, 0x4d, 0x63, 0x41, 0x77, 0x4d, 0x42, 0x41, 0x67, 0x49, + 0x32, 0x4a, 0x76, 0x34, 0x6c, 0x4a, 0x6a, 0x59, 0x32, 0x4a, 0x70, + 0x45, 0x44, 0x42, 0x77, 0x49, 0x6c, 0x41, 0x77, 0x4d, 0x42, 0x41, + 0x51, 0x49, 0x4a, 0x42, 0x67, 0x45, 0x59, 0x2f, 0x69, 0x38, 0x4f, + 0x44, 0x76, 0x55, 0x4f, 0x4a, 0x67, 0x34, 0x2b, 0x44, 0x67, 0x36, + 0x57, 0x41, 0x58, 0x49, 0x4f, 0x44, 0x6a, 0x38, 0x4f, 0x4a, 0x51, + 0x34, 0x41, 0x41, 0x41, 0x41, 0x42, 0x41, 0x47, 0x4d, 0x41, 0x47, + 0x67, 0x4b, 0x64, 0x41, 0x35, 0x30, 0x41, 0x46, 0x51, 0x41, 0x41, + 0x43, 0x51, 0x49, 0x57, 0x46, 0x41, 0x38, 0x42, 0x42, 0x69, 0x49, + 0x6e, 0x41, 0x53, 0x59, 0x30, 0x4e, 0x77, 0x45, 0x32, 0x4d, 0x68, + 0x38, 0x42, 0x46, 0x68, 0x51, 0x48, 0x41, 0x70, 0x33, 0x2b, 0x30, + 0x51, 0x45, 0x76, 0x43, 0x77, 0x74, 0x66, 0x43, 0x68, 0x34, 0x4c, + 0x2f, 0x6c, 0x67, 0x4c, 0x43, 0x77, 0x47, 0x6f, 0x43, 0x78, 0x34, + 0x4b, 0x58, 0x77, 0x73, 0x4c, 0x41, 0x77, 0x76, 0x2b, 0x30, 0x50, + 0x37, 0x52, 0x43, 0x78, 0x34, 0x4b, 0x58, 0x77, 0x73, 0x4c, 0x41, + 0x61, 0x67, 0x4b, 0x48, 0x67, 0x73, 0x42, 0x71, 0x41, 0x73, 0x4c, + 0x58, 0x77, 0x6f, 0x65, 0x43, 0x77, 0x41, 0x42, 0x41, 0x44, 0x34, + 0x41, 0x47, 0x67, 0x4a, 0x35, 0x41, 0x35, 0x30, 0x41, 0x46, 0x51, + 0x41, 0x41, 0x43, 0x51, 0x45, 0x47, 0x49, 0x69, 0x38, 0x42, 0x4a, + 0x6a, 0x51, 0x33, 0x43, 0x51, 0x45, 0x6d, 0x4e, 0x44, 0x38, 0x42, + 0x4e, 0x6a, 0x49, 0x58, 0x41, 0x52, 0x59, 0x55, 0x42, 0x77, 0x4a, + 0x35, 0x2f, 0x6c, 0x67, 0x4c, 0x48, 0x67, 0x74, 0x66, 0x43, 0x67, + 0x6f, 0x42, 0x4d, 0x50, 0x37, 0x51, 0x43, 0x67, 0x70, 0x66, 0x43, + 0x78, 0x34, 0x4c, 0x41, 0x61, 0x67, 0x4b, 0x43, 0x67, 0x48, 0x43, + 0x2f, 0x6c, 0x67, 0x4c, 0x43, 0x31, 0x38, 0x4b, 0x48, 0x67, 0x73, + 0x42, 0x4c, 0x77, 0x45, 0x77, 0x43, 0x78, 0x34, 0x4b, 0x58, 0x77, + 0x73, 0x4c, 0x2f, 0x6c, 0x67, 0x4c, 0x48, 0x67, 0x6f, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x77, 0x41, 0x4a, 0x41, 0x41, 0x41, 0x44, + 0x39, 0x77, 0x4f, 0x33, 0x41, 0x41, 0x38, 0x41, 0x4a, 0x67, 0x41, + 0x38, 0x41, 0x41, 0x41, 0x6c, 0x4e, 0x54, 0x51, 0x6d, 0x4b, 0x77, + 0x45, 0x69, 0x42, 0x68, 0x30, 0x42, 0x46, 0x42, 0x59, 0x37, 0x41, + 0x54, 0x49, 0x32, 0x4a, 0x78, 0x4d, 0x30, 0x4a, 0x69, 0x63, 0x75, + 0x41, 0x53, 0x73, 0x42, 0x49, 0x67, 0x59, 0x48, 0x44, 0x67, 0x45, + 0x56, 0x45, 0x78, 0x51, 0x57, 0x4f, 0x77, 0x45, 0x79, 0x4e, 0x6a, + 0x55, 0x44, 0x41, 0x52, 0x59, 0x55, 0x42, 0x77, 0x34, 0x42, 0x49, + 0x79, 0x45, 0x69, 0x4a, 0x69, 0x63, 0x6d, 0x4e, 0x44, 0x63, 0x42, + 0x50, 0x67, 0x45, 0x7a, 0x4d, 0x68, 0x59, 0x58, 0x41, 0x6b, 0x6b, + 0x4b, 0x43, 0x47, 0x34, 0x49, 0x43, 0x67, 0x6f, 0x49, 0x62, 0x67, + 0x67, 0x4b, 0x41, 0x51, 0x6f, 0x43, 0x41, 0x77, 0x4d, 0x48, 0x42, + 0x48, 0x34, 0x45, 0x42, 0x77, 0x4d, 0x44, 0x41, 0x67, 0x6b, 0x4d, + 0x43, 0x47, 0x6f, 0x48, 0x44, 0x41, 0x67, 0x42, 0x74, 0x77, 0x6b, + 0x4b, 0x43, 0x69, 0x49, 0x54, 0x2f, 0x4a, 0x49, 0x54, 0x49, 0x67, + 0x6f, 0x4b, 0x43, 0x51, 0x47, 0x33, 0x43, 0x53, 0x4d, 0x55, 0x46, + 0x43, 0x4d, 0x4a, 0x70, 0x57, 0x30, 0x48, 0x44, 0x41, 0x77, 0x48, + 0x62, 0x51, 0x67, 0x4c, 0x43, 0x39, 0x34, 0x42, 0x42, 0x67, 0x4d, + 0x47, 0x41, 0x67, 0x49, 0x45, 0x42, 0x41, 0x49, 0x43, 0x42, 0x77, + 0x50, 0x2b, 0x2b, 0x77, 0x59, 0x48, 0x42, 0x77, 0x59, 0x43, 0x46, + 0x76, 0x7a, 0x62, 0x45, 0x53, 0x59, 0x52, 0x45, 0x52, 0x4d, 0x54, + 0x45, 0x52, 0x45, 0x6d, 0x45, 0x51, 0x4d, 0x6c, 0x45, 0x52, 0x55, + 0x56, 0x45, 0x51, 0x41, 0x41, 0x41, 0x41, 0x55, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x42, 0x4a, 0x49, 0x44, 0x62, 0x67, 0x41, 0x44, 0x41, + 0x41, 0x67, 0x41, 0x44, 0x67, 0x41, 0x54, 0x41, 0x42, 0x67, 0x41, + 0x41, 0x41, 0x45, 0x52, 0x49, 0x78, 0x45, 0x42, 0x45, 0x53, 0x4d, + 0x52, 0x4d, 0x77, 0x45, 0x56, 0x49, 0x52, 0x45, 0x7a, 0x45, 0x51, + 0x45, 0x52, 0x49, 0x78, 0x45, 0x7a, 0x4e, 0x78, 0x45, 0x6a, 0x45, + 0x54, 0x4d, 0x42, 0x62, 0x70, 0x4d, 0x42, 0x62, 0x70, 0x4b, 0x53, + 0x41, 0x6b, 0x6e, 0x37, 0x62, 0x6b, 0x6b, 0x43, 0x33, 0x4a, 0x4f, + 0x54, 0x32, 0x35, 0x4b, 0x53, 0x41, 0x62, 0x66, 0x2b, 0x32, 0x77, + 0x45, 0x6c, 0x41, 0x53, 0x54, 0x39, 0x74, 0x77, 0x4a, 0x4a, 0x2f, + 0x57, 0x35, 0x4a, 0x41, 0x32, 0x37, 0x38, 0x32, 0x77, 0x49, 0x41, + 0x2f, 0x6b, 0x6b, 0x42, 0x74, 0x39, 0x7a, 0x39, 0x62, 0x51, 0x4b, + 0x54, 0x41, 0x41, 0x59, 0x41, 0x41, 0x50, 0x2b, 0x2f, 0x42, 0x45, + 0x6b, 0x44, 0x72, 0x67, 0x41, 0x4c, 0x41, 0x42, 0x63, 0x41, 0x49, + 0x77, 0x43, 0x6b, 0x41, 0x50, 0x77, 0x42, 0x56, 0x41, 0x41, 0x41, + 0x41, 0x54, 0x51, 0x6d, 0x49, 0x79, 0x49, 0x47, 0x46, 0x52, 0x51, + 0x57, 0x4d, 0x7a, 0x49, 0x32, 0x42, 0x54, 0x51, 0x6d, 0x49, 0x79, + 0x49, 0x47, 0x46, 0x52, 0x51, 0x57, 0x4d, 0x7a, 0x49, 0x32, 0x45, + 0x54, 0x51, 0x6d, 0x49, 0x79, 0x49, 0x47, 0x46, 0x52, 0x51, 0x57, + 0x4d, 0x7a, 0x49, 0x32, 0x42, 0x78, 0x55, 0x55, 0x42, 0x67, 0x38, + 0x42, 0x44, 0x67, 0x45, 0x48, 0x48, 0x67, 0x45, 0x58, 0x48, 0x67, + 0x45, 0x56, 0x46, 0x41, 0x59, 0x48, 0x44, 0x67, 0x45, 0x6a, 0x49, + 0x69, 0x59, 0x76, 0x41, 0x51, 0x34, 0x42, 0x42, 0x77, 0x34, 0x42, + 0x42, 0x77, 0x34, 0x42, 0x4b, 0x77, 0x45, 0x69, 0x4a, 0x69, 0x38, + 0x42, 0x4c, 0x67, 0x45, 0x6e, 0x42, 0x77, 0x34, 0x42, 0x49, 0x79, + 0x49, 0x6d, 0x4a, 0x79, 0x34, 0x42, 0x4e, 0x54, 0x51, 0x32, 0x4e, + 0x7a, 0x34, 0x42, 0x4e, 0x79, 0x34, 0x42, 0x4c, 0x77, 0x45, 0x75, + 0x41, 0x54, 0x30, 0x42, 0x4e, 0x44, 0x59, 0x2f, 0x41, 0x54, 0x34, + 0x42, 0x4e, 0x79, 0x34, 0x42, 0x4a, 0x79, 0x34, 0x42, 0x4e, 0x54, + 0x51, 0x32, 0x4e, 0x7a, 0x34, 0x42, 0x4d, 0x7a, 0x49, 0x57, 0x48, + 0x77, 0x45, 0x2b, 0x41, 0x54, 0x63, 0x2b, 0x41, 0x54, 0x63, 0x2b, + 0x41, 0x54, 0x73, 0x42, 0x4d, 0x68, 0x59, 0x66, 0x41, 0x52, 0x34, + 0x42, 0x46, 0x7a, 0x63, 0x2b, 0x41, 0x54, 0x4d, 0x79, 0x46, 0x68, + 0x63, 0x65, 0x41, 0x52, 0x55, 0x55, 0x42, 0x67, 0x63, 0x4f, 0x41, + 0x51, 0x63, 0x65, 0x41, 0x52, 0x38, 0x42, 0x48, 0x67, 0x45, 0x56, + 0x41, 0x52, 0x55, 0x55, 0x42, 0x69, 0x4d, 0x4f, 0x41, 0x51, 0x63, + 0x65, 0x41, 0x52, 0x55, 0x55, 0x42, 0x67, 0x63, 0x4f, 0x41, 0x53, + 0x4d, 0x69, 0x4a, 0x69, 0x63, 0x69, 0x42, 0x69, 0x4d, 0x69, 0x4a, + 0x69, 0x4d, 0x4f, 0x41, 0x53, 0x4d, 0x69, 0x4a, 0x69, 0x63, 0x75, + 0x41, 0x54, 0x55, 0x30, 0x4e, 0x6a, 0x63, 0x75, 0x41, 0x53, 0x63, + 0x69, 0x4a, 0x6a, 0x30, 0x42, 0x4e, 0x44, 0x59, 0x33, 0x50, 0x67, + 0x45, 0x33, 0x4c, 0x67, 0x45, 0x31, 0x4d, 0x44, 0x59, 0x33, 0x50, + 0x67, 0x45, 0x7a, 0x4d, 0x68, 0x59, 0x58, 0x50, 0x67, 0x45, 0x7a, + 0x4d, 0x68, 0x59, 0x58, 0x50, 0x67, 0x45, 0x2f, 0x41, 0x54, 0x49, + 0x57, 0x46, 0x78, 0x34, 0x42, 0x4d, 0x52, 0x51, 0x47, 0x42, 0x78, + 0x34, 0x42, 0x46, 0x78, 0x34, 0x42, 0x46, 0x52, 0x45, 0x56, 0x46, + 0x41, 0x59, 0x48, 0x44, 0x67, 0x45, 0x48, 0x48, 0x67, 0x45, 0x56, + 0x46, 0x41, 0x59, 0x48, 0x44, 0x67, 0x45, 0x6a, 0x49, 0x69, 0x59, + 0x6e, 0x49, 0x67, 0x59, 0x6a, 0x49, 0x69, 0x59, 0x6a, 0x44, 0x67, + 0x45, 0x6a, 0x49, 0x69, 0x59, 0x6e, 0x4c, 0x67, 0x45, 0x31, 0x4e, + 0x44, 0x59, 0x33, 0x4c, 0x67, 0x45, 0x6e, 0x4c, 0x67, 0x45, 0x39, + 0x41, 0x54, 0x51, 0x32, 0x4e, 0x7a, 0x34, 0x42, 0x4e, 0x79, 0x34, + 0x42, 0x4e, 0x54, 0x51, 0x32, 0x4e, 0x7a, 0x34, 0x42, 0x4d, 0x7a, + 0x49, 0x57, 0x46, 0x7a, 0x49, 0x32, 0x4d, 0x7a, 0x49, 0x57, 0x4d, + 0x7a, 0x34, 0x42, 0x50, 0x77, 0x45, 0x79, 0x46, 0x68, 0x63, 0x65, + 0x41, 0x52, 0x55, 0x55, 0x42, 0x67, 0x63, 0x65, 0x41, 0x52, 0x63, + 0x65, 0x41, 0x52, 0x55, 0x43, 0x41, 0x46, 0x59, 0x38, 0x50, 0x56, + 0x5a, 0x57, 0x50, 0x54, 0x78, 0x57, 0x41, 0x62, 0x63, 0x72, 0x48, + 0x68, 0x34, 0x72, 0x4b, 0x78, 0x34, 0x65, 0x4b, 0x79, 0x73, 0x65, + 0x48, 0x69, 0x73, 0x72, 0x48, 0x68, 0x34, 0x72, 0x33, 0x41, 0x63, + 0x47, 0x57, 0x41, 0x51, 0x4a, 0x42, 0x67, 0x77, 0x61, 0x44, 0x67, + 0x49, 0x43, 0x41, 0x67, 0x49, 0x4a, 0x52, 0x77, 0x77, 0x45, 0x42, + 0x67, 0x4a, 0x43, 0x43, 0x78, 0x55, 0x4d, 0x41, 0x67, 0x55, 0x47, + 0x41, 0x67, 0x6b, 0x47, 0x61, 0x67, 0x59, 0x4c, 0x41, 0x51, 0x30, + 0x4c, 0x46, 0x51, 0x74, 0x44, 0x41, 0x67, 0x59, 0x44, 0x42, 0x41, + 0x59, 0x43, 0x44, 0x45, 0x63, 0x44, 0x41, 0x51, 0x30, 0x5a, 0x44, + 0x51, 0x59, 0x4c, 0x41, 0x31, 0x63, 0x47, 0x43, 0x41, 0x67, 0x46, + 0x57, 0x51, 0x4d, 0x4a, 0x42, 0x67, 0x77, 0x61, 0x44, 0x51, 0x49, + 0x43, 0x41, 0x51, 0x4d, 0x49, 0x52, 0x77, 0x30, 0x44, 0x42, 0x67, + 0x4e, 0x42, 0x43, 0x78, 0x59, 0x4c, 0x41, 0x67, 0x59, 0x46, 0x41, + 0x67, 0x6f, 0x47, 0x61, 0x67, 0x59, 0x4b, 0x41, 0x51, 0x30, 0x4c, + 0x46, 0x67, 0x70, 0x44, 0x41, 0x77, 0x59, 0x44, 0x41, 0x77, 0x59, + 0x44, 0x43, 0x30, 0x63, 0x43, 0x41, 0x67, 0x77, 0x61, 0x44, 0x41, + 0x59, 0x4b, 0x42, 0x46, 0x63, 0x47, 0x42, 0x77, 0x46, 0x75, 0x54, + 0x41, 0x6b, 0x44, 0x43, 0x51, 0x55, 0x45, 0x47, 0x51, 0x45, 0x42, + 0x42, 0x55, 0x41, 0x43, 0x42, 0x69, 0x34, 0x45, 0x42, 0x41, 0x6b, + 0x45, 0x42, 0x51, 0x67, 0x45, 0x42, 0x53, 0x34, 0x46, 0x41, 0x7a, + 0x38, 0x46, 0x41, 0x67, 0x45, 0x61, 0x42, 0x41, 0x59, 0x49, 0x42, + 0x41, 0x68, 0x4e, 0x54, 0x51, 0x67, 0x45, 0x43, 0x41, 0x59, 0x45, + 0x47, 0x67, 0x45, 0x43, 0x42, 0x54, 0x38, 0x44, 0x42, 0x53, 0x34, + 0x46, 0x42, 0x41, 0x67, 0x46, 0x42, 0x41, 0x6b, 0x45, 0x44, 0x42, + 0x6f, 0x4f, 0x42, 0x41, 0x4a, 0x41, 0x42, 0x51, 0x45, 0x42, 0x47, + 0x51, 0x51, 0x46, 0x43, 0x51, 0x4d, 0x4a, 0x54, 0x45, 0x77, 0x4a, + 0x41, 0x77, 0x6b, 0x46, 0x42, 0x42, 0x6b, 0x42, 0x41, 0x51, 0x56, + 0x41, 0x41, 0x67, 0x59, 0x75, 0x42, 0x41, 0x51, 0x4a, 0x42, 0x41, + 0x55, 0x49, 0x42, 0x41, 0x55, 0x75, 0x42, 0x51, 0x4d, 0x2f, 0x42, + 0x51, 0x49, 0x42, 0x47, 0x67, 0x51, 0x47, 0x43, 0x41, 0x51, 0x49, + 0x54, 0x55, 0x30, 0x49, 0x42, 0x41, 0x67, 0x47, 0x42, 0x42, 0x6f, + 0x42, 0x41, 0x67, 0x55, 0x2f, 0x41, 0x77, 0x55, 0x75, 0x42, 0x51, + 0x51, 0x49, 0x42, 0x51, 0x51, 0x4a, 0x42, 0x41, 0x77, 0x61, 0x44, + 0x67, 0x51, 0x43, 0x51, 0x41, 0x55, 0x42, 0x41, 0x52, 0x6b, 0x45, + 0x42, 0x51, 0x6b, 0x44, 0x43, 0x55, 0x77, 0x42, 0x74, 0x7a, 0x78, + 0x57, 0x56, 0x6a, 0x77, 0x39, 0x56, 0x56, 0x58, 0x6f, 0x48, 0x69, + 0x73, 0x72, 0x48, 0x68, 0x34, 0x72, 0x4b, 0x77, 0x4a, 0x6e, 0x48, + 0x69, 0x77, 0x73, 0x48, 0x68, 0x34, 0x72, 0x4b, 0x39, 0x4a, 0x71, + 0x42, 0x51, 0x73, 0x42, 0x44, 0x67, 0x73, 0x56, 0x43, 0x78, 0x45, + 0x68, 0x45, 0x41, 0x49, 0x47, 0x41, 0x77, 0x4d, 0x47, 0x41, 0x67, + 0x78, 0x4a, 0x41, 0x67, 0x49, 0x7a, 0x42, 0x51, 0x6b, 0x45, 0x46, + 0x53, 0x34, 0x56, 0x42, 0x67, 0x67, 0x49, 0x42, 0x6c, 0x67, 0x44, + 0x43, 0x51, 0x59, 0x7a, 0x41, 0x67, 0x49, 0x43, 0x41, 0x67, 0x74, + 0x45, 0x44, 0x51, 0x4d, 0x46, 0x41, 0x78, 0x41, 0x67, 0x45, 0x51, + 0x73, 0x59, 0x44, 0x41, 0x30, 0x42, 0x43, 0x67, 0x5a, 0x71, 0x42, + 0x51, 0x73, 0x42, 0x44, 0x51, 0x77, 0x56, 0x43, 0x78, 0x45, 0x67, + 0x45, 0x51, 0x49, 0x47, 0x41, 0x77, 0x4d, 0x47, 0x41, 0x67, 0x78, + 0x4a, 0x41, 0x67, 0x49, 0x7a, 0x42, 0x51, 0x6b, 0x45, 0x46, 0x53, + 0x34, 0x56, 0x42, 0x67, 0x67, 0x4a, 0x42, 0x6c, 0x63, 0x45, 0x43, + 0x51, 0x55, 0x7a, 0x41, 0x67, 0x49, 0x43, 0x41, 0x77, 0x70, 0x46, + 0x44, 0x41, 0x4d, 0x46, 0x41, 0x78, 0x45, 0x66, 0x45, 0x51, 0x77, + 0x58, 0x44, 0x41, 0x30, 0x42, 0x43, 0x67, 0x62, 0x2b, 0x7a, 0x31, + 0x41, 0x47, 0x43, 0x77, 0x6b, 0x4f, 0x42, 0x77, 0x6b, 0x2b, 0x43, + 0x41, 0x45, 0x43, 0x41, 0x51, 0x4d, 0x6d, 0x50, 0x41, 0x59, 0x42, + 0x41, 0x51, 0x59, 0x38, 0x4a, 0x67, 0x4d, 0x42, 0x41, 0x67, 0x45, + 0x48, 0x50, 0x77, 0x6b, 0x48, 0x44, 0x67, 0x6b, 0x4c, 0x42, 0x6c, + 0x41, 0x48, 0x43, 0x67, 0x45, 0x49, 0x44, 0x77, 0x63, 0x49, 0x50, + 0x77, 0x67, 0x44, 0x41, 0x51, 0x49, 0x6d, 0x4f, 0x77, 0x63, 0x42, + 0x41, 0x51, 0x45, 0x42, 0x45, 0x53, 0x45, 0x4f, 0x41, 0x69, 0x55, + 0x44, 0x41, 0x51, 0x4d, 0x49, 0x50, 0x77, 0x67, 0x48, 0x44, 0x77, + 0x67, 0x42, 0x43, 0x67, 0x63, 0x43, 0x53, 0x56, 0x41, 0x47, 0x43, + 0x67, 0x45, 0x49, 0x44, 0x77, 0x63, 0x4a, 0x50, 0x67, 0x67, 0x42, + 0x41, 0x67, 0x45, 0x44, 0x4a, 0x54, 0x73, 0x47, 0x41, 0x51, 0x45, + 0x47, 0x4f, 0x79, 0x55, 0x44, 0x41, 0x51, 0x49, 0x42, 0x42, 0x7a, + 0x38, 0x4a, 0x42, 0x77, 0x38, 0x49, 0x41, 0x51, 0x6f, 0x47, 0x55, + 0x41, 0x63, 0x4b, 0x41, 0x51, 0x67, 0x50, 0x42, 0x77, 0x67, 0x2f, + 0x43, 0x41, 0x45, 0x43, 0x41, 0x51, 0x49, 0x6d, 0x4f, 0x77, 0x59, + 0x42, 0x41, 0x52, 0x41, 0x68, 0x44, 0x77, 0x45, 0x6c, 0x41, 0x77, + 0x45, 0x43, 0x41, 0x51, 0x67, 0x2f, 0x43, 0x41, 0x63, 0x50, 0x43, + 0x41, 0x45, 0x4b, 0x42, 0x77, 0x41, 0x41, 0x41, 0x67, 0x41, 0x41, + 0x41, 0x45, 0x6b, 0x45, 0x41, 0x41, 0x4f, 0x33, 0x41, 0x43, 0x67, + 0x41, 0x53, 0x77, 0x41, 0x41, 0x41, 0x52, 0x55, 0x55, 0x42, 0x69, + 0x4d, 0x68, 0x49, 0x69, 0x59, 0x31, 0x45, 0x54, 0x51, 0x32, 0x4d, + 0x79, 0x45, 0x79, 0x46, 0x68, 0x30, 0x42, 0x46, 0x41, 0x59, 0x6a, + 0x49, 0x53, 0x49, 0x47, 0x46, 0x52, 0x45, 0x55, 0x46, 0x6a, 0x4d, + 0x68, 0x4d, 0x6a, 0x59, 0x39, 0x41, 0x54, 0x51, 0x32, 0x4f, 0x77, + 0x45, 0x79, 0x46, 0x68, 0x55, 0x54, 0x45, 0x52, 0x51, 0x47, 0x49, + 0x79, 0x49, 0x6d, 0x4c, 0x77, 0x45, 0x42, 0x44, 0x67, 0x45, 0x6a, + 0x49, 0x69, 0x59, 0x76, 0x41, 0x53, 0x34, 0x42, 0x4e, 0x54, 0x51, + 0x32, 0x4e, 0x77, 0x45, 0x6e, 0x4c, 0x67, 0x45, 0x31, 0x4e, 0x44, + 0x59, 0x7a, 0x49, 0x54, 0x49, 0x57, 0x46, 0x51, 0x4d, 0x6c, 0x59, + 0x55, 0x54, 0x2b, 0x4a, 0x55, 0x56, 0x67, 0x59, 0x45, 0x55, 0x42, + 0x6b, 0x67, 0x67, 0x4b, 0x43, 0x67, 0x6a, 0x2b, 0x62, 0x69, 0x59, + 0x32, 0x4e, 0x69, 0x59, 0x42, 0x32, 0x79, 0x59, 0x31, 0x43, 0x77, + 0x67, 0x6b, 0x43, 0x41, 0x76, 0x62, 0x46, 0x67, 0x38, 0x48, 0x44, + 0x51, 0x56, 0x6c, 0x2f, 0x6f, 0x77, 0x44, 0x42, 0x77, 0x51, 0x44, + 0x42, 0x77, 0x4e, 0x42, 0x41, 0x67, 0x51, 0x45, 0x41, 0x67, 0x46, + 0x31, 0x5a, 0x51, 0x55, 0x47, 0x46, 0x67, 0x38, 0x42, 0x4a, 0x41, + 0x38, 0x57, 0x41, 0x61, 0x57, 0x33, 0x52, 0x47, 0x46, 0x68, 0x52, + 0x41, 0x48, 0x62, 0x52, 0x47, 0x45, 0x4c, 0x43, 0x43, 0x51, 0x49, + 0x43, 0x6a, 0x59, 0x6d, 0x2f, 0x69, 0x55, 0x6d, 0x4e, 0x6a, 0x59, + 0x6d, 0x74, 0x77, 0x63, 0x4c, 0x43, 0x77, 0x63, 0x42, 0x37, 0x66, + 0x37, 0x63, 0x44, 0x78, 0x59, 0x47, 0x42, 0x57, 0x58, 0x2b, 0x69, + 0x77, 0x4d, 0x44, 0x41, 0x77, 0x4e, 0x42, 0x41, 0x77, 0x63, 0x44, + 0x42, 0x41, 0x63, 0x43, 0x41, 0x58, 0x56, 0x6c, 0x42, 0x51, 0x30, + 0x48, 0x44, 0x78, 0x59, 0x57, 0x44, 0x77, 0x41, 0x41, 0x41, 0x67, + 0x41, 0x41, 0x41, 0x45, 0x6b, 0x44, 0x4a, 0x51, 0x4e, 0x75, 0x41, + 0x41, 0x38, 0x41, 0x48, 0x77, 0x41, 0x41, 0x41, 0x53, 0x45, 0x69, + 0x42, 0x68, 0x55, 0x52, 0x46, 0x42, 0x59, 0x7a, 0x49, 0x54, 0x49, + 0x32, 0x4e, 0x52, 0x45, 0x30, 0x4a, 0x68, 0x63, 0x52, 0x46, 0x41, + 0x59, 0x6a, 0x49, 0x53, 0x49, 0x6d, 0x4e, 0x52, 0x45, 0x30, 0x4e, + 0x6a, 0x4d, 0x68, 0x4d, 0x68, 0x59, 0x43, 0x67, 0x50, 0x34, 0x6c, + 0x4a, 0x6a, 0x59, 0x32, 0x4a, 0x67, 0x48, 0x62, 0x4a, 0x6a, 0x55, + 0x31, 0x66, 0x32, 0x46, 0x45, 0x2f, 0x69, 0x56, 0x46, 0x59, 0x47, + 0x42, 0x46, 0x41, 0x64, 0x74, 0x45, 0x59, 0x51, 0x4d, 0x6c, 0x4e, + 0x69, 0x62, 0x2b, 0x4a, 0x53, 0x59, 0x32, 0x4e, 0x69, 0x59, 0x42, + 0x32, 0x79, 0x59, 0x32, 0x58, 0x50, 0x34, 0x6c, 0x52, 0x47, 0x46, + 0x68, 0x52, 0x41, 0x48, 0x62, 0x52, 0x47, 0x46, 0x68, 0x41, 0x41, + 0x4d, 0x41, 0x4a, 0x66, 0x2b, 0x33, 0x41, 0x39, 0x73, 0x44, 0x74, + 0x77, 0x41, 0x53, 0x41, 0x44, 0x41, 0x41, 0x5a, 0x77, 0x41, 0x41, + 0x42, 0x54, 0x51, 0x6d, 0x49, 0x79, 0x49, 0x6d, 0x4e, 0x54, 0x51, + 0x6d, 0x49, 0x79, 0x49, 0x47, 0x46, 0x52, 0x51, 0x57, 0x4d, 0x7a, + 0x49, 0x32, 0x4e, 0x53, 0x55, 0x68, 0x4a, 0x69, 0x63, 0x75, 0x41, + 0x53, 0x63, 0x6d, 0x4e, 0x54, 0x51, 0x6e, 0x4c, 0x67, 0x45, 0x6e, + 0x4a, 0x69, 0x4d, 0x69, 0x42, 0x77, 0x34, 0x42, 0x42, 0x77, 0x59, + 0x56, 0x46, 0x41, 0x63, 0x4f, 0x41, 0x51, 0x63, 0x47, 0x42, 0x79, + 0x45, 0x55, 0x42, 0x69, 0x4d, 0x68, 0x46, 0x41, 0x59, 0x6a, 0x49, + 0x69, 0x59, 0x31, 0x49, 0x53, 0x49, 0x6d, 0x4e, 0x54, 0x59, 0x33, + 0x50, 0x67, 0x45, 0x33, 0x4e, 0x6a, 0x55, 0x30, 0x4e, 0x7a, 0x34, + 0x42, 0x4e, 0x7a, 0x59, 0x33, 0x4c, 0x67, 0x45, 0x31, 0x4e, 0x44, + 0x59, 0x7a, 0x4d, 0x68, 0x59, 0x56, 0x46, 0x41, 0x59, 0x48, 0x46, + 0x68, 0x63, 0x65, 0x41, 0x52, 0x63, 0x57, 0x46, 0x52, 0x51, 0x58, + 0x48, 0x67, 0x45, 0x58, 0x46, 0x68, 0x63, 0x43, 0x43, 0x51, 0x55, + 0x45, 0x49, 0x6a, 0x41, 0x47, 0x41, 0x77, 0x51, 0x47, 0x4f, 0x79, + 0x6f, 0x45, 0x42, 0x66, 0x36, 0x45, 0x41, 0x75, 0x59, 0x6d, 0x48, + 0x42, 0x30, 0x6d, 0x43, 0x51, 0x6f, 0x4e, 0x44, 0x54, 0x59, 0x71, + 0x4b, 0x54, 0x67, 0x34, 0x4b, 0x53, 0x6f, 0x32, 0x44, 0x51, 0x30, + 0x4b, 0x43, 0x53, 0x59, 0x64, 0x48, 0x43, 0x59, 0x44, 0x54, 0x69, + 0x73, 0x65, 0x2f, 0x77, 0x42, 0x57, 0x50, 0x44, 0x78, 0x57, 0x2f, + 0x77, 0x41, 0x65, 0x4b, 0x78, 0x38, 0x68, 0x49, 0x44, 0x55, 0x52, + 0x45, 0x42, 0x45, 0x52, 0x50, 0x69, 0x30, 0x74, 0x4f, 0x51, 0x49, + 0x44, 0x49, 0x42, 0x63, 0x58, 0x49, 0x41, 0x4d, 0x43, 0x4f, 0x53, + 0x30, 0x74, 0x50, 0x68, 0x45, 0x52, 0x45, 0x42, 0x45, 0x31, 0x49, + 0x43, 0x45, 0x66, 0x45, 0x67, 0x51, 0x46, 0x4d, 0x43, 0x49, 0x45, + 0x42, 0x51, 0x55, 0x45, 0x4b, 0x54, 0x73, 0x46, 0x42, 0x4b, 0x51, + 0x73, 0x4d, 0x7a, 0x4e, 0x32, 0x52, 0x45, 0x4e, 0x4e, 0x47, 0x79, + 0x41, 0x67, 0x4e, 0x78, 0x49, 0x54, 0x45, 0x78, 0x49, 0x33, 0x49, + 0x43, 0x41, 0x62, 0x54, 0x55, 0x4e, 0x45, 0x64, 0x6a, 0x4d, 0x7a, + 0x4c, 0x42, 0x34, 0x72, 0x50, 0x46, 0x5a, 0x57, 0x50, 0x43, 0x73, + 0x65, 0x47, 0x79, 0x63, 0x6e, 0x63, 0x55, 0x31, 0x4e, 0x61, 0x43, + 0x6b, 0x70, 0x4b, 0x6b, 0x55, 0x5a, 0x47, 0x51, 0x6b, 0x46, 0x43, + 0x77, 0x59, 0x58, 0x49, 0x43, 0x41, 0x58, 0x42, 0x67, 0x73, 0x46, + 0x43, 0x52, 0x6b, 0x5a, 0x52, 0x53, 0x6f, 0x70, 0x4b, 0x57, 0x68, + 0x4e, 0x54, 0x58, 0x45, 0x6e, 0x4a, 0x78, 0x73, 0x41, 0x42, 0x67, + 0x41, 0x41, 0x2f, 0x37, 0x63, 0x45, 0x53, 0x51, 0x4f, 0x33, 0x41, + 0x42, 0x6f, 0x41, 0x4e, 0x67, 0x42, 0x43, 0x41, 0x46, 0x34, 0x41, + 0x65, 0x41, 0x43, 0x45, 0x41, 0x41, 0x41, 0x42, 0x44, 0x67, 0x45, + 0x48, 0x49, 0x79, 0x49, 0x6d, 0x4e, 0x54, 0x51, 0x33, 0x50, 0x67, + 0x45, 0x33, 0x4e, 0x6a, 0x4d, 0x79, 0x46, 0x6a, 0x4d, 0x79, 0x4e, + 0x6a, 0x63, 0x4f, 0x41, 0x52, 0x55, 0x55, 0x46, 0x68, 0x63, 0x42, + 0x46, 0x41, 0x59, 0x6a, 0x49, 0x53, 0x49, 0x6d, 0x4e, 0x54, 0x51, + 0x33, 0x50, 0x67, 0x45, 0x33, 0x4e, 0x6a, 0x4d, 0x79, 0x46, 0x6a, + 0x4d, 0x79, 0x4e, 0x6a, 0x4d, 0x79, 0x46, 0x78, 0x34, 0x42, 0x46, + 0x78, 0x59, 0x56, 0x41, 0x52, 0x51, 0x47, 0x49, 0x79, 0x49, 0x6d, + 0x4e, 0x54, 0x51, 0x32, 0x4d, 0x7a, 0x49, 0x57, 0x41, 0x52, 0x51, + 0x48, 0x44, 0x67, 0x45, 0x48, 0x42, 0x69, 0x4d, 0x69, 0x4a, 0x79, + 0x34, 0x42, 0x4a, 0x79, 0x59, 0x31, 0x4e, 0x44, 0x63, 0x2b, 0x41, + 0x54, 0x63, 0x32, 0x4d, 0x7a, 0x49, 0x58, 0x48, 0x67, 0x45, 0x58, + 0x46, 0x67, 0x55, 0x55, 0x42, 0x69, 0x73, 0x42, 0x4c, 0x67, 0x45, + 0x6e, 0x50, 0x67, 0x45, 0x31, 0x4e, 0x43, 0x59, 0x6e, 0x48, 0x67, + 0x45, 0x7a, 0x4d, 0x6a, 0x59, 0x7a, 0x4d, 0x68, 0x63, 0x65, 0x41, + 0x52, 0x63, 0x57, 0x41, 0x78, 0x51, 0x47, 0x49, 0x79, 0x49, 0x6d, + 0x4e, 0x54, 0x51, 0x32, 0x4d, 0x7a, 0x49, 0x57, 0x41, 0x56, 0x4d, + 0x74, 0x54, 0x68, 0x31, 0x4d, 0x4b, 0x30, 0x51, 0x42, 0x41, 0x51, + 0x30, 0x4f, 0x44, 0x78, 0x73, 0x4a, 0x55, 0x6a, 0x6b, 0x55, 0x4a, + 0x68, 0x49, 0x42, 0x41, 0x52, 0x67, 0x57, 0x41, 0x6d, 0x52, 0x55, + 0x52, 0x66, 0x34, 0x4e, 0x52, 0x56, 0x51, 0x49, 0x42, 0x79, 0x73, + 0x6d, 0x4a, 0x7a, 0x38, 0x50, 0x61, 0x46, 0x5a, 0x56, 0x61, 0x51, + 0x34, 0x2f, 0x4a, 0x79, 0x59, 0x72, 0x43, 0x41, 0x66, 0x39, 0x74, + 0x31, 0x59, 0x39, 0x50, 0x46, 0x5a, 0x57, 0x50, 0x44, 0x31, 0x57, + 0x41, 0x5a, 0x49, 0x52, 0x45, 0x6a, 0x73, 0x6f, 0x4b, 0x43, 0x30, + 0x75, 0x4b, 0x43, 0x67, 0x37, 0x45, 0x68, 0x45, 0x52, 0x45, 0x6a, + 0x73, 0x6f, 0x4b, 0x43, 0x34, 0x74, 0x4b, 0x43, 0x67, 0x37, 0x45, + 0x68, 0x45, 0x42, 0x53, 0x55, 0x51, 0x72, 0x54, 0x42, 0x31, 0x4f, + 0x4c, 0x52, 0x63, 0x59, 0x41, 0x67, 0x45, 0x53, 0x4a, 0x68, 0x51, + 0x36, 0x55, 0x51, 0x6b, 0x63, 0x44, 0x67, 0x34, 0x4e, 0x41, 0x51, + 0x46, 0x4a, 0x56, 0x6a, 0x77, 0x39, 0x56, 0x6c, 0x59, 0x39, 0x50, + 0x46, 0x59, 0x42, 0x74, 0x77, 0x45, 0x6d, 0x49, 0x69, 0x73, 0x77, + 0x45, 0x53, 0x49, 0x68, 0x51, 0x78, 0x6b, 0x5a, 0x4d, 0x41, 0x59, + 0x48, 0x43, 0x68, 0x49, 0x4b, 0x4a, 0x30, 0x73, 0x67, 0x2f, 0x70, + 0x52, 0x47, 0x54, 0x6b, 0x35, 0x47, 0x4d, 0x44, 0x6f, 0x35, 0x59, + 0x69, 0x45, 0x68, 0x54, 0x30, 0x38, 0x68, 0x49, 0x57, 0x49, 0x35, + 0x4f, 0x6a, 0x41, 0x43, 0x32, 0x6a, 0x31, 0x57, 0x56, 0x6a, 0x30, + 0x38, 0x56, 0x6c, 0x62, 0x2b, 0x36, 0x43, 0x30, 0x6f, 0x4b, 0x44, + 0x77, 0x52, 0x45, 0x52, 0x45, 0x52, 0x50, 0x43, 0x67, 0x6f, 0x4c, + 0x53, 0x34, 0x6f, 0x4b, 0x44, 0x73, 0x52, 0x45, 0x68, 0x49, 0x52, + 0x4f, 0x79, 0x67, 0x6f, 0x72, 0x6a, 0x41, 0x72, 0x49, 0x69, 0x59, + 0x42, 0x49, 0x45, 0x73, 0x6e, 0x43, 0x68, 0x49, 0x4b, 0x42, 0x77, + 0x59, 0x77, 0x47, 0x52, 0x6c, 0x44, 0x49, 0x53, 0x49, 0x42, 0x53, + 0x7a, 0x31, 0x57, 0x56, 0x6a, 0x30, 0x38, 0x56, 0x6c, 0x59, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x77, 0x41, 0x41, 0x41, 0x45, 0x6b, + 0x44, 0x62, 0x67, 0x4d, 0x6c, 0x41, 0x41, 0x38, 0x41, 0x48, 0x77, + 0x41, 0x76, 0x41, 0x41, 0x41, 0x6c, 0x46, 0x52, 0x51, 0x47, 0x49, + 0x79, 0x45, 0x69, 0x4a, 0x6a, 0x30, 0x42, 0x4e, 0x44, 0x59, 0x7a, + 0x49, 0x54, 0x49, 0x57, 0x45, 0x52, 0x55, 0x55, 0x42, 0x69, 0x4d, + 0x68, 0x49, 0x69, 0x59, 0x39, 0x41, 0x54, 0x51, 0x32, 0x4d, 0x79, + 0x45, 0x79, 0x46, 0x68, 0x45, 0x56, 0x46, 0x41, 0x59, 0x6a, 0x49, + 0x53, 0x49, 0x6d, 0x50, 0x51, 0x45, 0x30, 0x4e, 0x6a, 0x4d, 0x68, + 0x4d, 0x68, 0x59, 0x44, 0x62, 0x68, 0x59, 0x50, 0x2f, 0x4e, 0x77, + 0x50, 0x46, 0x68, 0x59, 0x50, 0x41, 0x79, 0x51, 0x50, 0x46, 0x68, + 0x59, 0x50, 0x2f, 0x4e, 0x77, 0x50, 0x46, 0x68, 0x59, 0x50, 0x41, + 0x79, 0x51, 0x50, 0x46, 0x68, 0x59, 0x50, 0x2f, 0x4e, 0x77, 0x50, + 0x46, 0x68, 0x59, 0x50, 0x41, 0x79, 0x51, 0x50, 0x46, 0x72, 0x64, + 0x4a, 0x44, 0x78, 0x59, 0x57, 0x44, 0x30, 0x6b, 0x50, 0x46, 0x52, + 0x55, 0x42, 0x46, 0x55, 0x6b, 0x50, 0x46, 0x52, 0x55, 0x50, 0x53, + 0x51, 0x38, 0x57, 0x46, 0x67, 0x45, 0x57, 0x53, 0x51, 0x38, 0x57, + 0x46, 0x67, 0x39, 0x4a, 0x44, 0x78, 0x59, 0x57, 0x41, 0x41, 0x6f, + 0x41, 0x41, 0x41, 0x42, 0x4a, 0x41, 0x37, 0x63, 0x44, 0x62, 0x67, + 0x41, 0x51, 0x41, 0x43, 0x41, 0x41, 0x4d, 0x51, 0x42, 0x42, 0x41, + 0x46, 0x45, 0x41, 0x59, 0x67, 0x42, 0x79, 0x41, 0x49, 0x4d, 0x41, + 0x6c, 0x41, 0x43, 0x6b, 0x41, 0x41, 0x41, 0x6c, 0x4e, 0x54, 0x51, + 0x6d, 0x4b, 0x77, 0x45, 0x69, 0x42, 0x68, 0x30, 0x42, 0x46, 0x42, + 0x59, 0x37, 0x41, 0x54, 0x49, 0x32, 0x4e, 0x54, 0x30, 0x42, 0x4e, + 0x43, 0x59, 0x72, 0x41, 0x53, 0x49, 0x47, 0x48, 0x51, 0x45, 0x55, + 0x46, 0x6a, 0x73, 0x42, 0x4d, 0x6a, 0x59, 0x46, 0x4e, 0x54, 0x51, + 0x6d, 0x4b, 0x77, 0x45, 0x69, 0x42, 0x68, 0x30, 0x42, 0x46, 0x42, + 0x59, 0x37, 0x41, 0x54, 0x49, 0x32, 0x4e, 0x51, 0x45, 0x31, 0x4e, + 0x43, 0x59, 0x72, 0x41, 0x53, 0x49, 0x47, 0x48, 0x51, 0x45, 0x55, + 0x46, 0x6a, 0x73, 0x42, 0x4d, 0x6a, 0x59, 0x46, 0x4e, 0x54, 0x51, + 0x6d, 0x4b, 0x77, 0x45, 0x69, 0x42, 0x68, 0x30, 0x42, 0x46, 0x42, + 0x59, 0x37, 0x41, 0x54, 0x49, 0x32, 0x42, 0x54, 0x55, 0x30, 0x4a, + 0x69, 0x73, 0x42, 0x49, 0x67, 0x59, 0x64, 0x41, 0x52, 0x51, 0x57, + 0x4f, 0x77, 0x45, 0x79, 0x4e, 0x6a, 0x55, 0x42, 0x4e, 0x54, 0x51, + 0x6d, 0x4b, 0x77, 0x45, 0x69, 0x42, 0x68, 0x30, 0x42, 0x46, 0x42, + 0x59, 0x37, 0x41, 0x54, 0x49, 0x32, 0x42, 0x54, 0x55, 0x30, 0x4a, + 0x69, 0x73, 0x42, 0x49, 0x67, 0x59, 0x64, 0x41, 0x52, 0x51, 0x57, + 0x4f, 0x77, 0x45, 0x79, 0x4e, 0x6a, 0x55, 0x39, 0x41, 0x54, 0x51, + 0x6d, 0x4b, 0x77, 0x45, 0x69, 0x42, 0x68, 0x30, 0x42, 0x46, 0x42, + 0x59, 0x37, 0x41, 0x54, 0x49, 0x32, 0x4e, 0x54, 0x63, 0x52, 0x46, + 0x41, 0x59, 0x6a, 0x49, 0x53, 0x49, 0x6d, 0x4e, 0x52, 0x45, 0x30, + 0x4e, 0x6a, 0x4d, 0x68, 0x4d, 0x68, 0x59, 0x42, 0x4a, 0x51, 0x73, + 0x49, 0x74, 0x77, 0x63, 0x4c, 0x43, 0x77, 0x65, 0x33, 0x43, 0x41, + 0x73, 0x4c, 0x43, 0x4c, 0x63, 0x48, 0x43, 0x77, 0x73, 0x48, 0x74, + 0x77, 0x67, 0x4c, 0x41, 0x53, 0x51, 0x4b, 0x43, 0x4c, 0x63, 0x49, + 0x43, 0x67, 0x6f, 0x49, 0x74, 0x77, 0x67, 0x4b, 0x2f, 0x74, 0x77, + 0x4c, 0x43, 0x4c, 0x63, 0x48, 0x43, 0x77, 0x73, 0x48, 0x74, 0x77, + 0x67, 0x4c, 0x41, 0x53, 0x51, 0x4b, 0x43, 0x4c, 0x63, 0x49, 0x43, + 0x67, 0x6f, 0x49, 0x74, 0x77, 0x67, 0x4b, 0x41, 0x53, 0x55, 0x4c, + 0x43, 0x4c, 0x59, 0x49, 0x43, 0x77, 0x73, 0x49, 0x74, 0x67, 0x67, + 0x4c, 0x2f, 0x74, 0x73, 0x4b, 0x43, 0x4c, 0x63, 0x49, 0x43, 0x67, + 0x6f, 0x49, 0x74, 0x77, 0x67, 0x4b, 0x41, 0x53, 0x55, 0x4c, 0x43, + 0x4c, 0x59, 0x49, 0x43, 0x77, 0x73, 0x49, 0x74, 0x67, 0x67, 0x4c, + 0x43, 0x77, 0x69, 0x32, 0x43, 0x41, 0x73, 0x4c, 0x43, 0x4c, 0x59, + 0x49, 0x43, 0x30, 0x6b, 0x32, 0x4a, 0x76, 0x30, 0x41, 0x4a, 0x54, + 0x59, 0x32, 0x4a, 0x51, 0x4d, 0x41, 0x4a, 0x6a, 0x61, 0x6c, 0x62, + 0x51, 0x67, 0x4c, 0x43, 0x77, 0x68, 0x74, 0x43, 0x41, 0x73, 0x4c, + 0x43, 0x4e, 0x74, 0x75, 0x42, 0x77, 0x73, 0x4c, 0x42, 0x32, 0x34, + 0x49, 0x43, 0x67, 0x72, 0x54, 0x62, 0x51, 0x67, 0x4c, 0x43, 0x77, + 0x68, 0x74, 0x43, 0x41, 0x73, 0x4c, 0x43, 0x41, 0x47, 0x32, 0x62, + 0x67, 0x67, 0x4b, 0x43, 0x67, 0x68, 0x75, 0x42, 0x77, 0x73, 0x4c, + 0x31, 0x47, 0x34, 0x48, 0x43, 0x77, 0x73, 0x48, 0x62, 0x67, 0x67, + 0x4b, 0x43, 0x74, 0x4e, 0x74, 0x43, 0x41, 0x73, 0x4c, 0x43, 0x47, + 0x30, 0x49, 0x43, 0x77, 0x73, 0x49, 0x41, 0x62, 0x5a, 0x75, 0x43, + 0x41, 0x6f, 0x4b, 0x43, 0x47, 0x34, 0x48, 0x43, 0x77, 0x76, 0x55, + 0x62, 0x67, 0x63, 0x4c, 0x43, 0x77, 0x64, 0x75, 0x43, 0x41, 0x6f, + 0x4b, 0x43, 0x4e, 0x74, 0x75, 0x43, 0x41, 0x6f, 0x4b, 0x43, 0x47, + 0x34, 0x48, 0x43, 0x77, 0x73, 0x48, 0x74, 0x2f, 0x32, 0x54, 0x4a, + 0x6a, 0x59, 0x32, 0x4a, 0x67, 0x4a, 0x74, 0x4a, 0x6a, 0x59, 0x32, + 0x41, 0x41, 0x41, 0x42, 0x41, 0x41, 0x41, 0x42, 0x41, 0x41, 0x4a, + 0x4a, 0x41, 0x6b, 0x6b, 0x41, 0x46, 0x51, 0x41, 0x41, 0x41, 0x52, + 0x51, 0x47, 0x42, 0x77, 0x45, 0x4f, 0x41, 0x53, 0x4d, 0x69, 0x4a, + 0x69, 0x63, 0x42, 0x4c, 0x67, 0x45, 0x31, 0x4e, 0x44, 0x59, 0x7a, + 0x49, 0x54, 0x49, 0x57, 0x46, 0x51, 0x4a, 0x4a, 0x42, 0x67, 0x58, + 0x2f, 0x41, 0x41, 0x55, 0x4e, 0x42, 0x77, 0x67, 0x4e, 0x42, 0x66, + 0x38, 0x41, 0x42, 0x51, 0x59, 0x57, 0x44, 0x77, 0x49, 0x41, 0x44, + 0x78, 0x55, 0x43, 0x4a, 0x51, 0x67, 0x4e, 0x42, 0x66, 0x38, 0x41, + 0x42, 0x51, 0x59, 0x47, 0x42, 0x51, 0x45, 0x41, 0x42, 0x51, 0x30, + 0x49, 0x44, 0x78, 0x55, 0x56, 0x44, 0x77, 0x41, 0x41, 0x41, 0x41, + 0x45, 0x41, 0x41, 0x41, 0x44, 0x62, 0x41, 0x6b, 0x6b, 0x43, 0x4a, + 0x51, 0x41, 0x55, 0x41, 0x41, 0x41, 0x42, 0x46, 0x41, 0x59, 0x6a, + 0x49, 0x53, 0x49, 0x6d, 0x4e, 0x54, 0x51, 0x32, 0x4e, 0x77, 0x45, + 0x2b, 0x41, 0x54, 0x4d, 0x79, 0x46, 0x68, 0x63, 0x42, 0x48, 0x67, + 0x45, 0x43, 0x53, 0x52, 0x55, 0x50, 0x2f, 0x67, 0x41, 0x50, 0x46, + 0x67, 0x59, 0x46, 0x41, 0x51, 0x41, 0x46, 0x44, 0x51, 0x67, 0x48, + 0x44, 0x51, 0x55, 0x42, 0x41, 0x41, 0x55, 0x47, 0x41, 0x51, 0x41, + 0x50, 0x46, 0x68, 0x59, 0x50, 0x42, 0x77, 0x34, 0x46, 0x41, 0x51, + 0x41, 0x46, 0x42, 0x67, 0x59, 0x46, 0x2f, 0x77, 0x41, 0x46, 0x44, + 0x67, 0x41, 0x42, 0x41, 0x43, 0x55, 0x41, 0x6b, 0x67, 0x46, 0x75, + 0x41, 0x74, 0x73, 0x41, 0x46, 0x51, 0x41, 0x41, 0x41, 0x52, 0x45, + 0x55, 0x42, 0x69, 0x4d, 0x69, 0x4a, 0x69, 0x63, 0x42, 0x4c, 0x67, + 0x45, 0x31, 0x4e, 0x44, 0x59, 0x33, 0x41, 0x54, 0x34, 0x42, 0x4d, + 0x7a, 0x49, 0x57, 0x46, 0x51, 0x46, 0x75, 0x46, 0x67, 0x38, 0x48, + 0x44, 0x51, 0x62, 0x2f, 0x41, 0x41, 0x55, 0x46, 0x42, 0x51, 0x55, + 0x42, 0x41, 0x41, 0x59, 0x4e, 0x42, 0x77, 0x38, 0x57, 0x41, 0x72, + 0x66, 0x2b, 0x41, 0x41, 0x38, 0x57, 0x42, 0x67, 0x55, 0x42, 0x41, + 0x41, 0x55, 0x4f, 0x42, 0x77, 0x63, 0x4e, 0x42, 0x67, 0x45, 0x41, + 0x42, 0x51, 0x55, 0x56, 0x44, 0x77, 0x41, 0x41, 0x41, 0x41, 0x45, + 0x41, 0x41, 0x41, 0x43, 0x53, 0x41, 0x55, 0x6b, 0x43, 0x32, 0x77, + 0x41, 0x56, 0x41, 0x41, 0x41, 0x42, 0x46, 0x41, 0x59, 0x48, 0x41, + 0x51, 0x34, 0x42, 0x49, 0x79, 0x49, 0x6d, 0x4e, 0x52, 0x45, 0x30, + 0x4e, 0x6a, 0x4d, 0x79, 0x46, 0x68, 0x63, 0x42, 0x48, 0x67, 0x45, + 0x56, 0x41, 0x55, 0x6b, 0x47, 0x42, 0x66, 0x38, 0x41, 0x42, 0x51, + 0x30, 0x48, 0x44, 0x78, 0x59, 0x57, 0x44, 0x77, 0x63, 0x4e, 0x42, + 0x51, 0x45, 0x41, 0x42, 0x51, 0x59, 0x42, 0x74, 0x77, 0x63, 0x4f, + 0x42, 0x66, 0x38, 0x41, 0x42, 0x51, 0x59, 0x57, 0x44, 0x77, 0x49, + 0x41, 0x44, 0x78, 0x55, 0x46, 0x42, 0x66, 0x38, 0x41, 0x42, 0x67, + 0x30, 0x48, 0x41, 0x41, 0x41, 0x41, 0x41, 0x67, 0x41, 0x41, 0x41, + 0x43, 0x55, 0x43, 0x53, 0x51, 0x4e, 0x4a, 0x41, 0x42, 0x55, 0x41, + 0x4b, 0x77, 0x41, 0x41, 0x41, 0x52, 0x51, 0x47, 0x42, 0x77, 0x45, + 0x4f, 0x41, 0x53, 0x4d, 0x69, 0x4a, 0x69, 0x63, 0x42, 0x4c, 0x67, + 0x45, 0x31, 0x4e, 0x44, 0x59, 0x7a, 0x49, 0x54, 0x49, 0x57, 0x46, + 0x54, 0x55, 0x55, 0x42, 0x69, 0x4d, 0x68, 0x49, 0x69, 0x59, 0x31, + 0x4e, 0x44, 0x59, 0x33, 0x41, 0x54, 0x34, 0x42, 0x4d, 0x7a, 0x49, + 0x57, 0x46, 0x77, 0x45, 0x65, 0x41, 0x52, 0x55, 0x43, 0x53, 0x51, + 0x59, 0x46, 0x2f, 0x77, 0x41, 0x46, 0x44, 0x51, 0x63, 0x49, 0x44, + 0x51, 0x58, 0x2f, 0x41, 0x41, 0x55, 0x47, 0x46, 0x67, 0x38, 0x43, + 0x41, 0x41, 0x38, 0x56, 0x46, 0x51, 0x2f, 0x2b, 0x41, 0x41, 0x38, + 0x57, 0x42, 0x67, 0x55, 0x42, 0x41, 0x41, 0x55, 0x4e, 0x43, 0x41, + 0x63, 0x4e, 0x42, 0x51, 0x45, 0x41, 0x42, 0x51, 0x59, 0x42, 0x53, + 0x51, 0x63, 0x4e, 0x42, 0x76, 0x38, 0x41, 0x42, 0x51, 0x55, 0x46, + 0x42, 0x51, 0x45, 0x41, 0x42, 0x67, 0x30, 0x48, 0x44, 0x78, 0x59, + 0x57, 0x44, 0x39, 0x77, 0x50, 0x46, 0x68, 0x59, 0x50, 0x42, 0x77, + 0x30, 0x46, 0x41, 0x51, 0x41, 0x46, 0x42, 0x67, 0x59, 0x46, 0x2f, + 0x77, 0x41, 0x46, 0x44, 0x51, 0x63, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x42, 0x77, 0x41, 0x41, 0x41, 0x41, 0x41, 0x45, 0x41, 0x41, 0x4d, + 0x6c, 0x41, 0x41, 0x73, 0x41, 0x46, 0x77, 0x41, 0x74, 0x41, 0x44, + 0x6b, 0x41, 0x52, 0x51, 0x42, 0x52, 0x41, 0x47, 0x30, 0x41, 0x41, + 0x42, 0x4d, 0x30, 0x4a, 0x69, 0x4d, 0x69, 0x42, 0x68, 0x55, 0x55, + 0x46, 0x6a, 0x4d, 0x79, 0x4e, 0x68, 0x4d, 0x30, 0x4a, 0x69, 0x4d, + 0x69, 0x42, 0x68, 0x55, 0x55, 0x46, 0x6a, 0x4d, 0x79, 0x4e, 0x68, + 0x63, 0x33, 0x4e, 0x69, 0x59, 0x6e, 0x4d, 0x53, 0x59, 0x47, 0x44, + 0x77, 0x45, 0x4f, 0x41, 0x51, 0x63, 0x47, 0x46, 0x68, 0x63, 0x57, + 0x4e, 0x6a, 0x63, 0x32, 0x4a, 0x69, 0x63, 0x6c, 0x4e, 0x43, 0x59, + 0x6a, 0x49, 0x67, 0x59, 0x56, 0x46, 0x42, 0x59, 0x7a, 0x4d, 0x6a, + 0x59, 0x42, 0x4e, 0x43, 0x59, 0x6a, 0x49, 0x67, 0x59, 0x56, 0x46, + 0x42, 0x59, 0x7a, 0x4d, 0x6a, 0x59, 0x46, 0x4e, 0x43, 0x59, 0x6a, + 0x49, 0x67, 0x59, 0x56, 0x46, 0x42, 0x59, 0x7a, 0x4d, 0x6a, 0x59, + 0x58, 0x46, 0x41, 0x59, 0x48, 0x44, 0x67, 0x45, 0x6a, 0x49, 0x53, + 0x49, 0x6d, 0x4a, 0x79, 0x34, 0x42, 0x4e, 0x54, 0x51, 0x33, 0x50, + 0x67, 0x45, 0x33, 0x4e, 0x6a, 0x4d, 0x79, 0x46, 0x78, 0x34, 0x42, + 0x46, 0x78, 0x59, 0x56, 0x32, 0x79, 0x6f, 0x66, 0x48, 0x69, 0x73, + 0x72, 0x48, 0x68, 0x38, 0x71, 0x62, 0x69, 0x73, 0x65, 0x48, 0x69, + 0x73, 0x72, 0x48, 0x68, 0x34, 0x72, 0x39, 0x54, 0x6b, 0x45, 0x44, + 0x77, 0x38, 0x4f, 0x47, 0x77, 0x4d, 0x36, 0x49, 0x6a, 0x59, 0x4a, + 0x44, 0x43, 0x34, 0x73, 0x4c, 0x45, 0x38, 0x4c, 0x43, 0x52, 0x6b, + 0x63, 0x41, 0x58, 0x6b, 0x72, 0x48, 0x68, 0x38, 0x71, 0x4b, 0x68, + 0x38, 0x65, 0x4b, 0x2f, 0x36, 0x53, 0x4b, 0x78, 0x34, 0x65, 0x4b, + 0x79, 0x73, 0x65, 0x48, 0x69, 0x73, 0x42, 0x41, 0x43, 0x73, 0x65, + 0x48, 0x69, 0x73, 0x72, 0x48, 0x68, 0x34, 0x72, 0x74, 0x79, 0x6b, + 0x6f, 0x42, 0x52, 0x41, 0x4a, 0x2f, 0x4e, 0x34, 0x4a, 0x45, 0x41, + 0x55, 0x6f, 0x4b, 0x53, 0x67, 0x70, 0x69, 0x31, 0x31, 0x64, 0x61, + 0x6d, 0x70, 0x64, 0x58, 0x59, 0x73, 0x70, 0x4b, 0x41, 0x45, 0x6c, + 0x48, 0x69, 0x73, 0x72, 0x48, 0x68, 0x38, 0x72, 0x4b, 0x77, 0x45, + 0x66, 0x48, 0x69, 0x73, 0x72, 0x48, 0x68, 0x38, 0x72, 0x4b, 0x2f, + 0x54, 0x61, 0x44, 0x78, 0x6f, 0x45, 0x41, 0x77, 0x38, 0x50, 0x32, + 0x67, 0x4d, 0x72, 0x49, 0x79, 0x78, 0x50, 0x43, 0x77, 0x77, 0x75, + 0x4c, 0x43, 0x4e, 0x41, 0x46, 0x42, 0x4d, 0x65, 0x4b, 0x79, 0x73, + 0x65, 0x48, 0x79, 0x73, 0x72, 0x41, 0x59, 0x77, 0x66, 0x4b, 0x69, + 0x6f, 0x66, 0x48, 0x69, 0x73, 0x72, 0x54, 0x78, 0x34, 0x72, 0x4b, + 0x78, 0x34, 0x66, 0x4b, 0x79, 0x76, 0x68, 0x53, 0x6f, 0x77, 0x2b, + 0x43, 0x41, 0x6b, 0x4a, 0x43, 0x44, 0x32, 0x4e, 0x53, 0x6d, 0x6c, + 0x65, 0x58, 0x59, 0x73, 0x6f, 0x4b, 0x53, 0x6b, 0x6f, 0x69, 0x31, + 0x31, 0x65, 0x61, 0x51, 0x41, 0x41, 0x41, 0x41, 0x41, 0x43, 0x41, + 0x42, 0x6f, 0x41, 0x64, 0x51, 0x4a, 0x43, 0x41, 0x71, 0x38, 0x41, + 0x4a, 0x41, 0x42, 0x4a, 0x41, 0x41, 0x41, 0x6c, 0x46, 0x41, 0x59, + 0x50, 0x41, 0x51, 0x34, 0x42, 0x49, 0x79, 0x49, 0x6d, 0x4a, 0x77, + 0x45, 0x75, 0x41, 0x54, 0x55, 0x30, 0x4e, 0x6a, 0x63, 0x42, 0x50, + 0x67, 0x45, 0x7a, 0x4d, 0x68, 0x59, 0x66, 0x41, 0x52, 0x34, 0x42, + 0x46, 0x52, 0x51, 0x47, 0x44, 0x77, 0x45, 0x58, 0x48, 0x67, 0x45, + 0x56, 0x4d, 0x78, 0x51, 0x47, 0x44, 0x77, 0x45, 0x4f, 0x41, 0x53, + 0x4d, 0x69, 0x4a, 0x69, 0x63, 0x42, 0x4c, 0x67, 0x45, 0x31, 0x4e, + 0x44, 0x59, 0x33, 0x41, 0x54, 0x34, 0x42, 0x4d, 0x7a, 0x49, 0x57, + 0x48, 0x77, 0x45, 0x65, 0x41, 0x52, 0x55, 0x55, 0x42, 0x67, 0x38, + 0x42, 0x46, 0x78, 0x34, 0x42, 0x46, 0x51, 0x46, 0x6d, 0x41, 0x77, + 0x49, 0x64, 0x41, 0x77, 0x63, 0x44, 0x42, 0x41, 0x63, 0x43, 0x2f, + 0x76, 0x55, 0x43, 0x41, 0x77, 0x4d, 0x43, 0x41, 0x51, 0x73, 0x43, + 0x42, 0x77, 0x51, 0x44, 0x42, 0x77, 0x4d, 0x64, 0x41, 0x67, 0x4d, + 0x44, 0x41, 0x75, 0x48, 0x68, 0x41, 0x67, 0x50, 0x63, 0x41, 0x77, + 0x4d, 0x64, 0x41, 0x67, 0x63, 0x45, 0x41, 0x77, 0x63, 0x44, 0x2f, + 0x76, 0x59, 0x44, 0x41, 0x77, 0x4d, 0x44, 0x41, 0x51, 0x6f, 0x44, + 0x42, 0x77, 0x4d, 0x45, 0x42, 0x77, 0x49, 0x64, 0x41, 0x77, 0x4d, + 0x44, 0x41, 0x2b, 0x48, 0x68, 0x41, 0x77, 0x4f, 0x6c, 0x42, 0x41, + 0x63, 0x44, 0x48, 0x41, 0x4d, 0x44, 0x41, 0x77, 0x4d, 0x42, 0x43, + 0x67, 0x4d, 0x48, 0x41, 0x77, 0x51, 0x48, 0x41, 0x67, 0x45, 0x4c, + 0x41, 0x67, 0x4d, 0x44, 0x41, 0x68, 0x30, 0x43, 0x43, 0x41, 0x4d, + 0x44, 0x43, 0x41, 0x4c, 0x68, 0x34, 0x41, 0x4d, 0x48, 0x41, 0x77, + 0x51, 0x48, 0x41, 0x78, 0x77, 0x44, 0x41, 0x77, 0x4d, 0x44, 0x41, + 0x51, 0x6f, 0x44, 0x42, 0x77, 0x4d, 0x45, 0x42, 0x77, 0x49, 0x42, + 0x43, 0x77, 0x49, 0x44, 0x41, 0x77, 0x49, 0x64, 0x41, 0x67, 0x67, + 0x44, 0x41, 0x77, 0x67, 0x43, 0x34, 0x65, 0x41, 0x44, 0x42, 0x77, + 0x4d, 0x41, 0x41, 0x41, 0x41, 0x43, 0x41, 0x41, 0x63, 0x41, 0x64, + 0x51, 0x49, 0x76, 0x41, 0x71, 0x38, 0x41, 0x4a, 0x41, 0x42, 0x4a, + 0x41, 0x41, 0x41, 0x42, 0x46, 0x41, 0x59, 0x48, 0x41, 0x51, 0x34, + 0x42, 0x49, 0x79, 0x49, 0x6d, 0x4c, 0x77, 0x45, 0x75, 0x41, 0x54, + 0x55, 0x30, 0x4e, 0x6a, 0x38, 0x42, 0x4a, 0x79, 0x34, 0x42, 0x4e, + 0x54, 0x51, 0x32, 0x50, 0x77, 0x45, 0x2b, 0x41, 0x54, 0x4d, 0x79, + 0x46, 0x68, 0x63, 0x42, 0x48, 0x67, 0x45, 0x56, 0x4d, 0x78, 0x51, + 0x47, 0x42, 0x77, 0x45, 0x4f, 0x41, 0x53, 0x4d, 0x69, 0x4a, 0x69, + 0x38, 0x42, 0x4c, 0x67, 0x45, 0x31, 0x4e, 0x44, 0x59, 0x2f, 0x41, + 0x53, 0x63, 0x75, 0x41, 0x54, 0x55, 0x30, 0x4e, 0x6a, 0x38, 0x42, + 0x50, 0x67, 0x45, 0x7a, 0x4d, 0x68, 0x59, 0x58, 0x41, 0x52, 0x34, + 0x42, 0x46, 0x51, 0x46, 0x55, 0x41, 0x77, 0x50, 0x2b, 0x39, 0x67, + 0x4d, 0x48, 0x41, 0x77, 0x51, 0x48, 0x41, 0x68, 0x30, 0x43, 0x42, + 0x41, 0x51, 0x43, 0x34, 0x65, 0x45, 0x43, 0x42, 0x41, 0x51, 0x43, + 0x48, 0x51, 0x49, 0x48, 0x42, 0x41, 0x4d, 0x48, 0x41, 0x77, 0x45, + 0x4b, 0x41, 0x77, 0x50, 0x62, 0x41, 0x77, 0x4c, 0x2b, 0x39, 0x51, + 0x49, 0x48, 0x42, 0x41, 0x4d, 0x48, 0x41, 0x78, 0x77, 0x44, 0x41, + 0x77, 0x4d, 0x44, 0x34, 0x4f, 0x41, 0x44, 0x41, 0x77, 0x4d, 0x44, + 0x48, 0x41, 0x4d, 0x48, 0x41, 0x77, 0x51, 0x48, 0x41, 0x67, 0x45, + 0x4c, 0x41, 0x67, 0x4d, 0x42, 0x6b, 0x67, 0x4d, 0x48, 0x41, 0x2f, + 0x37, 0x32, 0x41, 0x77, 0x4d, 0x44, 0x41, 0x78, 0x77, 0x44, 0x42, + 0x77, 0x51, 0x44, 0x42, 0x77, 0x50, 0x67, 0x34, 0x51, 0x49, 0x49, + 0x41, 0x77, 0x4d, 0x49, 0x41, 0x68, 0x30, 0x43, 0x41, 0x77, 0x4d, + 0x43, 0x2f, 0x76, 0x55, 0x43, 0x42, 0x77, 0x51, 0x44, 0x42, 0x77, + 0x50, 0x2b, 0x39, 0x67, 0x4d, 0x44, 0x41, 0x77, 0x4d, 0x63, 0x41, + 0x77, 0x63, 0x45, 0x41, 0x77, 0x63, 0x44, 0x34, 0x4f, 0x45, 0x43, + 0x43, 0x41, 0x4d, 0x44, 0x43, 0x41, 0x49, 0x64, 0x41, 0x67, 0x4d, + 0x44, 0x41, 0x76, 0x37, 0x31, 0x41, 0x67, 0x63, 0x45, 0x41, 0x41, + 0x41, 0x42, 0x41, 0x42, 0x6f, 0x41, 0x64, 0x51, 0x46, 0x6d, 0x41, + 0x71, 0x38, 0x41, 0x4a, 0x41, 0x41, 0x41, 0x41, 0x52, 0x51, 0x47, + 0x44, 0x77, 0x45, 0x58, 0x48, 0x67, 0x45, 0x56, 0x46, 0x41, 0x59, + 0x50, 0x41, 0x51, 0x34, 0x42, 0x49, 0x79, 0x49, 0x6d, 0x4a, 0x77, + 0x45, 0x75, 0x41, 0x54, 0x55, 0x30, 0x4e, 0x6a, 0x63, 0x42, 0x50, + 0x67, 0x45, 0x7a, 0x4d, 0x68, 0x59, 0x66, 0x41, 0x52, 0x34, 0x42, + 0x46, 0x51, 0x46, 0x6d, 0x41, 0x77, 0x4c, 0x68, 0x34, 0x51, 0x49, + 0x44, 0x41, 0x77, 0x49, 0x64, 0x41, 0x77, 0x63, 0x44, 0x42, 0x41, + 0x63, 0x43, 0x2f, 0x76, 0x55, 0x43, 0x41, 0x77, 0x4d, 0x43, 0x41, + 0x51, 0x73, 0x43, 0x42, 0x77, 0x51, 0x44, 0x42, 0x77, 0x4d, 0x64, + 0x41, 0x67, 0x4d, 0x43, 0x67, 0x41, 0x4d, 0x49, 0x41, 0x75, 0x48, + 0x67, 0x41, 0x77, 0x63, 0x44, 0x42, 0x41, 0x63, 0x44, 0x48, 0x41, + 0x4d, 0x44, 0x41, 0x77, 0x4d, 0x42, 0x43, 0x67, 0x4d, 0x48, 0x41, + 0x77, 0x51, 0x48, 0x41, 0x67, 0x45, 0x4c, 0x41, 0x67, 0x4d, 0x44, + 0x41, 0x68, 0x30, 0x43, 0x42, 0x77, 0x51, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x51, 0x41, 0x48, 0x41, 0x48, 0x55, 0x42, 0x56, 0x41, + 0x4b, 0x76, 0x41, 0x43, 0x51, 0x41, 0x41, 0x41, 0x45, 0x55, 0x42, + 0x67, 0x63, 0x42, 0x44, 0x67, 0x45, 0x6a, 0x49, 0x69, 0x59, 0x76, + 0x41, 0x53, 0x34, 0x42, 0x4e, 0x54, 0x51, 0x32, 0x50, 0x77, 0x45, + 0x6e, 0x4c, 0x67, 0x45, 0x31, 0x4e, 0x44, 0x59, 0x2f, 0x41, 0x54, + 0x34, 0x42, 0x4d, 0x7a, 0x49, 0x57, 0x46, 0x77, 0x45, 0x65, 0x41, + 0x52, 0x55, 0x42, 0x56, 0x41, 0x4d, 0x44, 0x2f, 0x76, 0x59, 0x44, + 0x42, 0x77, 0x4d, 0x45, 0x42, 0x77, 0x49, 0x64, 0x41, 0x67, 0x51, + 0x45, 0x41, 0x75, 0x48, 0x68, 0x41, 0x67, 0x51, 0x45, 0x41, 0x68, + 0x30, 0x43, 0x42, 0x77, 0x51, 0x44, 0x42, 0x77, 0x4d, 0x42, 0x43, + 0x67, 0x4d, 0x44, 0x41, 0x5a, 0x49, 0x44, 0x42, 0x77, 0x50, 0x2b, + 0x39, 0x67, 0x4d, 0x44, 0x41, 0x77, 0x4d, 0x63, 0x41, 0x77, 0x63, + 0x45, 0x41, 0x77, 0x63, 0x44, 0x34, 0x4f, 0x45, 0x43, 0x43, 0x41, + 0x4d, 0x44, 0x43, 0x41, 0x49, 0x64, 0x41, 0x67, 0x4d, 0x44, 0x41, + 0x76, 0x37, 0x31, 0x41, 0x67, 0x63, 0x45, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x49, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, 0x45, 0x6b, + 0x44, 0x74, 0x77, 0x41, 0x50, 0x41, 0x43, 0x34, 0x41, 0x41, 0x41, + 0x45, 0x52, 0x4e, 0x43, 0x59, 0x6a, 0x49, 0x53, 0x49, 0x47, 0x46, + 0x52, 0x45, 0x55, 0x46, 0x6a, 0x4d, 0x68, 0x4d, 0x6a, 0x59, 0x54, + 0x45, 0x52, 0x51, 0x47, 0x49, 0x79, 0x45, 0x55, 0x46, 0x68, 0x55, + 0x55, 0x42, 0x69, 0x4d, 0x68, 0x49, 0x69, 0x59, 0x31, 0x4e, 0x44, + 0x59, 0x31, 0x49, 0x53, 0x49, 0x6d, 0x4e, 0x52, 0x45, 0x30, 0x4e, + 0x6a, 0x4d, 0x68, 0x4d, 0x68, 0x59, 0x56, 0x42, 0x41, 0x41, 0x4c, + 0x42, 0x2f, 0x78, 0x74, 0x42, 0x77, 0x73, 0x4c, 0x42, 0x77, 0x4f, + 0x54, 0x42, 0x77, 0x74, 0x4a, 0x4e, 0x69, 0x58, 0x2b, 0x79, 0x53, + 0x51, 0x56, 0x44, 0x2f, 0x37, 0x62, 0x44, 0x78, 0x55, 0x6b, 0x2f, + 0x73, 0x6b, 0x6c, 0x4e, 0x6a, 0x59, 0x6c, 0x41, 0x35, 0x4d, 0x6c, + 0x4e, 0x67, 0x47, 0x41, 0x41, 0x64, 0x73, 0x49, 0x43, 0x77, 0x73, + 0x49, 0x2f, 0x69, 0x55, 0x48, 0x43, 0x77, 0x73, 0x42, 0x34, 0x76, + 0x32, 0x54, 0x4a, 0x6a, 0x59, 0x6b, 0x4f, 0x67, 0x38, 0x50, 0x46, + 0x68, 0x59, 0x50, 0x44, 0x7a, 0x6b, 0x6c, 0x4e, 0x69, 0x59, 0x43, + 0x62, 0x53, 0x59, 0x32, 0x4e, 0x69, 0x59, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x67, 0x41, 0x41, 0x41, 0x41, 0x41, 0x44, 0x62, 0x67, + 0x4e, 0x75, 0x41, 0x42, 0x77, 0x41, 0x4f, 0x51, 0x41, 0x41, 0x41, + 0x53, 0x49, 0x48, 0x44, 0x67, 0x45, 0x48, 0x42, 0x68, 0x55, 0x55, + 0x46, 0x78, 0x34, 0x42, 0x46, 0x78, 0x59, 0x7a, 0x4d, 0x6a, 0x63, + 0x2b, 0x41, 0x54, 0x63, 0x32, 0x4e, 0x54, 0x51, 0x6e, 0x4c, 0x67, + 0x45, 0x6e, 0x4a, 0x69, 0x4d, 0x42, 0x46, 0x41, 0x63, 0x4f, 0x41, + 0x51, 0x63, 0x47, 0x49, 0x79, 0x49, 0x6e, 0x4c, 0x67, 0x45, 0x6e, + 0x4a, 0x6a, 0x55, 0x30, 0x4e, 0x7a, 0x34, 0x42, 0x4e, 0x7a, 0x59, + 0x7a, 0x4d, 0x54, 0x49, 0x58, 0x48, 0x67, 0x45, 0x58, 0x46, 0x67, + 0x47, 0x33, 0x51, 0x44, 0x6b, 0x35, 0x56, 0x42, 0x6b, 0x59, 0x47, + 0x42, 0x6c, 0x55, 0x4f, 0x54, 0x6c, 0x41, 0x51, 0x44, 0x6b, 0x34, + 0x56, 0x52, 0x67, 0x5a, 0x47, 0x52, 0x68, 0x56, 0x4f, 0x44, 0x6c, + 0x41, 0x41, 0x62, 0x63, 0x6a, 0x49, 0x6e, 0x64, 0x51, 0x55, 0x46, + 0x74, 0x62, 0x55, 0x46, 0x42, 0x33, 0x49, 0x79, 0x49, 0x69, 0x49, + 0x33, 0x64, 0x51, 0x55, 0x46, 0x74, 0x62, 0x55, 0x46, 0x42, 0x33, + 0x49, 0x69, 0x4d, 0x43, 0x37, 0x68, 0x6b, 0x59, 0x56, 0x54, 0x67, + 0x35, 0x51, 0x45, 0x41, 0x35, 0x4f, 0x56, 0x51, 0x5a, 0x47, 0x42, + 0x67, 0x5a, 0x56, 0x44, 0x6b, 0x35, 0x51, 0x45, 0x41, 0x35, 0x4f, + 0x46, 0x55, 0x59, 0x47, 0x66, 0x37, 0x4a, 0x57, 0x31, 0x42, 0x51, + 0x64, 0x79, 0x49, 0x6a, 0x49, 0x79, 0x4a, 0x33, 0x55, 0x46, 0x42, + 0x62, 0x57, 0x31, 0x42, 0x51, 0x64, 0x79, 0x49, 0x6a, 0x49, 0x79, + 0x4a, 0x33, 0x55, 0x46, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x51, 0x41, 0x41, 0x41, 0x41, 0x41, 0x44, 0x62, 0x67, 0x4e, 0x75, + 0x41, 0x42, 0x73, 0x41, 0x41, 0x41, 0x45, 0x55, 0x42, 0x77, 0x34, + 0x42, 0x42, 0x77, 0x59, 0x6a, 0x49, 0x69, 0x63, 0x75, 0x41, 0x53, + 0x63, 0x6d, 0x4e, 0x54, 0x51, 0x33, 0x50, 0x67, 0x45, 0x33, 0x4e, + 0x6a, 0x4d, 0x79, 0x46, 0x78, 0x34, 0x42, 0x46, 0x78, 0x59, 0x44, + 0x62, 0x69, 0x4d, 0x69, 0x64, 0x31, 0x42, 0x51, 0x57, 0x31, 0x74, + 0x51, 0x55, 0x48, 0x63, 0x6a, 0x49, 0x69, 0x49, 0x6a, 0x64, 0x31, + 0x42, 0x51, 0x57, 0x31, 0x74, 0x51, 0x55, 0x48, 0x63, 0x69, 0x49, + 0x77, 0x47, 0x33, 0x57, 0x31, 0x42, 0x51, 0x64, 0x79, 0x49, 0x6a, + 0x49, 0x79, 0x4a, 0x33, 0x55, 0x46, 0x42, 0x62, 0x57, 0x31, 0x42, + 0x51, 0x64, 0x79, 0x49, 0x6a, 0x49, 0x79, 0x4a, 0x33, 0x55, 0x46, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x77, 0x41, 0x66, 0x41, + 0x41, 0x73, 0x45, 0x4b, 0x67, 0x4d, 0x61, 0x41, 0x42, 0x55, 0x41, + 0x4a, 0x67, 0x41, 0x38, 0x41, 0x41, 0x41, 0x6c, 0x42, 0x77, 0x59, + 0x69, 0x4a, 0x77, 0x45, 0x6d, 0x4e, 0x44, 0x63, 0x42, 0x4e, 0x6a, + 0x49, 0x66, 0x41, 0x52, 0x59, 0x55, 0x44, 0x77, 0x45, 0x58, 0x46, + 0x68, 0x51, 0x48, 0x41, 0x51, 0x4d, 0x4f, 0x41, 0x53, 0x38, 0x42, + 0x4c, 0x67, 0x45, 0x33, 0x45, 0x7a, 0x34, 0x42, 0x48, 0x77, 0x45, + 0x65, 0x41, 0x51, 0x63, 0x4a, 0x41, 0x51, 0x59, 0x69, 0x4c, 0x77, + 0x45, 0x6d, 0x4e, 0x44, 0x38, 0x42, 0x4a, 0x79, 0x59, 0x30, 0x50, + 0x77, 0x45, 0x32, 0x4d, 0x68, 0x63, 0x42, 0x46, 0x68, 0x51, 0x48, + 0x41, 0x57, 0x45, 0x64, 0x42, 0x67, 0x38, 0x46, 0x2f, 0x76, 0x55, + 0x46, 0x42, 0x51, 0x45, 0x4c, 0x42, 0x51, 0x38, 0x47, 0x48, 0x51, + 0x55, 0x46, 0x34, 0x65, 0x45, 0x46, 0x42, 0x51, 0x46, 0x52, 0x31, + 0x51, 0x49, 0x4e, 0x42, 0x79, 0x51, 0x48, 0x42, 0x77, 0x4c, 0x56, + 0x41, 0x67, 0x30, 0x48, 0x4a, 0x41, 0x63, 0x48, 0x41, 0x67, 0x46, + 0x34, 0x2f, 0x76, 0x55, 0x46, 0x44, 0x77, 0x59, 0x63, 0x42, 0x67, + 0x62, 0x67, 0x34, 0x41, 0x59, 0x47, 0x48, 0x41, 0x59, 0x50, 0x42, + 0x51, 0x45, 0x4c, 0x42, 0x51, 0x57, 0x58, 0x48, 0x41, 0x59, 0x47, + 0x41, 0x51, 0x6f, 0x47, 0x44, 0x77, 0x55, 0x42, 0x43, 0x77, 0x55, + 0x46, 0x48, 0x51, 0x55, 0x51, 0x42, 0x65, 0x48, 0x67, 0x42, 0x67, + 0x38, 0x47, 0x41, 0x6d, 0x4c, 0x39, 0x48, 0x67, 0x63, 0x48, 0x41, + 0x67, 0x6f, 0x43, 0x44, 0x51, 0x63, 0x43, 0x34, 0x67, 0x63, 0x49, + 0x41, 0x67, 0x6f, 0x43, 0x44, 0x67, 0x66, 0x2b, 0x6a, 0x50, 0x37, + 0x32, 0x42, 0x67, 0x59, 0x63, 0x42, 0x67, 0x38, 0x47, 0x34, 0x4f, + 0x45, 0x46, 0x45, 0x41, 0x55, 0x64, 0x42, 0x51, 0x58, 0x2b, 0x39, + 0x51, 0x55, 0x50, 0x42, 0x67, 0x41, 0x41, 0x41, 0x41, 0x49, 0x41, + 0x41, 0x50, 0x2b, 0x33, 0x41, 0x32, 0x34, 0x44, 0x74, 0x77, 0x41, + 0x49, 0x41, 0x42, 0x73, 0x41, 0x41, 0x41, 0x45, 0x52, 0x48, 0x67, + 0x45, 0x66, 0x41, 0x52, 0x34, 0x42, 0x46, 0x77, 0x55, 0x55, 0x46, + 0x6a, 0x4d, 0x68, 0x45, 0x52, 0x51, 0x47, 0x49, 0x79, 0x45, 0x69, + 0x4a, 0x6a, 0x55, 0x52, 0x4e, 0x44, 0x59, 0x7a, 0x49, 0x52, 0x45, + 0x43, 0x53, 0x51, 0x59, 0x4b, 0x42, 0x65, 0x6b, 0x45, 0x43, 0x41, + 0x54, 0x2b, 0x71, 0x53, 0x41, 0x58, 0x41, 0x54, 0x63, 0x67, 0x46, + 0x2f, 0x30, 0x41, 0x46, 0x79, 0x41, 0x67, 0x46, 0x77, 0x48, 0x4a, + 0x41, 0x70, 0x49, 0x42, 0x44, 0x67, 0x51, 0x49, 0x42, 0x4f, 0x6b, + 0x45, 0x43, 0x77, 0x59, 0x53, 0x46, 0x79, 0x44, 0x39, 0x70, 0x52, + 0x63, 0x67, 0x49, 0x42, 0x63, 0x44, 0x6b, 0x68, 0x63, 0x67, 0x2f, + 0x73, 0x6b, 0x41, 0x41, 0x41, 0x55, 0x41, 0x41, 0x50, 0x2b, 0x33, + 0x41, 0x32, 0x34, 0x44, 0x74, 0x77, 0x41, 0x49, 0x41, 0x42, 0x6f, + 0x41, 0x4b, 0x77, 0x41, 0x38, 0x41, 0x45, 0x30, 0x41, 0x41, 0x41, + 0x45, 0x65, 0x41, 0x52, 0x63, 0x68, 0x45, 0x52, 0x34, 0x42, 0x46, + 0x77, 0x4d, 0x68, 0x45, 0x52, 0x51, 0x47, 0x49, 0x79, 0x45, 0x69, + 0x4a, 0x6a, 0x55, 0x52, 0x4e, 0x44, 0x59, 0x7a, 0x49, 0x52, 0x45, + 0x55, 0x46, 0x68, 0x4d, 0x31, 0x4e, 0x43, 0x59, 0x6a, 0x49, 0x53, + 0x49, 0x47, 0x48, 0x51, 0x45, 0x55, 0x46, 0x6a, 0x4d, 0x68, 0x4d, + 0x6a, 0x59, 0x31, 0x50, 0x51, 0x45, 0x30, 0x4a, 0x69, 0x4d, 0x68, + 0x49, 0x67, 0x59, 0x64, 0x41, 0x52, 0x51, 0x57, 0x4d, 0x79, 0x45, + 0x79, 0x4e, 0x6a, 0x55, 0x39, 0x41, 0x54, 0x51, 0x6d, 0x49, 0x79, + 0x45, 0x69, 0x42, 0x68, 0x30, 0x42, 0x46, 0x42, 0x59, 0x7a, 0x49, + 0x54, 0x49, 0x32, 0x4e, 0x51, 0x4e, 0x48, 0x42, 0x41, 0x67, 0x45, + 0x2f, 0x76, 0x49, 0x47, 0x43, 0x67, 0x55, 0x6e, 0x41, 0x54, 0x63, + 0x67, 0x46, 0x2f, 0x30, 0x41, 0x46, 0x79, 0x41, 0x67, 0x46, 0x77, + 0x48, 0x4a, 0x49, 0x48, 0x49, 0x4b, 0x43, 0x50, 0x35, 0x75, 0x43, + 0x41, 0x73, 0x4c, 0x43, 0x41, 0x47, 0x53, 0x43, 0x41, 0x6f, 0x4b, + 0x43, 0x50, 0x35, 0x75, 0x43, 0x41, 0x73, 0x4c, 0x43, 0x41, 0x47, + 0x53, 0x43, 0x41, 0x6f, 0x4b, 0x43, 0x50, 0x35, 0x75, 0x43, 0x41, + 0x73, 0x4c, 0x43, 0x41, 0x47, 0x53, 0x43, 0x41, 0x6f, 0x43, 0x70, + 0x77, 0x51, 0x4c, 0x42, 0x67, 0x45, 0x4f, 0x42, 0x41, 0x67, 0x45, + 0x2f, 0x72, 0x6e, 0x39, 0x70, 0x52, 0x63, 0x67, 0x49, 0x42, 0x63, + 0x44, 0x6b, 0x68, 0x63, 0x67, 0x2f, 0x73, 0x6b, 0x58, 0x49, 0x50, + 0x35, 0x63, 0x4a, 0x41, 0x67, 0x4b, 0x43, 0x67, 0x67, 0x6b, 0x43, + 0x41, 0x73, 0x4c, 0x43, 0x4a, 0x49, 0x6b, 0x43, 0x41, 0x73, 0x4c, + 0x43, 0x43, 0x51, 0x49, 0x43, 0x67, 0x6f, 0x49, 0x6b, 0x69, 0x55, + 0x48, 0x43, 0x77, 0x73, 0x48, 0x4a, 0x51, 0x67, 0x4b, 0x43, 0x67, + 0x67, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x51, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x44, 0x58, 0x41, 0x4e, 0x75, 0x41, 0x44, 0x73, 0x41, + 0x41, 0x41, 0x45, 0x68, 0x48, 0x67, 0x45, 0x56, 0x46, 0x41, 0x63, + 0x4f, 0x41, 0x51, 0x63, 0x47, 0x49, 0x79, 0x49, 0x6e, 0x4c, 0x67, + 0x45, 0x6e, 0x4a, 0x6a, 0x55, 0x30, 0x4e, 0x7a, 0x34, 0x42, 0x4e, + 0x7a, 0x59, 0x7a, 0x4d, 0x68, 0x63, 0x65, 0x41, 0x52, 0x63, 0x57, + 0x46, 0x77, 0x63, 0x75, 0x41, 0x53, 0x4d, 0x69, 0x42, 0x77, 0x34, + 0x42, 0x42, 0x77, 0x59, 0x56, 0x46, 0x42, 0x63, 0x65, 0x41, 0x52, + 0x63, 0x57, 0x4d, 0x7a, 0x49, 0x33, 0x50, 0x67, 0x45, 0x33, 0x4e, + 0x6a, 0x63, 0x6a, 0x4e, 0x51, 0x47, 0x33, 0x41, 0x5a, 0x34, 0x44, + 0x42, 0x42, 0x34, 0x65, 0x62, 0x30, 0x35, 0x4e, 0x58, 0x31, 0x74, + 0x51, 0x55, 0x48, 0x63, 0x6a, 0x49, 0x69, 0x49, 0x6a, 0x64, 0x31, + 0x42, 0x51, 0x57, 0x79, 0x77, 0x70, 0x4b, 0x55, 0x6f, 0x67, 0x49, + 0x52, 0x31, 0x33, 0x47, 0x56, 0x5a, 0x41, 0x4f, 0x44, 0x49, 0x78, + 0x53, 0x68, 0x59, 0x56, 0x46, 0x52, 0x5a, 0x4b, 0x4d, 0x54, 0x49, + 0x34, 0x51, 0x53, 0x34, 0x74, 0x4f, 0x77, 0x38, 0x50, 0x42, 0x50, + 0x6b, 0x42, 0x39, 0x68, 0x45, 0x6a, 0x46, 0x56, 0x35, 0x50, 0x54, + 0x33, 0x45, 0x67, 0x49, 0x43, 0x49, 0x6a, 0x64, 0x31, 0x42, 0x51, + 0x57, 0x31, 0x74, 0x51, 0x55, 0x48, 0x63, 0x69, 0x49, 0x77, 0x67, + 0x49, 0x48, 0x68, 0x55, 0x56, 0x47, 0x33, 0x4d, 0x59, 0x4c, 0x42, + 0x59, 0x57, 0x53, 0x7a, 0x49, 0x7a, 0x4f, 0x54, 0x6f, 0x79, 0x4d, + 0x30, 0x73, 0x57, 0x46, 0x52, 0x51, 0x56, 0x4f, 0x69, 0x45, 0x68, + 0x47, 0x4a, 0x63, 0x41, 0x41, 0x51, 0x41, 0x53, 0x2f, 0x38, 0x6b, + 0x44, 0x37, 0x67, 0x4f, 0x66, 0x41, 0x44, 0x6f, 0x41, 0x41, 0x41, + 0x45, 0x55, 0x42, 0x77, 0x34, 0x42, 0x42, 0x77, 0x59, 0x6a, 0x49, + 0x69, 0x63, 0x75, 0x41, 0x53, 0x63, 0x6d, 0x4e, 0x54, 0x51, 0x33, + 0x50, 0x67, 0x45, 0x33, 0x4e, 0x6a, 0x63, 0x56, 0x42, 0x67, 0x63, + 0x4f, 0x41, 0x51, 0x63, 0x47, 0x46, 0x52, 0x51, 0x58, 0x48, 0x67, + 0x45, 0x58, 0x46, 0x6a, 0x4d, 0x79, 0x4e, 0x7a, 0x34, 0x42, 0x4e, + 0x7a, 0x59, 0x31, 0x4e, 0x43, 0x63, 0x75, 0x41, 0x53, 0x63, 0x6d, + 0x4a, 0x7a, 0x55, 0x57, 0x46, 0x78, 0x34, 0x42, 0x46, 0x78, 0x59, + 0x56, 0x41, 0x2b, 0x34, 0x6e, 0x4a, 0x34, 0x5a, 0x61, 0x57, 0x6d, + 0x5a, 0x6d, 0x57, 0x6c, 0x71, 0x47, 0x4a, 0x79, 0x63, 0x68, 0x49, + 0x48, 0x46, 0x4e, 0x54, 0x56, 0x6b, 0x2f, 0x4e, 0x54, 0x5a, 0x4f, + 0x46, 0x68, 0x63, 0x64, 0x48, 0x57, 0x4e, 0x44, 0x51, 0x6b, 0x78, + 0x4d, 0x51, 0x6b, 0x4e, 0x6a, 0x48, 0x52, 0x30, 0x58, 0x46, 0x6b, + 0x34, 0x32, 0x4e, 0x54, 0x39, 0x5a, 0x54, 0x55, 0x31, 0x78, 0x49, + 0x43, 0x45, 0x42, 0x74, 0x32, 0x5a, 0x61, 0x57, 0x6f, 0x59, 0x6e, + 0x4a, 0x79, 0x63, 0x6e, 0x68, 0x6c, 0x70, 0x61, 0x5a, 0x6c, 0x31, + 0x54, 0x55, 0x34, 0x49, 0x72, 0x4b, 0x77, 0x32, 0x43, 0x44, 0x53, + 0x41, 0x68, 0x58, 0x7a, 0x73, 0x38, 0x51, 0x6b, 0x78, 0x43, 0x51, + 0x32, 0x4d, 0x64, 0x48, 0x52, 0x30, 0x64, 0x59, 0x30, 0x4e, 0x43, + 0x54, 0x45, 0x49, 0x38, 0x4f, 0x31, 0x38, 0x68, 0x49, 0x41, 0x32, + 0x43, 0x44, 0x53, 0x73, 0x72, 0x67, 0x6c, 0x4e, 0x54, 0x58, 0x51, + 0x41, 0x41, 0x42, 0x41, 0x41, 0x4e, 0x2f, 0x37, 0x63, 0x45, 0x68, + 0x67, 0x4f, 0x33, 0x41, 0x42, 0x49, 0x41, 0x4a, 0x51, 0x41, 0x39, + 0x41, 0x47, 0x38, 0x41, 0x41, 0x41, 0x55, 0x30, 0x4a, 0x69, 0x4d, + 0x69, 0x4a, 0x6a, 0x55, 0x30, 0x4a, 0x69, 0x4d, 0x69, 0x42, 0x68, + 0x55, 0x55, 0x46, 0x6a, 0x4d, 0x79, 0x4e, 0x6a, 0x55, 0x4a, 0x41, + 0x53, 0x34, 0x42, 0x49, 0x79, 0x49, 0x48, 0x44, 0x67, 0x45, 0x48, + 0x42, 0x68, 0x55, 0x55, 0x42, 0x77, 0x34, 0x42, 0x42, 0x77, 0x59, + 0x48, 0x42, 0x52, 0x51, 0x47, 0x49, 0x79, 0x45, 0x55, 0x42, 0x69, + 0x4d, 0x69, 0x4a, 0x6a, 0x55, 0x33, 0x49, 0x53, 0x34, 0x42, 0x4a, + 0x7a, 0x63, 0x57, 0x46, 0x78, 0x34, 0x42, 0x46, 0x78, 0x59, 0x58, + 0x45, 0x78, 0x63, 0x57, 0x46, 0x41, 0x63, 0x42, 0x42, 0x69, 0x59, + 0x76, 0x41, 0x53, 0x59, 0x32, 0x50, 0x77, 0x45, 0x75, 0x41, 0x54, + 0x55, 0x32, 0x4e, 0x7a, 0x34, 0x42, 0x4e, 0x7a, 0x59, 0x31, 0x4e, + 0x44, 0x63, 0x2b, 0x41, 0x54, 0x63, 0x32, 0x4e, 0x79, 0x34, 0x42, + 0x4e, 0x54, 0x51, 0x32, 0x4d, 0x7a, 0x49, 0x57, 0x46, 0x52, 0x51, + 0x47, 0x42, 0x78, 0x34, 0x42, 0x46, 0x7a, 0x63, 0x32, 0x46, 0x68, + 0x63, 0x43, 0x55, 0x67, 0x55, 0x45, 0x49, 0x6a, 0x41, 0x46, 0x42, + 0x41, 0x51, 0x46, 0x4f, 0x79, 0x6b, 0x45, 0x42, 0x66, 0x37, 0x4e, + 0x41, 0x66, 0x59, 0x57, 0x5a, 0x46, 0x49, 0x34, 0x4b, 0x53, 0x6f, + 0x32, 0x44, 0x51, 0x30, 0x46, 0x42, 0x52, 0x4d, 0x50, 0x44, 0x78, + 0x51, 0x44, 0x42, 0x69, 0x77, 0x65, 0x2f, 0x77, 0x42, 0x56, 0x50, + 0x54, 0x78, 0x57, 0x56, 0x51, 0x47, 0x78, 0x4d, 0x45, 0x45, 0x52, + 0x50, 0x77, 0x73, 0x54, 0x45, 0x79, 0x30, 0x61, 0x47, 0x68, 0x6b, + 0x78, 0x4d, 0x41, 0x51, 0x47, 0x2b, 0x39, 0x49, 0x46, 0x45, 0x41, + 0x51, 0x77, 0x42, 0x51, 0x45, 0x46, 0x61, 0x77, 0x59, 0x46, 0x48, + 0x79, 0x45, 0x68, 0x4e, 0x42, 0x45, 0x52, 0x45, 0x42, 0x45, 0x2b, + 0x4c, 0x53, 0x30, 0x35, 0x41, 0x67, 0x4d, 0x67, 0x46, 0x78, 0x63, + 0x67, 0x41, 0x67, 0x4e, 0x4b, 0x61, 0x78, 0x33, 0x76, 0x42, 0x67, + 0x38, 0x46, 0x45, 0x67, 0x51, 0x46, 0x4d, 0x43, 0x49, 0x45, 0x42, + 0x51, 0x55, 0x45, 0x4b, 0x54, 0x73, 0x46, 0x42, 0x41, 0x45, 0x50, + 0x41, 0x62, 0x49, 0x74, 0x53, 0x52, 0x4d, 0x53, 0x4e, 0x79, 0x41, + 0x67, 0x47, 0x7a, 0x63, 0x7a, 0x4d, 0x6c, 0x77, 0x71, 0x4b, 0x53, + 0x5a, 0x72, 0x48, 0x69, 0x73, 0x38, 0x56, 0x6c, 0x55, 0x39, 0x53, + 0x54, 0x61, 0x44, 0x54, 0x6a, 0x64, 0x41, 0x4d, 0x6a, 0x46, 0x4e, + 0x48, 0x42, 0x30, 0x56, 0x41, 0x78, 0x77, 0x33, 0x42, 0x67, 0x38, + 0x46, 0x2f, 0x47, 0x45, 0x46, 0x41, 0x51, 0x59, 0x33, 0x42, 0x67, + 0x38, 0x46, 0x58, 0x41, 0x67, 0x54, 0x43, 0x68, 0x73, 0x6e, 0x4a, + 0x33, 0x46, 0x4e, 0x54, 0x57, 0x67, 0x70, 0x4b, 0x53, 0x70, 0x46, + 0x47, 0x52, 0x6b, 0x4a, 0x42, 0x51, 0x73, 0x47, 0x46, 0x79, 0x41, + 0x67, 0x46, 0x77, 0x59, 0x4c, 0x42, 0x51, 0x74, 0x4d, 0x4d, 0x73, + 0x38, 0x46, 0x41, 0x51, 0x59, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x67, 0x41, 0x41, 0x41, 0x41, 0x41, 0x45, 0x6b, 0x67, 0x4e, 0x75, + 0x41, 0x41, 0x55, 0x41, 0x43, 0x77, 0x41, 0x41, 0x4a, 0x52, 0x55, + 0x68, 0x45, 0x54, 0x4d, 0x52, 0x41, 0x52, 0x4d, 0x68, 0x45, 0x51, + 0x6b, 0x42, 0x42, 0x4a, 0x4c, 0x37, 0x62, 0x6b, 0x6b, 0x44, 0x62, + 0x70, 0x4c, 0x38, 0x53, 0x51, 0x45, 0x41, 0x41, 0x55, 0x6c, 0x4a, + 0x53, 0x51, 0x4e, 0x75, 0x2f, 0x4e, 0x73, 0x43, 0x53, 0x66, 0x34, + 0x41, 0x41, 0x55, 0x6b, 0x42, 0x53, 0x76, 0x36, 0x32, 0x41, 0x41, + 0x41, 0x41, 0x42, 0x41, 0x41, 0x41, 0x2f, 0x37, 0x63, 0x45, 0x41, + 0x41, 0x4f, 0x33, 0x41, 0x42, 0x59, 0x41, 0x4b, 0x67, 0x41, 0x39, + 0x41, 0x45, 0x6b, 0x41, 0x41, 0x41, 0x45, 0x79, 0x46, 0x68, 0x63, + 0x65, 0x41, 0x52, 0x63, 0x6c, 0x4a, 0x67, 0x63, 0x4f, 0x41, 0x51, + 0x63, 0x47, 0x42, 0x79, 0x63, 0x32, 0x4e, 0x7a, 0x34, 0x42, 0x4e, + 0x7a, 0x59, 0x7a, 0x42, 0x52, 0x4d, 0x57, 0x46, 0x78, 0x34, 0x42, + 0x46, 0x78, 0x59, 0x33, 0x41, 0x79, 0x59, 0x6e, 0x4c, 0x67, 0x45, + 0x6e, 0x4a, 0x6a, 0x55, 0x30, 0x4e, 0x6a, 0x63, 0x46, 0x46, 0x68, + 0x63, 0x57, 0x42, 0x67, 0x63, 0x47, 0x42, 0x77, 0x34, 0x42, 0x4a, + 0x78, 0x4d, 0x32, 0x4e, 0x7a, 0x59, 0x6d, 0x4a, 0x79, 0x59, 0x6e, + 0x4a, 0x7a, 0x49, 0x57, 0x46, 0x52, 0x51, 0x47, 0x49, 0x79, 0x49, + 0x6d, 0x4e, 0x54, 0x51, 0x32, 0x41, 0x66, 0x35, 0x43, 0x67, 0x7a, + 0x31, 0x44, 0x5a, 0x69, 0x44, 0x2b, 0x57, 0x43, 0x30, 0x72, 0x4b, + 0x30, 0x67, 0x63, 0x48, 0x41, 0x2b, 0x64, 0x4a, 0x53, 0x30, 0x74, + 0x5a, 0x6a, 0x67, 0x33, 0x4f, 0x50, 0x35, 0x56, 0x77, 0x52, 0x51, + 0x66, 0x48, 0x30, 0x77, 0x71, 0x4b, 0x79, 0x32, 0x44, 0x58, 0x45, + 0x39, 0x51, 0x64, 0x43, 0x45, 0x68, 0x4c, 0x43, 0x63, 0x44, 0x69, + 0x79, 0x45, 0x42, 0x41, 0x54, 0x73, 0x35, 0x4f, 0x6c, 0x4e, 0x44, + 0x6b, 0x6b, 0x6a, 0x6f, 0x47, 0x51, 0x73, 0x4d, 0x41, 0x67, 0x38, + 0x50, 0x48, 0x72, 0x31, 0x49, 0x5a, 0x57, 0x56, 0x49, 0x53, 0x47, + 0x56, 0x6c, 0x41, 0x37, 0x63, 0x69, 0x49, 0x79, 0x64, 0x74, 0x51, + 0x42, 0x59, 0x44, 0x43, 0x77, 0x73, 0x74, 0x49, 0x69, 0x45, 0x72, + 0x38, 0x79, 0x30, 0x6b, 0x49, 0x7a, 0x45, 0x4d, 0x44, 0x65, 0x6a, + 0x2b, 0x68, 0x69, 0x6b, 0x66, 0x49, 0x43, 0x67, 0x48, 0x43, 0x41, + 0x6e, 0x2b, 0x2f, 0x67, 0x34, 0x74, 0x4c, 0x59, 0x5a, 0x57, 0x56, + 0x6d, 0x42, 0x4e, 0x6a, 0x7a, 0x78, 0x67, 0x56, 0x31, 0x74, 0x61, + 0x71, 0x45, 0x68, 0x49, 0x4d, 0x43, 0x63, 0x67, 0x41, 0x77, 0x46, + 0x6b, 0x4a, 0x69, 0x73, 0x72, 0x56, 0x53, 0x6b, 0x70, 0x49, 0x67, + 0x4e, 0x6c, 0x52, 0x30, 0x68, 0x6c, 0x5a, 0x55, 0x68, 0x48, 0x5a, + 0x51, 0x41, 0x41, 0x41, 0x67, 0x41, 0x54, 0x41, 0x41, 0x41, 0x44, + 0x37, 0x51, 0x4e, 0x75, 0x41, 0x41, 0x4d, 0x41, 0x61, 0x41, 0x41, + 0x41, 0x41, 0x54, 0x63, 0x6a, 0x42, 0x77, 0x45, 0x48, 0x44, 0x67, + 0x45, 0x72, 0x41, 0x51, 0x63, 0x7a, 0x4d, 0x68, 0x59, 0x58, 0x48, + 0x67, 0x45, 0x50, 0x41, 0x51, 0x34, 0x42, 0x4b, 0x77, 0x45, 0x48, + 0x44, 0x67, 0x45, 0x72, 0x41, 0x53, 0x49, 0x6d, 0x4a, 0x79, 0x34, + 0x42, 0x50, 0x77, 0x45, 0x6a, 0x42, 0x77, 0x34, 0x42, 0x4b, 0x77, + 0x45, 0x69, 0x4a, 0x69, 0x63, 0x75, 0x41, 0x54, 0x38, 0x42, 0x49, + 0x79, 0x49, 0x6d, 0x4a, 0x79, 0x34, 0x42, 0x50, 0x77, 0x45, 0x2b, + 0x41, 0x54, 0x73, 0x42, 0x4e, 0x79, 0x4d, 0x69, 0x4a, 0x69, 0x63, + 0x75, 0x41, 0x54, 0x38, 0x42, 0x50, 0x67, 0x45, 0x37, 0x41, 0x54, + 0x63, 0x2b, 0x41, 0x54, 0x73, 0x42, 0x4d, 0x68, 0x59, 0x58, 0x48, + 0x67, 0x45, 0x50, 0x41, 0x54, 0x4d, 0x33, 0x50, 0x67, 0x45, 0x37, + 0x41, 0x54, 0x49, 0x57, 0x46, 0x78, 0x34, 0x42, 0x44, 0x77, 0x45, + 0x7a, 0x4d, 0x68, 0x59, 0x58, 0x48, 0x67, 0x45, 0x48, 0x41, 0x6a, + 0x59, 0x6c, 0x6b, 0x53, 0x55, 0x43, 0x53, 0x43, 0x41, 0x43, 0x43, + 0x51, 0x65, 0x36, 0x4a, 0x62, 0x49, 0x45, 0x42, 0x77, 0x4d, 0x44, + 0x41, 0x67, 0x49, 0x67, 0x41, 0x51, 0x6f, 0x47, 0x75, 0x79, 0x34, + 0x43, 0x43, 0x67, 0x61, 0x41, 0x42, 0x41, 0x67, 0x44, 0x41, 0x77, + 0x45, 0x42, 0x4c, 0x4a, 0x45, 0x75, 0x41, 0x67, 0x6f, 0x47, 0x67, + 0x51, 0x4d, 0x49, 0x41, 0x77, 0x49, 0x43, 0x41, 0x53, 0x79, 0x78, + 0x42, 0x51, 0x63, 0x44, 0x41, 0x67, 0x49, 0x42, 0x49, 0x41, 0x49, + 0x4a, 0x42, 0x37, 0x6f, 0x6c, 0x73, 0x67, 0x51, 0x48, 0x41, 0x77, + 0x4d, 0x43, 0x41, 0x69, 0x41, 0x42, 0x43, 0x67, 0x61, 0x37, 0x4c, + 0x67, 0x49, 0x4b, 0x42, 0x34, 0x41, 0x45, 0x42, 0x77, 0x4d, 0x44, + 0x41, 0x51, 0x45, 0x73, 0x6b, 0x53, 0x34, 0x43, 0x43, 0x67, 0x65, + 0x41, 0x41, 0x77, 0x67, 0x44, 0x41, 0x67, 0x49, 0x42, 0x4c, 0x4c, + 0x45, 0x46, 0x42, 0x77, 0x4d, 0x43, 0x41, 0x67, 0x45, 0x42, 0x62, + 0x70, 0x4b, 0x53, 0x41, 0x53, 0x43, 0x41, 0x42, 0x67, 0x69, 0x53, + 0x42, 0x41, 0x4d, 0x45, 0x43, 0x41, 0x53, 0x41, 0x42, 0x67, 0x69, + 0x37, 0x42, 0x67, 0x67, 0x45, 0x41, 0x77, 0x4d, 0x4a, 0x42, 0x4c, + 0x4b, 0x37, 0x42, 0x67, 0x67, 0x45, 0x41, 0x77, 0x4d, 0x4a, 0x42, + 0x4c, 0x49, 0x45, 0x41, 0x77, 0x4d, 0x4a, 0x42, 0x49, 0x41, 0x47, + 0x43, 0x4a, 0x49, 0x45, 0x41, 0x77, 0x4d, 0x4a, 0x42, 0x49, 0x41, + 0x47, 0x43, 0x4c, 0x73, 0x47, 0x43, 0x41, 0x51, 0x44, 0x42, 0x41, + 0x67, 0x45, 0x73, 0x72, 0x73, 0x47, 0x43, 0x41, 0x51, 0x44, 0x42, + 0x41, 0x67, 0x45, 0x73, 0x67, 0x51, 0x44, 0x42, 0x41, 0x67, 0x45, + 0x41, 0x41, 0x51, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x32, 0x34, + 0x44, 0x62, 0x67, 0x41, 0x51, 0x41, 0x45, 0x51, 0x41, 0x59, 0x51, + 0x42, 0x2b, 0x41, 0x41, 0x41, 0x42, 0x46, 0x52, 0x51, 0x47, 0x4b, + 0x77, 0x45, 0x69, 0x4a, 0x6a, 0x30, 0x42, 0x4e, 0x44, 0x59, 0x37, + 0x41, 0x54, 0x49, 0x57, 0x46, 0x52, 0x4d, 0x55, 0x42, 0x67, 0x63, + 0x4f, 0x41, 0x52, 0x30, 0x42, 0x46, 0x41, 0x59, 0x72, 0x41, 0x53, + 0x49, 0x6d, 0x50, 0x51, 0x45, 0x30, 0x4e, 0x6a, 0x63, 0x2b, 0x41, + 0x54, 0x55, 0x30, 0x4a, 0x69, 0x4d, 0x69, 0x42, 0x67, 0x63, 0x4f, + 0x41, 0x51, 0x63, 0x4f, 0x41, 0x53, 0x4d, 0x69, 0x4a, 0x69, 0x38, + 0x42, 0x4c, 0x67, 0x45, 0x33, 0x50, 0x67, 0x45, 0x7a, 0x4d, 0x54, + 0x49, 0x58, 0x48, 0x67, 0x45, 0x58, 0x46, 0x68, 0x55, 0x44, 0x49, + 0x67, 0x63, 0x4f, 0x41, 0x51, 0x63, 0x47, 0x46, 0x52, 0x51, 0x58, + 0x48, 0x67, 0x45, 0x58, 0x46, 0x6a, 0x4d, 0x79, 0x4e, 0x7a, 0x34, + 0x42, 0x4e, 0x7a, 0x59, 0x31, 0x4e, 0x43, 0x63, 0x75, 0x41, 0x53, + 0x63, 0x6d, 0x49, 0x77, 0x45, 0x55, 0x42, 0x77, 0x34, 0x42, 0x42, + 0x77, 0x59, 0x6a, 0x49, 0x69, 0x63, 0x75, 0x41, 0x53, 0x63, 0x6d, + 0x4e, 0x54, 0x51, 0x33, 0x50, 0x67, 0x45, 0x33, 0x4e, 0x6a, 0x4d, + 0x78, 0x4d, 0x68, 0x63, 0x65, 0x41, 0x52, 0x63, 0x57, 0x41, 0x66, + 0x63, 0x4c, 0x42, 0x31, 0x77, 0x49, 0x43, 0x67, 0x6f, 0x49, 0x58, + 0x41, 0x63, 0x4c, 0x6b, 0x6b, 0x4d, 0x66, 0x46, 0x68, 0x6f, 0x4c, + 0x42, 0x31, 0x77, 0x49, 0x43, 0x6a, 0x77, 0x66, 0x47, 0x52, 0x34, + 0x7a, 0x48, 0x41, 0x38, 0x65, 0x43, 0x67, 0x6b, 0x55, 0x45, 0x41, + 0x4d, 0x48, 0x42, 0x51, 0x4d, 0x46, 0x41, 0x6a, 0x34, 0x47, 0x41, + 0x67, 0x51, 0x6a, 0x59, 0x30, 0x45, 0x6a, 0x4a, 0x43, 0x4d, 0x35, + 0x45, 0x68, 0x4c, 0x53, 0x54, 0x45, 0x4a, 0x44, 0x59, 0x78, 0x30, + 0x64, 0x48, 0x52, 0x31, 0x6a, 0x51, 0x30, 0x4a, 0x4d, 0x53, 0x30, + 0x4e, 0x44, 0x59, 0x78, 0x30, 0x64, 0x48, 0x52, 0x31, 0x6a, 0x51, + 0x30, 0x4e, 0x4c, 0x41, 0x62, 0x63, 0x6a, 0x49, 0x6e, 0x64, 0x51, + 0x55, 0x46, 0x74, 0x62, 0x55, 0x46, 0x42, 0x33, 0x49, 0x79, 0x49, + 0x69, 0x49, 0x33, 0x64, 0x51, 0x55, 0x46, 0x74, 0x62, 0x55, 0x46, + 0x42, 0x33, 0x49, 0x69, 0x4d, 0x42, 0x43, 0x56, 0x73, 0x49, 0x43, + 0x77, 0x73, 0x49, 0x57, 0x77, 0x67, 0x4b, 0x43, 0x67, 0x67, 0x42, + 0x48, 0x44, 0x30, 0x36, 0x45, 0x67, 0x30, 0x55, 0x44, 0x52, 0x4d, + 0x48, 0x43, 0x77, 0x73, 0x48, 0x4a, 0x7a, 0x55, 0x73, 0x44, 0x67, + 0x77, 0x56, 0x46, 0x42, 0x6b, 0x67, 0x43, 0x41, 0x63, 0x47, 0x46, + 0x68, 0x4d, 0x45, 0x41, 0x77, 0x45, 0x43, 0x4c, 0x77, 0x51, 0x50, + 0x42, 0x6a, 0x63, 0x32, 0x44, 0x51, 0x30, 0x76, 0x48, 0x79, 0x41, + 0x6c, 0x41, 0x51, 0x41, 0x64, 0x48, 0x57, 0x4e, 0x44, 0x51, 0x30, + 0x74, 0x4d, 0x51, 0x6b, 0x4e, 0x6a, 0x48, 0x52, 0x30, 0x64, 0x48, + 0x57, 0x4e, 0x44, 0x51, 0x6b, 0x78, 0x4c, 0x51, 0x30, 0x4e, 0x6a, + 0x48, 0x52, 0x33, 0x2b, 0x6b, 0x6c, 0x74, 0x51, 0x55, 0x48, 0x63, + 0x69, 0x49, 0x79, 0x4d, 0x69, 0x64, 0x31, 0x42, 0x51, 0x57, 0x31, + 0x74, 0x51, 0x55, 0x48, 0x63, 0x69, 0x49, 0x79, 0x4d, 0x69, 0x64, + 0x31, 0x42, 0x51, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x45, 0x41, + 0x41, 0x41, 0x41, 0x42, 0x41, 0x41, 0x41, 0x55, 0x38, 0x73, 0x33, + 0x37, 0x58, 0x77, 0x38, 0x38, 0x39, 0x51, 0x41, 0x4c, 0x42, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x31, 0x79, 0x70, 0x72, 0x4c, + 0x67, 0x41, 0x41, 0x41, 0x41, 0x44, 0x58, 0x4b, 0x6d, 0x73, 0x75, + 0x41, 0x41, 0x44, 0x2f, 0x74, 0x77, 0x53, 0x53, 0x41, 0x37, 0x63, + 0x41, 0x41, 0x41, 0x41, 0x49, 0x41, 0x41, 0x49, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x51, 0x41, 0x41, 0x41, + 0x38, 0x44, 0x2f, 0x77, 0x41, 0x41, 0x41, 0x42, 0x4a, 0x49, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x42, 0x4a, 0x49, 0x41, 0x41, 0x51, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x44, 0x4d, 0x45, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x43, 0x41, 0x41, 0x41, 0x41, 0x41, 0x74, 0x73, + 0x41, 0x41, 0x41, 0x4f, 0x33, 0x41, 0x41, 0x41, 0x45, 0x41, 0x41, + 0x41, 0x41, 0x42, 0x41, 0x41, 0x41, 0x52, 0x51, 0x4d, 0x6c, 0x41, + 0x44, 0x38, 0x44, 0x62, 0x67, 0x41, 0x41, 0x41, 0x32, 0x34, 0x41, + 0x41, 0x41, 0x4e, 0x75, 0x41, 0x41, 0x41, 0x44, 0x62, 0x67, 0x41, + 0x41, 0x42, 0x41, 0x41, 0x41, 0x41, 0x41, 0x51, 0x41, 0x41, 0x41, + 0x41, 0x43, 0x53, 0x51, 0x41, 0x41, 0x41, 0x37, 0x73, 0x41, 0x41, + 0x41, 0x4d, 0x41, 0x41, 0x47, 0x4d, 0x43, 0x74, 0x77, 0x41, 0x2b, + 0x42, 0x41, 0x41, 0x41, 0x43, 0x51, 0x53, 0x53, 0x41, 0x41, 0x41, + 0x45, 0x53, 0x51, 0x41, 0x41, 0x42, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x4d, 0x6c, 0x41, 0x41, 0x41, 0x45, 0x41, 0x41, 0x41, 0x6c, 0x42, + 0x45, 0x6b, 0x41, 0x41, 0x41, 0x4e, 0x75, 0x41, 0x41, 0x41, 0x44, + 0x74, 0x77, 0x41, 0x41, 0x41, 0x6b, 0x6b, 0x41, 0x41, 0x41, 0x4a, + 0x4a, 0x41, 0x41, 0x41, 0x42, 0x6b, 0x67, 0x41, 0x6c, 0x41, 0x55, + 0x6b, 0x41, 0x41, 0x41, 0x4a, 0x4a, 0x41, 0x41, 0x41, 0x45, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x6c, 0x73, 0x41, 0x47, 0x67, 0x49, 0x33, + 0x41, 0x41, 0x63, 0x42, 0x67, 0x41, 0x41, 0x61, 0x41, 0x56, 0x73, + 0x41, 0x42, 0x77, 0x52, 0x4a, 0x41, 0x41, 0x41, 0x44, 0x62, 0x67, + 0x41, 0x41, 0x41, 0x32, 0x34, 0x41, 0x41, 0x41, 0x52, 0x4a, 0x41, + 0x42, 0x38, 0x44, 0x62, 0x67, 0x41, 0x41, 0x41, 0x32, 0x34, 0x41, + 0x41, 0x41, 0x4e, 0x63, 0x41, 0x41, 0x41, 0x45, 0x41, 0x41, 0x41, + 0x53, 0x42, 0x4a, 0x49, 0x41, 0x44, 0x51, 0x53, 0x53, 0x41, 0x41, + 0x41, 0x45, 0x4e, 0x77, 0x41, 0x41, 0x42, 0x41, 0x41, 0x41, 0x45, + 0x77, 0x4e, 0x75, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x6f, 0x41, 0x46, 0x41, 0x41, 0x65, 0x41, 0x48, 0x51, + 0x41, 0x30, 0x41, 0x46, 0x53, 0x41, 0x5a, 0x41, 0x42, 0x37, 0x41, + 0x4c, 0x43, 0x41, 0x77, 0x41, 0x44, 0x63, 0x67, 0x51, 0x47, 0x42, + 0x4c, 0x59, 0x46, 0x59, 0x67, 0x57, 0x69, 0x42, 0x68, 0x6f, 0x47, + 0x52, 0x41, 0x5a, 0x77, 0x42, 0x73, 0x77, 0x47, 0x2f, 0x41, 0x6a, + 0x55, 0x43, 0x55, 0x41, 0x4a, 0x63, 0x67, 0x6f, 0x47, 0x43, 0x73, + 0x59, 0x4c, 0x43, 0x67, 0x76, 0x65, 0x44, 0x41, 0x59, 0x4d, 0x4c, + 0x41, 0x78, 0x55, 0x44, 0x48, 0x77, 0x4d, 0x78, 0x41, 0x31, 0x6b, + 0x44, 0x64, 0x59, 0x4f, 0x53, 0x41, 0x36, 0x47, 0x44, 0x73, 0x51, + 0x50, 0x43, 0x67, 0x39, 0x6b, 0x44, 0x35, 0x51, 0x50, 0x2f, 0x42, + 0x41, 0x73, 0x45, 0x4a, 0x77, 0x51, 0x39, 0x68, 0x46, 0x51, 0x45, + 0x66, 0x67, 0x53, 0x46, 0x68, 0x4b, 0x4f, 0x45, 0x79, 0x59, 0x54, + 0x32, 0x67, 0x41, 0x42, 0x41, 0x41, 0x41, 0x41, 0x4d, 0x77, 0x46, + 0x56, 0x41, 0x41, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x49, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x44, 0x67, 0x43, 0x75, 0x41, 0x41, 0x45, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x45, 0x41, 0x41, 0x67, + 0x41, 0x41, 0x41, 0x41, 0x45, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x49, 0x41, 0x42, 0x77, 0x41, 0x7a, 0x41, 0x41, 0x45, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x4d, 0x41, 0x41, 0x67, 0x41, + 0x6e, 0x41, 0x41, 0x45, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x51, 0x41, 0x41, 0x67, 0x42, 0x49, 0x41, 0x41, 0x45, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x55, 0x41, 0x43, 0x77, 0x41, 0x47, + 0x41, 0x41, 0x45, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x59, + 0x41, 0x41, 0x67, 0x41, 0x74, 0x41, 0x41, 0x45, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x6f, 0x41, 0x47, 0x67, 0x42, 0x4f, 0x41, + 0x41, 0x4d, 0x41, 0x41, 0x51, 0x51, 0x4a, 0x41, 0x41, 0x45, 0x41, + 0x42, 0x41, 0x41, 0x43, 0x41, 0x41, 0x4d, 0x41, 0x41, 0x51, 0x51, + 0x4a, 0x41, 0x41, 0x49, 0x41, 0x44, 0x67, 0x41, 0x36, 0x41, 0x41, + 0x4d, 0x41, 0x41, 0x51, 0x51, 0x4a, 0x41, 0x41, 0x4d, 0x41, 0x42, + 0x41, 0x41, 0x70, 0x41, 0x41, 0x4d, 0x41, 0x41, 0x51, 0x51, 0x4a, + 0x41, 0x41, 0x51, 0x41, 0x42, 0x41, 0x42, 0x4b, 0x41, 0x41, 0x4d, + 0x41, 0x41, 0x51, 0x51, 0x4a, 0x41, 0x41, 0x55, 0x41, 0x46, 0x67, + 0x41, 0x52, 0x41, 0x41, 0x4d, 0x41, 0x41, 0x51, 0x51, 0x4a, 0x41, + 0x41, 0x59, 0x41, 0x42, 0x41, 0x41, 0x76, 0x41, 0x41, 0x4d, 0x41, + 0x41, 0x51, 0x51, 0x4a, 0x41, 0x41, 0x6f, 0x41, 0x4e, 0x41, 0x42, + 0x6f, 0x5a, 0x6d, 0x45, 0x41, 0x5a, 0x67, 0x42, 0x68, 0x56, 0x6d, + 0x56, 0x79, 0x63, 0x32, 0x6c, 0x76, 0x62, 0x69, 0x41, 0x78, 0x4c, + 0x6a, 0x41, 0x41, 0x56, 0x67, 0x42, 0x6c, 0x41, 0x48, 0x49, 0x41, + 0x63, 0x77, 0x42, 0x70, 0x41, 0x47, 0x38, 0x41, 0x62, 0x67, 0x41, + 0x67, 0x41, 0x44, 0x45, 0x41, 0x4c, 0x67, 0x41, 0x77, 0x5a, 0x6d, + 0x45, 0x41, 0x5a, 0x67, 0x42, 0x68, 0x5a, 0x6d, 0x45, 0x41, 0x5a, + 0x67, 0x42, 0x68, 0x55, 0x6d, 0x56, 0x6e, 0x64, 0x57, 0x78, 0x68, + 0x63, 0x67, 0x42, 0x53, 0x41, 0x47, 0x55, 0x41, 0x5a, 0x77, 0x42, + 0x31, 0x41, 0x47, 0x77, 0x41, 0x59, 0x51, 0x42, 0x79, 0x5a, 0x6d, + 0x45, 0x41, 0x5a, 0x67, 0x42, 0x68, 0x52, 0x6d, 0x39, 0x75, 0x64, + 0x43, 0x42, 0x6e, 0x5a, 0x57, 0x35, 0x6c, 0x63, 0x6d, 0x46, 0x30, + 0x5a, 0x57, 0x51, 0x67, 0x59, 0x6e, 0x6b, 0x67, 0x53, 0x57, 0x4e, + 0x76, 0x54, 0x57, 0x39, 0x76, 0x62, 0x69, 0x34, 0x41, 0x52, 0x67, + 0x42, 0x76, 0x41, 0x47, 0x34, 0x41, 0x64, 0x41, 0x41, 0x67, 0x41, + 0x47, 0x63, 0x41, 0x5a, 0x51, 0x42, 0x75, 0x41, 0x47, 0x55, 0x41, + 0x63, 0x67, 0x42, 0x68, 0x41, 0x48, 0x51, 0x41, 0x5a, 0x51, 0x42, + 0x6b, 0x41, 0x43, 0x41, 0x41, 0x59, 0x67, 0x42, 0x35, 0x41, 0x43, + 0x41, 0x41, 0x53, 0x51, 0x42, 0x6a, 0x41, 0x47, 0x38, 0x41, 0x54, + 0x51, 0x42, 0x76, 0x41, 0x47, 0x38, 0x41, 0x62, 0x67, 0x41, 0x75, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x77, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x3d, 0x3d, 0x29, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x28, 0x27, 0x77, 0x6f, 0x66, 0x66, 0x27, 0x29, 0x3b, 0x66, + 0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, + 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x3b, 0x66, 0x6f, 0x6e, + 0x74, 0x2d, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3a, 0x20, 0x6e, 0x6f, + 0x72, 0x6d, 0x61, 0x6c, 0x3b, 0x7d, 0x5b, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x5e, 0x3d, 0x22, 0x66, 0x61, 0x2d, 0x22, 0x5d, 0x2c, 0x5b, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x2a, 0x3d, 0x22, 0x20, 0x66, 0x61, + 0x2d, 0x22, 0x5d, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x66, 0x61, + 0x6d, 0x69, 0x6c, 0x79, 0x3a, 0x27, 0x66, 0x61, 0x27, 0x20, 0x21, + 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x3b, 0x73, + 0x70, 0x65, 0x61, 0x6b, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x66, + 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3a, 0x6e, + 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, + 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x6e, 0x6f, 0x72, 0x6d, + 0x61, 0x6c, 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x76, 0x61, 0x72, + 0x69, 0x61, 0x6e, 0x74, 0x3a, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, + 0x3b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x6c, + 0x69, 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, + 0x31, 0x3b, 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x66, + 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x69, + 0x6e, 0x67, 0x3a, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x61, + 0x73, 0x65, 0x64, 0x3b, 0x2d, 0x6d, 0x6f, 0x7a, 0x2d, 0x6f, 0x73, + 0x78, 0x2d, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x6d, 0x6f, 0x6f, + 0x74, 0x68, 0x69, 0x6e, 0x67, 0x3a, 0x67, 0x72, 0x61, 0x79, 0x73, + 0x63, 0x61, 0x6c, 0x65, 0x7d, 0x2e, 0x66, 0x61, 0x2d, 0x73, 0x70, + 0x69, 0x6e, 0x7b, 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, + 0x61, 0x6e, 0x69, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x66, + 0x61, 0x2d, 0x73, 0x70, 0x69, 0x6e, 0x20, 0x32, 0x73, 0x20, 0x69, + 0x6e, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x65, 0x20, 0x6c, 0x69, 0x6e, + 0x65, 0x61, 0x72, 0x3b, 0x61, 0x6e, 0x69, 0x6d, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x3a, 0x66, 0x61, 0x2d, 0x73, 0x70, 0x69, 0x6e, 0x20, + 0x32, 0x73, 0x20, 0x69, 0x6e, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x65, + 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x7d, 0x40, 0x2d, 0x77, + 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x6b, 0x65, 0x79, 0x66, 0x72, + 0x61, 0x6d, 0x65, 0x73, 0x20, 0x22, 0x66, 0x61, 0x2d, 0x73, 0x70, + 0x69, 0x6e, 0x22, 0x7b, 0x30, 0x25, 0x7b, 0x2d, 0x77, 0x65, 0x62, + 0x6b, 0x69, 0x74, 0x2d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, + 0x72, 0x6d, 0x3a, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x28, 0x30, + 0x64, 0x65, 0x67, 0x29, 0x3b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x6f, 0x72, 0x6d, 0x3a, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x28, + 0x30, 0x64, 0x65, 0x67, 0x29, 0x3b, 0x7d, 0x31, 0x30, 0x30, 0x25, + 0x7b, 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x3a, 0x72, 0x6f, 0x74, + 0x61, 0x74, 0x65, 0x28, 0x33, 0x35, 0x39, 0x64, 0x65, 0x67, 0x29, + 0x3b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x3a, + 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x28, 0x33, 0x35, 0x39, 0x64, + 0x65, 0x67, 0x29, 0x3b, 0x7d, 0x7d, 0x40, 0x6b, 0x65, 0x79, 0x66, + 0x72, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x22, 0x66, 0x61, 0x2d, 0x73, + 0x70, 0x69, 0x6e, 0x22, 0x7b, 0x30, 0x25, 0x7b, 0x2d, 0x77, 0x65, + 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x6f, 0x72, 0x6d, 0x3a, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x28, + 0x30, 0x64, 0x65, 0x67, 0x29, 0x3b, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x3a, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, + 0x28, 0x30, 0x64, 0x65, 0x67, 0x29, 0x3b, 0x7d, 0x31, 0x30, 0x30, + 0x25, 0x7b, 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x3a, 0x72, 0x6f, + 0x74, 0x61, 0x74, 0x65, 0x28, 0x33, 0x35, 0x39, 0x64, 0x65, 0x67, + 0x29, 0x3b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x3a, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x28, 0x33, 0x35, 0x39, + 0x64, 0x65, 0x67, 0x29, 0x3b, 0x7d, 0x7d, 0x2e, 0x66, 0x61, 0x2d, + 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, 0x2d, 0x6f, 0x3a, 0x62, 0x65, + 0x66, 0x6f, 0x72, 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x3a, 0x22, 0x5c, 0x66, 0x30, 0x39, 0x36, 0x22, 0x3b, 0x7d, + 0x2e, 0x66, 0x61, 0x2d, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x62, 0x65, + 0x66, 0x6f, 0x72, 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x3a, 0x22, 0x5c, 0x66, 0x30, 0x30, 0x37, 0x22, 0x7d, 0x2e, + 0x66, 0x61, 0x2d, 0x74, 0x68, 0x2d, 0x6c, 0x61, 0x72, 0x67, 0x65, + 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x7b, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, 0x5c, 0x66, 0x30, 0x30, 0x39, + 0x22, 0x7d, 0x2e, 0x66, 0x61, 0x2d, 0x74, 0x68, 0x2d, 0x6c, 0x69, + 0x73, 0x74, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x7b, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, 0x5c, 0x66, 0x30, + 0x30, 0x62, 0x22, 0x7d, 0x2e, 0x66, 0x61, 0x2d, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x7b, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, 0x5c, 0x66, 0x30, + 0x30, 0x63, 0x22, 0x7d, 0x2e, 0x66, 0x61, 0x2d, 0x63, 0x6c, 0x6f, + 0x73, 0x65, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x7b, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, 0x5c, 0x66, 0x30, + 0x30, 0x64, 0x22, 0x7d, 0x2e, 0x66, 0x61, 0x2d, 0x72, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x7b, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, 0x5c, 0x66, + 0x30, 0x30, 0x64, 0x22, 0x7d, 0x2e, 0x66, 0x61, 0x2d, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x7b, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, 0x5c, 0x66, + 0x30, 0x30, 0x64, 0x22, 0x7d, 0x2e, 0x66, 0x61, 0x2d, 0x63, 0x6f, + 0x67, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x7b, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, 0x5c, 0x66, 0x30, 0x31, + 0x33, 0x22, 0x7d, 0x2e, 0x66, 0x61, 0x2d, 0x67, 0x65, 0x61, 0x72, + 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x7b, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, 0x5c, 0x66, 0x30, 0x31, 0x33, + 0x22, 0x7d, 0x2e, 0x66, 0x61, 0x2d, 0x66, 0x69, 0x6c, 0x65, 0x2d, + 0x6f, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x7b, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, 0x5c, 0x66, 0x30, 0x31, + 0x36, 0x22, 0x7d, 0x2e, 0x66, 0x61, 0x2d, 0x63, 0x6c, 0x6f, 0x63, + 0x6b, 0x2d, 0x6f, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x7b, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, 0x5c, 0x66, + 0x30, 0x31, 0x37, 0x22, 0x7d, 0x2e, 0x66, 0x61, 0x2d, 0x72, 0x65, + 0x66, 0x72, 0x65, 0x73, 0x68, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, + 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, + 0x5c, 0x66, 0x30, 0x32, 0x31, 0x22, 0x7d, 0x2e, 0x66, 0x61, 0x2d, + 0x6c, 0x69, 0x73, 0x74, 0x2d, 0x61, 0x6c, 0x74, 0x3a, 0x62, 0x65, + 0x66, 0x6f, 0x72, 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x3a, 0x22, 0x5c, 0x66, 0x30, 0x32, 0x32, 0x22, 0x7d, 0x2e, + 0x66, 0x61, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x62, 0x65, 0x66, + 0x6f, 0x72, 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x3a, 0x22, 0x5c, 0x66, 0x30, 0x33, 0x61, 0x22, 0x7d, 0x2e, 0x66, + 0x61, 0x2d, 0x6d, 0x61, 0x70, 0x2d, 0x6d, 0x61, 0x72, 0x6b, 0x65, + 0x72, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x7b, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, 0x5c, 0x66, 0x30, 0x34, + 0x31, 0x22, 0x7d, 0x2e, 0x66, 0x61, 0x2d, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x2d, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, 0x2d, 0x6f, 0x3a, + 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x3a, 0x22, 0x5c, 0x66, 0x30, 0x34, 0x36, 0x22, + 0x7d, 0x2e, 0x66, 0x61, 0x2d, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, + 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x62, 0x65, 0x66, 0x6f, + 0x72, 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, + 0x22, 0x5c, 0x66, 0x30, 0x35, 0x33, 0x22, 0x7d, 0x2e, 0x66, 0x61, + 0x2d, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x2d, 0x72, 0x69, + 0x67, 0x68, 0x74, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x7b, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, 0x5c, 0x66, + 0x30, 0x35, 0x34, 0x22, 0x7d, 0x2e, 0x66, 0x61, 0x2d, 0x65, 0x78, + 0x63, 0x6c, 0x61, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x74, + 0x72, 0x69, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x3a, 0x62, 0x65, 0x66, + 0x6f, 0x72, 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x3a, 0x22, 0x5c, 0x66, 0x30, 0x37, 0x31, 0x22, 0x7d, 0x2e, 0x66, + 0x61, 0x2d, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x3a, 0x62, + 0x65, 0x66, 0x6f, 0x72, 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x3a, 0x22, 0x5c, 0x66, 0x30, 0x37, 0x31, 0x22, 0x7d, + 0x2e, 0x66, 0x61, 0x2d, 0x62, 0x61, 0x72, 0x2d, 0x63, 0x68, 0x61, + 0x72, 0x74, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x7b, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, 0x5c, 0x66, 0x30, + 0x38, 0x30, 0x22, 0x7d, 0x2e, 0x66, 0x61, 0x2d, 0x62, 0x61, 0x72, + 0x2d, 0x63, 0x68, 0x61, 0x72, 0x74, 0x2d, 0x6f, 0x3a, 0x62, 0x65, + 0x66, 0x6f, 0x72, 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x3a, 0x22, 0x5c, 0x66, 0x30, 0x38, 0x30, 0x22, 0x7d, 0x2e, + 0x66, 0x61, 0x2d, 0x63, 0x6f, 0x67, 0x73, 0x3a, 0x62, 0x65, 0x66, + 0x6f, 0x72, 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x3a, 0x22, 0x5c, 0x66, 0x30, 0x38, 0x35, 0x22, 0x7d, 0x2e, 0x66, + 0x61, 0x2d, 0x67, 0x65, 0x61, 0x72, 0x73, 0x3a, 0x62, 0x65, 0x66, + 0x6f, 0x72, 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x3a, 0x22, 0x5c, 0x66, 0x30, 0x38, 0x35, 0x22, 0x7d, 0x2e, 0x66, + 0x61, 0x2d, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2d, + 0x6c, 0x69, 0x6e, 0x6b, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, + 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, 0x5c, + 0x66, 0x30, 0x38, 0x65, 0x22, 0x7d, 0x2e, 0x66, 0x61, 0x2d, 0x62, + 0x65, 0x6c, 0x6c, 0x2d, 0x6f, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, + 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, + 0x5c, 0x66, 0x30, 0x61, 0x32, 0x22, 0x7d, 0x2e, 0x66, 0x61, 0x2d, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, + 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, + 0x5c, 0x66, 0x30, 0x63, 0x30, 0x22, 0x7d, 0x2e, 0x66, 0x61, 0x2d, + 0x75, 0x73, 0x65, 0x72, 0x73, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, + 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, + 0x5c, 0x66, 0x30, 0x63, 0x30, 0x22, 0x7d, 0x2e, 0x66, 0x61, 0x2d, + 0x62, 0x61, 0x72, 0x73, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, + 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, 0x5c, + 0x66, 0x30, 0x63, 0x39, 0x22, 0x7d, 0x2e, 0x66, 0x61, 0x2d, 0x6e, + 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x3a, 0x62, 0x65, 0x66, 0x6f, + 0x72, 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, + 0x22, 0x5c, 0x66, 0x30, 0x63, 0x39, 0x22, 0x7d, 0x2e, 0x66, 0x61, + 0x2d, 0x72, 0x65, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x62, 0x65, + 0x66, 0x6f, 0x72, 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x3a, 0x22, 0x5c, 0x66, 0x30, 0x63, 0x39, 0x22, 0x7d, 0x2e, + 0x66, 0x61, 0x2d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x62, 0x65, + 0x66, 0x6f, 0x72, 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x3a, 0x22, 0x5c, 0x66, 0x30, 0x63, 0x65, 0x22, 0x7d, 0x2e, + 0x66, 0x61, 0x2d, 0x63, 0x61, 0x72, 0x65, 0x74, 0x2d, 0x64, 0x6f, + 0x77, 0x6e, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x7b, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, 0x5c, 0x66, 0x30, + 0x64, 0x37, 0x22, 0x7d, 0x2e, 0x66, 0x61, 0x2d, 0x63, 0x61, 0x72, + 0x65, 0x74, 0x2d, 0x75, 0x70, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, + 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, + 0x5c, 0x66, 0x30, 0x64, 0x38, 0x22, 0x7d, 0x2e, 0x66, 0x61, 0x2d, + 0x63, 0x61, 0x72, 0x65, 0x74, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, + 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x3a, 0x22, 0x5c, 0x66, 0x30, 0x64, 0x39, 0x22, + 0x7d, 0x2e, 0x66, 0x61, 0x2d, 0x63, 0x61, 0x72, 0x65, 0x74, 0x2d, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, + 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, + 0x5c, 0x66, 0x30, 0x64, 0x61, 0x22, 0x7d, 0x2e, 0x66, 0x61, 0x2d, + 0x73, 0x6f, 0x72, 0x74, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, + 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, 0x5c, + 0x66, 0x30, 0x64, 0x63, 0x22, 0x7d, 0x2e, 0x66, 0x61, 0x2d, 0x75, + 0x6e, 0x73, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x3a, 0x62, 0x65, 0x66, + 0x6f, 0x72, 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x3a, 0x22, 0x5c, 0x66, 0x30, 0x64, 0x63, 0x22, 0x7d, 0x2e, 0x66, + 0x61, 0x2d, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, + 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x7b, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, 0x5c, 0x66, 0x30, 0x65, 0x34, + 0x22, 0x7d, 0x2e, 0x66, 0x61, 0x2d, 0x74, 0x61, 0x63, 0x68, 0x6f, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, + 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, + 0x5c, 0x66, 0x30, 0x65, 0x34, 0x22, 0x7d, 0x2e, 0x66, 0x61, 0x2d, + 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x2d, 0x64, 0x6f, 0x75, 0x62, 0x6c, + 0x65, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x62, 0x65, 0x66, 0x6f, + 0x72, 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, + 0x22, 0x5c, 0x66, 0x31, 0x30, 0x30, 0x22, 0x7d, 0x2e, 0x66, 0x61, + 0x2d, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x2d, 0x64, 0x6f, 0x75, 0x62, + 0x6c, 0x65, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x62, 0x65, + 0x66, 0x6f, 0x72, 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x3a, 0x22, 0x5c, 0x66, 0x31, 0x30, 0x31, 0x22, 0x7d, 0x2e, + 0x66, 0x61, 0x2d, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x2d, 0x6c, 0x65, + 0x66, 0x74, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x7b, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, 0x5c, 0x66, 0x31, + 0x30, 0x34, 0x22, 0x7d, 0x2e, 0x66, 0x61, 0x2d, 0x61, 0x6e, 0x67, + 0x6c, 0x65, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x62, 0x65, + 0x66, 0x6f, 0x72, 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x3a, 0x22, 0x5c, 0x66, 0x31, 0x30, 0x35, 0x22, 0x7d, 0x2e, + 0x66, 0x61, 0x2d, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x3a, + 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x3a, 0x22, 0x5c, 0x66, 0x31, 0x30, 0x38, 0x22, + 0x7d, 0x2e, 0x66, 0x61, 0x2d, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, + 0x2d, 0x6f, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x7b, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, 0x5c, 0x66, 0x31, + 0x30, 0x63, 0x22, 0x7d, 0x2e, 0x66, 0x61, 0x2d, 0x63, 0x69, 0x72, + 0x63, 0x6c, 0x65, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x7b, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, 0x5c, 0x66, + 0x31, 0x31, 0x31, 0x22, 0x7d, 0x2e, 0x66, 0x61, 0x2d, 0x63, 0x6f, + 0x64, 0x65, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x7b, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, 0x5c, 0x66, 0x31, + 0x32, 0x31, 0x22, 0x7d, 0x2e, 0x66, 0x61, 0x2d, 0x66, 0x69, 0x6c, + 0x65, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x7b, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, 0x5c, 0x66, 0x31, 0x35, + 0x62, 0x22, 0x7d, 0x2e, 0x66, 0x61, 0x2d, 0x66, 0x69, 0x6c, 0x65, + 0x2d, 0x74, 0x65, 0x78, 0x74, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, + 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, + 0x5c, 0x66, 0x31, 0x35, 0x63, 0x22, 0x7d, 0x2e, 0x66, 0x61, 0x2d, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x62, 0x65, 0x66, 0x6f, + 0x72, 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, + 0x22, 0x5c, 0x66, 0x31, 0x61, 0x30, 0x22, 0x7d, 0x2e, 0x66, 0x61, + 0x2d, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x2d, 0x6f, 0x2d, 0x6e, + 0x6f, 0x74, 0x63, 0x68, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, + 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, 0x5c, + 0x66, 0x31, 0x63, 0x65, 0x22, 0x7d, 0x2e, 0x66, 0x61, 0x2d, 0x62, + 0x65, 0x6c, 0x6c, 0x2d, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2d, 0x6f, + 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x7b, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, 0x5c, 0x66, 0x31, 0x66, 0x37, + 0x22, 0x7d, 0x2e, 0x66, 0x61, 0x2d, 0x61, 0x72, 0x65, 0x61, 0x2d, + 0x63, 0x68, 0x61, 0x72, 0x74, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, + 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x22, + 0x5c, 0x66, 0x31, 0x66, 0x65, 0x22, 0x7d, 0x2e, 0x66, 0x61, 0x2d, + 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x3a, 0x62, 0x65, 0x66, 0x6f, + 0x72, 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, + 0x22, 0x5c, 0x66, 0x32, 0x36, 0x38, 0x22, 0x7d, 0x2e, 0x66, 0x61, + 0x2d, 0x68, 0x61, 0x73, 0x68, 0x74, 0x61, 0x67, 0x3a, 0x62, 0x65, + 0x66, 0x6f, 0x72, 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x3a, 0x22, 0x5c, 0x66, 0x32, 0x39, 0x32, 0x22, 0x7d, 0x2e, + 0x66, 0x61, 0x2d, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, + 0x2d, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x2d, 0x6f, 0x3a, 0x62, + 0x65, 0x66, 0x6f, 0x72, 0x65, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x3a, 0x22, 0x5c, 0x66, 0x32, 0x39, 0x63, 0x22, 0x7d, + 0x00 +}; + +const int fa_css_length = 18459; diff --git a/goaccess++/src/gdashboard.c b/goaccess++/src/gdashboard.c new file mode 100644 index 0000000..64d15ff --- /dev/null +++ b/goaccess++/src/gdashboard.c @@ -0,0 +1,1510 @@ +/** + * gdashboard.c -- goaccess main dashboard + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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. + */ + +#define _XOPEN_SOURCE 700 + +#include <ctype.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <sys/types.h> +#include <regex.h> + +#include "gdashboard.h" + +#ifdef HAVE_LIBTOKYOCABINET +#include "tcabdb.h" +#else +#include "gkhash.h" +#endif + +#include "color.h" +#include "error.h" +#include "gstorage.h" +#include "util.h" +#include "xmalloc.h" + +static GFind find_t; + +/* Reset find indices */ +void +reset_find (void) +{ + if (find_t.pattern != NULL && *find_t.pattern != '\0') + free (find_t.pattern); + + find_t.look_in_sub = 0; + find_t.module = 0; + find_t.next_idx = 0; /* next total index */ + find_t.next_parent_idx = 0; /* next parent index */ + find_t.next_sub_idx = 0; /* next sub item index */ + find_t.pattern = NULL; +} + +/* Allocate memory for a new GDash instance. + * + * On success, the newly allocated GDash is returned . */ +GDash * +new_gdash (void) +{ + GDash *dash = xmalloc (sizeof (GDash)); + memset (dash, 0, sizeof *dash); + dash->total_alloc = 0; + + return dash; +} + +/* Allocate memory for a new GDashData instance. + * + * On success, the newly allocated GDashData is returned . */ +GDashData * +new_gdata (uint32_t size) +{ + GDashData *data = xcalloc (size, sizeof (GDashData)); + + return data; +} + +/* Free memory allocated for a GDashData instance. Includes malloc'd + * strings. */ +static void +free_dashboard_data (GDashData item) +{ + if (item.metrics == NULL) + return; + + if (item.metrics->data) + free (item.metrics->data); + if (item.metrics->bw.sbw) + free (item.metrics->bw.sbw); + if (conf.serve_usecs && item.metrics->avgts.sts) + free (item.metrics->avgts.sts); + if (conf.serve_usecs && item.metrics->cumts.sts) + free (item.metrics->cumts.sts); + if (conf.serve_usecs && item.metrics->maxts.sts) + free (item.metrics->maxts.sts); + free (item.metrics); +} + +/* Free memory allocated for a GDash instance, and nested structure + * data. */ +void +free_dashboard (GDash * dash) +{ + GModule module; + int j; + size_t idx = 0; + + FOREACH_MODULE (idx, module_list) { + module = module_list[idx]; + for (j = 0; j < dash->module[module].alloc_data; j++) { + free_dashboard_data (dash->module[module].data[j]); + } + free (dash->module[module].data); + } + free (dash); +} + +/* Get the current panel/module given the `Y` offset (position) in the + * terminal dashboard. + * + * If not found, 0 is returned. + * If found, the module number is returned . */ +static GModule +get_find_current_module (GDash * dash, int offset) +{ + GModule module; + size_t idx = 0; + + FOREACH_MODULE (idx, module_list) { + module = module_list[idx]; + + /* set current module */ + if (dash->module[module].pos_y == offset) + return module; + /* we went over by one module, set current - 1 */ + if (dash->module[module].pos_y > offset) + return module - 1; + } + + return 0; +} + +/* Get the number of rows that a collapsed dashboard panel contains. + * + * On success, the number of rows is returned. */ +int +get_num_collapsed_data_rows (void) +{ + /* The default number of rows is fixed */ + int size = DASH_COLLAPSED - DASH_NON_DATA; + /* If no column names, then add the number of rows occupied by the + * column values to the default number */ + return conf.no_column_names ? size + DASH_COL_ROWS : size; +} + +/* Get the number of rows that an expanded dashboard panel contains. + * + * On success, the number of rows is returned. */ +int +get_num_expanded_data_rows (void) +{ + /* The default number of rows is fixed */ + int size = DASH_EXPANDED - DASH_NON_DATA; + /* If no column names, then add the number of rows occupied by the + * column values to the default number */ + return conf.no_column_names ? size + DASH_COL_ROWS : size; +} + +/* Get the Y position of the terminal dashboard where data rows + * (metrics) start. + * + * On success, the Y position is returned. */ +static int +get_data_pos_rows (void) +{ + return conf.no_column_names ? DASH_DATA_POS - DASH_COL_ROWS : DASH_DATA_POS; +} + +/* Get the initial X position of the terminal dashboard where metrics + * and data columns start. + * + * On success, the X position is returned. */ +static int +get_xpos (void) +{ + return DASH_INIT_X; +} + +/* Determine which module should be expanded given the current mouse + * position. + * + * On error, 1 is returned. + * On success, 0 is returned. */ +int +set_module_from_mouse_event (GScroll * gscroll, GDash * dash, int y) +{ + int module = 0; + int offset = y - MAX_HEIGHT_HEADER - MAX_HEIGHT_FOOTER + 1; + if (gscroll->expanded) { + module = get_find_current_module (dash, offset); + } else { + offset += gscroll->dash; + module = offset / DASH_COLLAPSED; + } + + if (module >= TOTAL_MODULES) + module = TOTAL_MODULES - 1; + else if (module < 0) + module = 0; + + if ((int) gscroll->current == module) + return 1; + + gscroll->current = module; + return 0; +} + +/* Allocate a new string for a sub item on the terminal dashboard. + * + * On error, NULL is returned. + * On success, the newly allocated string is returned. */ +static char * +render_child_node (const char *data) +{ + char *buf; + int len = 0; + + /* chars to use based on encoding used */ +#ifdef HAVE_LIBNCURSESW + const char *bend = "\xe2\x94\x9c"; + const char *horz = "\xe2\x94\x80"; +#else + const char *bend = "|"; + const char *horz = "`-"; +#endif + + if (data == NULL || *data == '\0') + return NULL; + + len = snprintf (NULL, 0, " %s%s %s", bend, horz, data); + buf = xmalloc (len + 3); + sprintf (buf, " %s%s %s", bend, horz, data); + + return buf; +} + +/* Get a string of bars given current hits, maximum hit & xpos. + * + * On success, the newly allocated string representing the chart is + * returned. */ +static char * +get_bars (int n, int max, int x) +{ + int w, h; + float len = 0.0; + + getmaxyx (stdscr, h, w); + (void) h; /* avoid lint warning */ + + len = ((((float) n) / max)); + len *= (w - x); + if (len < 1) + len = 1; + return char_repeat (len, '|'); +} + +/* Set largest hits metric (length of the integer). */ +static void +set_max_hit_len (GDashMeta * meta, GDashData * idata) +{ + int vlen = intlen (idata->metrics->hits); + int llen = strlen (MTRC_HITS_LBL); + + if (vlen > meta->hits_len) + meta->hits_len = vlen; + + /* if outputting with column names, then determine if the value is + * longer than the length of the column name */ + if (llen > meta->hits_len) + meta->hits_len = llen; +} + +/* Get the percent integer length. */ +static void +set_max_hit_perc_len (GDashMeta * meta, GDashData * idata) +{ + int vlen = intlen (idata->metrics->hits_perc); + int llen = strlen (MTRC_HITS_PERC_LBL); + + if (vlen > meta->hits_perc_len) + meta->hits_perc_len = vlen; + + /* if outputting with column names, then determine if the value is + * longer than the length of the column name */ + if (llen > meta->hits_perc_len) + meta->hits_perc_len = llen; +} + +/* Set largest hits metric (length of the integer). */ +static void +set_max_visitors_len (GDashMeta * meta, GDashData * idata) +{ + int vlen = intlen (idata->metrics->visitors); + int llen = strlen (MTRC_VISITORS_SHORT_LBL); + + if (vlen > meta->visitors_len) + meta->visitors_len = vlen; + + /* if outputting with column names, then determine if the value is + * longer than the length of the column name */ + if (llen > meta->visitors_len) + meta->visitors_len = llen; +} + +/* Get the percent integer length. */ +static void +set_max_visitors_perc_len (GDashMeta * meta, GDashData * idata) +{ + int vlen = intlen (idata->metrics->visitors_perc); + int llen = strlen (MTRC_VISITORS_PERC_LBL); + + if (vlen > meta->visitors_perc_len) + meta->visitors_perc_len = vlen; + + /* if outputting with column names, then determine if the value is + * longer than the length of the column name */ + if (llen > meta->visitors_perc_len) + meta->visitors_perc_len = llen; +} + +/* Get the percent integer length. */ +static void +set_max_bw_len (GDashMeta * meta, GDashData * idata) +{ + int vlen = strlen (idata->metrics->bw.sbw); + int llen = strlen (MTRC_BW_LBL); + + if (vlen > meta->bw_len) + meta->bw_len = vlen; + + /* if outputting with column names, then determine if the value is + * longer than the length of the column name */ + if (llen > meta->bw_len) + meta->bw_len = llen; +} + +/* Get the percent integer length. */ +static void +set_max_avgts_len (GDashMeta * meta, GDashData * idata) +{ + int vlen = 0, llen = 0; + + if (!conf.serve_usecs || !idata->metrics->avgts.sts) + return; + + vlen = strlen (idata->metrics->avgts.sts); + llen = strlen (MTRC_AVGTS_LBL); + + if (vlen > meta->avgts_len) + meta->avgts_len = vlen; + + /* if outputting with column names, then determine if the value is + * longer than the length of the column name */ + if (llen > meta->avgts_len) + meta->avgts_len = llen; +} + +/* Get the percent integer length. */ +static void +set_max_cumts_len (GDashMeta * meta, GDashData * idata) +{ + int vlen = 0, llen = 0; + + if (!conf.serve_usecs || !idata->metrics->cumts.sts) + return; + + vlen = strlen (idata->metrics->cumts.sts); + llen = strlen (MTRC_AVGTS_LBL); + + if (vlen > meta->cumts_len) + meta->cumts_len = vlen; + + /* if outputting with column names, then determine if the value is + * longer than the length of the column name */ + if (llen > meta->cumts_len) + meta->cumts_len = llen; +} + +/* Get the percent integer length. */ +static void +set_max_maxts_len (GDashMeta * meta, GDashData * idata) +{ + int vlen = 0, llen = 0; + + if (!conf.serve_usecs || !idata->metrics->maxts.sts) + return; + + vlen = strlen (idata->metrics->maxts.sts); + llen = strlen (MTRC_AVGTS_LBL); + + if (vlen > meta->maxts_len) + meta->maxts_len = vlen; + + /* if outputting with column names, then determine if the value is + * longer than the length of the column name */ + if (llen > meta->maxts_len) + meta->maxts_len = llen; +} + +/* Get the percent integer length. */ +static void +set_max_method_len (GDashMeta * meta, GDashData * idata) +{ + int vlen = 0, llen = 0; + + if (!conf.append_method || !idata->metrics->method) + return; + + vlen = strlen (idata->metrics->method); + llen = strlen (MTRC_METHODS_SHORT_LBL); + + if (vlen > meta->method_len) + meta->method_len = vlen; + + /* if outputting with column names, then determine if the value is + * longer than the length of the column name */ + if (llen > meta->method_len) + meta->method_len = llen; +} + +/* Get the percent integer length. */ +static void +set_max_protocol_len (GDashMeta * meta, GDashData * idata) +{ + int vlen = 0, llen = 0; + + if (!conf.append_protocol || !idata->metrics->protocol) + return; + + vlen = strlen (idata->metrics->protocol); + llen = strlen (MTRC_PROTOCOLS_SHORT_LBL); + + if (vlen > meta->protocol_len) + meta->protocol_len = vlen; + + /* if outputting with column names, then determine if the value is + * longer than the length of the column name */ + if (llen > meta->protocol_len) + meta->protocol_len = llen; +} + +/* Get the percent integer length. */ +static void +set_max_data_len (GDashMeta * meta, GDashData * idata) +{ + int vlen = 0, llen = 0; + + vlen = strlen (idata->metrics->data); + llen = strlen (MTRC_DATA_LBL); + + if (vlen > meta->data_len) + meta->data_len = vlen; + + /* if outputting with column names, then determine if the value is + * longer than the length of the column name */ + if (llen > meta->data_len) + meta->data_len = llen; +} + +static void +set_max_values (GDashMeta * meta, GMetrics * metrics) +{ + if (metrics->hits > meta->max_hits) + meta->max_hits = metrics->hits; + if (metrics->visitors > meta->max_visitors) + meta->max_visitors = metrics->visitors; +} + +static void +set_metrics_len (GDashMeta * meta, GDashData * idata) +{ + /* integer-based length */ + set_max_hit_len (meta, idata); + set_max_hit_perc_len (meta, idata); + set_max_visitors_len (meta, idata); + set_max_visitors_perc_len (meta, idata); + + /* string-based length */ + set_max_bw_len (meta, idata); + set_max_avgts_len (meta, idata); + set_max_cumts_len (meta, idata); + set_max_maxts_len (meta, idata); + + set_max_method_len (meta, idata); + set_max_protocol_len (meta, idata); + set_max_data_len (meta, idata); +} + +/* Render host's panel selected row */ +static void +render_data_hosts (WINDOW * win, GDashRender render, char *value, int x) +{ + char *padded_data; + + padded_data = left_pad_str (value, x); + draw_header (win, padded_data, "%s", render.y, 0, render.w, color_selected); + free (padded_data); +} + +/* Set panel's date on the given buffer + * + * On error, '---' placeholder is returned. + * On success, the formatted date is returned. */ +static char * +set_visitors_date (const char *value) +{ + return get_visitors_date (value, conf.spec_date_time_num_format, + conf.spec_date_time_format); +} + +static char * +get_fixed_fmt_width (int w, char type) +{ + char *fmt = xmalloc (snprintf (NULL, 0, "%%%d%c", w, type) + 1); + sprintf (fmt, "%%%d%c", w, type); + + return fmt; +} + +/* Render the 'total' label on each panel */ +static void +render_total_label (WINDOW * win, GDashModule * data, int y, + GColors * (*func) (void)) +{ + char *s; + int win_h, win_w, total, ht_size; + + total = data->holder_size; + ht_size = data->ht_size; + + s = xmalloc (snprintf (NULL, 0, "%s: %d/%d", GEN_TOTAL, total, ht_size) + 1); + getmaxyx (win, win_h, win_w); + (void) win_h; + + sprintf (s, "%s: %d/%d", GEN_TOTAL, total, ht_size); + draw_header (win, s, "%s", y, win_w - strlen (s) - 2, win_w, func); + free (s); +} + +/* Render panel bar graph */ +static void +render_bars (GDashModule * data, GDashRender render, int *x) +{ + GColors *color = get_color (COLOR_BARS); + WINDOW *win = render.win; + char *bar; + int y = render.y, w = render.w, idx = render.idx, sel = render.sel; + + bar = get_bars (data->data[idx].metrics->hits, data->meta.max_hits, *x); + if (sel) + draw_header (win, bar, "%s", y, *x, w, color_selected); + else { + wattron (win, color->attr | COLOR_PAIR (color->pair->idx)); + mvwprintw (win, y, *x, "%s", bar); + wattroff (win, color->attr | COLOR_PAIR (color->pair->idx)); + } + free (bar); +} + +/* Render the data metric for each panel */ +static void +render_data (GDashModule * data, GDashRender render, int *x) +{ + GColors *color = get_color_by_item_module (COLOR_MTRC_DATA, data->module); + WINDOW *win = render.win; + + char *date = NULL, *value = NULL, *buf = NULL; + int y = render.y, w = render.w, idx = render.idx, sel = render.sel; + int date_len = 0; + + value = substring (data->data[idx].metrics->data, 0, w - *x); + if (data->module == VISITORS) { + date = set_visitors_date (value); + date_len = strlen (date); + } + + if (sel && data->module == HOSTS && data->data[idx].is_subitem) { + render_data_hosts (win, render, value, *x); + } else if (sel) { + buf = data->module == VISITORS ? date : value; + draw_header (win, buf, "%s", y, *x, w, color_selected); + } else { + wattron (win, color->attr | COLOR_PAIR (color->pair->idx)); + mvwprintw (win, y, *x, "%s", data->module == VISITORS ? date : value); + wattroff (win, color->attr | COLOR_PAIR (color->pair->idx)); + } + + *x += data->module == VISITORS ? date_len : data->meta.data_len; + *x += DASH_SPACE; + free (value); + free (date); +} + +/* Render the method metric for each panel + * + * On error, no method is rendered and it returns. + * On success, method is rendered. */ +static void +render_method (GDashModule * data, GDashRender render, int *x) +{ + GColors *color = get_color_by_item_module (COLOR_MTRC_MTHD, data->module); + WINDOW *win = render.win; + + int y = render.y, w = render.w, idx = render.idx, sel = render.sel; + char *method = data->data[idx].metrics->method; + + if (method == NULL || *method == '\0') + return; + + if (sel) { + /* selected state */ + draw_header (win, method, "%s", y, *x, w, color_selected); + } else { + /* regular state */ + wattron (win, color->attr | COLOR_PAIR (color->pair->idx)); + mvwprintw (win, y, *x, "%s", method); + wattroff (win, color->attr | COLOR_PAIR (color->pair->idx)); + } + + *x += data->meta.method_len + DASH_SPACE; +} + +/* Render the protocol metric for each panel + * + * On error, no protocol is rendered and it returns. + * On success, protocol is rendered. */ +static void +render_proto (GDashModule * data, GDashRender render, int *x) +{ + GColors *color = get_color_by_item_module (COLOR_MTRC_PROT, data->module); + WINDOW *win = render.win; + + int y = render.y, w = render.w, idx = render.idx, sel = render.sel; + char *protocol = data->data[idx].metrics->protocol; + + if (protocol == NULL || *protocol == '\0') + return; + + if (sel) { + /* selected state */ + draw_header (win, protocol, "%s", y, *x, w, color_selected); + } else { + /* regular state */ + wattron (win, color->attr | COLOR_PAIR (color->pair->idx)); + mvwprintw (win, y, *x, "%s", protocol); + wattroff (win, color->attr | COLOR_PAIR (color->pair->idx)); + } + + *x += REQ_PROTO_LEN - 1 + DASH_SPACE; +} + +/* Render the average time served metric for each panel */ +static void +render_avgts (GDashModule * data, GDashRender render, int *x) +{ + GColors *color = get_color_by_item_module (COLOR_MTRC_AVGTS, data->module); + WINDOW *win = render.win; + + int y = render.y, w = render.w, idx = render.idx, sel = render.sel; + char *avgts = data->data[idx].metrics->avgts.sts; + + if (data->module == HOSTS && data->data[idx].is_subitem) + goto out; + + if (sel) { + /* selected state */ + draw_header (win, avgts, "%9s", y, *x, w, color_selected); + } else { + /* regular state */ + wattron (win, color->attr | COLOR_PAIR (color->pair->idx)); + mvwprintw (win, y, *x, "%9s", avgts); + wattroff (win, color->attr | COLOR_PAIR (color->pair->idx)); + } + +out: + *x += DASH_SRV_TM_LEN + DASH_SPACE; +} + +/* Render the cumulative time served metric for each panel */ +static void +render_cumts (GDashModule * data, GDashRender render, int *x) +{ + GColors *color = get_color_by_item_module (COLOR_MTRC_CUMTS, data->module); + WINDOW *win = render.win; + + int y = render.y, w = render.w, idx = render.idx, sel = render.sel; + char *cumts = data->data[idx].metrics->cumts.sts; + + if (data->module == HOSTS && data->data[idx].is_subitem) + goto out; + + if (sel) { + /* selected state */ + draw_header (win, cumts, "%9s", y, *x, w, color_selected); + } else { + /* regular state */ + wattron (win, color->attr | COLOR_PAIR (color->pair->idx)); + mvwprintw (win, y, *x, "%9s", cumts); + wattroff (win, color->attr | COLOR_PAIR (color->pair->idx)); + } + +out: + *x += DASH_SRV_TM_LEN + DASH_SPACE; +} + +/* Render the maximum time served metric for each panel */ +static void +render_maxts (GDashModule * data, GDashRender render, int *x) +{ + GColors *color = get_color_by_item_module (COLOR_MTRC_MAXTS, data->module); + WINDOW *win = render.win; + + int y = render.y, w = render.w, idx = render.idx, sel = render.sel; + char *maxts = data->data[idx].metrics->maxts.sts; + + if (data->module == HOSTS && data->data[idx].is_subitem) + goto out; + + if (sel) { + /* selected state */ + draw_header (win, maxts, "%9s", y, *x, w, color_selected); + } else { + /* regular state */ + wattron (win, color->attr | COLOR_PAIR (color->pair->idx)); + mvwprintw (win, y, *x, "%9s", maxts); + wattroff (win, color->attr | COLOR_PAIR (color->pair->idx)); + } + +out: + *x += DASH_SRV_TM_LEN + DASH_SPACE; +} + +/* Render the bandwidth metric for each panel */ +static void +render_bw (GDashModule * data, GDashRender render, int *x) +{ + GColors *color = get_color_by_item_module (COLOR_MTRC_BW, data->module); + WINDOW *win = render.win; + + int y = render.y, w = render.w, idx = render.idx, sel = render.sel; + char *bw = data->data[idx].metrics->bw.sbw; + + if (data->module == HOSTS && data->data[idx].is_subitem) + goto out; + + if (sel) { + char *fw = get_fixed_fmt_width (data->meta.bw_len, 's'); + /* selected state */ + draw_header (win, bw, fw, y, *x, w, color_selected); + free (fw); + } else { + /* regular state */ + wattron (win, color->attr | COLOR_PAIR (color->pair->idx)); + mvwprintw (win, y, *x, "%*s", data->meta.bw_len, bw); + wattroff (win, color->attr | COLOR_PAIR (color->pair->idx)); + } + +out: + *x += data->meta.bw_len + DASH_SPACE; +} + +/* Render a percent metric */ +static void +render_percent (GDashRender render, GColors * color, float perc, int len, int x) +{ + WINDOW *win = render.win; + char *percent; + int y = render.y, w = render.w, sel = render.sel; + + if (sel) { + /* selected state */ + percent = float2str (perc, len); + draw_header (win, percent, "%s%%", y, x, w, color_selected); + free (percent); + } else { + /* regular state */ + wattron (win, color->attr | COLOR_PAIR (color->pair->idx)); + mvwprintw (win, y, x, "%*.2f%%", len, perc); + wattroff (win, color->attr | COLOR_PAIR (color->pair->idx)); + } +} + +/* Render the hits percent metric for each panel */ +static void +render_hits_percent (GDashModule * data, GDashRender render, int *x) +{ + GColorItem item = COLOR_MTRC_HITS_PERC; + GColors *color; + int l = data->meta.hits_perc_len + 3, idx = render.idx; + + if (data->module == HOSTS && data->data[idx].is_subitem) + goto out; + + if (data->meta.max_hits == data->data[idx].metrics->hits) + item = COLOR_MTRC_HITS_PERC_MAX; + + color = get_color_by_item_module (item, data->module); + render_percent (render, color, data->data[idx].metrics->hits_perc, l, *x); + +out: + *x += l + 1 + DASH_SPACE; +} + +/* Render the visitors percent metric for each panel */ +static void +render_visitors_percent (GDashModule * data, GDashRender render, int *x) +{ + GColorItem item = COLOR_MTRC_VISITORS_PERC; + GColors *color; + int l = data->meta.visitors_perc_len + 3, idx = render.idx; + + if (data->module == HOSTS && data->data[idx].is_subitem) + goto out; + + if (data->meta.max_visitors == data->data[idx].metrics->visitors) + item = COLOR_MTRC_VISITORS_PERC_MAX; + + color = get_color_by_item_module (item, data->module); + render_percent (render, color, data->data[idx].metrics->visitors_perc, l, *x); + +out: + *x += l + 1 + DASH_SPACE; +} + +/* Render the hits metric for each panel */ +static void +render_hits (GDashModule * data, GDashRender render, int *x) +{ + GColors *color = get_color_by_item_module (COLOR_MTRC_HITS, data->module); + WINDOW *win = render.win; + + char *hits; + int y = render.y, w = render.w, idx = render.idx, sel = render.sel; + int len = data->meta.hits_len; + + if (data->module == HOSTS && data->data[idx].is_subitem) + goto out; + + if (sel) { + /* selected state */ + hits = int2str (data->data[idx].metrics->hits, len); + draw_header (win, hits, " %s", y, 0, w, color_selected); + free (hits); + } else { + /* regular state */ + wattron (win, color->attr | COLOR_PAIR (color->pair->idx)); + mvwprintw (win, y, *x, "%*d", len, data->data[idx].metrics->hits); + wattroff (win, color->attr | COLOR_PAIR (color->pair->idx)); + } + +out: + *x += len + DASH_SPACE; +} + +/* Render the visitors metric for each panel */ +static void +render_visitors (GDashModule * data, GDashRender render, int *x) +{ + GColors *color = get_color_by_item_module (COLOR_MTRC_VISITORS, data->module); + WINDOW *win = render.win; + + char *visitors; + int y = render.y, w = render.w, idx = render.idx, sel = render.sel; + int len = data->meta.visitors_len; + + if (data->module == HOSTS && data->data[idx].is_subitem) + goto out; + + if (sel) { + /* selected state */ + visitors = int2str (data->data[idx].metrics->visitors, len); + draw_header (win, visitors, "%s", y, *x, w, color_selected); + free (visitors); + } else { + /* regular state */ + wattron (win, color->attr | COLOR_PAIR (color->pair->idx)); + mvwprintw (win, y, *x, "%*d", len, data->data[idx].metrics->visitors); + wattroff (win, color->attr | COLOR_PAIR (color->pair->idx)); + } + +out: + *x += len + DASH_SPACE; +} + +/* Render the header row for each panel */ +static void +render_header (WINDOW * win, GDashModule * data, GModule cur_module, int *y) +{ + GColors *(*func) (void); + char ind; + char *hd; + int k, w, h; + + getmaxyx (win, h, w); + (void) h; + + k = data->module + 1; + ind = cur_module == data->module ? '>' : ' '; + func = cur_module == data->module && + conf.hl_header ? color_panel_active : color_panel_header; + hd = xmalloc (snprintf (NULL, 0, "%c %d - %s", ind, k, data->head) + 1); + sprintf (hd, "%c %d - %s", ind, k, data->head); + + draw_header (win, hd, " %s", (*y), 0, w, func); + free (hd); + + render_total_label (win, data, (*y), func); + data->pos_y = (*y); + (*y)++; +} + +/* Render the description row for each panel */ +static void +render_description (WINDOW * win, GDashModule * data, int *y) +{ + int w, h; + + getmaxyx (win, h, w); + (void) h; + + draw_header (win, data->desc, " %s", (*y), 0, w, color_panel_desc); + + data->pos_y = (*y); + (*y)++; + (*y)++; /* add empty line underneath description */ +} + +/* Render available metrics per panel. + * ###TODO: Have the abilitity to display metrics in specific order */ +static void +render_metrics (GDashModule * data, GDashRender render, int expanded) +{ + int x = get_xpos (); + GModule module = data->module; + const GOutput *output = output_lookup (module); + + /* basic metrics */ + if (output->hits) + render_hits (data, render, &x); + if (output->percent) + render_hits_percent (data, render, &x); + if (output->visitors) + render_visitors (data, render, &x); + if (output->percent) + render_visitors_percent (data, render, &x); + + /* render bandwidth if available */ + if (conf.bandwidth && output->bw) + render_bw (data, render, &x); + + /* render avgts, cumts and maxts if available */ + if (output->avgts && conf.serve_usecs) + render_avgts (data, render, &x); + if (output->cumts && conf.serve_usecs) + render_cumts (data, render, &x); + if (output->maxts && conf.serve_usecs) + render_maxts (data, render, &x); + + /* render request method if available */ + if (output->method && conf.append_method) + render_method (data, render, &x); + /* render request protocol if available */ + if (output->protocol && conf.append_protocol) + render_proto (data, render, &x); + if (output->data) + render_data (data, render, &x); + + /* skip graph bars if module is expanded and we have sub nodes */ + if ((output->graph && !expanded) || (output->sub_graph && expanded)) + render_bars (data, render, &x); +} + +/* Render a dashboard row. */ +static void +render_data_line (WINDOW * win, GDashModule * data, int *y, int j, + GScroll * gscroll) +{ + GDashRender render; + GModule module = data->module; + int expanded = 0, sel = 0; + int w, h; + + getmaxyx (win, h, w); + (void) h; + + if (gscroll->expanded && module == gscroll->current) + expanded = 1; + + if (j >= data->idx_data) + goto out; + + sel = expanded && j == gscroll->module[module].scroll ? 1 : 0; + + render.win = win; + render.y = *y; + render.w = w; + render.idx = j; + render.sel = sel; + + render_metrics (data, render, expanded); + +out: + (*y)++; +} + +/* Render a dashed line underneath the metric label. */ +static void +print_horizontal_dash (WINDOW * win, int y, int x, int len) +{ + mvwprintw (win, y, x, "%.*s", len, "----------------"); +} + +/* Render left-aligned column label. */ +static void +lprint_col (WINDOW * win, int y, int *x, int len, const char *fmt, + const char *str) +{ + GColors *color = get_color (COLOR_PANEL_COLS); + + wattron (win, color->attr | COLOR_PAIR (color->pair->idx)); + mvwprintw (win, y, *x, fmt, str); + print_horizontal_dash (win, y + 1, *x, len); + wattroff (win, color->attr | COLOR_PAIR (color->pair->idx)); + + *x += len + DASH_SPACE; +} + +/* Render right-aligned column label. */ +static void +rprint_col (WINDOW * win, int y, int *x, int len, const char *fmt, + const char *str) +{ + GColors *color = get_color (COLOR_PANEL_COLS); + + wattron (win, color->attr | COLOR_PAIR (color->pair->idx)); + mvwprintw (win, y, *x, fmt, len, str); + print_horizontal_dash (win, y + 1, *x, len); + wattroff (win, color->attr | COLOR_PAIR (color->pair->idx)); + + *x += len + DASH_SPACE; +} + +/* Render column names for available metrics. + * ###TODO: Have the abilitity to display metrics in specific order */ +static void +render_cols (WINDOW * win, GDashModule * data, int *y) +{ + GModule module = data->module; + const GOutput *output = output_lookup (module); + int x = get_xpos (); + + if (data->idx_data == 0 || conf.no_column_names) + return; + + if (output->hits) + lprint_col (win, *y, &x, data->meta.hits_len, "%s", MTRC_HITS_LBL); + + if (output->percent) + rprint_col (win, *y, &x, data->meta.hits_perc_len + 4, "%*s", + MTRC_HITS_PERC_LBL); + + if (output->visitors) + rprint_col (win, *y, &x, data->meta.visitors_len, "%*s", + MTRC_VISITORS_SHORT_LBL); + + if (output->percent) + rprint_col (win, *y, &x, data->meta.visitors_perc_len + 4, "%*s", + MTRC_VISITORS_PERC_LBL); + + if (output->bw && conf.bandwidth) + rprint_col (win, *y, &x, data->meta.bw_len, "%*s", MTRC_BW_LBL); + + if (output->avgts && conf.serve_usecs) + rprint_col (win, *y, &x, DASH_SRV_TM_LEN, "%*s", MTRC_AVGTS_LBL); + + if (output->cumts && conf.serve_usecs) + rprint_col (win, *y, &x, DASH_SRV_TM_LEN, "%*s", MTRC_CUMTS_LBL); + + if (output->maxts && conf.serve_usecs) + rprint_col (win, *y, &x, DASH_SRV_TM_LEN, "%*s", MTRC_MAXTS_LBL); + + if (output->method && conf.append_method) + lprint_col (win, *y, &x, data->meta.method_len, "%s", + MTRC_METHODS_SHORT_LBL); + + if (output->protocol && conf.append_protocol) + lprint_col (win, *y, &x, 8, "%s", MTRC_PROTOCOLS_SHORT_LBL); + + if (output->data) + lprint_col (win, *y, &x, 4, "%s", MTRC_DATA_LBL); +} + +/* Iterate over all dashboard data and render its content. */ +static void +render_content (WINDOW * win, GDashModule * data, int *y, int *offset, + int *total, GScroll * gscroll) +{ + GModule module = data->module; + int i, j, size, h, w, data_pos = get_data_pos_rows (); + + getmaxyx (win, h, w); + (void) w; + + size = data->dash_size; + for (i = *offset, j = 0; i < size; i++) { + /* header */ + if ((i % size) == DASH_HEAD_POS) { + render_header (win, data, gscroll->current, y); + } else if ((i % size) == DASH_EMPTY_POS && conf.no_column_names) { + /* if no column names, print panel description */ + render_description (win, data, y); + } else if ((i % size) == DASH_EMPTY_POS || (i % size) == size - 1) { + /* blank lines */ + (*y)++; + } else if ((i % size) == DASH_DASHES_POS && !conf.no_column_names) { + /* account for already printed dash lines under columns */ + (*y)++; + } else if ((i % size) == DASH_COLS_POS && !conf.no_column_names) { + /* column headers lines */ + render_cols (win, data, y); + (*y)++; + } else if ((i % size) >= data_pos || (i % size) <= size - 2) { + /* account for 2 lines at the header and 2 blank lines */ + j = ((i % size) - data_pos) + gscroll->module[module].offset; + /* actual data */ + render_data_line (win, data, y, j, gscroll); + } else { + /* everything else should be empty */ + (*y)++; + } + (*total)++; + if (*y >= h) + break; + } +} + +/* Entry point to render the terminal dashboard. */ +void +display_content (WINDOW * win, GDash * dash, GScroll * gscroll) +{ + GModule module; + int j = 0; + size_t idx = 0; + + int y = 0, offset = 0, total = 0; + int dash_scroll = gscroll->dash; + + werase (win); + + FOREACH_MODULE (idx, module_list) { + module = module_list[idx]; + + offset = 0; + for (j = 0; j < dash->module[module].dash_size; j++) { + if (dash_scroll > total) { + offset++; + total++; + } + } + /* used module */ + dash->module[module].module = module; + + render_content (win, &dash->module[module], &y, &offset, &total, gscroll); + } + wrefresh (win); +} + +/* Reset the scroll and offset fields for each panel/module. */ +void +reset_scroll_offsets (GScroll * gscroll) +{ + GModule module; + size_t idx = 0; + + FOREACH_MODULE (idx, module_list) { + module = module_list[idx]; + + gscroll->module[module].scroll = 0; + gscroll->module[module].offset = 0; + } +} + +/* Compile the regular expression and see if it's valid. + * + * If unable to compile, an error as described in <regex.h>. + * Upon successful completion, function returns 0. */ +static int +regexp_init (regex_t * regex, const char *pattern) +{ + int y, x, rc; + char buf[REGEX_ERROR]; + + getmaxyx (stdscr, y, x); + rc = regcomp (regex, pattern, REG_EXTENDED | (find_t.icase ? REG_ICASE : 0)); + /* something went wrong */ + if (rc != 0) { + regerror (rc, regex, buf, sizeof (buf)); + draw_header (stdscr, buf, "%s", y - 1, 0, x, color_error); + refresh (); + return 1; + } + return 0; +} + +/* Set the dashboard scroll and offset based on the search index. */ +static void +perform_find_dash_scroll (GScroll * gscroll, GModule module) +{ + int *scrll, *offset; + int exp_size = get_num_expanded_data_rows (); + + /* reset gscroll offsets if we are changing module */ + if (gscroll->current != module) + reset_scroll_offsets (gscroll); + + scrll = &gscroll->module[module].scroll; + offset = &gscroll->module[module].offset; + + (*scrll) = find_t.next_idx; + if (*scrll >= exp_size && *scrll >= *offset + exp_size) + (*offset) = (*scrll) < exp_size - 1 ? 0 : (*scrll) - exp_size + 1; + + gscroll->current = module; + gscroll->dash = get_module_index (module) * DASH_COLLAPSED; + gscroll->expanded = 1; + find_t.module = module; +} + +/* Find the searched item within the given sub list. + * + * If not found, the GFind structure is reset and 1 is returned. + * If found, a GFind structure is set and 0 is returned. */ +static int +find_next_sub_item (GSubList * sub_list, regex_t * regex) +{ + GSubItem *iter; + int i = 0, rc; + + if (sub_list == NULL) + goto out; + + for (iter = sub_list->head; iter; iter = iter->next) { + if (i >= find_t.next_sub_idx) { + rc = regexec (regex, iter->metrics->data, 0, NULL, 0); + if (rc == 0) { + find_t.next_idx++; + find_t.next_sub_idx = (1 + i); + return 0; + } + find_t.next_idx++; + } + i++; + } +out: + find_t.next_parent_idx++; + find_t.next_sub_idx = 0; + find_t.look_in_sub = 0; + + return 1; +} + +/* Perform a forward search across all modules. + * + * On error or if not found, 1 is returned. + * On success or if found, a GFind structure is set and 0 is returned. */ +int +perform_next_find (GHolder * h, GScroll * gscroll) +{ + GModule module; + GSubList *sub_list; + regex_t regex; + char buf[REGEX_ERROR], *data; + int y, x, j, n, rc; + size_t idx = 0; + + getmaxyx (stdscr, y, x); + + if (find_t.pattern == NULL || *find_t.pattern == '\0') + return 1; + + /* compile and initialize regexp */ + if (regexp_init (®ex, find_t.pattern)) + return 1; + + /* use last find_t.module and start search */ + idx = find_t.module; + FOREACH_MODULE (idx, module_list) { + module = module_list[idx]; + + n = h[module].idx; + for (j = find_t.next_parent_idx; j < n; j++, find_t.next_idx++) { + data = h[module].items[j].metrics->data; + + rc = regexec (®ex, data, 0, NULL, 0); + /* error matching against the precompiled pattern buffer */ + if (rc != 0 && rc != REG_NOMATCH) { + regerror (rc, ®ex, buf, sizeof (buf)); + draw_header (stdscr, buf, "%s", y - 1, 0, x, color_error); + refresh (); + regfree (®ex); + return 1; + } + /* a match was found (data level) */ + else if (rc == 0 && !find_t.look_in_sub) { + find_t.look_in_sub = 1; + perform_find_dash_scroll (gscroll, module); + goto out; + } + /* look at sub list nodes */ + else { + sub_list = h[module].items[j].sub_list; + if (find_next_sub_item (sub_list, ®ex) == 0) { + perform_find_dash_scroll (gscroll, module); + goto out; + } + } + } + + /* reset find */ + find_t.next_idx = 0; + find_t.next_parent_idx = 0; + find_t.next_sub_idx = 0; + + if (find_t.module != module) { + reset_scroll_offsets (gscroll); + gscroll->expanded = 0; + } + if (module == TOTAL_MODULES - 1) { + find_t.module = 0; + goto out; + } + } + +out: + regfree (®ex); + return 0; +} + +/* Render a find dialog. + * + * On error or if no query is set, 1 is returned. + * On success, the dialog is rendered and 0 is returned. */ +int +render_find_dialog (WINDOW * main_win, GScroll * gscroll) +{ + int y, x, valid = 1; + int w = FIND_DLG_WIDTH; + int h = FIND_DLG_HEIGHT; + char *query = NULL; + WINDOW *win; + + getmaxyx (stdscr, y, x); + + win = newwin (h, w, (y - h) / 2, (x - w) / 2); + keypad (win, TRUE); + wborder (win, '|', '|', '-', '-', '+', '+', '+', '+'); + draw_header (win, FIND_HEAD, " %s", 1, 1, w - 2, color_panel_header); + mvwprintw (win, 2, 1, " %s", FIND_DESC); + + find_t.icase = 0; + query = input_string (win, 4, 2, w - 3, "", 1, &find_t.icase); + if (query != NULL && *query != '\0') { + reset_scroll_offsets (gscroll); + reset_find (); + find_t.pattern = xstrdup (query); + valid = 0; + } + if (query != NULL) + free (query); + touchwin (main_win); + close_win (win); + wrefresh (main_win); + + return valid; +} + +static void +set_dash_metrics (GDash ** dash, GMetrics * metrics, GModule module, + int is_subitem) +{ + GDashData *idata = NULL; + GDashMeta *meta = NULL; + char *data = NULL; + int *idx; + + if (!metrics->data) + return; + + idx = &(*dash)->module[module].idx_data; + idata = &(*dash)->module[module].data[(*idx)]; + meta = &(*dash)->module[module].meta; + + idata->metrics = new_gmetrics (); + idata->is_subitem = is_subitem; + + data = is_subitem ? render_child_node (metrics->data) : metrics->data; + + /* set maximum values so far for hits/visitors */ + set_max_values (meta, metrics); + + idata->metrics->hits = metrics->hits; + idata->metrics->hits_perc = get_percentage (meta->max_hits, metrics->hits); + idata->metrics->visitors = metrics->visitors; + idata->metrics->visitors_perc = + get_percentage (meta->max_visitors, metrics->visitors); + idata->metrics->bw.sbw = filesize_str (metrics->bw.nbw); + idata->metrics->data = xstrdup (data); + + if (conf.append_method && metrics->method) + idata->metrics->method = metrics->method; + if (conf.append_protocol && metrics->protocol) + idata->metrics->protocol = metrics->protocol; + + if (!conf.serve_usecs) + goto out; + + idata->metrics->avgts.sts = usecs_to_str (metrics->avgts.nts); + idata->metrics->cumts.sts = usecs_to_str (metrics->cumts.nts); + idata->metrics->maxts.sts = usecs_to_str (metrics->maxts.nts); + +out: + if (is_subitem) + free (data); + + set_metrics_len (meta, idata); + + (*idx)++; +} + +/* Add an item from a sub list to the dashboard. + * + * If no items on the sub list, the function returns. + * On success, sub list data is set into the dashboard structure. */ +static void +add_sub_item_to_dash (GDash ** dash, GHolderItem item, GModule module, int *i) +{ + GSubList *sub_list = item.sub_list; + GSubItem *iter; + + if (sub_list == NULL) + return; + + for (iter = sub_list->head; iter; iter = iter->next, (*i)++) { + set_dash_metrics (dash, iter->metrics, module, 1); + } +} + +/* Add a first level item to dashboard. + * + * On success, data is set into the dashboard structure. */ +static void +add_item_to_dash (GDash ** dash, GHolderItem item, GModule module) +{ + set_dash_metrics (dash, item.metrics, module, 0); +} + +/* Load holder's data into the dashboard structure. */ +void +load_data_to_dash (GHolder * h, GDash * dash, GModule module, GScroll * gscroll) +{ + int alloc_size = 0; + int i, j; + + alloc_size = dash->module[module].alloc_data; + if (gscroll->expanded && module == gscroll->current) + alloc_size += h->sub_items_size; + + dash->module[module].alloc_data = alloc_size; + dash->module[module].data = new_gdata (alloc_size); + dash->module[module].holder_size = h->holder_size; + memset (&dash->module[module].meta, 0, sizeof (GDashData)); + + for (i = 0, j = 0; i < alloc_size; i++) { + if (h->items[j].metrics->data == NULL) + continue; + + add_item_to_dash (&dash, h->items[j], module); + if (gscroll->expanded && module == gscroll->current && h->sub_items_size) + add_sub_item_to_dash (&dash, h->items[j], module, &i); + j++; + } +} diff --git a/goaccess++/src/gdashboard.h b/goaccess++/src/gdashboard.h new file mode 100644 index 0000000..314651a --- /dev/null +++ b/goaccess++/src/gdashboard.h @@ -0,0 +1,142 @@ +/** + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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. + */ + +#if HAVE_CONFIG_H +#include <config.h> +#endif + +#ifndef GDASHBOARD_H_INCLUDED +#define GDASHBOARD_H_INCLUDED + +#include <stdint.h> + +#include "ui.h" + +/* *INDENT-OFF* */ +#define DASH_HEAD_POS 0 /* position of header line */ +#define DASH_EMPTY_POS 1 /* empty line position */ +#define DASH_COLS_POS 2 /* position of column names */ +#define DASH_DASHES_POS 3 /* position of dashes under column names */ +#define DASH_DATA_POS 4 /* data line position */ + +#define DASH_NON_DATA 5 /* number of rows without data stats */ +#define DASH_COL_ROWS 2 /* number of rows for column values + dashed lines */ + +#define DASH_COLLAPSED 12 /* number of rows per panel (collapsed) */ +#define DASH_EXPANDED 32 /* number of rows per panel (expanded) */ + +#define DASH_INIT_X 1 /* start position (x-axis) */ + +#define DASH_BW_LEN 11 /* max bandwidth string length, e.g., 151.69 MiB */ +#define DASH_SRV_TM_LEN 9 /* max time served length, e.g., 483.00 us */ +#define DASH_SPACE 1 /* space between columns (metrics) */ + +/* Common render data line fields */ +typedef struct GDashRender_ +{ + WINDOW *win; + int y; + int w; + int idx; + int sel; +} GDashRender; + +/* Dashboard panel item */ +typedef struct GDashData_ +{ + GMetrics *metrics; + short is_subitem; +} GDashData; + +/* Dashboard panel meta data */ +typedef struct GDashMeta_ +{ + int max_hits; /* maximum value on the hits column */ + int max_visitors; /* maximum value on the visitors column */ + + /* determine the maximum metric's length of these metrics */ + /* for instance, 1022 is the max value for the hits column and its length = 4 */ + int hits_len; + int hits_perc_len; + int visitors_len; + int visitors_perc_len; + int bw_len; + int avgts_len; + int cumts_len; + int maxts_len; + int method_len; + int protocol_len; + int data_len; +} GDashMeta; + +/* Dashboard panel */ +typedef struct GDashModule_ +{ + GDashData *data; /* data metrics */ + GModule module; /* module */ + GDashMeta meta; /* meta data */ + + const char *head; /* panel header */ + const char *desc; /* panel description */ + + int alloc_data; /* number of data items allocated. */ + /* e.g., MAX_CHOICES or holder size */ + int dash_size; /* dashboard size */ + int holder_size; /* hash table size */ + int ht_size; /* hash table size */ + int idx_data; /* idx data */ + + unsigned short pos_y; /* dashboard current Y position */ +} GDashModule; + +/* Dashboard */ +typedef struct GDash_ +{ + int total_alloc; /* number of allocated dashboard lines */ + GDashModule module[TOTAL_MODULES]; +} GDash; + +/* Function Prototypes */ +GDashData *new_gdata (uint32_t size); +GDash *new_gdash (void); +int get_num_collapsed_data_rows(void); +int get_num_expanded_data_rows(void); +int perform_next_find (GHolder * h, GScroll * scroll); +int render_find_dialog (WINDOW * main_win, GScroll * scroll); +int set_module_from_mouse_event (GScroll *scroll, GDash *dash, int y); +uint32_t get_ht_size_by_module (GModule module); +void display_content (WINDOW * win, GDash * dash, GScroll * scroll); +void free_dashboard (GDash * dash); +void load_data_to_dash (GHolder * h, GDash * dash, GModule module, GScroll * scroll); +void reset_find (void); +void reset_scroll_offsets (GScroll * scroll); + +/* *INDENT-ON* */ + +#endif diff --git a/goaccess++/src/gdashboard.o b/goaccess++/src/gdashboard.o new file mode 100644 index 0000000000000000000000000000000000000000..a1351c7f1c51d60ab0a4d59f1bf9948055d765a6 GIT binary patch literal 27808 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 literal 0 HcmV?d00001 diff --git a/goaccess++/src/gdns.c b/goaccess++/src/gdns.c new file mode 100644 index 0000000..3287394 --- /dev/null +++ b/goaccess++/src/gdns.c @@ -0,0 +1,296 @@ +/** + * gdns.c -- hosts resolver + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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. + */ + +#define _MULTI_THREADED +#ifdef __FreeBSD__ +#include <sys/socket.h> +#endif + +#if HAVE_CONFIG_H +#include <config.h> +#endif + +#include <pthread.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <ctype.h> +#include <errno.h> +#include <netdb.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <time.h> +#include <unistd.h> + +#include "gdns.h" + +#ifdef HAVE_LIBTOKYOCABINET +#include "tcabdb.h" +#else +#include "gkhash.h" +#endif + +#include "error.h" +#include "goaccess.h" +#include "util.h" +#include "xmalloc.h" + +GDnsThread gdns_thread; +static GDnsQueue *gdns_queue; + +/* Initialize the queue. */ +void +gqueue_init (GDnsQueue * q, int capacity) +{ + q->head = 0; + q->tail = -1; + q->size = 0; + q->capacity = capacity; +} + +/* Get the current size of queue. + * + * Returns the size of the queue. */ +int +gqueue_size (GDnsQueue * q) +{ + return q->size; +} + +/* Determine if the queue is empty. + * + * Returns true if empty, otherwise false. */ +int +gqueue_empty (GDnsQueue * q) +{ + return q->size == 0; +} + +/* Determine if the queue is full. + * + * Returns true if full, otherwise false. */ +int +gqueue_full (GDnsQueue * q) +{ + return q->size == q->capacity; +} + +/* Free the queue. */ +void +gqueue_destroy (GDnsQueue * q) +{ + free (q); +} + +/* Add at the end of the queue a string item. + * + * If the queue is full, -1 is returned. + * If added to the queue, 0 is returned. */ +int +gqueue_enqueue (GDnsQueue * q, char *item) +{ + if (gqueue_full (q)) + return -1; + + q->tail = (q->tail + 1) % q->capacity; + strcpy (q->buffer[q->tail], item); + q->size++; + return 0; +} + +/* Find a string item in the queue. + * + * If the queue is empty, or the item is not in the queue, 0 is returned. + * If found, 1 is returned. */ +int +gqueue_find (GDnsQueue * q, const char *item) +{ + int i; + if (gqueue_empty (q)) + return 0; + + for (i = 0; i < q->size; i++) { + if (strcmp (item, q->buffer[i]) == 0) + return 1; + } + return 0; +} + +/* Remove a string item from the head of the queue. + * + * If the queue is empty, NULL is returned. + * If removed, the string item is returned. */ +char * +gqueue_dequeue (GDnsQueue * q) +{ + char *item; + if (gqueue_empty (q)) + return NULL; + + item = q->buffer[q->head]; + q->head = (q->head + 1) % q->capacity; + q->size--; + return item; +} + +/* Get the corresponding hostname given an IP address. + * + * On error, a string error message is returned. + * On success, a malloc'd hostname is returned. */ +static char * +reverse_host (const struct sockaddr *a, socklen_t length) +{ + char h[H_SIZE]; + int flags, st; + + flags = NI_NAMEREQD; + st = getnameinfo (a, length, h, H_SIZE, NULL, 0, flags); + if (!st) + return alloc_string (h); + return alloc_string (gai_strerror (st)); +} + +/* Determine if IPv4 or IPv6 and resolve. + * + * On error, NULL is returned. + * On success, a malloc'd hostname is returned. */ +char * +reverse_ip (char *str) +{ + union + { + struct sockaddr addr; + struct sockaddr_in6 addr6; + struct sockaddr_in addr4; + } a; + + if (str == NULL || *str == '\0') + return NULL; + + memset (&a, 0, sizeof (a)); + if (1 == inet_pton (AF_INET, str, &a.addr4.sin_addr)) { + a.addr4.sin_family = AF_INET; + return reverse_host (&a.addr, sizeof (a.addr4)); + } else if (1 == inet_pton (AF_INET6, str, &a.addr6.sin6_addr)) { + a.addr6.sin6_family = AF_INET6; + return reverse_host (&a.addr, sizeof (a.addr6)); + } + return NULL; +} + +/* Producer - Resolve an IP address and add it to the queue. */ +void +dns_resolver (char *addr) +{ + pthread_mutex_lock (&gdns_thread.mutex); + /* queue is not full and the IP address is not in the queue */ + if (!gqueue_full (gdns_queue) && !gqueue_find (gdns_queue, addr)) { + /* add the IP to the queue */ + gqueue_enqueue (gdns_queue, addr); + pthread_cond_broadcast (&gdns_thread.not_empty); + } + pthread_mutex_unlock (&gdns_thread.mutex); +} + +/* Consumer - Once an IP has been resolved, add it to dwithe hostnames + * hash structure. */ +static void +dns_worker (void GO_UNUSED (*ptr_data)) +{ + char *ip = NULL, *host = NULL; + + while (1) { + pthread_mutex_lock (&gdns_thread.mutex); + /* wait until an item has been added to the queue */ + while (gqueue_empty (gdns_queue)) + pthread_cond_wait (&gdns_thread.not_empty, &gdns_thread.mutex); + + ip = gqueue_dequeue (gdns_queue); + + pthread_mutex_unlock (&gdns_thread.mutex); + host = reverse_ip (ip); + pthread_mutex_lock (&gdns_thread.mutex); + + if (!active_gdns) { + if (host) + free (host); + break; + } + + /* insert the corresponding IP -> hostname map */ + if (host != NULL && active_gdns) { + ht_insert_hostname (ip, host); + free (host); + } + + pthread_cond_signal (&gdns_thread.not_full); + pthread_mutex_unlock (&gdns_thread.mutex); + } +} + +/* Initialize queue and dns thread */ +void +gdns_init (void) +{ + gdns_queue = xmalloc (sizeof (GDnsQueue)); + gqueue_init (gdns_queue, QUEUE_SIZE); + + if (pthread_cond_init (&(gdns_thread.not_empty), NULL)) + FATAL ("Failed init thread condition"); + + if (pthread_cond_init (&(gdns_thread.not_full), NULL)) + FATAL ("Failed init thread condition"); + + if (pthread_mutex_init (&(gdns_thread.mutex), NULL)) + FATAL ("Failed init thread mutex"); +} + +/* Destroy (free) queue */ +void +gdns_free_queue (void) +{ + gqueue_destroy (gdns_queue); +} + +/* Create a DNS thread and make it active */ +void +gdns_thread_create (void) +{ + int th; + + active_gdns = 1; + th = pthread_create (&(gdns_thread.thread), NULL, (void *) &dns_worker, NULL); + if (th) + FATAL ("Return code from pthread_create(): %d", th); + pthread_detach (gdns_thread.thread); +} diff --git a/goaccess++/src/gdns.h b/goaccess++/src/gdns.h new file mode 100644 index 0000000..97d8b25 --- /dev/null +++ b/goaccess++/src/gdns.h @@ -0,0 +1,70 @@ +/** + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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 GDNS_H_INCLUDED +#define GDNS_H_INCLUDED + +#define H_SIZE 1025 +#define QUEUE_SIZE 400 + +typedef struct GDnsThread_ +{ + pthread_cond_t not_empty; /* not empty queue condition */ + pthread_cond_t not_full; /* not full queue condition */ + pthread_mutex_t mutex; + pthread_t thread; +} GDnsThread; + +typedef struct GDnsQueue_ +{ + int head; /* index to head of queue */ + int tail; /* index to tail of queue */ + int size; /* queue size */ + int capacity; /* length at most */ + char buffer[QUEUE_SIZE][H_SIZE]; /* data item */ +} GDnsQueue; + +extern GDnsThread gdns_thread; + +char *gqueue_dequeue (GDnsQueue * q); +char *reverse_ip (char *str); +int gqueue_empty (GDnsQueue * q); +int gqueue_enqueue (GDnsQueue * q, char *item); +int gqueue_find (GDnsQueue * q, const char *item); +int gqueue_full (GDnsQueue * q); +int gqueue_size (GDnsQueue * q); +void dns_resolver (char *addr); +void gdns_free_queue (void); +void gdns_init (void); +void gdns_queue_free (void); +void gdns_thread_create (void); +void gqueue_destroy (GDnsQueue * q); +void gqueue_init (GDnsQueue * q, int capacity); + +#endif diff --git a/goaccess++/src/gdns.o b/goaccess++/src/gdns.o new file mode 100644 index 0000000000000000000000000000000000000000..465c8b5f03270645a6b383ace583ad3dd28cd7f6 GIT binary patch literal 10968 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 literal 0 HcmV?d00001 diff --git a/goaccess++/src/geoip1.c b/goaccess++/src/geoip1.c new file mode 100644 index 0000000..588d994 --- /dev/null +++ b/goaccess++/src/geoip1.c @@ -0,0 +1,439 @@ +/** + * geoip.c -- implementation of GeoIP + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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. + */ + +#if HAVE_CONFIG_H +#include <config.h> +#endif + +#ifdef HAVE_LIBGEOIP +#include <GeoIP.h> +#include <GeoIPCity.h> +#endif + +#include "geoip1.h" + +#include "error.h" +#include "util.h" + +static GeoIP *geo_location_data; + +/* Determine if we have a valid geoip resource. + * + * If the geoip resource is NULL, 0 is returned. + * If the geoip resource is valid and malloc'd, 1 is returned. */ +int +is_geoip_resource (void) +{ + return geo_location_data != NULL ? 1 : 0; +} + +/* Free up GeoIP resources */ +void +geoip_free (void) +{ + if (!is_geoip_resource ()) + return; + + GeoIP_delete (geo_location_data); + GeoIP_cleanup (); +} + +/* Open the given GeoLocation database and set its charset. + * + * On error, it aborts. + * On success, a new geolocation structure is returned. */ +static GeoIP * +geoip_open_db (const char *db) +{ + GeoIP *geoip; + geoip = GeoIP_open (db, GEOIP_MEMORY_CACHE); + + if (geoip == NULL) + FATAL ("Unable to open GeoIP database: %s\n", db); + + GeoIP_set_charset (geoip, GEOIP_CHARSET_UTF8); + LOG_DEBUG (("Opened GeoIP City database: %s\n", db)); + + return geoip; +} + +/* Set up and open GeoIP database */ +void +init_geoip (void) +{ + /* open custom city GeoIP database */ + if (conf.geoip_database != NULL) + geo_location_data = geoip_open_db (conf.geoip_database); + /* fall back to legacy GeoIP database */ + else + geo_location_data = GeoIP_new (conf.geo_db); +} + +/* Get continent name concatenated with code. + * + * If continent not found, "Unknown" is returned. + * On success, the continent code & name is returned . */ +static const char * +get_continent_name_and_code (const char *continentid) +{ + if (memcmp (continentid, "NA", 2) == 0) + return "NA North America"; + else if (memcmp (continentid, "OC", 2) == 0) + return "OC Oceania"; + else if (memcmp (continentid, "EU", 2) == 0) + return "EU Europe"; + else if (memcmp (continentid, "SA", 2) == 0) + return "SA South America"; + else if (memcmp (continentid, "AF", 2) == 0) + return "AF Africa"; + else if (memcmp (continentid, "AN", 2) == 0) + return "AN Antarctica"; + else if (memcmp (continentid, "AS", 2) == 0) + return "AS Asia"; + else + return "-- Unknown"; +} + +/* Compose a string with the country name and code and store it in the + * given buffer. */ +static void +geoip_set_country (const char *country, const char *code, char *loc) +{ + if (country && code) + snprintf (loc, COUNTRY_LEN, "%s %s", code, country); + else + snprintf (loc, COUNTRY_LEN, "%s", "Unknown"); +} + +/* Compose a string with the city name and state/region and store it + * in the given buffer. */ +static void +geoip_set_city (const char *city, const char *region, char *loc) +{ + snprintf (loc, CITY_LEN, "%s, %s", city ? city : "N/A City", + region ? region : "N/A Region"); +} + +/* Compose a string with the continent name and store it in the given + * buffer. */ +static void +geoip_set_continent (const char *continent, char *loc) +{ + if (continent) + snprintf (loc, CONTINENT_LEN, "%s", + get_continent_name_and_code (continent)); + else + snprintf (loc, CONTINENT_LEN, "%s", "Unknown"); +} + +/* Get detailed information found in the GeoIP Database about the + * given IPv4 or IPv6. + * + * On error, NULL is returned + * On success, GeoIPRecord structure is returned */ +static GeoIPRecord * +get_geoip_record (const char *addr, GTypeIP type_ip) +{ + GeoIPRecord *rec = NULL; + + if (TYPE_IPV4 == type_ip) + rec = GeoIP_record_by_name (geo_location_data, addr); + else if (TYPE_IPV6 == type_ip) + rec = GeoIP_record_by_name_v6 (geo_location_data, addr); + + return rec; +} + +/* Set country data by record into the given `location` buffer based + * on the IP version. */ +static void +geoip_set_country_by_record (const char *ip, char *location, GTypeIP type_ip) +{ + GeoIPRecord *rec = NULL; + const char *country = NULL, *code = NULL, *addr = ip; + + if (conf.geoip_database == NULL || geo_location_data == NULL) + return; + + /* Custom GeoIP database */ + if ((rec = get_geoip_record (addr, type_ip))) { + country = rec->country_name; + code = rec->country_code; + } + + geoip_set_country (country, code, location); + if (rec != NULL) { + GeoIPRecord_delete (rec); + } +} + +/* Get the GeoIP location id by name. + * + * On error, 0 is returned + * On success, the GeoIP location id is returned */ +static int +geoip_get_geoid (const char *addr, GTypeIP type_ip) +{ + int geoid = 0; + + if (TYPE_IPV4 == type_ip) + geoid = GeoIP_id_by_name (geo_location_data, addr); + else if (TYPE_IPV6 == type_ip) + geoid = GeoIP_id_by_name_v6 (geo_location_data, addr); + + return geoid; +} + +/* Get the country name by GeoIP location id. + * + * On error, NULL is returned + * On success, the country name is returned */ +static const char * +geoip_get_country_by_geoid (const char *addr, GTypeIP type_ip) +{ + const char *country = NULL; + + if (TYPE_IPV4 == type_ip) + country = GeoIP_country_name_by_name (geo_location_data, addr); + else if (TYPE_IPV6 == type_ip) + country = GeoIP_country_name_by_name_v6 (geo_location_data, addr); + + return country; +} + +/* Set country data by geoid into the given `location` buffer based on + * the IP version. */ +static void +geoip_set_country_by_geoid (const char *ip, char *location, GTypeIP type_ip) +{ + const char *country = NULL, *code = NULL, *addr = ip; + int geoid = 0; + + if (!is_geoip_resource ()) + return; + + if (!(country = geoip_get_country_by_geoid (addr, type_ip))) + goto out; + + /* return two letter country code */ + if (!(geoid = geoip_get_geoid (addr, type_ip))) + goto out; + code = GeoIP_code_by_id (geoid); + +out: + geoip_set_country (country, code, location); +} + +/* Set country data by geoid or record into the given `location` buffer + * based on the IP version and currently used database edition. */ +void +geoip_get_country (const char *ip, char *location, GTypeIP type_ip) +{ + unsigned char rec = GeoIP_database_edition (geo_location_data); + + switch (rec) { + case GEOIP_COUNTRY_EDITION: + if (TYPE_IPV4 == type_ip) + geoip_set_country_by_geoid (ip, location, TYPE_IPV4); + else + geoip_set_country (NULL, NULL, location); + break; + case GEOIP_COUNTRY_EDITION_V6: + if (TYPE_IPV6 == type_ip) + geoip_set_country_by_geoid (ip, location, TYPE_IPV6); + else + geoip_set_country (NULL, NULL, location); + break; + case GEOIP_CITY_EDITION_REV0: + case GEOIP_CITY_EDITION_REV1: + if (TYPE_IPV4 == type_ip) + geoip_set_country_by_record (ip, location, TYPE_IPV4); + else + geoip_set_country (NULL, NULL, location); + break; + case GEOIP_CITY_EDITION_REV0_V6: + case GEOIP_CITY_EDITION_REV1_V6: + if (TYPE_IPV6 == type_ip) + geoip_set_country_by_record (ip, location, TYPE_IPV6); + else + geoip_set_country (NULL, NULL, location); + break; + } +} + +/* Set continent data by record into the given `location` buffer based + * on the IP version. */ +static void +geoip_set_continent_by_record (const char *ip, char *location, GTypeIP type_ip) +{ + GeoIPRecord *rec = NULL; + const char *continent = NULL, *addr = ip; + + if (conf.geoip_database == NULL || geo_location_data == NULL) + return; + + /* Custom GeoIP database */ + if ((rec = get_geoip_record (addr, type_ip))) + continent = rec->continent_code; + + geoip_set_continent (continent, location); + if (rec != NULL) { + GeoIPRecord_delete (rec); + } +} + +/* Set continent data by geoid into the given `location` buffer based + * on the IP version. */ +static void +geoip_set_continent_by_geoid (const char *ip, char *location, GTypeIP type_ip) +{ + const char *continent = NULL, *addr = ip; + int geoid = 0; + + if (!is_geoip_resource ()) + return; + + if (!(geoid = geoip_get_geoid (addr, type_ip))) + goto out; + continent = GeoIP_continent_by_id (geoid); + +out: + geoip_set_continent (continent, location); +} + +/* Set continent data by geoid or record into the given `location` buffer + * based on the IP version and currently used database edition. */ +void +geoip_get_continent (const char *ip, char *location, GTypeIP type_ip) +{ + unsigned char rec = GeoIP_database_edition (geo_location_data); + + switch (rec) { + case GEOIP_COUNTRY_EDITION: + if (TYPE_IPV4 == type_ip) + geoip_set_continent_by_geoid (ip, location, TYPE_IPV4); + else + geoip_set_continent (NULL, location); + break; + case GEOIP_COUNTRY_EDITION_V6: + if (TYPE_IPV6 == type_ip) + geoip_set_continent_by_geoid (ip, location, TYPE_IPV6); + else + geoip_set_continent (NULL, location); + break; + case GEOIP_CITY_EDITION_REV0: + case GEOIP_CITY_EDITION_REV1: + if (TYPE_IPV4 == type_ip) + geoip_set_continent_by_record (ip, location, TYPE_IPV4); + else + geoip_set_continent (NULL, location); + break; + case GEOIP_CITY_EDITION_REV0_V6: + case GEOIP_CITY_EDITION_REV1_V6: + if (TYPE_IPV6 == type_ip) + geoip_set_continent_by_record (ip, location, TYPE_IPV6); + else + geoip_set_continent (NULL, location); + break; + } +} + +/* Set city data by record into the given `location` buffer based on + * the IP version. */ +static void +geoip_set_city_by_record (const char *ip, char *location, GTypeIP type_ip) +{ + GeoIPRecord *rec = NULL; + const char *city = NULL, *region = NULL, *addr = ip; + + /* Custom GeoIP database */ + if ((rec = get_geoip_record (addr, type_ip))) { + city = rec->city; + region = rec->region; + } + + geoip_set_city (city, region, location); + if (rec != NULL) { + GeoIPRecord_delete (rec); + } +} + +/* Set city data by geoid or record into the given `location` buffer + * based on the IP version and currently used database edition. + * It uses the custom GeoIP database - i.e., GeoLiteCity.dat */ +void +geoip_get_city (const char *ip, char *location, GTypeIP type_ip) +{ + unsigned char rec = GeoIP_database_edition (geo_location_data); + + if (conf.geoip_database == NULL || geo_location_data == NULL) + return; + + switch (rec) { + case GEOIP_CITY_EDITION_REV0: + case GEOIP_CITY_EDITION_REV1: + if (TYPE_IPV4 == type_ip) + geoip_set_city_by_record (ip, location, TYPE_IPV4); + else + geoip_set_city (NULL, NULL, location); + break; + case GEOIP_CITY_EDITION_REV0_V6: + case GEOIP_CITY_EDITION_REV1_V6: + if (TYPE_IPV6 == type_ip) + geoip_set_city_by_record (ip, location, TYPE_IPV6); + else + geoip_set_city (NULL, NULL, location); + break; + } +} + +/* Entry point to set GeoIP location into the corresponding buffers, + * (continent, country, city). + * + * On error, 1 is returned + * On success, buffers are set and 0 is returned */ +int +set_geolocation (char *host, char *continent, char *country, char *city) +{ + int type_ip = 0; + + if (!is_geoip_resource ()) + return 1; + + if (invalid_ipaddr (host, &type_ip)) + return 1; + + geoip_get_country (host, country, type_ip); + geoip_get_continent (host, continent, type_ip); + if (conf.geoip_database) + geoip_get_city (host, city, type_ip); + + return 0; +} diff --git a/goaccess++/src/geoip1.h b/goaccess++/src/geoip1.h new file mode 100644 index 0000000..6fbb100 --- /dev/null +++ b/goaccess++/src/geoip1.h @@ -0,0 +1,58 @@ +/** + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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. + */ + +#if HAVE_CONFIG_H +#include <config.h> +#endif + +#ifndef GEOIP_H_INCLUDED +#define GEOIP_H_INCLUDED + +#include "commons.h" + +#define CITY_LEN 47 + 1 /* max string length for a city */ +#define CONTINENT_LEN 47 + 1 /* max string length for a country */ +#define COUNTRY_LEN 48 + 3 /* Country + two-letter Code */ + +typedef struct GLocation_ +{ + char city[CITY_LEN]; + char continent[CONTINENT_LEN]; + int hits; +} GLocation; + +int is_geoip_resource (void); +int set_geolocation (char *host, char *continent, char *country, char *city); +void geoip_free (void); +void geoip_get_city (const char *ip, char *location, GTypeIP type_ip); +void geoip_get_continent (const char *ip, char *location, GTypeIP type_ip); +void geoip_get_country (const char *ip, char *location, GTypeIP type_ip); +void init_geoip (void); + +#endif // for #ifndef GEOIP_H diff --git a/goaccess++/src/geoip1.o b/goaccess++/src/geoip1.o new file mode 100644 index 0000000000000000000000000000000000000000..a3dce92b3f11a5187f75e8295d25de1b8c23eda5 GIT binary patch literal 12288 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 YY5Na<Ker^hT-yqLQC~He(%CNm7t59fU;qFB literal 0 HcmV?d00001 diff --git a/goaccess++/src/geoip2.c b/goaccess++/src/geoip2.c new file mode 100644 index 0000000..724998d --- /dev/null +++ b/goaccess++/src/geoip2.c @@ -0,0 +1,297 @@ +/** + * geoip2.c -- implementation of GeoIP2 + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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. + */ + +#if HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdlib.h> +#include <string.h> +#include <errno.h> + +#ifdef HAVE_LIBMAXMINDDB +#include <maxminddb.h> +#endif + +#include "geoip1.h" + +#include "error.h" +#include "util.h" +#include "xmalloc.h" + +/* should be reused across lookups */ +int geoip_city_type = 0; +static MMDB_s *mmdb = NULL; + +/* Determine if we have a valid geoip resource. + * + * If the geoip resource is NULL, 0 is returned. + * If the geoip resource is valid and malloc'd, 1 is returned. */ +int +is_geoip_resource (void) +{ + return mmdb != NULL ? 1 : 0; +} + +/* Free up GeoIP resources */ +void +geoip_free (void) +{ + if (!is_geoip_resource ()) + return; + + MMDB_close (mmdb); + free (mmdb); + mmdb = NULL; +} + +/* Open the given GeoIP2 database. + * + * On error, it aborts. + * On success, a new geolocation structure is set. */ +void +init_geoip (void) +{ + const char *fn = conf.geoip_database; + int status = 0; + + if (fn == NULL) + return; + + /* open custom city GeoIP database */ + mmdb = xcalloc (1, sizeof (MMDB_s)); + if ((status = MMDB_open (fn, MMDB_MODE_MMAP, mmdb)) != MMDB_SUCCESS) { + free (mmdb); + FATAL ("Unable to open GeoIP2 database: %s\n", fn); + } + + if (strcmp (mmdb->metadata.database_type, "GeoLite2-City") == 0) + geoip_city_type = 1; +} + +/* Look up an IP address that is passed in as a null-terminated string. + * + * On error, it aborts. + * If no entry is found, 1 is returned. + * On success, MMDB_lookup_result_s struct is set and 0 is returned. */ +static int +geoip_lookup (MMDB_lookup_result_s * res, const char *ip) +{ + int gai_err, mmdb_err; + + *res = MMDB_lookup_string (mmdb, ip, &gai_err, &mmdb_err); + if (0 != gai_err) + return 1; + + if (MMDB_SUCCESS != mmdb_err) + FATAL ("Error from libmaxminddb: %s\n", MMDB_strerror (mmdb_err)); + + if (!(*res).found_entry) + return 1; + + return 0; +} + +/* Get continent name concatenated with code. + * + * If continent not found, "Unknown" is returned. + * On success, the continent code & name is returned . */ +static const char * +get_continent_name_and_code (const char *continentid) +{ + if (memcmp (continentid, "NA", 2) == 0) + return "NA North America"; + else if (memcmp (continentid, "OC", 2) == 0) + return "OC Oceania"; + else if (memcmp (continentid, "EU", 2) == 0) + return "EU Europe"; + else if (memcmp (continentid, "SA", 2) == 0) + return "SA South America"; + else if (memcmp (continentid, "AF", 2) == 0) + return "AF Africa"; + else if (memcmp (continentid, "AN", 2) == 0) + return "AN Antarctica"; + else if (memcmp (continentid, "AS", 2) == 0) + return "AS Asia"; + else + return "-- Unknown"; +} + +/* Compose a string with the country name and code and store it in the + * given buffer. */ +static void +geoip_set_country (const char *country, const char *code, char *loc) +{ + if (country && code) + snprintf (loc, COUNTRY_LEN, "%s %s", code, country); + else + snprintf (loc, COUNTRY_LEN, "%s", "Unknown"); +} + +/* Compose a string with the city name and state/region and store it + * in the given buffer. */ +static void +geoip_set_city (const char *city, const char *region, char *loc) +{ + snprintf (loc, CITY_LEN, "%s, %s", city ? city : "N/A City", + region ? region : "N/A Region"); +} + +/* Compose a string with the continent name and store it in the given + * buffer. */ +static void +geoip_set_continent (const char *continent, char *loc) +{ + if (continent) + snprintf (loc, CONTINENT_LEN, "%s", + get_continent_name_and_code (continent)); + else + snprintf (loc, CONTINENT_LEN, "%s", "Unknown"); +} + +/* A wrapper to fetch the looked up result set. + * + * On error, it aborts. + * If no data is found, NULL is returned. + * On success, the fetched value is returned. */ +static char * +get_value (MMDB_lookup_result_s res, ...) +{ + MMDB_entry_data_s entry_data; + char *value = NULL; + int status = 0; + va_list keys; + va_start (keys, res); + + status = MMDB_vget_value (&res.entry, &entry_data, keys); + va_end (keys); + + if (status != MMDB_SUCCESS) + return NULL; + + if (!entry_data.has_data) + return NULL; + + if (entry_data.type != MMDB_DATA_TYPE_UTF8_STRING) + FATAL ("Invalid data UTF8 GeoIP2 data %d:\n", entry_data.type); + + if ((value = strndup (entry_data.utf8_string, entry_data.data_size)) == NULL) + FATAL ("Unable to allocate buffer %s: ", strerror (errno)); + + return value; +} + +/* A wrapper to fetch the looked up result and set the city and region. + * + * If no data is found, NULL is set. + * On success, the fetched value is set. */ +static void +geoip_query_city (MMDB_lookup_result_s res, char *location) +{ + char *city = NULL, *region = NULL; + + if (res.found_entry) { + city = get_value (res, "city", "names", "en", NULL); + region = get_value (res, "subdivisions", "0", "names", "en", NULL); + } + geoip_set_city (city, region, location); +} + +/* A wrapper to fetch the looked up result and set the country and code. + * + * If no data is found, NULL is set. + * On success, the fetched value is set. */ +static void +geoip_query_country (MMDB_lookup_result_s res, char *location) +{ + char *country = NULL, *code = NULL; + + if (res.found_entry) { + country = get_value (res, "country", "names", "en", NULL); + code = get_value (res, "country", "iso_code", NULL); + } + geoip_set_country (country, code, location); +} + +/* A wrapper to fetch the looked up result and set the continent code. + * + * If no data is found, NULL is set. + * On success, the fetched value is set. */ +static void +geoip_query_continent (MMDB_lookup_result_s res, char *location) +{ + char *code = NULL; + + if (res.found_entry) + code = get_value (res, "continent", "code", NULL); + geoip_set_continent (code, location); +} + +/* Set country data by record into the given `location` buffer */ +void +geoip_get_country (const char *ip, char *location, GO_UNUSED GTypeIP type_ip) +{ + MMDB_lookup_result_s res; + + geoip_lookup (&res, ip); + geoip_query_country (res, location); +} + +/* A wrapper to fetch the looked up result and set the continent. */ +void +geoip_get_continent (const char *ip, char *location, GO_UNUSED GTypeIP type_ip) +{ + MMDB_lookup_result_s res; + + geoip_lookup (&res, ip); + geoip_query_continent (res, location); +} + +/* Entry point to set GeoIP location into the corresponding buffers, + * (continent, country, city). + * + * On error, 1 is returned + * On success, buffers are set and 0 is returned */ +int +set_geolocation (char *host, char *continent, char *country, char *city) +{ + MMDB_lookup_result_s res; + + if (!is_geoip_resource ()) + return 1; + + geoip_lookup (&res, host); + geoip_query_country (res, country); + geoip_query_continent (res, continent); + if (geoip_city_type) + geoip_query_city (res, city); + + return 0; +} diff --git a/goaccess++/src/gholder.c b/goaccess++/src/gholder.c new file mode 100644 index 0000000..27939c6 --- /dev/null +++ b/goaccess++/src/gholder.c @@ -0,0 +1,673 @@ +/** + * gholder.c -- data structure to hold raw data + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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 <pthread.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <netinet/in.h> +#include <arpa/inet.h> + +#ifdef HAVE_LIBTOKYOCABINET +#include "tcabdb.h" +#else +#include "gkhash.h" +#endif + +#ifdef HAVE_GEOLOCATION +#include "geoip1.h" +#endif + +#include "gholder.h" + +#include "error.h" +#include "gdns.h" +#include "util.h" +#include "xmalloc.h" + +typedef struct GPanel_ +{ + GModule module; + void (*insert) (GRawDataItem item, GHolder * h, GRawDataType type, + const struct GPanel_ *); + void (*holder_callback) (GHolder * h); + void (*lookup) (GRawDataItem item); +} GPanel; + +static void add_data_to_holder (GRawDataItem item, GHolder * h, + GRawDataType type, const GPanel * panel); +static void add_host_to_holder (GRawDataItem item, GHolder * h, + GRawDataType type, const GPanel * panel); +static void add_root_to_holder (GRawDataItem item, GHolder * h, + GRawDataType type, const GPanel * panel); +static void add_host_child_to_holder (GHolder * h); + +/* *INDENT-OFF* */ +static GPanel paneling[] = { + {VISITORS , add_data_to_holder, NULL} , + {REQUESTS , add_data_to_holder, NULL} , + {REQUESTS_STATIC , add_data_to_holder, NULL} , + {NOT_FOUND , add_data_to_holder, NULL} , + {HOSTS , add_host_to_holder, add_host_child_to_holder} , + {OS , add_root_to_holder, NULL} , + {BROWSERS , add_root_to_holder, NULL} , + {VISIT_TIMES , add_data_to_holder, NULL} , + {VIRTUAL_HOSTS , add_data_to_holder, NULL} , + {REFERRERS , add_data_to_holder, NULL} , + {REFERRING_SITES , add_data_to_holder, NULL} , + {KEYPHRASES , add_data_to_holder, NULL} , + {STATUS_CODES , add_root_to_holder, NULL} , + {REMOTE_USER , add_data_to_holder, NULL} , +#ifdef HAVE_GEOLOCATION + {GEO_LOCATION , add_root_to_holder, NULL} , +#endif +}; +/* *INDENT-ON* */ + +/* Get a panel from the GPanel structure given a module. + * + * On error, or if not found, NULL is returned. + * On success, the panel value is returned. */ +static GPanel * +panel_lookup (GModule module) +{ + int i, num_panels = ARRAY_SIZE (paneling); + + for (i = 0; i < num_panels; i++) { + if (paneling[i].module == module) + return &paneling[i]; + } + return NULL; +} + +/* Allocate memory for a new GHolder instance. + * + * On success, the newly allocated GHolder is returned . */ +GHolder * +new_gholder (uint32_t size) +{ + GHolder *holder = xmalloc (size * sizeof (GHolder)); + memset (holder, 0, size * sizeof *holder); + + return holder; +} + +/* Allocate memory for a new GHolderItem instance. + * + * On success, the newly allocated GHolderItem is returned . */ +static GHolderItem * +new_gholder_item (uint32_t size) +{ + GHolderItem *item = xcalloc (size, sizeof (GHolderItem)); + + return item; +} + +/* Allocate memory for a new double linked-list GSubList instance. + * + * On success, the newly allocated GSubList is returned . */ +static GSubList * +new_gsublist (void) +{ + GSubList *sub_list = xmalloc (sizeof (GSubList)); + sub_list->head = NULL; + sub_list->tail = NULL; + sub_list->size = 0; + + return sub_list; +} + +/* Allocate memory for a new double linked-list GSubItem node. + * + * On success, the newly allocated GSubItem is returned . */ +static GSubItem * +new_gsubitem (GModule module, GMetrics * nmetrics) +{ + GSubItem *sub_item = xmalloc (sizeof (GSubItem)); + + sub_item->metrics = nmetrics; + sub_item->module = module; + sub_item->prev = NULL; + sub_item->next = NULL; + + return sub_item; +} + +/* Add an item to the end of a given sub list. */ +static void +add_sub_item_back (GSubList * sub_list, GModule module, GMetrics * nmetrics) +{ + GSubItem *sub_item = new_gsubitem (module, nmetrics); + if (sub_list->tail) { + sub_list->tail->next = sub_item; + sub_item->prev = sub_list->tail; + sub_list->tail = sub_item; + } else { + sub_list->head = sub_item; + sub_list->tail = sub_item; + } + sub_list->size++; +} + +/* Delete the entire given sub list. */ +static void +delete_sub_list (GSubList * sub_list) +{ + GSubItem *item = NULL; + GSubItem *next = NULL; + + if (sub_list != NULL && sub_list->size == 0) + goto clear; + if (sub_list->size == 0) + return; + + for (item = sub_list->head; item; item = next) { + next = item->next; + free (item->metrics->data); + free (item->metrics); + free (item); + } +clear: + sub_list->head = NULL; + sub_list->size = 0; + free (sub_list); +} + +/* Free malloc'd holder fields. */ +static void +free_holder_data (GHolderItem item) +{ + if (item.sub_list != NULL) + delete_sub_list (item.sub_list); + if (item.metrics->data != NULL) + free (item.metrics->data); + if (item.metrics->method != NULL) + free (item.metrics->method); + if (item.metrics->protocol != NULL) + free (item.metrics->protocol); + if (item.metrics != NULL) + free (item.metrics); +} + +/* Free all memory allocated in holder for a given module. */ +void +free_holder_by_module (GHolder ** holder, GModule module) +{ + int j; + + if ((*holder) == NULL) + return; + + for (j = 0; j < (*holder)[module].idx; j++) { + free_holder_data ((*holder)[module].items[j]); + } + free ((*holder)[module].items); + + (*holder)[module].holder_size = 0; + (*holder)[module].idx = 0; + (*holder)[module].sub_items_size = 0; +} + +/* Free all memory allocated in holder for all modules. */ +void +free_holder (GHolder ** holder) +{ + GModule module; + int j; + size_t idx = 0; + + if ((*holder) == NULL) + return; + + FOREACH_MODULE (idx, module_list) { + module = module_list[idx]; + + for (j = 0; j < (*holder)[module].idx; j++) { + free_holder_data ((*holder)[module].items[j]); + } + free ((*holder)[module].items); + } + free (*holder); + (*holder) = NULL; +} + +/* Iterate over holder and get the key index. + * + * If the key does not exist, -1 is returned. + * On success, the key in holder is returned . */ +static int +get_item_idx_in_holder (GHolder * holder, const char *k) +{ + int i; + if (holder == NULL) + return KEY_NOT_FOUND; + if (holder->idx == 0) + return KEY_NOT_FOUND; + if (k == NULL || *k == '\0') + return KEY_NOT_FOUND; + + for (i = 0; i < holder->idx; i++) { + if (strcmp (k, holder->items[i].metrics->data) == 0) + return i; + } + + return KEY_NOT_FOUND; +} + +/* Copy linked-list items to an array, sort, and move them back to the + * list. Should be faster than sorting the list */ +static void +sort_sub_list (GHolder * h, GSort sort) +{ + GHolderItem *arr; + GSubItem *iter; + GSubList *sub_list; + int i, j, k; + + /* iterate over root-level nodes */ + for (i = 0; i < h->idx; i++) { + sub_list = h->items[i].sub_list; + if (sub_list == NULL) + continue; + + arr = new_gholder_item (sub_list->size); + + /* copy items from the linked-list into an array */ + for (j = 0, iter = sub_list->head; iter; iter = iter->next, j++) { + arr[j].metrics = new_gmetrics (); + + arr[j].metrics->bw.nbw = iter->metrics->bw.nbw; + arr[j].metrics->data = xstrdup (iter->metrics->data); + arr[j].metrics->hits = iter->metrics->hits; + arr[j].metrics->id = iter->metrics->id; + arr[j].metrics->visitors = iter->metrics->visitors; + if (conf.serve_usecs) { + arr[j].metrics->avgts.nts = iter->metrics->avgts.nts; + arr[j].metrics->cumts.nts = iter->metrics->cumts.nts; + arr[j].metrics->maxts.nts = iter->metrics->maxts.nts; + } + } + sort_holder_items (arr, j, sort); + delete_sub_list (sub_list); + + sub_list = new_gsublist (); + for (k = 0; k < j; k++) { + if (k > 0) + sub_list = h->items[i].sub_list; + + add_sub_item_back (sub_list, h->module, arr[k].metrics); + h->items[i].sub_list = sub_list; + } + free (arr); + } +} + +/* Set the data metric field for the host panel. + * + * On success, the data field/metric is set. */ +static int +set_host_child_metrics (char *data, uint8_t id, GMetrics ** nmetrics) +{ + GMetrics *metrics; + + metrics = new_gmetrics (); + metrics->data = xstrdup (data); + metrics->id = id; + *nmetrics = metrics; + + return 0; +} + +/* Set host panel data, including sub items. + * + * On success, the host panel data is set. */ +static void +set_host_sub_list (GHolder * h, GSubList * sub_list) +{ + GMetrics *nmetrics; +#ifdef HAVE_GEOLOCATION + char city[CITY_LEN] = ""; + char continent[CONTINENT_LEN] = ""; + char country[COUNTRY_LEN] = ""; +#endif + + char *host = h->items[h->idx].metrics->data, *hostname = NULL; +#ifdef HAVE_GEOLOCATION + /* add geolocation child nodes */ + set_geolocation (host, continent, country, city); + + /* country */ + if (country[0] != '\0') { + set_host_child_metrics (country, MTRC_ID_COUNTRY, &nmetrics); + add_sub_item_back (sub_list, h->module, nmetrics); + h->items[h->idx].sub_list = sub_list; + h->sub_items_size++; + + /* flag only */ + conf.has_geocountry = 1; + } + + /* city */ + if (city[0] != '\0') { + set_host_child_metrics (city, MTRC_ID_CITY, &nmetrics); + add_sub_item_back (sub_list, h->module, nmetrics); + h->items[h->idx].sub_list = sub_list; + h->sub_items_size++; + + /* flag only */ + conf.has_geocity = 1; + } +#endif + + /* hostname */ + if (conf.enable_html_resolver && conf.output_stdout) { + hostname = reverse_ip (host); + set_host_child_metrics (hostname, MTRC_ID_HOSTNAME, &nmetrics); + add_sub_item_back (sub_list, h->module, nmetrics); + h->items[h->idx].sub_list = sub_list; + h->sub_items_size++; + free (hostname); + } +} + +/* Set host panel data, including sub items. + * + * On success, the host panel data is set. */ +static void +add_host_child_to_holder (GHolder * h) +{ + GMetrics *nmetrics; + GSubList *sub_list = new_gsublist (); + + char *ip = h->items[h->idx].metrics->data; + char *hostname = NULL; + int n = h->sub_items_size; + + /* add child nodes */ + set_host_sub_list (h, sub_list); + + pthread_mutex_lock (&gdns_thread.mutex); + hostname = ht_get_hostname (ip); + pthread_mutex_unlock (&gdns_thread.mutex); + + /* determine if we have the IP's hostname */ + if (!hostname) { + dns_resolver (ip); + } else if (hostname) { + set_host_child_metrics (hostname, MTRC_ID_HOSTNAME, &nmetrics); + add_sub_item_back (sub_list, h->module, nmetrics); + h->items[h->idx].sub_list = sub_list; + h->sub_items_size++; + free (hostname); + } + + /* did not add any items */ + if (n == h->sub_items_size) + free (sub_list); +} + +/* Given a GRawDataType, set the data and hits value. + * + * On error, no values are set and 1 is returned. + * On success, the data and hits values are set and 0 is returned. */ +static int +set_data_hits_keys (GModule module, GRawDataItem item, GRawDataType type, + char **data, int *hits) +{ + if (type == INTEGER) { + if (!(*data = ht_get_datamap (module, item.key))) + return 1; + *hits = item.value.ivalue; + } else if (type == STRING) { + if (!(*hits = ht_get_hits (module, item.key))) + return 1; + *data = xstrdup (item.value.svalue); + } + return 0; +} + +/* Given a data item, store it into a holder structure. */ +static void +set_data_holder_metrics (GRawDataItem item, GHolder * h, char *data, int hits) +{ + char *method = NULL, *protocol = NULL; + int visitors = 0; + uint64_t bw = 0, cumts = 0, maxts = 0; + + bw = ht_get_bw (h->module, item.key); + cumts = ht_get_cumts (h->module, item.key); + maxts = ht_get_maxts (h->module, item.key); + visitors = ht_get_visitors (h->module, item.key); + + h->items[h->idx].metrics = new_gmetrics (); + h->items[h->idx].metrics->hits = hits; + h->items[h->idx].metrics->data = data; + h->items[h->idx].metrics->visitors = visitors; + h->items[h->idx].metrics->bw.nbw = bw; + h->items[h->idx].metrics->avgts.nts = cumts / hits; + h->items[h->idx].metrics->cumts.nts = cumts; + h->items[h->idx].metrics->maxts.nts = maxts; + + if (conf.append_method) { + method = ht_get_method (h->module, item.key); + h->items[h->idx].metrics->method = method; + } + + if (conf.append_protocol) { + protocol = ht_get_protocol (h->module, item.key); + h->items[h->idx].metrics->protocol = protocol; + } +} + +/* A wrapper to set a host item */ +static void +set_host (GRawDataItem item, GHolder * h, const GPanel * panel, char *data, + int hits) +{ + set_data_holder_metrics (item, h, xstrdup (data), hits); + if (panel->holder_callback) + panel->holder_callback (h); + h->idx++; +} + +/* Set all panel data. This will set data for panels that do not + * contain sub items. A function pointer is used for post data set. */ +static void +add_data_to_holder (GRawDataItem item, GHolder * h, GRawDataType type, + const GPanel * panel) +{ + char *data = NULL; + int hits = 0; + + if (set_data_hits_keys (h->module, item, type, &data, &hits) == 1) + return; + + set_data_holder_metrics (item, h, data, hits); + if (panel->holder_callback) + panel->holder_callback (h); + + h->idx++; +} + +/* Set all panel data. This will set data for panels that do not + * contain sub items. A function pointer is used for post data set. */ +static void +add_host_to_holder (GRawDataItem item, GHolder * h, GRawDataType type, + const GPanel * panel) +{ + char buf4[INET_ADDRSTRLEN]; + char buf6[INET6_ADDRSTRLEN]; + char *data = NULL; + int hits = 0; + unsigned i; + + struct in6_addr addr6, mask6, nwork6; + struct in_addr addr4, mask4, nwork4; + + const char *m4 = "255.255.255.0"; + const char *m6 = "ffff:ffff:ffff:ffff:0000:0000:0000:0000"; + + if (set_data_hits_keys (h->module, item, type, &data, &hits) == 1) + return; + + if (!conf.anonymize_ip) { + add_data_to_holder (item, h, type, panel); + free (data); + return; + } + + if (1 == inet_pton (AF_INET, data, &addr4)) { + if (1 == inet_pton (AF_INET, m4, &mask4)) { + memset (buf4, 0, sizeof *buf4); + nwork4.s_addr = addr4.s_addr & mask4.s_addr; + + if (inet_ntop (AF_INET, &nwork4, buf4, INET_ADDRSTRLEN) != NULL) { + set_host (item, h, panel, buf4, hits); + free (data); + } + } + } else if (1 == inet_pton (AF_INET6, data, &addr6)) { + if (1 == inet_pton (AF_INET6, m6, &mask6)) { + memset (buf6, 0, sizeof *buf6); + for (i = 0; i < 16; i++) { + nwork6.s6_addr[i] = addr6.s6_addr[i] & mask6.s6_addr[i]; + } + + if (inet_ntop (AF_INET6, &nwork6, buf6, INET6_ADDRSTRLEN) != NULL) { + set_host (item, h, panel, buf6, hits); + free (data); + } + } + } +} + +/* Set all root panel data. This will set the root nodes. */ +static int +set_root_metrics (GRawDataItem item, GRawDataType type, GModule module, + GMetrics ** nmetrics) +{ + GMetrics *metrics; + char *data = NULL; + uint64_t bw = 0, cumts = 0, maxts = 0; + int hits = 0, visitors = 0; + + if (set_data_hits_keys (module, item, type, &data, &hits) == 1) + return 1; + + bw = ht_get_bw (module, item.key); + cumts = ht_get_cumts (module, item.key); + maxts = ht_get_maxts (module, item.key); + visitors = ht_get_visitors (module, item.key); + + metrics = new_gmetrics (); + metrics->avgts.nts = cumts / hits; + metrics->cumts.nts = cumts; + metrics->maxts.nts = maxts; + metrics->bw.nbw = bw; + metrics->data = data; + metrics->hits = hits; + metrics->visitors = visitors; + *nmetrics = metrics; + + return 0; +} + +/* Set all root panel data, including sub list items. */ +static void +add_root_to_holder (GRawDataItem item, GHolder * h, GRawDataType type, + GO_UNUSED const GPanel * panel) +{ + GSubList *sub_list; + GMetrics *metrics, *nmetrics; + char *root = NULL; + int root_idx = KEY_NOT_FOUND, idx = 0; + + if (set_root_metrics (item, type, h->module, &nmetrics) == 1) + return; + + if (!(root = (ht_get_root (h->module, item.key)))) + return; + + /* add data as a child node into holder */ + if (KEY_NOT_FOUND == (root_idx = get_item_idx_in_holder (h, root))) { + idx = h->idx; + sub_list = new_gsublist (); + metrics = new_gmetrics (); + + h->items[idx].metrics = metrics; + h->items[idx].metrics->data = root; + h->idx++; + } else { + sub_list = h->items[root_idx].sub_list; + metrics = h->items[root_idx].metrics; + + idx = root_idx; + free (root); + } + + add_sub_item_back (sub_list, h->module, nmetrics); + h->items[idx].sub_list = sub_list; + + h->items[idx].metrics = metrics; + h->items[idx].metrics->cumts.nts += nmetrics->cumts.nts; + h->items[idx].metrics->bw.nbw += nmetrics->bw.nbw; + h->items[idx].metrics->hits += nmetrics->hits; + h->items[idx].metrics->visitors += nmetrics->visitors; + h->items[idx].metrics->avgts.nts = + h->items[idx].metrics->cumts.nts / h->items[idx].metrics->hits; + if (nmetrics->maxts.nts > h->items[idx].metrics->maxts.nts) + h->items[idx].metrics->maxts.nts = nmetrics->maxts.nts; + + h->sub_items_size++; +} + +/* Load raw data into our holder structure */ +void +load_holder_data (GRawData * raw_data, GHolder * h, GModule module, GSort sort) +{ + int i, size = 0, max_choices = get_max_choices (); + const GPanel *panel = panel_lookup (module); + + size = raw_data->size; + h->holder_size = size > max_choices ? max_choices : size; + h->ht_size = size; + h->idx = 0; + h->module = module; + h->sub_items_size = 0; + h->items = new_gholder_item (h->holder_size); + + for (i = 0; i < h->holder_size; i++) { + panel->insert (raw_data->items[i], h, raw_data->type, panel); + } + sort_holder_items (h->items, h->idx, sort); + if (h->sub_items_size) + sort_sub_list (h, sort); + free_raw_data (raw_data); +} diff --git a/goaccess++/src/gholder.h b/goaccess++/src/gholder.h new file mode 100644 index 0000000..b5c05bc --- /dev/null +++ b/goaccess++/src/gholder.h @@ -0,0 +1,49 @@ +/** + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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 GHOLDER_H_INCLUDED +#define GHOLDER_H_INCLUDED + +#define MTRC_ID_COUNTRY 0 +#define MTRC_ID_CITY 1 +#define MTRC_ID_HOSTNAME 2 + +#include "commons.h" +#include "sort.h" + +/* Function Prototypes */ +GHolder *new_gholder (uint32_t size); +void *add_hostname_node (void *ptr_holder); +void free_holder_by_module (GHolder ** holder, GModule module); +void free_holder (GHolder ** holder); +void load_holder_data (GRawData * raw_data, GHolder * h, GModule module, + GSort sort); +void load_host_to_holder (GHolder * h, char *ip); + +#endif // for #ifndef GHOLDER_H diff --git a/goaccess++/src/gholder.o b/goaccess++/src/gholder.o new file mode 100644 index 0000000000000000000000000000000000000000..672f809791d55a55aa4e69d05eb9d8d1cbbd344f GIT binary patch literal 11832 zcmbta4{%e*nSZimqk=0bIhv>!8k9yQ<}f;mkgE+O(X%Cc6`q3|Y~T_S+1N66ku9I} z6iC7!XJj#KA4+^T?X>CjuBCI+NvE9-y}8SzZSG<Ruwk0E9KE|q%Y>3P1UsSpYxvV^ zsPFss?aFJRXJ*=+k#_gD-+ue;_iuM)?}=(n6*ik9icNV)ndu2sQLZnYX@^-etlXw} z6tyiz|GS-DSx@L6UiZPkBn}c|y+@-RPFh1I!XAc9guSfJpV03jw82Ygt0!l-5!&c^ z;z@P$A@|}T95*3n5k~$WwXZkk<wx}gi4k{_{7HRfPr$u+7|9hv-zLTrUSdR@#Mt5F ztMB3sdcg$pC$s<ightQ8LQ^<vW_~-NS4e(Zubljc>FH@=?1BZb$9NmNJhOUUsYfq7 zX|kH(<z5_C)Q#!}wOwsfL2A-91#0;n$(^e)b~_{VJwn_3UdGyZ&g@709;qLrM`raV zSWoN9RMUvRIyUy6L$lw{Fk%2FV<&*L$w|5ztBIlcJ!I^(gV^oF7<6iMlF$v#&<S$w zit!2D4IQYZyMu&2TBp$gqS4*0gf@lqC$fu-N*vFRW*;QE!!>9P^-1+9H4ZjWOhMV2 zF*?dt5{rakk+4Th)(_o^)O!>6h@z<NQF?@_i_o8eG5&{Z%rszxP7!)4LeCQV#^ixN zqJg3c0avIb^jFizbB)zDVCpnQ25~|E?JdZUank6ILHEx5G5wR#(7U<c+w^**j?mM^ z38uTosL6E|T?T}VBM>n?2)|?+pmtdL6NGye&idec+;4G``Wi;g6VlYM@;mq4|A#(& zxrH8Xr#IHq^Mw8!r1BZhg8EK$6T|VD8kj}E!rsuRR?z&_S^?aGOu!e~1?p<7C+`6V z&0V+YOTg4%?>3;Jr$82ZV|qGf;FQ^l0m$1;?l<{oKL!%|SfsJ7i1=ahZBXe?)%F;@ z!lN0*)aW7d{J9ZWm`VD+B<Zk!AHb%tP88OQ!m{v&+R22~!B{A4W6?hn#L$7V(B`jx zy#n`xbV!oa3Q50@jlMn~Fpa)1#@xei0zeFN#o}h%`FlXq<oUxWp72+&6!;Up5TkEJ z=p~K*TBGMDcQK#Y$)oOre;>j1J*4meOjKrxk$nlpXa%KJlY;JFcrPgQ2WS8ghY^lP z{H+RDX(1C1bnPDQ0*gdohLc_(1<ZI;8hvkaDcFNRY?_fi^$-xv<OmIT2gUm4ZZ8*i zo4*}s**c+76e8R+qPkyct5noaFRa?Pu!`hH!QZcYvQtdf9|Uj{vdU1Z{O5tm)KS<t z<J&W{HpU0D_eStXGflDNeFI|dJoqGu7@xn%DeFu-*P@++Xy+iRE<!Irvlg3^^dn|! z_izsw1qMLvoP?f_Q8R}zI7Y{3M$qBSAXj<TBV9ZFwV@LjA%`@25i^>TT)U>x=j!Nl zwJK;7gv$^@*S1FJHppa+VFJp>hRFyPV`e!8%d2QeSYi>{=>h^n4=e8BGtdI$g}0%O z6nY_U7W$*1tFhb>TWsu%<Ad8{xp5E1mb0b)ynFZ+AbZ3}u5dn5aIDbiG$wF3n=sal zthp$p%^#x}VEt*$s9_sa!P9~4ml{Op$?F)M)qY|$5;zv?h&@U)8~Eo^Li?P?+FE-{ zEwQ!N(Uw|ceUNk=v$Y2yYttwp*DgT?du(hatD~(?JD}I9<{;8+xL{o|9I~Ad+eE~H znYUlZaAd;33G9Tn0*8w@j3=<qN4qrtB0`VE42PeLy#s3`oz58jsYZ7>ajk0GQ~>;m zahmZT(|Ow2p^pnerg#;qSvlfm0MK{3K{XIrgN%i-*4yL0U^=%D3|5~l7@jgz^E*Pv ziU(S&Q!~=e9=hNE4PXl)snK`FhyCA#j^bVl+Q%;+eg*L>j9;zz)q!7w?xn;2Ax1jv z$DBb7IK1Gx05)S{4ej&~D(?JZaA0V9pm`Xm%ySbiEH076+<6@nPvJorHT9>_Ym5WO zV)QWUw&dS+5Bq?Y_2A|qd|w@}sxUIJ@MU&#gM<9=Dx?e8F%XIE(wbbO*T$xTp&j*& zUiUEeFcH2Cb<y(f{NJEF&mTtZOAas-^J4v(aAV#LXBb?<oZ}TX5N7hTT!h){Pq1qN z@K>fTLpJGQ`IYm7*&=*r^HY%D*(>IjEct!8$WQ1`>@)8LZxbi%)B@<3>k3PWgaUn` zYjxb=N1ei~7)k}He=@-(0J7OaF!`reiR?IHp3iVwi;cZo2`1qC`*r9l;i(Jmrcw?? zdScv3z$?1VyD8is$Ieu)C${&EhU)z2?q#8qaBm{?Es{HAGZ(KQMjc+tCSL%tFy#Po z{o~bpeo2f~Y{8hl)=ws)?3|y7Vni`(9_ks9*Dl5%yJ5l=2NJjOFy2X@)e4`%Ni7g) zYnYu>W061ihiQF18T(BovHi+uM%jXp>x4cpLaO8P%@gvS{}7L^T?$Ny)Nile^9$e~ z%N=$wA#tFk{#^E7%-%#4S1fwnA(O9pzNi~w^eWycZs1j{up9~3vwP1b0+AhzfSu}0 zHuQYx80c&D-R|LoK$RPV6K>p>`@K7RF7#W~XkVz(r=0(Z2eCTQ#1vG2T%{Wpy4Sq{ z08<s6Q0Z>-9vwBBJTY1Ywu{1cmxoS*9aN(QuE~=Sa%hd19qxKy8Pg)u?M}7+DbJp_ zV#Y&o-qfka)9h*$WWuS&Zf|}%yA0CnCdlP80mg3rOwW+8A#H+&e=@ZWoOOhqNQ{fP z5@Dp^C7}*#Eq`^-9UmM-|0w2huUg+!z58o8(aYS0j<FLaW>gVl5qR}xxE#Tw=O@N$ zrUoXN2A6H5s%gnjyNB<DAk_*T&d^DXo{{1dZq0CJC^4fMi1Fky2Eh+^Kqt+$k0%`_ zf|#)pMx%<6uBC&u?pIcX_XUk~(D*o7jt&Ol4h?UtbePaVIFQnCl062`hd~0bxYib9 zj~87%cf<qIWb>d$4U<BIo(laIFGA*_h%Mh_?d9p|a%a=T>>~g+VZQG$T0otcsqu`? z9rjGpOBh6;9C-0)bd9tA?JW4ISZ3;*m|KeP!=f+{&_x<klmoy=5(P(#M-qRvN(bfC zBfxjX0}lkmhuwpe9w@6yzJgFz&Hh3){z(PX?_33M(sLF2T!S#?xWza-1LmNqnqv%y z=G|i4d5iIn-C`VXzjKuZa}B~6%P4cuumG52+%?A-8)|NBT;;22-;y2Bv%dPk%0O^= zD9d`G-7A8D;L5;?r6$hE(H@xWQ18u;wku%YQN)BD7eX70?b*i^+YXQIuIhQt5pa@~ zfGuJpiqe5~gUhqOBI5GywKuwaImgcVF0bnHG`O5(fhL+jRs)|lq=&Krzh>sCI1gDw z*gQqSWIKd3P*nEi^6ag6&V@GYfX~+ugR%^r7Wlka(ctpFU~h2w3XTR>&Hl=WE4a5R z;;PHdYj$;1d}qF^PIU!UR}D}ACCmWvA`2>7%i+Kh_b7gx(y$FP3Kdb8cfY;a<=g9s zxN35h&8}e5RRglCf}^qtNb7hY?Vmjl=w{}%&Ue*Bq=}IQ8vy|l(19r&S<vmOfwhW& zf?42;ocC9dcN6Npxv2M;D_oJC&zPF(R~IN@AUn$Eyn{8&c>(uPut#0K{kV_4m5r`o zu1a%_+A6+2pD79CC@QIG0q(z=2mczZfyax;<0gGKn))8H+5f|4p>ddw{5ErbKP&Pp zu^(7#Z<UJt*10a)?7PeJTZ=J=zVcnpk6lfeUY=sUQVU~8`Pkn<TY0qTtDsx(xz7m) zZ9FvoCfE*0u5<dYB0bX=$W}n#+V21l+KaxGtE$K`dlmI$?rS9vo>Q~;1-dRcqUe`w zUj+Bn<QlP6yb5Xpb|sGa$egJJ&FD}rO`~|F#V(w-WWZjG>e&PKGFcfHuaNk3@F}0- zxahMO1`MxUNIwcS7S*ia*Ig6$aQ|bm3fPkz4|6@EKVa#H5Aqq|_<n{e3f74GxNe#6 z^D#TiUc4h!cID>N;_IBxDCfiC0kD7N_(6UEF&_u)2*)q-gN6AjVEE>@NvF+ezCVCL z%jHiYyHfu2uq)+FZ7*|LoW%vo?DrhQZ{9D$cID<%?GoUa_e;w>*he|sZGkVe!0)!e z(f;N5W4<hh6AQfE0)N~B@3p{pSl~kz_=^_!KU(15wZLDoz(+0cH!bj=Tj0O3z%N+f z6%cRb^nberexC)t(gJ@N@Y^9`MtKOZ91YI5)`I>qPJfZpv%C%Ty&NCpA;a=B;JO8$ zAx`h9Ha(r?WN7}q1^odF{M#1zk1X(GfZwKEo)-5_Q7c<}Q_1c`I?$zbc6Y}!*)8!t zJ<%WE(%H35=}sgQdV+z;zKpK)q!Wp_Ngwa-)H{_-LT3#D_9ygoUsop3mq~X9f^4`q zmC@xs&Wrc<>6!Sp#50*dS85=m52jOtK#l^iVLineG6*@uXG7^!suW^WUA=wDZi#lV zb0CrI8`!D@w8kKQg_L-+wyr_d;_I54)<@goZEAxSjVn9)JCn&&7u%uItH-y(#<px1 zt*&gpo)Mk?&K)zIr~5K}dMce!1`^xjTlw}C*i=uEJfZidx<wCms;9bANo7YyPj_br z1&-V9?<{svKT15F(ZLGwuHJ3&p3c6c(l-E74eF@@vo)ZniW5*F3b5?zA7onJnn=NR zI`uvv-r7BoiR-=TL}#}$Xx8!mte)5r2a;_<0@U9?XMduEBs;)}kVQI?NhP07q?L36 zzB7q<-=Mi|(<7ArL_he$EGOCWOuRqUolPcWR577AbE#yivs-u%b1Bq3s2Fyg>g!5m zlpS5BWiqL>E(p;>GbYP)=XTQ-2U6SPdOyUpS@6y9m+*n#=2;n$@Vg}ZB@6t31^$)= z{+<Q?p#^?F<UK4XC%#*RoQ)EWcN>9!PQve&@VJC8mhg;(`y~8Z9EWtE+ykH12Ka(9 zUV^uA{H(<1(?BQWu_FU0SRo%lkNFu3?(1Io2>Qn*+%Mr{5{@}o&`(MD5(&R1;WD3p z<M$_A_dbdKUId`vG?Y_oz@DP4<~UaP1{CXVw7|bD;j;g{%5mg>hs5U%iC*Uap@c7$ z=s(5pc{nWduj4rKzf+=*O7t@SFG#q||DPmW*3TXMiiYdTet55h%YGP?aM=$ZmT=h* zn<d;Q$-hs+|4PDdNcb`dzl~pEOZD^55-!L4YZ5N6J1OD!N&J`b0}=VleBO}oT8aJ? z$Aw=Fa=)4^!C&L}H3`SJ$!7Rq`AFiAf6f$s=-^jml;^J{d;!OCU762cNc2I8{vHYU zNqDV<`z3s{gv)+-K*D7{-;;2e&)Xaq`Z>+@a7m(<`TSABWj@RKeM|6pm-C5m9Q6~D z<o{a<m*r1N_zH<$mvC90JrXX<^L+`I`Tt15Wxx6_377rql!W8&I>PP^{2qz>lKFpu z<EV$vO7v$f=&xAdOZdGL`QTY8)?LGKT(@4r4GCW*;lGgZ)e@fhICP*OADR9o3HQO6 zSoen#F6;R;$A#TL<aS@ee{e+p^17=eT-I|z!exDaU&3WRM<iV4b4J2tKKM?@g7V1t z4Tj!~Uz7B<255vHcp88giFsCu-xX>&pHiGy;Jp_3z7kyg-XQKpg1`7(;pGx~@jJv( z3w*K!7xFuiF%-dH;58OFzOT#C<9oRrzOMuqa=u)Gi*=8d;DX*~vS;@M^f^&B@dje} z>EQigUJHDb_rFnsi{F_Xd|g2w#s-u%CAj#V=_@6;kRRXOSOlL@e(&*cegYT!>L|g5 zeGiu4;vM{E2`=8dAC=(Zy<5lE$6@@4cdZi0JkzgtZh=})n{}^fr4z}{0K7kRCBUxy zfi0Pg5=f`8gXEz=Xm+;_x;TdsKr4W6o1_Ad$Nv7r0I(TI>4^aRxnMbaG4cM^fouR@ zmWj0f3}=w&jrXMSk@II4A8<fZ@asyEUzoSf^L!x&N`K41T!A?wEC_gg94}i?UUix^ zvcYwDm;J7cBTG2W)sGM>0k>$)uDRP3!CGh`&p&lOp1H^q&r-RF^-H$TXpv6H5$5gE z`C%@94H8R5>|e~szu92BRQ@48|Fj_FJbb(s)jDXD)BiqHER-QWANPS*MzOvZ2cdMs z2TAa*C6|ud%pU4jE<zkp_rsuQ%XItsd>O-bDeW%6P%a*pNW#hppYP*+Q3?4)|4Yz7 zo~82-^7%t0iY=Xw=SDgGIcv-nTDiceKRoipe4)Q`Yvary`(Ir}InLiJXwFZTnUB}S i5)lD`f`J9)c*({}^@rOmH-FPoHeJEr<>gX3|NjBfuM>p; literal 0 HcmV?d00001 diff --git a/goaccess++/src/gkhash.c b/goaccess++/src/gkhash.c new file mode 100644 index 0000000..8dcfba8 --- /dev/null +++ b/goaccess++/src/gkhash.c @@ -0,0 +1,1610 @@ +/** + * gkhash.c -- default hash table functions + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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. + */ + +#if HAVE_CONFIG_H +#include <config.h> +#endif + +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "gkhash.h" + +#include "error.h" +#include "sort.h" +#include "util.h" +#include "xmalloc.h" + +/* Hash tables storage */ +static GKHashStorage *gkh_storage; + +/* *INDENT-OFF* */ +/* Hash tables used across the whole app */ +static khash_t (is32) *ht_agent_vals = NULL; +static khash_t (si32) *ht_agent_keys = NULL; +static khash_t (si32) *ht_unique_keys = NULL; +static khash_t (ss32) *ht_hostnames = NULL; +/* *INDENT-ON* */ +static GKHashStorage * +new_gkhstorage (uint32_t size) +{ + GKHashStorage *storage = xcalloc (size, sizeof (GKHashStorage)); + return storage; +} + +/* Initialize a new int key - int value hash table */ +static +khash_t (ii32) * +new_ii32_ht (void) +{ + khash_t (ii32) * h = kh_init (ii32); + return h; +} + +/* Initialize a new int key - string value hash table */ +static +khash_t (is32) * +new_is32_ht (void) +{ + khash_t (is32) * h = kh_init (is32); + return h; +} + +/* Initialize a new int key - uint64_t value hash table */ +static +khash_t (iu64) * +new_iu64_ht (void) +{ + khash_t (iu64) * h = kh_init (iu64); + return h; +} + +/* Initialize a new string key - int value hash table */ +static +khash_t (si32) * +new_si32_ht (void) +{ + khash_t (si32) * h = kh_init (si32); + return h; +} + +/* Initialize a new string key - string value hash table */ +static +khash_t (ss32) * +new_ss32_ht (void) +{ + khash_t (ss32) * h = kh_init (ss32); + return h; +} + +/* Initialize a new int key - int value hash table */ +static +khash_t (igsl) * +new_igsl_ht (void) +{ + khash_t (igsl) * h = kh_init (igsl); + return h; +} + +/* Initialize a new int key - uint64_t value hash table */ +static +khash_t (su64) * +new_su64_ht (void) +{ + khash_t (su64) * h = kh_init (su64); + return h; +} + +/* Destroys both the hash structure and the keys for a + * string key - int value hash */ +static void +des_si32_free (khash_t (si32) * hash) +{ + khint_t k; + if (!hash) + return; + + for (k = 0; k < kh_end (hash); ++k) { + if (kh_exist (hash, k)) { + free ((char *) kh_key (hash, k)); + } + } + + kh_destroy (si32, hash); +} + +/* Destroys both the hash structure and its string values */ +static void +des_is32_free (khash_t (is32) * hash) +{ + khint_t k; + if (!hash) + return; + + for (k = 0; k < kh_end (hash); ++k) { + if (kh_exist (hash, k)) { + free ((char *) kh_value (hash, k)); + } + } + + kh_destroy (is32, hash); +} + +/* Destroys both the hash structure and its string + * keys and string values */ +static void +des_ss32_free (khash_t (ss32) * hash) +{ + khint_t k; + if (!hash) + return; + + for (k = 0; k < kh_end (hash); ++k) { + if (kh_exist (hash, k)) { + free ((char *) kh_key (hash, k)); + free ((char *) kh_value (hash, k)); + } + } + + kh_destroy (ss32, hash); +} + +/* Destroys the hash structure */ +static void +des_ii32 (khash_t (ii32) * hash) +{ + if (!hash) + return; + kh_destroy (ii32, hash); +} + +/* Destroys both the hash structure and its GSLList + * values */ +static void +des_igsl_free (khash_t (igsl) * hash) +{ + khint_t k; + void *list = NULL; + if (!hash) + return; + + for (k = 0; k < kh_end (hash); ++k) { + if (kh_exist (hash, k) && (list = kh_value (hash, k))) { + list_remove_nodes (list); + } + } + + kh_destroy (igsl, hash); +} + +/* Destroys both the hash structure and the keys for a + * string key - uint64_t value hash */ +static void +des_su64_free (khash_t (su64) * hash) +{ + if (!hash) + return; + + kh_destroy (su64, hash); +} + +/* Destroys the hash structure */ +static void +des_iu64 (khash_t (iu64) * hash) +{ + if (!hash) + return; + kh_destroy (iu64, hash); +} + +/* Initialize map & metric hashes */ +static void +init_tables (GModule module) +{ + int n = 0, i; + /* *INDENT-OFF* */ + GKHashMetric metrics[] = { + {MTRC_KEYMAP , MTRC_TYPE_SI32 , {.si32 = new_si32_ht ()}} , + {MTRC_ROOTMAP , MTRC_TYPE_IS32 , {.is32 = new_is32_ht ()}} , + {MTRC_DATAMAP , MTRC_TYPE_IS32 , {.is32 = new_is32_ht ()}} , + {MTRC_UNIQMAP , MTRC_TYPE_SI32 , {.si32 = new_si32_ht ()}} , + {MTRC_ROOT , MTRC_TYPE_II32 , {.ii32 = new_ii32_ht ()}} , + {MTRC_HITS , MTRC_TYPE_II32 , {.ii32 = new_ii32_ht ()}} , + {MTRC_VISITORS , MTRC_TYPE_II32 , {.ii32 = new_ii32_ht ()}} , + {MTRC_BW , MTRC_TYPE_IU64 , {.iu64 = new_iu64_ht ()}} , + {MTRC_CUMTS , MTRC_TYPE_IU64 , {.iu64 = new_iu64_ht ()}} , + {MTRC_MAXTS , MTRC_TYPE_IU64 , {.iu64 = new_iu64_ht ()}} , + {MTRC_METHODS , MTRC_TYPE_IS32 , {.is32 = new_is32_ht ()}} , + {MTRC_PROTOCOLS , MTRC_TYPE_IS32 , {.is32 = new_is32_ht ()}} , + {MTRC_AGENTS , MTRC_TYPE_IGSL , {.igsl = new_igsl_ht ()}} , + {MTRC_METADATA , MTRC_TYPE_SU64 , {.su64 = new_su64_ht ()}} , + }; + /* *INDENT-ON* */ + + n = ARRAY_SIZE (metrics); + for (i = 0; i < n; i++) { + gkh_storage[module].metrics[i] = metrics[i]; + } +} + +/* Initialize hash tables */ +void +init_storage (void) +{ + GModule module; + size_t idx = 0; + + /* Hashes used across the whole app (not per module) */ + ht_agent_keys = (khash_t (si32) *) new_si32_ht (); + ht_agent_vals = (khash_t (is32) *) new_is32_ht (); + ht_hostnames = (khash_t (ss32) *) new_ss32_ht (); + ht_unique_keys = (khash_t (si32) *) new_si32_ht (); + + gkh_storage = new_gkhstorage (TOTAL_MODULES); + FOREACH_MODULE (idx, module_list) { + module = module_list[idx]; + + gkh_storage[module].module = module; + init_tables (module); + } +} + +static void +free_metric_type (GKHashMetric mtrc) +{ + /* Determine the hash structure type */ + switch (mtrc.type) { + case MTRC_TYPE_II32: + des_ii32 (mtrc.ii32); + break; + case MTRC_TYPE_IS32: + des_is32_free (mtrc.is32); + break; + case MTRC_TYPE_IU64: + des_iu64 (mtrc.iu64); + break; + case MTRC_TYPE_SI32: + des_si32_free (mtrc.si32); + break; + case MTRC_TYPE_SS32: + des_ss32_free (mtrc.ss32); + break; + case MTRC_TYPE_IGSL: + des_igsl_free (mtrc.igsl); + break; + case MTRC_TYPE_SU64: + des_su64_free (mtrc.su64); + break; + } +} + +/* Destroys the hash structure allocated metrics */ +static void +free_metrics (GModule module) +{ + int i; + GKHashMetric mtrc; + + for (i = 0; i < GSMTRC_TOTAL; i++) { + mtrc = gkh_storage[module].metrics[i]; + free_metric_type (mtrc); + } +} + +/* Destroys the hash structure and its content */ +void +free_storage (void) +{ + size_t idx = 0; + + des_is32_free (ht_agent_vals); + des_si32_free (ht_agent_keys); + des_si32_free (ht_unique_keys); + des_ss32_free (ht_hostnames); + + if (!gkh_storage) + return; + + FOREACH_MODULE (idx, module_list) { + free_metrics (module_list[idx]); + } + free (gkh_storage); +} + +/* Given a module and a metric, get the hash table + * + * On error, or if table is not found, NULL is returned. + * On success the hash structure pointer is returned. */ +static void * +get_hash (GModule module, GSMetric metric) +{ + void *hash = NULL; + int i; + GKHashMetric mtrc; + + for (i = 0; i < GSMTRC_TOTAL; i++) { + if (hash != NULL) + break; + + mtrc = gkh_storage[module].metrics[i]; + if (mtrc.metric != metric) + continue; + + /* Determine the hash structure type */ + switch (mtrc.type) { + case MTRC_TYPE_II32: + hash = mtrc.ii32; + break; + case MTRC_TYPE_IS32: + hash = mtrc.is32; + break; + case MTRC_TYPE_IU64: + hash = mtrc.iu64; + break; + case MTRC_TYPE_SI32: + hash = mtrc.si32; + break; + case MTRC_TYPE_SS32: + hash = mtrc.ss32; + break; + case MTRC_TYPE_IGSL: + hash = mtrc.igsl; + break; + case MTRC_TYPE_SU64: + hash = mtrc.su64; + break; + } + } + + return hash; +} + +/* Insert a string key and the corresponding int value. + * Note: If the key exists, the value is not replaced. + * + * On error, or if key exists, -1 is returned. + * On success 0 is returned */ +static int +ins_si32 (khash_t (si32) * hash, const char *key, int value) +{ + khint_t k; + int ret; + char *dupkey = NULL; + + if (!hash) + return -1; + + dupkey = xstrdup (key); + k = kh_put (si32, hash, dupkey, &ret); + /* operation failed, or key exists */ + if (ret == -1 || ret == 0) { + free (dupkey); + return -1; + } + + kh_val (hash, k) = value; + + return 0; +} + +/* Insert an int key and the corresponding string value. + * Note: If the key exists, the value is not replaced. + * + * On error, or if key exists, -1 is returned. + * On success 0 is returned */ +static int +ins_is32 (khash_t (is32) * hash, int key, const char *value) +{ + khint_t k; + int ret; + + if (!hash) + return -1; + + k = kh_put (is32, hash, key, &ret); + if (ret == -1 || ret == 0) + return -1; + + kh_val (hash, k) = xstrdup (value); + + return 0; +} + +/* Insert a string key and the corresponding string value. + * Note: If the key exists, the value is not replaced. + * + * On error, or if key exists, -1 is returned. + * On success 0 is returned */ +static int +ins_ss32 (khash_t (ss32) * hash, const char *key, const char *value) +{ + khint_t k; + int ret; + char *dupkey = NULL; + + if (!hash) + return -1; + + dupkey = xstrdup (key); + k = kh_put (ss32, hash, dupkey, &ret); + /* operation failed, or key exists */ + if (ret == -1 || ret == 0) { + free (dupkey); + return -1; + } + + kh_val (hash, k) = xstrdup (value); + + return 0; +} + +/* Insert an int key and an int value + * Note: If the key exists, its value is replaced by the given value. + * + * On error, -1 is returned. + * On success 0 is returned */ +static int +ins_ii32 (khash_t (ii32) * hash, int key, int value) +{ + khint_t k; + int ret; + + if (!hash) + return -1; + + k = kh_put (ii32, hash, key, &ret); + if (ret == -1) + return -1; + + kh_val (hash, k) = value; + + return 0; +} + +/* Insert an int key and a uint64_t value + * Note: If the key exists, its value is replaced by the given value. + * + * On error, -1 is returned. + * On success 0 is returned */ +static int +ins_iu64 (khash_t (iu64) * hash, int key, uint64_t value) +{ + khint_t k; + int ret; + + if (!hash) + return -1; + + k = kh_put (iu64, hash, key, &ret); + if (ret == -1) + return -1; + + kh_val (hash, k) = value; + + return 0; +} + +/* Increase an int value given an int key. + * Note: If the key exists, its value is increased by the given inc. + * + * On error, -1 is returned. + * On success the inserted value is returned */ +static int +inc_ii32 (khash_t (ii32) * hash, int key, int inc) +{ + khint_t k; + int ret, value = inc; + + if (!hash) + return -1; + + k = kh_get (ii32, hash, key); + /* key found, increment current value by the given `inc` */ + if (k != kh_end (hash)) + value = kh_val (hash, k) + inc; + + k = kh_put (ii32, hash, key, &ret); + if (ret == -1) + return -1; + + kh_val (hash, k) = value; + + return value; +} + +/* Increase a uint64_t value given a string key. + * + * On error, -1 is returned. + * On success 0 is returned */ +static int +inc_su64 (khash_t (su64) * hash, const char *key, uint64_t inc) +{ + khint_t k; + int ret; + uint64_t value = inc; + + if (!hash) + return -1; + + k = kh_get (su64, hash, key); + /* key not found, set new value to the given `inc` */ + if (k == kh_end (hash)) { + k = kh_put (su64, hash, key, &ret); + /* operation failed */ + if (ret == -1) + return -1; + } else { + value = kh_val (hash, k) + inc; + } + + kh_val (hash, k) = value; + + return 0; +} + +/* Increase a uint64_t value given an int key. + * Note: If the key exists, its value is increased by the given inc. + * + * On error, -1 is returned. + * On success 0 is returned */ +static int +inc_iu64 (khash_t (iu64) * hash, int key, uint64_t inc) +{ + khint_t k; + int ret; + uint64_t value = inc; + + if (!hash) + return -1; + + k = kh_get (iu64, hash, key); + /* key found, increment current value by the given `inc` */ + if (k != kh_end (hash)) + value = (uint64_t) kh_val (hash, k) + inc; + + k = kh_put (iu64, hash, key, &ret); + if (ret == -1) + return -1; + + kh_val (hash, k) = value; + + return 0; +} + +/* Insert a string key and auto increment int value. + * + * On error, -1 is returned. + * On success the value of the key inserted is returned */ +static int +ins_si32_ai (khash_t (si32) * hash, const char *key) +{ + int size = 0, value = 0; + + if (!hash) + return -1; + + size = kh_size (hash); + /* the auto increment value starts at SIZE (hash table) + 1 */ + value = size > 0 ? size + 1 : 1; + + if (ins_si32 (hash, key, value) == -1) + return -1; + + return value; +} + +/* Compare if the given needle is in the haystack + * + * if equal, 1 is returned, else 0 */ +static int +find_int_key_in_list (void *data, void *needle) +{ + return (*(int *) data) == (*(int *) needle) ? 1 : 0; +} + +/* Insert an int key and the corresponding GSLList (Single linked-list) value. + * Note: If the key exists within the list, the value is not appended. + * + * On error, -1 is returned. + * On success 0 is returned */ +static int +ins_igsl (khash_t (igsl) * hash, int key, int value) +{ + khint_t k; + GSLList *list, *match; + int ret; + + if (!hash) + return -1; + + k = kh_get (igsl, hash, key); + /* key found, check if key exists within the list */ + if (k != kh_end (hash) && (list = kh_val (hash, k))) { + if ((match = list_find (list, find_int_key_in_list, &value))) + return 0; + list = list_insert_prepend (list, int2ptr (value)); + } else { + list = list_create (int2ptr (value)); + } + + k = kh_put (igsl, hash, key, &ret); + if (ret == -1) + return -1; + + kh_val (hash, k) = list; + + return 0; +} + +/* Get the int value of a given string key. + * + * On error, -1 is returned. + * On success the int value for the given key is returned */ +static int +get_si32 (khash_t (si32) * hash, const char *key) +{ + khint_t k; + + if (!hash) + return -1; + + k = kh_get (si32, hash, key); + /* key found, return current value */ + if (k != kh_end (hash)) + return kh_val (hash, k); + + return -1; +} + +/* Get the string value of a given int key. + * + * On error, NULL is returned. + * On success the string value for the given key is returned */ +static char * +get_is32 (khash_t (is32) * hash, int key) +{ + khint_t k; + char *value = NULL; + + if (!hash) + return NULL; + + k = kh_get (is32, hash, key); + /* key found, return current value */ + if (k != kh_end (hash) && (value = kh_val (hash, k))) + return xstrdup (value); + + return NULL; +} + +/* Get the string value of a given string key. + * + * On error, NULL is returned. + * On success the string value for the given key is returned */ +static char * +get_ss32 (khash_t (ss32) * hash, const char *key) +{ + khint_t k; + char *value = NULL; + + if (!hash) + return NULL; + + k = kh_get (ss32, hash, key); + /* key found, return current value */ + if (k != kh_end (hash) && (value = kh_val (hash, k))) + return xstrdup (value); + + return NULL; +} + +/* Get the int value of a given int key. + * + * If key is not found, 0 is returned. + * On error, -1 is returned. + * On success the int value for the given key is returned */ +static int +get_ii32 (khash_t (ii32) * hash, int key) +{ + khint_t k; + int value = 0; + + if (!hash) + return -1; + + k = kh_get (ii32, hash, key); + /* key found, return current value */ + if (k != kh_end (hash) && (value = kh_val (hash, k))) + return value; + + return 0; +} + +/* Get the uint64_t value of a given int key. + * + * On error, or if key is not found, 0 is returned. + * On success the uint64_t value for the given key is returned */ +static uint64_t +get_iu64 (khash_t (iu64) * hash, int key) +{ + khint_t k; + uint64_t value = 0; + + if (!hash) + return 0; + + k = kh_get (iu64, hash, key); + /* key found, return current value */ + if (k != kh_end (hash) && (value = kh_val (hash, k))) + return value; + + return 0; +} + +/* Get the GSLList value of a given int key. + * + * On error, or if key is not found, NULL is returned. + * On success the GSLList value for the given key is returned */ +static GSLList * +get_igsl (khash_t (igsl) * hash, int key) +{ + khint_t k; + GSLList *list = NULL; + + if (!hash) + return NULL; + + k = kh_get (igsl, hash, key); + /* key found, return current value */ + if (k != kh_end (hash) && (list = kh_val (hash, k))) + return list; + + return NULL; +} + +/* Get the uint64_t value of a given string key. + * + * On error, or if key is not found, 0 is returned. + * On success the uint64_t value for the given key is returned */ +static uint64_t +get_su64 (khash_t (su64) * hash, const char *key) +{ + khint_t k; + uint64_t val = 0; + + if (!hash) + return 0; + + k = kh_get (su64, hash, key); + /* key found, return current value */ + if (k != kh_end (hash) && (val = kh_val (hash, k))) + return val; + + return 0; +} + +/* Iterate over all the key/value pairs for the given hash structure + * and set the maximum and minimum values found on an integer key and + * integer value. + * + * Note: This are expensive calls since it has to iterate over all + * key-value pairs + * + * If the hash structure is empty, no values are set. + * On success the minimum and maximum values are set. */ +static void +get_ii32_min_max (khash_t (ii32) * hash, int *min, int *max) +{ + khint_t k; + int curvalue = 0, i; + + for (i = 0, k = kh_begin (hash); k != kh_end (hash); ++k) { + if (!kh_exist (hash, k)) + continue; + + curvalue = kh_value (hash, k); + if (i++ == 0) + *min = curvalue; + if (curvalue > *max) + *max = curvalue; + if (curvalue < *min) + *min = curvalue; + } +} + +/* Iterate over all the key/value pairs for the given hash structure + * and set the maximum and minimum values found on an integer key and + * a uint64_t value. + * + * Note: This are expensive calls since it has to iterate over all + * key-value pairs + * + * If the hash structure is empty, no values are set. + * On success the minimum and maximum values are set. */ +static void +get_iu64_min_max (khash_t (iu64) * hash, uint64_t * min, uint64_t * max) +{ + khint_t k; + uint64_t curvalue = 0; + int i; + + for (i = 0, k = kh_begin (hash); k != kh_end (hash); ++k) { + if (!kh_exist (hash, k)) + continue; + + curvalue = kh_value (hash, k); + if (i++ == 0) + *min = curvalue; + if (curvalue > *max) + *max = curvalue; + if (curvalue < *min) + *min = curvalue; + } +} + +/* Insert a unique visitor key string (IP/DATE/UA), mapped to an auto + * incremented value. + * + * If the given key exists, its value is returned. + * On error, -1 is returned. + * On success the value of the key inserted is returned */ +int +ht_insert_unique_key (const char *key) +{ + int value = -1; + khash_t (si32) * hash = ht_unique_keys; + + if (!hash) + return -1; + + if ((value = get_si32 (hash, key)) != -1) + return value; + + return ins_si32_ai (hash, key); +} + +/* Insert a user agent key string, mapped to an auto incremented value. + * + * If the given key exists, its value is returned. + * On error, -1 is returned. + * On success the value of the key inserted is returned */ +int +ht_insert_agent_key (const char *key) +{ + int value = -1; + khash_t (si32) * hash = ht_agent_keys; + + if (!hash) + return -1; + + if ((value = get_si32 (hash, key)) != -1) + return value; + + return ins_si32_ai (hash, key); +} + +/* Insert a user agent int key, mapped to a user agent string value. + * + * On error, -1 is returned. + * On success 0 is returned */ +int +ht_insert_agent_value (int key, const char *value) +{ + khash_t (is32) * hash = ht_agent_vals; + + if (!hash) + return -1; + + return ins_is32 (hash, key, value); +} + +/* Insert a keymap string key. + * + * If the given key exists, its value is returned. + * On error, -1 is returned. + * On success the value of the key inserted is returned */ +int +ht_insert_keymap (GModule module, const char *key) +{ + int value = -1; + khash_t (si32) * hash = get_hash (module, MTRC_KEYMAP); + + if (!hash) + return -1; + + if ((value = get_si32 (hash, key)) != -1) + return value; + + return ins_si32_ai (hash, key); +} + +/* Insert a datamap int key and string value. + * + * On error, -1 is returned. + * On success 0 is returned */ +int +ht_insert_datamap (GModule module, int key, const char *value) +{ + khash_t (is32) * hash = get_hash (module, MTRC_DATAMAP); + + if (!hash) + return -1; + + return ins_is32 (hash, key, value); +} + +/* Insert a rootmap int key from the keymap store mapped to its string value. + * + * On error, -1 is returned. + * On success 0 is returned */ +int +ht_insert_rootmap (GModule module, int key, const char *value) +{ + khash_t (is32) * hash = get_hash (module, MTRC_ROOTMAP); + + if (!hash) + return -1; + + return ins_is32 (hash, key, value); +} + +/* Insert a uniqmap string key. + * + * If the given key exists, 0 is returned. + * On error, -1 is returned. + * On success the value of the key inserted is returned */ +int +ht_insert_uniqmap (GModule module, const char *key) +{ + int value = -1; + khash_t (si32) * hash = get_hash (module, MTRC_UNIQMAP); + + if (!hash) + return -1; + + if ((value = get_si32 (hash, key)) != -1) + return 0; + + return ins_si32_ai (hash, key); +} + +/* Insert a data int key mapped to the corresponding int root key. + * + * On error, -1 is returned. + * On success 0 is returned */ +int +ht_insert_root (GModule module, int key, int value) +{ + khash_t (ii32) * hash = get_hash (module, MTRC_ROOT); + + if (!hash) + return -1; + + return ins_ii32 (hash, key, value); +} + +/* Insert meta data counters from a string key. + * + * On error, -1 is returned. + * On success 0 is returned */ +int +ht_insert_meta_data (GModule module, const char *key, uint64_t value) +{ + khash_t (su64) * hash = get_hash (module, MTRC_METADATA); + + if (!hash) + return -1; + + return inc_su64 (hash, key, value); +} + +/* Increases hits counter from an int key. + * + * On error, -1 is returned. + * On success the inserted value is returned */ +int +ht_insert_hits (GModule module, int key, int inc) +{ + khash_t (ii32) * hash = get_hash (module, MTRC_HITS); + + if (!hash) + return -1; + + return inc_ii32 (hash, key, inc); +} + +/* Increases visitors counter from an int key. + * + * On error, -1 is returned. + * On success the inserted value is returned */ +int +ht_insert_visitor (GModule module, int key, int inc) +{ + khash_t (ii32) * hash = get_hash (module, MTRC_VISITORS); + + if (!hash) + return -1; + + return inc_ii32 (hash, key, inc); +} + +/* Increases bandwidth counter from an int key. + * + * On error, -1 is returned. + * On success 0 is returned */ +int +ht_insert_bw (GModule module, int key, uint64_t inc) +{ + khash_t (iu64) * hash = get_hash (module, MTRC_BW); + + if (!hash) + return -1; + + return inc_iu64 (hash, key, inc); +} + +/* Increases cumulative time served counter from an int key. + * + * On error, -1 is returned. + * On success 0 is returned */ +int +ht_insert_cumts (GModule module, int key, uint64_t inc) +{ + khash_t (iu64) * hash = get_hash (module, MTRC_CUMTS); + + if (!hash) + return -1; + + return inc_iu64 (hash, key, inc); +} + +/* Insert the maximum time served counter from an int key. + * Note: it compares the current value with the given value. + * + * On error, -1 is returned. + * On success 0 is returned */ +int +ht_insert_maxts (GModule module, int key, uint64_t value) +{ + uint64_t curvalue = 0; + khash_t (iu64) * hash = get_hash (module, MTRC_MAXTS); + + if (!hash) + return -1; + + if ((curvalue = get_iu64 (hash, key)) < value) + ins_iu64 (hash, key, value); + + return 0; +} + +/* Insert a method given an int key and string value. + * + * On error, or if key exists, -1 is returned. + * On success 0 is returned */ +int +ht_insert_method (GModule module, int key, const char *value) +{ + khash_t (is32) * hash = get_hash (module, MTRC_METHODS); + + if (!hash) + return -1; + + return ins_is32 (hash, key, value); +} + +/* Insert a protocol given an int key and string value. + * + * On error, or if key exists, -1 is returned. + * On success 0 is returned */ +int +ht_insert_protocol (GModule module, int key, const char *value) +{ + khash_t (is32) * hash = get_hash (module, MTRC_PROTOCOLS); + + if (!hash) + return -1; + + return ins_is32 (hash, key, value); +} + +/* Insert an agent for a hostname given an int key and int value. + * + * On error, -1 is returned. + * On success 0 is returned */ +int +ht_insert_agent (GModule module, int key, int value) +{ + khash_t (igsl) * hash = get_hash (module, MTRC_AGENTS); + + if (!hash) + return -1; + + return ins_igsl (hash, key, value); +} + +/* Insert an IP hostname mapped to the corresponding hostname. + * + * On error, or if key exists, -1 is returned. + * On success 0 is returned */ +int +ht_insert_hostname (const char *ip, const char *host) +{ + khash_t (ss32) * hash = ht_hostnames; + + if (!hash) + return -1; + + return ins_ss32 (hash, ip, host); +} + +/* Get the number of elements in a datamap. + * + * Return -1 if the operation fails, else number of elements. */ +uint32_t +ht_get_size_datamap (GModule module) +{ + khash_t (is32) * hash = get_hash (module, MTRC_DATAMAP); + + if (!hash) + return 0; + + return kh_size (hash); +} + +/* Get the number of elements in a uniqmap. + * + * On error, 0 is returned. + * On success the number of elements in MTRC_UNIQMAP is returned */ +uint32_t +ht_get_size_uniqmap (GModule module) +{ + khash_t (is32) * hash = get_hash (module, MTRC_UNIQMAP); + + if (!hash) + return 0; + + return kh_size (hash); +} + +/* Get the string data value of a given int key. + * + * On error, NULL is returned. + * On success the string value for the given key is returned */ +char * +ht_get_datamap (GModule module, int key) +{ + khash_t (is32) * hash = get_hash (module, MTRC_DATAMAP); + + if (!hash) + return NULL; + + return get_is32 (hash, key); +} + +/* Get the int value from MTRC_KEYMAP given a string key. + * + * On error, -1 is returned. + * On success the int value for the given key is returned */ +int +ht_get_keymap (GModule module, const char *key) +{ + khash_t (si32) * hash = get_hash (module, MTRC_KEYMAP); + + if (!hash) + return -1; + + return get_si32 (hash, key); +} + +/* Get the int value from MTRC_UNIQMAP given a string key. + * + * On error, -1 is returned. + * On success the int value for the given key is returned */ +int +ht_get_uniqmap (GModule module, const char *key) +{ + khash_t (si32) * hash = get_hash (module, MTRC_UNIQMAP); + + if (!hash) + return -1; + + return get_si32 (hash, key); +} + +/* Get the string root from MTRC_ROOTMAP given an int data key. + * + * On error, NULL is returned. + * On success the string value for the given key is returned */ +char * +ht_get_root (GModule module, int key) +{ + int root_key = 0; + khash_t (ii32) * hashroot = get_hash (module, MTRC_ROOT); + khash_t (is32) * hashrootmap = get_hash (module, MTRC_ROOTMAP); + + if (!hashroot || !hashrootmap) + return NULL; + + /* not found */ + if ((root_key = get_ii32 (hashroot, key)) == 0) + return NULL; + + return get_is32 (hashrootmap, root_key); +} + +/* Get the int visitors value from MTRC_VISITORS given an int key. + * + * If key is not found, 0 is returned. + * On error, -1 is returned. + * On success the int value for the given key is returned */ +int +ht_get_visitors (GModule module, int key) +{ + khash_t (ii32) * hash = get_hash (module, MTRC_VISITORS); + + if (!hash) + return -1; + + return get_ii32 (hash, key); +} + +/* Get the int visitors value from MTRC_VISITORS given an int key. + * + * If key is not found, 0 is returned. + * On error, -1 is returned. + * On success the int value for the given key is returned */ +int +ht_get_hits (GModule module, int key) +{ + khash_t (ii32) * hash = get_hash (module, MTRC_HITS); + + if (!hash) + return -1; + + return get_ii32 (hash, key); +} + +/* Get the uint64_t value from MTRC_BW given an int key. + * + * On error, or if key is not found, 0 is returned. + * On success the uint64_t value for the given key is returned */ +uint64_t +ht_get_bw (GModule module, int key) +{ + khash_t (iu64) * hash = get_hash (module, MTRC_BW); + + if (!hash) + return 0; + + return get_iu64 (hash, key); +} + +/* Get the uint64_t value from MTRC_CUMTS given an int key. + * + * On error, or if key is not found, 0 is returned. + * On success the uint64_t value for the given key is returned */ +uint64_t +ht_get_cumts (GModule module, int key) +{ + khash_t (iu64) * hash = get_hash (module, MTRC_CUMTS); + + if (!hash) + return 0; + + return get_iu64 (hash, key); +} + +/* Get the uint64_t value from MTRC_MAXTS given an int key. + * + * On error, or if key is not found, 0 is returned. + * On success the uint64_t value for the given key is returned */ +uint64_t +ht_get_maxts (GModule module, int key) +{ + khash_t (iu64) * hash = get_hash (module, MTRC_MAXTS); + + if (!hash) + return 0; + + return get_iu64 (hash, key); +} + +/* Get the string value from MTRC_METHODS given an int key. + * + * On error, NULL is returned. + * On success the string value for the given key is returned */ +char * +ht_get_method (GModule module, int key) +{ + khash_t (is32) * hash = get_hash (module, MTRC_METHODS); + + if (!hash) + return NULL; + + return get_is32 (hash, key); +} + +/* Get the string value from MTRC_PROTOCOLS given an int key. + * + * On error, NULL is returned. + * On success the string value for the given key is returned */ +char * +ht_get_protocol (GModule module, int key) +{ + khash_t (is32) * hash = get_hash (module, MTRC_PROTOCOLS); + + if (!hash) + return NULL; + + return get_is32 (hash, key); +} + +/* Get the string value from ht_hostnames given a string key (IP). + * + * On error, NULL is returned. + * On success the string value for the given key is returned */ +char * +ht_get_hostname (const char *host) +{ + khash_t (ss32) * hash = ht_hostnames; + + if (!hash) + return NULL; + + return get_ss32 (hash, host); +} + +/* Get the string value from ht_agent_vals (user agent) given an int key. + * + * On error, NULL is returned. + * On success the string value for the given key is returned */ +char * +ht_get_host_agent_val (int key) +{ + khash_t (is32) * hash = ht_agent_vals; + + if (!hash) + return NULL; + + return get_is32 (hash, key); +} + +/* Get the list value from MTRC_AGENTS given an int key. + * + * On error, or if key is not found, NULL is returned. + * On success the GSLList value for the given key is returned */ +GSLList * +ht_get_host_agent_list (GModule module, int key) +{ + khash_t (igsl) * hash = get_hash (module, MTRC_AGENTS); + GSLList *list; + + if ((list = get_igsl (hash, key))) + return list; + return NULL; +} + +/* Get the meta data uint64_t from MTRC_METADATA given a string key. + * + * On error, or if key is not found, 0 is returned. + * On success the uint64_t value for the given key is returned */ +uint64_t +ht_get_meta_data (GModule module, const char *key) +{ + khash_t (su64) * hash = get_hash (module, MTRC_METADATA); + + return get_su64 (hash, key); +} + +/* Set the maximum and minimum values found on an integer key and + * integer value found on the MTRC_VISITORS hash structure. + * + * If the hash structure is empty, no values are set. + * On success the minimum and maximum values are set. */ +void +ht_get_hits_min_max (GModule module, int *min, int *max) +{ + khash_t (ii32) * hash = get_hash (module, MTRC_HITS); + + if (!hash) + return; + + get_ii32_min_max (hash, min, max); +} + +/* Set the maximum and minimum values found on an integer key and + * integer value found on the MTRC_VISITORS hash structure. + * + * If the hash structure is empty, no values are set. + * On success the minimum and maximum values are set. */ +void +ht_get_visitors_min_max (GModule module, int *min, int *max) +{ + khash_t (ii32) * hash = get_hash (module, MTRC_VISITORS); + + if (!hash) + return; + + get_ii32_min_max (hash, min, max); +} + +/* Set the maximum and minimum values found on an integer key and + * a uint64_t value found on the MTRC_BW hash structure. + * + * If the hash structure is empty, no values are set. + * On success the minimum and maximum values are set. */ +void +ht_get_bw_min_max (GModule module, uint64_t * min, uint64_t * max) +{ + khash_t (iu64) * hash = get_hash (module, MTRC_BW); + + if (!hash) + return; + + get_iu64_min_max (hash, min, max); +} + +/* Set the maximum and minimum values found on an integer key and + * a uint64_t value found on the MTRC_CUMTS hash structure. + * + * If the hash structure is empty, no values are set. + * On success the minimum and maximum values are set. */ +void +ht_get_cumts_min_max (GModule module, uint64_t * min, uint64_t * max) +{ + khash_t (iu64) * hash = get_hash (module, MTRC_CUMTS); + + if (!hash) + return; + + get_iu64_min_max (hash, min, max); +} + +/* Set the maximum and minimum values found on an integer key and + * a uint64_t value found on the MTRC_MAXTS hash structure. + * + * If the hash structure is empty, no values are set. + * On success the minimum and maximum values are set. */ +void +ht_get_maxts_min_max (GModule module, uint64_t * min, uint64_t * max) +{ + khash_t (iu64) * hash = get_hash (module, MTRC_MAXTS); + + if (!hash) + return; + + get_iu64_min_max (hash, min, max); +} + +/* A wrapper to initialize a raw data structure. + * + * On success a GRawData structure is returned. */ +static GRawData * +init_new_raw_data (GModule module, uint32_t ht_size) +{ + GRawData *raw_data; + + raw_data = new_grawdata (); + raw_data->idx = 0; + raw_data->module = module; + raw_data->size = ht_size; + raw_data->items = new_grawdata_item (ht_size); + + return raw_data; +} + +/* Store the key/value pairs from a hash table into raw_data and sorts + * the hits (numeric) value. + * + * On error, NULL is returned. + * On success the GRawData sorted is returned */ +static GRawData * +parse_raw_num_data (GModule module) +{ + GRawData *raw_data; + khiter_t key; + uint32_t ht_size = 0; + + khash_t (ii32) * hash = get_hash (module, MTRC_HITS); + if (!hash) + return NULL; + + ht_size = kh_size (hash); + raw_data = init_new_raw_data (module, ht_size); + raw_data->type = INTEGER; + for (key = kh_begin (hash); key != kh_end (hash); ++key) { + if (!kh_exist (hash, key)) + continue; + + raw_data->items[raw_data->idx].key = kh_key (hash, key); + raw_data->items[raw_data->idx].value.ivalue = kh_value (hash, key); + raw_data->idx++; + } + + sort_raw_num_data (raw_data, raw_data->idx); + + return raw_data; +} + +/* Store the key/value pairs from a hash table into raw_data and sorts + * the data (string) value. + * + * On error, NULL is returned. + * On success the GRawData sorted is returned */ +static GRawData * +parse_raw_str_data (GModule module) +{ + GRawData *raw_data; + khiter_t key; + uint32_t ht_size = 0; + + khash_t (is32) * hash = get_hash (module, MTRC_DATAMAP); + if (!hash) + return NULL; + + ht_size = kh_size (hash); + raw_data = init_new_raw_data (module, ht_size); + raw_data->type = STRING; + for (key = kh_begin (hash); key != kh_end (hash); ++key) { + if (!kh_exist (hash, key)) + continue; + + raw_data->items[raw_data->idx].key = kh_key (hash, key); + raw_data->items[raw_data->idx].value.svalue = kh_value (hash, key); + raw_data->idx++; + } + + sort_raw_str_data (raw_data, raw_data->idx); + + return raw_data; +} + +/* Entry point to load the raw data from the data store into our + * GRawData structure. + * + * On error, NULL is returned. + * On success the GRawData sorted is returned */ +GRawData * +parse_raw_data (GModule module) +{ + GRawData *raw_data; + + switch (module) { + case VISITORS: + raw_data = parse_raw_str_data (module); + break; + default: + raw_data = parse_raw_num_data (module); + } + return raw_data; +} diff --git a/goaccess++/src/gkhash.h b/goaccess++/src/gkhash.h new file mode 100644 index 0000000..38e36d2 --- /dev/null +++ b/goaccess++/src/gkhash.h @@ -0,0 +1,250 @@ +/** + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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 GKHASH_H_INCLUDED +#define GKHASH_H_INCLUDED + +#include <stdint.h> + +#include "gslist.h" +#include "gstorage.h" +#include "khash.h" +#include "parser.h" + +/* int keys, int payload */ +KHASH_MAP_INIT_INT (ii32, int); +/* int keys, string payload */ +KHASH_MAP_INIT_INT (is32, char *); +/* int keys, uint64_t payload */ +KHASH_MAP_INIT_INT (iu64, uint64_t); +/* string keys, int payload */ +KHASH_MAP_INIT_STR (si32, int); +/* string keys, string payload */ +KHASH_MAP_INIT_STR (ss32, char *); +/* int keys, GSLList payload */ +KHASH_MAP_INIT_INT (igsl, GSLList *); +/* string keys, uint64_t payload */ +KHASH_MAP_INIT_STR (su64, uint64_t); + +/* Metrics Storage */ + +/* Maps keys (string) to numeric values (integer). + * This mitigates the issue of having multiple stores + * with the same string key, and therefore, avoids unnecessary + * memory usage (in most cases). + * + * HEAD|/index.php -> 1 + * POST|/index.php -> 2 + * Windows XP -> 3 + * Ubuntu 10.10 -> 4 + * GET|Ubuntu 10.10 -> 5 + * Linux -> 6 + * 26/Dec/2014 -> 7 + * Windows -> 8 + */ +/*khash_t(si32) MTRC_KEYMAP */ + +/* Maps integer keys of root elements from the keymap hash + * to actual string values. + * + * 6 -> Linux + * 8 -> Windows + */ +/*khash_t(is32) MTRC_ROOTMAP */ + +/* Maps integer keys of data elements from the keymap hash + * to actual string values. + * + * 1 -> /index.php + * 2 -> /index.php + * 3 -> Windows XP + * 4 -> Ubuntu 10.10 + * 5 -> Ubuntu 10.10 + * 7 -> 26/Dec/2014 + */ +/*khash_t(is32) MTRC_DATAMAP */ + +/* Maps a string key made from the integer key of the + * IP/date/UA and the integer key from the data field of + * each module to numeric autoincremented values. e.g., "1|4" + * => 1 -> unique visitor key (concatenated) with 4 -> data + * key. + * + * "1|4" -> 1 + * "1|5" -> 2 + */ +/*khash_t(si32) MTRC_UNIQMAP */ + +/* Maps integer key from the keymap hash to the number of + * hits. + * + * 1 -> 10934 + * 2 -> 3231 + * 3 -> 500 + * 4 -> 201 + * 5 -> 206 + */ +/*khash_t(ii32) MTRC_HITS */ + +/* Maps numeric keys made from the uniqmap store to autoincremented values + * (counter). + * 10 -> 100 + * 40 -> 56 + */ +/*khash_t(ii32) MTRC_VISITORS */ + +/* Maps numeric data keys to bandwidth (in bytes). + * 1 -> 1024 + * 2 -> 2048 + */ +/*khash_t(iu64) MTRC_BW */ + +/* Maps numeric data keys to cumulative time served (in usecs/msecs). + * 1 -> 187 + * 2 -> 208 + */ +/*khash_t(iu64) MTRC_CUMTS */ + +/* Maps numeric data keys to max time served (in usecs/msecs). + * 1 -> 1287 + * 2 -> 2308 + */ +/*khash_t(iu64) MTRC_MAXTS */ + +/* Maps numeric data keys to string values. + * 1 -> GET + * 2 -> POST + */ +/*khash_t(is32) MTRC_METHODS */ + +/* Maps numeric data keys to string values. + * 1 -> HTTP/1.1 + * 2 -> HTTP/1.0 + */ +/*khash_t(is32) MTRC_PROTOCOLS */ + +/* Maps numeric unique user-agent keys to the + * corresponding numeric value. + * 1 -> 3 + * 2 -> 4 + */ +/*khash_t(igsl) MTRC_AGENTS */ + +/* Enumerated Storage Metrics */ +typedef enum GSMetricType_ +{ + /* int key - int val */ + MTRC_TYPE_II32, + /* int key - string val */ + MTRC_TYPE_IS32, + /* int key - uint64_t val */ + MTRC_TYPE_IU64, + /* string key - int val */ + MTRC_TYPE_SI32, + /* string key - string val */ + MTRC_TYPE_SS32, + /* int key - GSLList val */ + MTRC_TYPE_IGSL, + /* string key - uint64_t val */ + MTRC_TYPE_SU64, +} GSMetricType; + +typedef struct GKHashMetric_ +{ + GSMetric metric; + GSMetricType type; + union + { + khash_t (ii32) * ii32; + khash_t (is32) * is32; + khash_t (iu64) * iu64; + khash_t (si32) * si32; + khash_t (ss32) * ss32; + khash_t (igsl) * igsl; + khash_t (su64) * su64; + }; +} GKHashMetric; + +/* Data Storage per module */ +typedef struct GKHashStorage_ +{ + GModule module; + GKHashMetric metrics[GSMTRC_TOTAL]; +} GKHashStorage; + +void free_storage (void); +void init_storage (void); + +int ht_insert_agent_key (const char *key); +int ht_insert_agent_value (int key, const char *value); +int ht_insert_unique_key (const char *key); + +int ht_insert_agent (GModule module, int key, int value); +int ht_insert_bw (GModule module, int key, uint64_t inc); +int ht_insert_cumts (GModule module, int key, uint64_t inc); +int ht_insert_datamap (GModule module, int key, const char *value); +int ht_insert_hits (GModule module, int key, int inc); +int ht_insert_hostname (const char *ip, const char *host); +int ht_insert_keymap (GModule module, const char *key); +int ht_insert_maxts (GModule module, int key, uint64_t value); +int ht_insert_meta_data (GModule module, const char *key, uint64_t value); +int ht_insert_method (GModule module, int key, const char *value); +int ht_insert_protocol (GModule module, int key, const char *value); +int ht_insert_root (GModule module, int key, int value); +int ht_insert_rootmap (GModule module, int key, const char *value); +int ht_insert_uniqmap (GModule module, const char *key); +int ht_insert_visitor (GModule module, int key, int inc); + +uint32_t ht_get_size_datamap (GModule module); +uint32_t ht_get_size_uniqmap (GModule module); + +char *ht_get_datamap (GModule module, int key); +char *ht_get_host_agent_val (int key); +char *ht_get_hostname (const char *host); +char *ht_get_method (GModule module, int key); +char *ht_get_protocol (GModule module, int key); +char *ht_get_root (GModule module, int key); +GSLList *ht_get_host_agent_list (GModule module, int key); +int ht_get_hits (GModule module, int key); +int ht_get_keymap (GModule module, const char *key); +int ht_get_uniqmap (GModule module, const char *key); +int ht_get_visitors (GModule module, int key); +uint64_t ht_get_bw (GModule module, int key); +uint64_t ht_get_cumts (GModule module, int key); +uint64_t ht_get_maxts (GModule module, int key); +uint64_t ht_get_meta_data (GModule module, const char *key); +void ht_get_bw_min_max (GModule module, uint64_t * min, uint64_t * max); +void ht_get_cumts_min_max (GModule module, uint64_t * min, uint64_t * max); +void ht_get_hits_min_max (GModule module, int *min, int *max); +void ht_get_maxts_min_max (GModule module, uint64_t * min, uint64_t * max); +void ht_get_visitors_min_max (GModule module, int *min, int *max); + +GRawData *parse_raw_data (GModule module); + +#endif // for #ifndef GKHASH_H diff --git a/goaccess++/src/gkhash.o b/goaccess++/src/gkhash.o new file mode 100644 index 0000000000000000000000000000000000000000..b6609c69a0c1672b979fd33770adde595e560164 GIT binary patch literal 38520 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 literal 0 HcmV?d00001 diff --git a/goaccess++/src/gmenu.c b/goaccess++/src/gmenu.c new file mode 100644 index 0000000..80eed29 --- /dev/null +++ b/goaccess++/src/gmenu.c @@ -0,0 +1,150 @@ +/** + * gmenu.c -- goaccess menus + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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 <ctype.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "gmenu.h" + +#include "xmalloc.h" +#include "ui.h" + +/* Allocate memory for a new GMenu instance. + * + * On success, the newly allocated GMenu is returned . */ +GMenu * +new_gmenu (WINDOW * parent, int h, int w, int y, int x) +{ + GMenu *menu = xmalloc (sizeof (GMenu)); + + memset (menu, 0, sizeof *menu); + menu->count = 0; + menu->idx = 0; + menu->multiple = 0; + menu->selectable = 0; + menu->start = 0; + menu->status = 0; + + menu->h = h; + menu->w = w; + menu->x = x; + menu->y = y; + menu->win = derwin (parent, menu->h, menu->w, menu->y, menu->x); + + return menu; +} + +/* Render actual menu item */ +static void +draw_menu_item (GMenu * menu, char *s, int x, int y, int w, int checked, + GColors * (*func) (void)) +{ + char check, *lbl = NULL; + + if (menu->selectable) { + check = checked ? 'x' : ' '; + lbl = xmalloc (snprintf (NULL, 0, "[%c] %s", check, s) + 1); + sprintf (lbl, "[%c] %s", check, s); + draw_header (menu->win, lbl, "%s", y, x, w, (*func)); + free (lbl); + } else { + draw_header (menu->win, s, "%s", y, x, w, (*func)); + } +} + +/* Displays a menu to its associated window. + * + * On error, 1 is returned. + * On success, the newly created menu is added to the window and 0 is + * returned. */ +int +post_gmenu (GMenu * menu) +{ + GColors *(*func) (void); + int i = 0, j = 0, start, end, height, total, checked = 0; + + if (menu == NULL) + return 1; + + werase (menu->win); + + height = menu->h; + start = menu->start; + total = menu->size; + end = height < total ? start + height : total; + + for (i = start; i < end; i++, j++) { + func = i == menu->idx ? color_selected : color_default; + checked = menu->items[i].checked ? 1 : 0; + draw_menu_item (menu, menu->items[i].name, 0, j, menu->w, checked, func); + } + wrefresh (menu->win); + + return 0; +} + +/* Main work horse of the menu system processing input events */ +void +gmenu_driver (GMenu * menu, int c) +{ + int i; + + switch (c) { + case REQ_DOWN: + if (menu->idx >= menu->size - 1) + break; + ++menu->idx; + if (menu->idx >= menu->h && menu->idx >= menu->start + menu->h) + menu->start++; + post_gmenu (menu); + break; + case REQ_UP: + if (menu->idx <= 0) + break; + --menu->idx; + if (menu->idx < menu->start) + --menu->start; + post_gmenu (menu); + break; + case REQ_SEL: + if (!menu->multiple) { + for (i = 0; i < menu->size; i++) + menu->items[i].checked = 0; + } + if (menu->items[menu->idx].checked) + menu->items[menu->idx].checked = 0; + else + menu->items[menu->idx].checked = 1; + post_gmenu (menu); + break; + } +} diff --git a/goaccess++/src/gmenu.h b/goaccess++/src/gmenu.h new file mode 100644 index 0000000..0ab7383 --- /dev/null +++ b/goaccess++/src/gmenu.h @@ -0,0 +1,87 @@ +/** + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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. + */ + +#if HAVE_CONFIG_H +#include <config.h> +#endif + +#ifdef HAVE_NCURSESW_NCURSES_H +#include <ncursesw/ncurses.h> +#elif HAVE_NCURSES_NCURSES_H +#include <ncurses/ncurses.h> +#elif HAVE_NCURSES_H +#include <ncurses.h> +#elif HAVE_CURSES_H +#include <curses.h> +#endif + +#ifndef GMENU_H_INCLUDED +#define GMENU_H_INCLUDED + +enum ACTION +{ + REQ_DOWN, + REQ_UP, + REQ_SEL +}; + +typedef struct GMenu_ GMenu; +typedef struct GItem_ GItem; + +/* Menu Item */ +struct GItem_ +{ + char *name; + int checked; +}; + +/* Menu Panel */ +struct GMenu_ +{ + WINDOW *win; + + int count; + int size; + int idx; + int start; + int h; + int w; + int x; + int y; + unsigned short multiple; + unsigned short selectable; + unsigned short status; + GItem *items; +}; + +GMenu *new_gmenu (WINDOW * parent, int h, int w, int y, int x); +int post_gmenu (GMenu * menu); +void gmenu_driver (GMenu * menu, int c); + +#endif diff --git a/goaccess++/src/gmenu.o b/goaccess++/src/gmenu.o new file mode 100644 index 0000000000000000000000000000000000000000..c8313d3cc974f0de5dbc9c69d80e9a14d6352e5d GIT binary patch literal 3568 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 literal 0 HcmV?d00001 diff --git a/goaccess++/src/goaccess.c b/goaccess++/src/goaccess.c new file mode 100644 index 0000000..60d610f --- /dev/null +++ b/goaccess++/src/goaccess.c @@ -0,0 +1,1537 @@ +/** + * goaccess.c -- main log analyzer + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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. + */ + +#define _LARGEFILE_SOURCE +#define _LARGEFILE64_SOURCE +#define _FILE_OFFSET_BITS 64 + +#include <assert.h> +#include <ctype.h> +#include <errno.h> + +#include <locale.h> + +#if HAVE_CONFIG_H +#include <config.h> +#endif + +#include <fcntl.h> +#include <pthread.h> +#include <signal.h> +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <unistd.h> + +#ifdef HAVE_LIBTOKYOCABINET +#include "tcabdb.h" +#else +#include "gkhash.h" +#endif + +#ifdef HAVE_GEOLOCATION +#include "geoip1.h" +#endif + +#include "browsers.h" +#include "csv.h" +#include "error.h" +#include "gdashboard.h" +#include "gdns.h" +#include "gholder.h" +#include "goaccess.h" +#include "gwsocket.h" +#include "json.h" +#include "options.h" +#include "output.h" +#include "util.h" +#include "websocket.h" +#include "xmalloc.h" + +GConf conf = { + .append_method = 1, + .append_protocol = 1, + .hl_header = 1, + .num_tests = 10, +}; + +/* Loading/Spinner */ +GSpinner *parsing_spinner; +/* active reverse dns flag */ +int active_gdns = 0; + +/* WebSocket server - writer and reader threads */ +static GWSWriter *gwswriter; +static GWSReader *gwsreader; +/* Dashboard data structure */ +static GDash *dash; +/* Data holder structure */ +static GHolder *holder; +/* Log line properties structure */ +static GLog *glog; +/* Old signal mask */ +static sigset_t oldset; +/* Curses windows */ +static WINDOW *header_win, *main_win; + +static int main_win_height = 0; + +/* *INDENT-OFF* */ +static GScroll gscroll = { + { + {0, 0}, /* visitors {scroll, offset} */ + {0, 0}, /* requests {scroll, offset} */ + {0, 0}, /* req static {scroll, offset} */ + {0, 0}, /* not found {scroll, offset} */ + {0, 0}, /* hosts {scroll, offset} */ + {0, 0}, /* os {scroll, offset} */ + {0, 0}, /* browsers {scroll, offset} */ + {0, 0}, /* visit times {scroll, offset} */ + {0, 0}, /* referrers {scroll, offset} */ + {0, 0}, /* ref sites {scroll, offset} */ + {0, 0}, /* keywords {scroll, offset} */ +#ifdef HAVE_GEOLOCATION + {0, 0}, /* geolocation {scroll, offset} */ +#endif + {0, 0}, /* status {scroll, offset} */ + }, + 0, /* current module */ + 0, /* main dashboard scroll */ + 0, /* expanded flag */ +}; +/* *INDENT-ON* */ + +/* Free malloc'd holder */ +static void +house_keeping_holder (void) +{ + /* REVERSE DNS THREAD */ + pthread_mutex_lock (&gdns_thread.mutex); + + /* kill dns pthread */ + active_gdns = 0; + /* clear holder structure */ + free_holder (&holder); + /* clear reverse dns queue */ + gdns_free_queue (); + /* clear the whole storage */ + free_storage (); + + pthread_mutex_unlock (&gdns_thread.mutex); +} + +/* Free malloc'd data across the whole program */ +static void +house_keeping (void) +{ +#ifdef TCB_MEMHASH + /* free malloc'd int values on the agent list */ + if (conf.list_agents) + free_agent_list (); +#endif + + house_keeping_holder (); + + /* DASHBOARD */ + if (dash && !conf.output_stdout) { + free_dashboard (dash); + reset_find (); + } + + /* GEOLOCATION */ +#ifdef HAVE_GEOLOCATION + geoip_free (); +#endif + + /* LOGGER */ + if (glog->pipe) + fclose (glog->pipe); + free_logerrors (glog); + free (glog); + + /* INVALID REQUESTS */ + if (conf.invalid_requests_log) { + LOG_DEBUG (("Closing invalid requests log.\n")); + invalid_log_close (); + } + + /* CONFIGURATION */ + free_formats (); + free_browsers_hash (); + if (conf.debug_log) { + LOG_DEBUG (("Bye.\n")); + dbg_log_close (); + } + + /* clear spinner */ + free (parsing_spinner); + /* free colors */ + free_color_lists (); + /* free cmd arguments */ + free_cmd_args (); + /* WebSocket writer */ + free (gwswriter); + /* WebSocket reader */ + free (gwsreader); +} + +/* Open the pidfile whose name is specified in the given path and write + * the daemonized given pid. */ +static void +write_pid_file (const char *path, pid_t pid) +{ + FILE *pidfile; + + if (!path) + return; + + if ((pidfile = fopen (path, "w"))) { + fprintf (pidfile, "%d", pid); + fclose (pidfile); + } else { + FATAL ("Unable to open the specified pid file. %s", strerror (errno)); + } +} + +/* Set GoAccess to run as a daemon */ +static void +daemonize (void) +{ + pid_t pid, sid; + int fd; + + /* Clone ourselves to make a child */ + pid = fork (); + + if (pid < 0) + exit (EXIT_FAILURE); + if (pid > 0) { + write_pid_file (conf.pidfile, pid); + printf ("Daemonized GoAccess: %d\n", pid); + exit (EXIT_SUCCESS); + } + + umask (0); + /* attempt to create our own process group */ + sid = setsid (); + if (sid < 0) { + LOG_DEBUG (("Unable to setsid: %s.\n", strerror (errno))); + exit (EXIT_FAILURE); + } + + /* set the working directory to the root directory. + * requires the user to specify absolute paths */ + if (chdir ("/") < 0) { + LOG_DEBUG (("Unable to set chdir: %s.\n", strerror (errno))); + exit (EXIT_FAILURE); + } + + /* redirect fd's 0,1,2 to /dev/null */ + /* Note that the user will need to use --debug-file for log output */ + if ((fd = open ("/dev/null", O_RDWR, 0)) == -1) { + LOG_DEBUG (("Unable to open /dev/null: %s.\n", strerror (errno))); + exit (EXIT_FAILURE); + } + + dup2 (fd, STDIN_FILENO); + dup2 (fd, STDOUT_FILENO); + dup2 (fd, STDERR_FILENO); + if (fd > STDERR_FILENO) { + close (fd); + } +} + +/* Extract data from the given module hash structure and allocate + + * load data from the hash table into an instance of GHolder */ +static void +allocate_holder_by_module (GModule module) +{ + GRawData *raw_data; + + /* extract data from the corresponding hash table */ + raw_data = parse_raw_data (module); + if (!raw_data) { + LOG_DEBUG (("raw data is NULL for module: %d.\n", module)); + return; + } + + load_holder_data (raw_data, holder + module, module, module_sort[module]); +} + +/* Iterate over all modules/panels and extract data from hash + * structures and load it into an instance of GHolder */ +static void +allocate_holder (void) +{ + size_t idx = 0; + + holder = new_gholder (TOTAL_MODULES); + FOREACH_MODULE (idx, module_list) { + allocate_holder_by_module (module_list[idx]); + } +} + +/* Extract data from the modules GHolder structure and load it into + * the terminal dashboard */ +static void +allocate_data_by_module (GModule module, int col_data) +{ + int size = 0, max_choices = get_max_choices (); + + dash->module[module].head = module_to_head (module); + dash->module[module].desc = module_to_desc (module); + + size = holder[module].idx; + if (gscroll.expanded && module == gscroll.current) { + size = size > max_choices ? max_choices : holder[module].idx; + } else { + size = holder[module].idx > col_data ? col_data : holder[module].idx; + } + + dash->module[module].alloc_data = size; /* data allocated */ + dash->module[module].ht_size = holder[module].ht_size; /* hash table size */ + dash->module[module].idx_data = 0; + dash->module[module].pos_y = 0; + + if (gscroll.expanded && module == gscroll.current) + dash->module[module].dash_size = DASH_EXPANDED; + else + dash->module[module].dash_size = DASH_COLLAPSED; + dash->total_alloc += dash->module[module].dash_size; + + pthread_mutex_lock (&gdns_thread.mutex); + load_data_to_dash (&holder[module], dash, module, &gscroll); + pthread_mutex_unlock (&gdns_thread.mutex); +} + +/* Iterate over all modules/panels and extract data from GHolder + * structure and load it into the terminal dashboard */ +static void +allocate_data (void) +{ + GModule module; + int col_data = get_num_collapsed_data_rows (); + size_t idx = 0; + + dash = new_gdash (); + FOREACH_MODULE (idx, module_list) { + module = module_list[idx]; + allocate_data_by_module (module, col_data); + } +} + +/* A wrapper to render all windows within the dashboard. */ +static void +render_screens (void) +{ + GColors *color = get_color (COLOR_DEFAULT); + int row, col, chg = 0; + + getmaxyx (stdscr, row, col); + term_size (main_win, &main_win_height); + + generate_time (); + chg = glog->processed - glog->offset; + + draw_header (stdscr, "", "%s", row - 1, 0, col, color_default); + + wattron (stdscr, color->attr | COLOR_PAIR (color->pair->idx)); + mvaddstr (row - 1, 1, T_HELP_ENTER); + mvprintw (row - 1, 30, "%d - %s", chg, asctime (now_tm)); + mvaddstr (row - 1, col - 21, T_QUIT); + mvprintw (row - 1, col - 5, "%s", GO_VERSION); + wattroff (stdscr, color->attr | COLOR_PAIR (color->pair->idx)); + + refresh (); + + /* call general stats header */ + display_general (header_win, glog, holder); + wrefresh (header_win); + + /* display active label based on current module */ + update_active_module (header_win, gscroll.current); + + display_content (main_win, dash, &gscroll); +} + +/* Collapse the current expanded module */ +static void +collapse_current_module (void) +{ + if (!gscroll.expanded) + return; + + gscroll.expanded = 0; + reset_scroll_offsets (&gscroll); + free_dashboard (dash); + allocate_data (); + render_screens (); +} + +/* Display message a the bottom of the terminal dashboard that panel + * is disabled */ +static void +disabled_panel_msg (GModule module) +{ + const char *lbl = module_to_label (module); + int row, col; + + getmaxyx (stdscr, row, col); + draw_header (stdscr, lbl, ERR_PANEL_DISABLED, row - 1, 0, col, color_error); +} + +/* Set the current module/panel */ +static void +set_module_to (GScroll * scrll, GModule module) +{ + if (get_module_index (module) == -1) { + disabled_panel_msg (module); + return; + } + + /* scroll to panel */ + if (!conf.no_tab_scroll) + gscroll.dash = get_module_index (module) * DASH_COLLAPSED; + + /* reset expanded module */ + collapse_current_module (); + scrll->current = module; + render_screens (); +} + +/* Scroll expanded module or terminal dashboard to the top */ +static void +scroll_to_first_line (void) +{ + if (!gscroll.expanded) + gscroll.dash = 0; + else { + gscroll.module[gscroll.current].scroll = 0; + gscroll.module[gscroll.current].offset = 0; + } +} + +/* Scroll expanded module or terminal dashboard to the last row */ +static void +scroll_to_last_line (void) +{ + int exp_size = get_num_expanded_data_rows (); + int scrll = 0, offset = 0; + + if (!gscroll.expanded) + gscroll.dash = dash->total_alloc - main_win_height; + else { + scrll = dash->module[gscroll.current].idx_data - 1; + if (scrll >= exp_size && scrll >= offset + exp_size) + offset = scrll < exp_size - 1 ? 0 : scrll - exp_size + 1; + gscroll.module[gscroll.current].scroll = scrll; + gscroll.module[gscroll.current].offset = offset; + } +} + +/* Load the user-agent window given the selected IP */ +static void +load_ip_agent_list (void) +{ + int type_ip = 0; + /* make sure we have a valid IP */ + int sel = gscroll.module[gscroll.current].scroll; + GDashData item = dash->module[HOSTS].data[sel]; + + if (!invalid_ipaddr (item.metrics->data, &type_ip)) + load_agent_list (main_win, item.metrics->data); +} + +/* Expand the selected module */ +static void +expand_current_module (void) +{ + if (gscroll.expanded && gscroll.current == HOSTS) { + load_ip_agent_list (); + return; + } + + /* expanded, nothing to do... */ + if (gscroll.expanded) + return; + + reset_scroll_offsets (&gscroll); + gscroll.expanded = 1; + + free_holder_by_module (&holder, gscroll.current); + free_dashboard (dash); + allocate_holder_by_module (gscroll.current); + allocate_data (); +} + +/* Expand the clicked module/panel given the Y event coordinate. */ +static void +expand_module_from_ypos (int y) +{ + /* ignore header/footer clicks */ + if (y < MAX_HEIGHT_HEADER || y == LINES - 1) + return; + + if (set_module_from_mouse_event (&gscroll, dash, y)) + return; + + reset_scroll_offsets (&gscroll); + gscroll.expanded = 1; + + free_holder_by_module (&holder, gscroll.current); + free_dashboard (dash); + allocate_holder_by_module (gscroll.current); + allocate_data (); + + render_screens (); +} + +/* Expand the clicked module/panel */ +static void +expand_on_mouse_click (void) +{ + int ok_mouse; + MEVENT event; + + ok_mouse = getmouse (&event); + if (!conf.mouse_support || ok_mouse != OK) + return; + + if (event.bstate & BUTTON1_CLICKED) + expand_module_from_ypos (event.y); +} + +/* Scroll dowm expanded module to the last row */ +static void +scroll_down_expanded_module (void) +{ + int exp_size = get_num_expanded_data_rows (); + int *scroll_ptr, *offset_ptr; + + scroll_ptr = &gscroll.module[gscroll.current].scroll; + offset_ptr = &gscroll.module[gscroll.current].offset; + + if (!gscroll.expanded) + return; + if (*scroll_ptr >= dash->module[gscroll.current].idx_data - 1) + return; + ++(*scroll_ptr); + if (*scroll_ptr >= exp_size && *scroll_ptr >= *offset_ptr + exp_size) + ++(*offset_ptr); +} + +/* Scroll up expanded module */ +static void +scroll_up_expanded_module (void) +{ + int *scroll_ptr, *offset_ptr; + + scroll_ptr = &gscroll.module[gscroll.current].scroll; + offset_ptr = &gscroll.module[gscroll.current].offset; + + if (!gscroll.expanded) + return; + if (*scroll_ptr <= 0) + return; + --(*scroll_ptr); + if (*scroll_ptr < *offset_ptr) + --(*offset_ptr); +} + +/* Scroll up terminal dashboard */ +static void +scroll_up_dashboard (void) +{ + gscroll.dash--; +} + +/* Page up expanded module */ +static void +page_up_module (void) +{ + int exp_size = get_num_expanded_data_rows (); + int *scroll_ptr, *offset_ptr; + + scroll_ptr = &gscroll.module[gscroll.current].scroll; + offset_ptr = &gscroll.module[gscroll.current].offset; + + if (!gscroll.expanded) + return; + /* decrease scroll and offset by exp_size */ + *scroll_ptr -= exp_size; + if (*scroll_ptr < 0) + *scroll_ptr = 0; + + if (*scroll_ptr < *offset_ptr) + *offset_ptr -= exp_size; + if (*offset_ptr <= 0) + *offset_ptr = 0; +} + +/* Page down expanded module */ +static void +page_down_module (void) +{ + int exp_size = get_num_expanded_data_rows (); + int *scroll_ptr, *offset_ptr; + + scroll_ptr = &gscroll.module[gscroll.current].scroll; + offset_ptr = &gscroll.module[gscroll.current].offset; + + if (!gscroll.expanded) + return; + + *scroll_ptr += exp_size; + if (*scroll_ptr >= dash->module[gscroll.current].idx_data - 1) + *scroll_ptr = dash->module[gscroll.current].idx_data - 1; + if (*scroll_ptr >= exp_size && *scroll_ptr >= *offset_ptr + exp_size) + *offset_ptr += exp_size; + if (*offset_ptr + exp_size >= dash->module[gscroll.current].idx_data - 1) + *offset_ptr = dash->module[gscroll.current].idx_data - exp_size; + if (*scroll_ptr < exp_size - 1) + *offset_ptr = 0; +} + +/* Create a new find dialog window and render it. Upon closing the + * window, dashboard is refreshed. */ +static void +render_search_dialog (int search) +{ + if (render_find_dialog (main_win, &gscroll)) + return; + + pthread_mutex_lock (&gdns_thread.mutex); + search = perform_next_find (holder, &gscroll); + pthread_mutex_unlock (&gdns_thread.mutex); + if (search != 0) + return; + + free_dashboard (dash); + allocate_data (); + render_screens (); +} + +/* Search for the next occurrence within the dashboard structure */ +static void +search_next_match (int search) +{ + pthread_mutex_lock (&gdns_thread.mutex); + search = perform_next_find (holder, &gscroll); + pthread_mutex_unlock (&gdns_thread.mutex); + if (search != 0) + return; + + free_dashboard (dash); + allocate_data (); + render_screens (); +} + +/* Update holder structure and dashboard screen */ +static void +tail_term (void) +{ + pthread_mutex_lock (&gdns_thread.mutex); + free_holder (&holder); + pthread_cond_broadcast (&gdns_thread.not_empty); + pthread_mutex_unlock (&gdns_thread.mutex); + + free_dashboard (dash); + allocate_holder (); + allocate_data (); + + term_size (main_win, &main_win_height); + render_screens (); +} + +static void +tail_html (void) +{ + char *json = NULL; + + pthread_mutex_lock (&gdns_thread.mutex); + free_holder (&holder); + pthread_cond_broadcast (&gdns_thread.not_empty); + pthread_mutex_unlock (&gdns_thread.mutex); + + allocate_holder (); + + pthread_mutex_lock (&gdns_thread.mutex); + json = get_json (glog, holder, 0); + pthread_mutex_unlock (&gdns_thread.mutex); + + if (json == NULL) + return; + + broadcast_holder (gwswriter->fd, json, strlen (json)); + free (json); +} + +/* Fast-forward latest JSON data when client connection is opened. */ +static void +fast_forward_client (int listener) +{ + char *json = NULL; + + pthread_mutex_lock (&gdns_thread.mutex); + json = get_json (glog, holder, 0); + pthread_mutex_unlock (&gdns_thread.mutex); + + if (json == NULL) + return; + + pthread_mutex_lock (&gwswriter->mutex); + send_holder_to_client (gwswriter->fd, listener, json, strlen (json)); + pthread_mutex_unlock (&gwswriter->mutex); + free (json); +} + +/* Start reading data coming from the client side through the + * WebSocket server. */ +void +read_client (void *ptr_data) +{ + GWSReader *reader = (GWSReader *) ptr_data; + fd_set rfds, wfds; + + FD_ZERO (&rfds); + FD_ZERO (&wfds); + + /* check we have a fifo for reading */ + if (reader->fd == -1) + return; + + pthread_mutex_lock (&reader->mutex); + set_self_pipe (reader->self_pipe); + pthread_mutex_unlock (&reader->mutex); + + while (1) { + /* select(2) will block */ + if (read_fifo (reader, rfds, wfds, fast_forward_client)) + break; + } + close (reader->fd); +} + +/* Parse tailed lines */ +static void +parse_tail_follow (FILE * fp) +{ +#ifdef WITH_GETLINE + char *buf = NULL; +#else + char buf[LINE_BUFFER] = { 0 }; +#endif + +#ifdef WITH_GETLINE + while ((buf = fgetline (fp)) != NULL) { +#else + while (fgets (buf, LINE_BUFFER, fp) != NULL) { +#endif + pthread_mutex_lock (&gdns_thread.mutex); + parse_log (&glog, buf, 0); + pthread_mutex_unlock (&gdns_thread.mutex); +#ifdef WITH_GETLINE + free (buf); +#endif + } +} + +/* Process appended log data */ +static void +perform_tail_follow (uint64_t * size1, const char *fn) +{ + FILE *fp = NULL; + uint64_t size2 = 0; + + if (fn[0] == '-' && fn[1] == '\0') { + parse_tail_follow (glog->pipe); + goto out; + } + if (glog->load_from_disk_only) + return; + + size2 = file_size (fn); + + /* file hasn't changed */ + if (size2 == *size1) + return; + + if (!(fp = fopen (fn, "r"))) + FATAL ("Unable to read log file %s.", strerror (errno)); + + if (!fseeko (fp, *size1, SEEK_SET)) + parse_tail_follow (fp); + fclose (fp); + + *size1 = size2; + +out: + + if (!conf.output_stdout) + tail_term (); + else + tail_html (); + + usleep (200000); /* 0.2 seconds */ +} + +/* Entry point to start processing the HTML output */ +static void +process_html (const char *filename) +{ + uint64_t *size1 = NULL; + int i = 0; + + /* render report */ + pthread_mutex_lock (&gdns_thread.mutex); + output_html (glog, holder, filename); + pthread_mutex_unlock (&gdns_thread.mutex); + /* not real time? */ + if (!conf.real_time_html) + return; + /* ignore loading from disk */ + if (glog->load_from_disk_only) + return; + + pthread_mutex_lock (&gwswriter->mutex); + gwswriter->fd = open_fifoin (); + pthread_mutex_unlock (&gwswriter->mutex); + + /* open fifo for write */ + if (gwswriter->fd == -1) + return; + + size1 = xcalloc (conf.filenames_idx, sizeof (uint64_t)); + for (i = 0; i < conf.filenames_idx; ++i) { + if (conf.filenames[i][0] == '-' && conf.filenames[i][1] == '\0') + size1[i] = 0; + else + size1[i] = file_size (conf.filenames[i]); + } + + set_ready_state (); + while (1) { + if (conf.stop_processing) + break; + + for (i = 0; i < conf.filenames_idx; ++i) + perform_tail_follow (&size1[i], conf.filenames[i]); /* 0.2 secs */ + usleep (800000); /* 0.8 secs */ + } + close (gwswriter->fd); + free (size1); +} + +/* Iterate over available panels and advance the panel pointer. */ +static int +next_module (void) +{ + int next = -1; + + if ((next = get_next_module (gscroll.current)) == -1) + return 1; + + gscroll.current = next; + if (!conf.no_tab_scroll) + gscroll.dash = get_module_index (gscroll.current) * DASH_COLLAPSED; + + return 0; +} + +/* Iterate over available panels and rewind the panel pointer. */ +static int +previous_module (void) +{ + int prev = -1; + + if ((prev = get_prev_module (gscroll.current)) == -1) + return 1; + + gscroll.current = prev; + if (!conf.no_tab_scroll) + gscroll.dash = get_module_index (gscroll.current) * DASH_COLLAPSED; + + return 0; +} + +/* Perform several curses operations upon resizing the terminal. */ +static void +window_resize (void) +{ + endwin (); + refresh (); + werase (header_win); + werase (main_win); + werase (stdscr); + term_size (main_win, &main_win_height); + refresh (); + render_screens (); +} + +/* Create a new sort dialog window and render it. Upon closing the + * window, dashboard is refreshed. */ +static void +render_sort_dialog (void) +{ + load_sort_win (main_win, gscroll.current, &module_sort[gscroll.current]); + + pthread_mutex_lock (&gdns_thread.mutex); + free_holder (&holder); + pthread_cond_broadcast (&gdns_thread.not_empty); + pthread_mutex_unlock (&gdns_thread.mutex); + + free_dashboard (dash); + allocate_holder (); + allocate_data (); + render_screens (); +} + +/* Interfacing with the keyboard */ +static void +get_keys (void) +{ + int search = 0; + int c, quit = 1, i; + uint64_t *size1 = NULL; + + if (!glog->load_from_disk_only && conf.filenames_idx) { + size1 = xcalloc (conf.filenames_idx, sizeof (uint64_t)); + for (i = 0; i < conf.filenames_idx; ++i) { + if (conf.filenames[i][0] == '-' && conf.filenames[i][1] == '\0') + size1[i] = 0; + else + size1[i] = file_size (conf.filenames[i]); + } + } + + while (quit) { + if (conf.stop_processing) + break; + c = wgetch (stdscr); + switch (c) { + case 'q': /* quit */ + if (!gscroll.expanded) { + quit = 0; + break; + } + collapse_current_module (); + break; + case KEY_F (1): + case '?': + case 'h': + load_help_popup (main_win); + render_screens (); + break; + case 49: /* 1 */ + /* reset expanded module */ + set_module_to (&gscroll, VISITORS); + break; + case 50: /* 2 */ + /* reset expanded module */ + set_module_to (&gscroll, REQUESTS); + break; + case 51: /* 3 */ + /* reset expanded module */ + set_module_to (&gscroll, REQUESTS_STATIC); + break; + case 52: /* 4 */ + /* reset expanded module */ + set_module_to (&gscroll, NOT_FOUND); + break; + case 53: /* 5 */ + /* reset expanded module */ + set_module_to (&gscroll, HOSTS); + break; + case 54: /* 6 */ + /* reset expanded module */ + set_module_to (&gscroll, OS); + break; + case 55: /* 7 */ + /* reset expanded module */ + set_module_to (&gscroll, BROWSERS); + break; + case 56: /* 8 */ + /* reset expanded module */ + set_module_to (&gscroll, VISIT_TIMES); + break; + case 57: /* 9 */ + /* reset expanded module */ + set_module_to (&gscroll, VIRTUAL_HOSTS); + break; + case 48: /* 0 */ + /* reset expanded module */ + set_module_to (&gscroll, REFERRERS); + break; + case 33: /* shift + 1 */ + /* reset expanded module */ + set_module_to (&gscroll, REFERRING_SITES); + break; + case 34: /* shift + 2 */ + /* reset expanded module */ + set_module_to (&gscroll, KEYPHRASES); + break; + case 35: /* Shift + 3 */ + /* reset expanded module */ + set_module_to (&gscroll, STATUS_CODES); + break; + case 36: /* Shift + 3 */ + /* reset expanded module */ + set_module_to (&gscroll, REMOTE_USER); + break; +#ifdef HAVE_GEOLOCATION + case 37: /* Shift + 4 */ + /* reset expanded module */ + set_module_to (&gscroll, GEO_LOCATION); + break; +#endif + case 9: /* TAB */ + /* reset expanded module */ + collapse_current_module (); + if (next_module () == 0) + render_screens (); + break; + case 353: /* Shift TAB */ + /* reset expanded module */ + collapse_current_module (); + if (previous_module () == 0) + render_screens (); + break; + case 'g': /* g = top */ + scroll_to_first_line (); + display_content (main_win, dash, &gscroll); + break; + case 'G': /* G = down */ + scroll_to_last_line (); + display_content (main_win, dash, &gscroll); + break; + /* expand dashboard module */ + case KEY_RIGHT: + case 0x0a: + case 0x0d: + case 32: /* ENTER */ + case 79: /* o */ + case 111: /* O */ + case KEY_ENTER: + expand_current_module (); + display_content (main_win, dash, &gscroll); + break; + case KEY_DOWN: /* scroll main dashboard */ + if ((gscroll.dash + main_win_height) < dash->total_alloc) { + gscroll.dash++; + display_content (main_win, dash, &gscroll); + } + break; + case KEY_MOUSE: /* handles mouse events */ + expand_on_mouse_click (); + break; + case 106: /* j - DOWN expanded module */ + scroll_down_expanded_module (); + display_content (main_win, dash, &gscroll); + break; + /* scroll up main_win */ + case KEY_UP: + if (gscroll.dash > 0) { + scroll_up_dashboard (); + display_content (main_win, dash, &gscroll); + } + break; + case 2: /* ^ b - page up */ + case 339: /* ^ PG UP */ + page_up_module (); + display_content (main_win, dash, &gscroll); + break; + case 6: /* ^ f - page down */ + case 338: /* ^ PG DOWN */ + page_down_module (); + display_content (main_win, dash, &gscroll); + break; + case 107: /* k - UP expanded module */ + scroll_up_expanded_module (); + display_content (main_win, dash, &gscroll); + break; + case 'n': + search_next_match (search); + break; + case '/': + render_search_dialog (search); + break; + case 99: /* c */ + if (conf.no_color) + break; + load_schemes_win (main_win); + free_dashboard (dash); + allocate_data (); + set_wbkgd (main_win, header_win); + render_screens (); + break; + case 115: /* s */ + render_sort_dialog (); + break; + case 269: + case KEY_RESIZE: + window_resize (); + break; + default: + for (i = 0; i < conf.filenames_idx; ++i) + perform_tail_follow (&size1[i], conf.filenames[i]); + break; + } + } + free (size1); +} + +/* Set general/overall statistics when loading data from the on-disk + * storage. i.e., --load-from-disk */ +static void +set_general_stats (void) +{ + glog->valid = glog->processed = glog->invalid = glog->excluded_ip = 0; + +#ifdef TCB_BTREE + glog->excluded_ip = ht_get_genstats ("excluded_ip"); + glog->invalid = ht_get_genstats ("failed_requests"); + glog->processed = ht_get_genstats ("total_requests"); + glog->resp_size = ht_get_genstats_bw ("bandwidth"); + glog->valid = ht_get_genstats ("valid_requests"); + + if (glog->resp_size > 0) + conf.bandwidth = 1; + if (ht_get_genstats ("serve_usecs")) + conf.serve_usecs = 1; +#endif +} + +/* Store accumulated processing time + * Note: As we store with time_t second resolution, + * if elapsed time == 0, we will bump it to 1. + */ +#ifdef TCB_BTREE +static void +set_accumulated_time (void) +{ + if (conf.store_accumulated_time) { + time_t elapsed = end_proc - start_proc; + elapsed = (!elapsed) ? !elapsed : elapsed; + ht_insert_genstats_accumulated_time (elapsed); + } +} +#endif + +/* Execute the following calls right before we start the main + * processing/parsing loop */ +static void +init_processing (void) +{ + /* perform some additional checks before parsing panels */ + verify_panels (); + /* initialize storage */ + init_storage (); + if (conf.load_from_disk) + set_general_stats (); + set_spec_date_format (); +} + +/* Determine the type of output, i.e., JSON, CSV, HTML */ +static void +standard_output (void) +{ + char *csv = NULL, *json = NULL, *html = NULL; + + /* CSV */ + if (find_output_type (&csv, "csv", 1) == 0) + output_csv (glog, holder, csv); + /* JSON */ + if (find_output_type (&json, "json", 1) == 0) + output_json (glog, holder, json); + /* HTML */ + if (find_output_type (&html, "html", 1) == 0 || conf.output_format_idx == 0) + process_html (html); + + free (csv); + free (html); + free (json); +} + +/* Output to a terminal */ +static void +curses_output (void) +{ + allocate_data (); + if (!conf.skip_term_resolver) + gdns_thread_create (); + + render_screens (); + /* will loop in here */ + get_keys (); +} + +/* Set locale */ +static void +set_locale (void) +{ + char *loc_ctype; + + setlocale (LC_ALL, ""); + bindtextdomain (PACKAGE, LOCALEDIR); + textdomain (PACKAGE); + + loc_ctype = getenv ("LC_CTYPE"); + if (loc_ctype != NULL) + setlocale (LC_CTYPE, loc_ctype); + else if ((loc_ctype = getenv ("LC_ALL"))) + setlocale (LC_CTYPE, loc_ctype); + else + setlocale (LC_CTYPE, ""); +} + +/* Attempt to get the current name of a terminal or fallback to /dev/tty + * + * On error, -1 is returned + * On success, the new file descriptor is returned */ +static int +open_term (char **buf) +{ + const char *term = "/dev/tty"; + + if (!isatty (STDERR_FILENO) || (term = ttyname (STDERR_FILENO)) == 0) { + if (!isatty (STDOUT_FILENO) || (term = ttyname (STDOUT_FILENO)) == 0) { + if (!isatty (STDIN_FILENO) || (term = ttyname (STDIN_FILENO)) == 0) { + term = "/dev/tty"; + } + } + } + *buf = xstrdup (term); + + return open (term, O_RDONLY); +} + +/* Determine if reading from a pipe, and duplicate file descriptors so + * it doesn't get in the way of curses' normal reading stdin for + * wgetch() */ +static void +set_pipe_stdin (void) +{ + char *term = NULL; + FILE *pipe = stdin; + int fd1, fd2; + + /* If unable to open a terminal, yet data is being piped, then it's + * probably from the cron. + * + * Note: If used from the cron, it will require the + * user to use a single dash to parse piped data such as: + * cat access.log | goaccess - */ + if ((fd1 = open_term (&term)) == -1) + goto out; + + if ((fd2 = dup (fileno (stdin))) == -1) + FATAL ("Unable to dup stdin: %s", strerror (errno)); + + pipe = fdopen (fd2, "r"); + if (freopen (term, "r", stdin) == 0) + FATAL ("Unable to open input from TTY"); + if (fileno (stdin) != 0) + (void) dup2 (fileno (stdin), 0); + + add_dash_filename (); + /* no need to set it as non-blocking since we are simply outputting a + * static report */ + if (conf.output_stdout && !conf.real_time_html) + goto out; + + /* Using select(), poll(), or epoll(), etc may be a better choice... */ + if (fcntl (fd2, F_SETFL, fcntl (fd2, F_GETFL, 0) | O_NONBLOCK) == -1) + FATAL ("Unable to set fd as non-blocking: %s.", strerror (errno)); +out: + + glog->pipe = pipe; + free (term); +} + +/* Determine if we are getting data from the stdin, and where are we + * outputting to. */ +static void +set_io (void) +{ + /* For backwards compatibility, check if we are not outputting to a + * terminal or if an output format was supplied */ + if (!isatty (STDOUT_FILENO) || conf.output_format_idx > 0) + conf.output_stdout = 1; + /* dup fd if data piped */ + if (!isatty (STDIN_FILENO)) + set_pipe_stdin (); + /* No data piped, no file was used and not loading from disk */ + if (!conf.filenames_idx && !conf.read_stdin && !conf.load_from_disk) + cmd_help (); +} + +/* Process command line options and set some default options. */ +static void +parse_cmd_line (int argc, char **argv) +{ + read_option_args (argc, argv); + set_default_static_files (); +} + +/* Set up signal handlers. */ +static void +setup_signal_handlers (void) +{ + struct sigaction act; + + sigemptyset (&act.sa_mask); + act.sa_flags = 0; + act.sa_handler = sigsegv_handler; + + sigaction (SIGSEGV, &act, NULL); +} + +static void +handle_signal_action (int sig_number) +{ + switch (sig_number) { + case SIGTERM: + case SIGINT: + fprintf (stderr, "\nSIGINT caught!\n"); + fprintf (stderr, "Closing GoAccess...\n"); + + stop_ws_server (gwswriter, gwsreader); + conf.stop_processing = 1; + break; + case SIGPIPE: + fprintf (stderr, "SIGPIPE caught!\n"); + /* ignore it */ + break; + } +} + +static void +setup_thread_signals (void) +{ + struct sigaction act; + + act.sa_handler = handle_signal_action; + sigemptyset (&act.sa_mask); + act.sa_flags = 0; + + sigaction (SIGINT, &act, NULL); + sigaction (SIGPIPE, &act, NULL); + sigaction (SIGTERM, &act, NULL); + + /* Restore old signal mask for the main thread */ + pthread_sigmask (SIG_SETMASK, &oldset, NULL); +} + +static void +block_thread_signals (void) +{ + /* Avoid threads catching SIGINT/SIGPIPE/SIGTERM and handle them in + * main thread */ + sigset_t sigset; + sigemptyset (&sigset); + sigaddset (&sigset, SIGINT); + sigaddset (&sigset, SIGPIPE); + sigaddset (&sigset, SIGTERM); + pthread_sigmask (SIG_BLOCK, &sigset, &oldset); +} + +/* Initialize various types of data. */ +static void +initializer (void) +{ + /* initialize modules and set first */ + gscroll.current = init_modules (); + /* setup to use the current locale */ + set_locale (); + + parse_browsers_file (); + +#ifdef HAVE_GEOLOCATION + init_geoip (); +#endif + + /* init glog */ + glog = init_log (); + + set_io (); + set_signal_data (glog); + + /* init parsing spinner */ + parsing_spinner = new_gspinner (); + parsing_spinner->processed = &glog->processed; +} + +static void +set_standard_output (void) +{ + int html = 0; + gwswriter = new_gwswriter (); + gwsreader = new_gwsreader (); + + /* HTML */ + if (find_output_type (NULL, "html", 0) == 0 || conf.output_format_idx == 0) + html = 1; + + /* Spawn WebSocket server threads */ + if (html && conf.real_time_html) { + /* open fifo for read */ + if ((gwsreader->fd = open_fifoout ()) == -1) { + LOG (("Unable to open FIFO for read.\n")); + return; + } + + if (conf.daemonize) + daemonize (); + setup_ws_server (gwswriter, gwsreader); + } + setup_thread_signals (); + + /* Spawn progress spinner thread */ + ui_spinner_create (parsing_spinner); +} + +/* Set up curses. */ +static void +set_curses (int *quit) +{ + const char *err_log = NULL; + + setup_thread_signals (); + set_input_opts (); + if (conf.no_color || has_colors () == FALSE) { + conf.color_scheme = NO_COLOR; + conf.no_color = 1; + } else { + start_color (); + } + init_colors (0); + init_windows (&header_win, &main_win); + set_curses_spinner (parsing_spinner); + + /* Display configuration dialog if missing formats and not piping data in */ + if (!conf.read_stdin && (verify_formats () || conf.load_conf_dlg)) { + refresh (); + *quit = render_confdlg (glog, parsing_spinner); + clear (); + } + /* Piping data in without log/date/time format */ + else if (conf.read_stdin && (err_log = verify_formats ())) { + FATAL ("%s", err_log); + } + /* straight parsing */ + else { + ui_spinner_create (parsing_spinner); + } +} + +/* Where all begins... */ +int +main (int argc, char **argv) +{ + int quit = 0, ret = 0; + + block_thread_signals (); + setup_signal_handlers (); + + /* command line/config options */ + verify_global_config (argc, argv); + parse_conf_file (&argc, &argv); + parse_cmd_line (argc, argv); + + initializer (); + + /* ignore outputting, process only */ + if (conf.process_and_exit) { + } + /* set stdout */ + else if (conf.output_stdout) { + set_standard_output (); + } + /* set curses */ + else { + set_curses (&quit); + } + + /* no log/date/time format set */ + if (quit) + goto clean; + + init_processing (); + /* main processing event */ + time (&start_proc); + if ((ret = parse_log (&glog, NULL, 0))) { + end_spinner (); + goto clean; + } + if (conf.stop_processing) + goto clean; + glog->offset = glog->processed; + + /* init reverse lookup thread */ + gdns_init (); + parse_initial_sort (); + allocate_holder (); + + end_spinner (); + time (&end_proc); + + /* ignore outputting, process only */ + if (conf.process_and_exit) { +#ifdef TCB_BTREE + set_accumulated_time (); +#endif + } + /* stdout */ + else if (conf.output_stdout) { + standard_output (); + } + /* curses */ + else { + curses_output (); + } + + /* clean */ +clean: + /* done, restore tty modes and reset terminal into + * non-visual mode */ + if (!conf.output_stdout) + endwin (); + + /* unable to process valid data */ + if (ret) + output_logerrors (glog); + + house_keeping (); + + return ret ? EXIT_FAILURE : EXIT_SUCCESS; +} diff --git a/goaccess++/src/goaccess.h b/goaccess++/src/goaccess.h new file mode 100644 index 0000000..7772d3e --- /dev/null +++ b/goaccess++/src/goaccess.h @@ -0,0 +1,40 @@ +/** + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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 GOACCESS_H_INCLUDED +#define GOACCESS_H_INCLUDED + +#include "ui.h" + +extern GSpinner *parsing_spinner; +extern int active_gdns; /* kill dns pthread flag */ + +void read_client (void *ptr_data); + +#endif diff --git a/goaccess++/src/goaccess.o b/goaccess++/src/goaccess.o new file mode 100644 index 0000000000000000000000000000000000000000..15664fe53f6451410b72d797cf49aafe4a549874 GIT binary patch literal 66416 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 literal 0 HcmV?d00001 diff --git a/goaccess++/src/gslist.c b/goaccess++/src/gslist.c new file mode 100644 index 0000000..e73d7b7 --- /dev/null +++ b/goaccess++/src/gslist.c @@ -0,0 +1,166 @@ +/** + * gslist.c -- A Singly link list implementation + * _______ _______ __ __ + * / ____/ | / / ___/____ _____/ /_____ / /_ + * / / __ | | /| / /\__ \/ __ \/ ___/ //_/ _ \/ __/ + * / /_/ / | |/ |/ /___/ / /_/ / /__/ ,< / __/ /_ + * \____/ |__/|__//____/\____/\___/_/|_|\___/\__/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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 <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> + +#include "gslist.h" +#include "xmalloc.h" + +/* Instantiate a new Single linked-list node. + * + * On error, aborts if node can't be malloc'd. + * On success, the GSLList node. */ +GSLList * +list_create (void *data) +{ + GSLList *node = xmalloc (sizeof (GSLList)); + node->data = data; + node->next = NULL; + + return node; +} + +/* Create and insert a node after a given node. + * + * On error, aborts if node can't be malloc'd. + * On success, the newly created node. */ +GSLList * +list_insert_append (GSLList * node, void *data) +{ + GSLList *newnode; + newnode = list_create (data); + newnode->next = node->next; + node->next = newnode; + + return newnode; +} + +/* Create and insert a node in front of the list. + * + * On error, aborts if node can't be malloc'd. + * On success, the newly created node. */ +GSLList * +list_insert_prepend (GSLList * list, void *data) +{ + GSLList *newnode; + newnode = list_create (data); + newnode->next = list; + + return newnode; +} + +/* Find a node given a pointer to a function that compares them. + * + * If comparison fails, NULL is returned. + * On success, the existing node is returned. */ +GSLList * +list_find (GSLList * node, int (*func) (void *, void *), void *data) +{ + while (node) { + if (func (node->data, data) > 0) + return node; + node = node->next; + } + + return NULL; +} + +/* Remove all nodes from the list. + * + * On success, 0 is returned. */ +int +list_remove_nodes (GSLList * list) +{ + GSLList *tmp; + while (list != NULL) { + tmp = list->next; + if (list->data) + free (list->data); + free (list); + list = tmp; + } + + return 0; +} + +/* Remove the given node from the list. + * + * On error, 1 is returned. + * On success, 0 is returned. */ +int +list_remove_node (GSLList ** list, GSLList * node) +{ + GSLList **current = list, *next = NULL; + for (; *current; current = &(*current)->next) { + if ((*current) != node) + continue; + + next = (*current)->next; + if ((*current)->data) + free ((*current)->data); + free (*current); + *current = next; + return 0; + } + return 1; +} + +/* Iterate over the single linked-list and call function pointer. + * + * If function pointer does not return 0, -1 is returned. + * On success, 0 is returned. */ +int +list_foreach (GSLList * node, int (*func) (void *, void *), void *user_data) +{ + while (node) { + if (func (node->data, user_data) != 0) + return -1; + node = node->next; + } + + return 0; +} + +/* Count the number of elements on the linked-list. + * + * On success, the number of elements is returned. */ +int +list_count (GSLList * node) +{ + int count = 0; + while (node != 0) { + count++; + node = node->next; + } + return count; +} diff --git a/goaccess++/src/gslist.h b/goaccess++/src/gslist.h new file mode 100644 index 0000000..6108051 --- /dev/null +++ b/goaccess++/src/gslist.h @@ -0,0 +1,51 @@ +/** + * _______ _______ __ __ + * / ____/ | / / ___/____ _____/ /_____ / /_ + * / / __ | | /| / /\__ \/ __ \/ ___/ //_/ _ \/ __/ + * / /_/ / | |/ |/ /___/ / /_/ / /__/ ,< / __/ /_ + * \____/ |__/|__//____/\____/\___/_/|_|\___/\__/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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 GSLIST_H_INCLUDED +#define GSLIST_H_INCLUDED + +/* Generic Single linked-list */ +typedef struct GSLList_ +{ + void *data; + struct GSLList_ *next; +} GSLList; + +/* single linked-list */ +GSLList *list_create (void *data); +GSLList *list_find (GSLList * node, int (*func) (void *, void *), void *data); +GSLList *list_insert_append (GSLList * node, void *data); +GSLList *list_insert_prepend (GSLList * list, void *data); +int list_count (GSLList * list); +int list_foreach (GSLList * node, int (*func) (void *, void *), + void *user_data); +int list_remove_node (GSLList ** list, GSLList * node); +int list_remove_nodes (GSLList * list); + +#endif // for #ifndef GSLIST_H diff --git a/goaccess++/src/gslist.o b/goaccess++/src/gslist.o new file mode 100644 index 0000000000000000000000000000000000000000..c5e675fbf9e45b382905166b9cd40b66e640a2ce GIT binary patch literal 2992 zcmbtW|7%-S6u)UY_qNX0RQwW{m^T<w!99{u#7(J5(<aw7xM^E(#G0hZOIyr0US4J^ zZWCjNk8IE%#h><z;GeMH3}jS)@J9t<DE(13**dJh_=S4Tedi|W>&x)Vf&1>cpY!$J zb8_0NGpWRo&&MSB*d*(nB+6J#>G4s)M%m-+82fefx!>ow{l`}U0DndSw}bras8COL zHc`I7?ccgOy!ngb=#dg{%_-a-=k^8I;tFrxR?>@|(a<L%$|LO2=4~&1zOiRb#^ztQ zcOmlk82R3q^v7Fig>T%kp5d)mxP3pi_uWSO%3W^%kY0?v(<yGIBW+|N?M`ttG|j~Q z(BEqd=m(Q`aBlx7T(vGU6d$6iKXCSqJB^?4B9XSZ3ittsU4P&T{P0!?6A5zrF9<K3 zo!PQN{Kg6<*tm!Gx3Co8qNw-spX`eV(JAmE>&7egw2R{X|LuENchk4_fbb!_-XqdR zk57sF@YYqO+4cd@*o7Oi4ok-4XSMN#rAEbSXlL{ZJ$x$C5U0qM(_uY4p`U)i!Lh)@ zu&{Lw!Aicdz=jxWBj$&N^rW*f-v@6o-&(+T{Mcb-6J8|<__HJn;Xb1VnnM>=1=y3Y zUPcT^>>#@~G_3}k{*<a^)nH5w#6T1EvZw?!j-P#c7rJ`r<5QFaox{(p8n}-BuKA}` ztvS4WRH#m=N_-@y2IFb~*jQ)lTTn&6x6uY@7C+}O7tm_@ld4t{+K@}4v&C2##5<@1 zl*f<AN9aPF0z^rO#Aip|m3HEOC+P?4l^a=MLI-lgch8dT35@p$LbYM`aL-G{?>RBB zhO&zLt^A_u`!PKE*<%Mmfgc`#W3>;GUv$%c{3sls=*v^|3}8>g!gp}fivW1x6M&;1 zjSOU;B?-?GF8T@hG~t_siy8rM5WY>g=ndfChvgObL%=a^nCd0^1F#!}-y~f6|D5n0 z!cV|i&~m-BTDSB(!!46Hjhtn$Ofq$TDwfKePbB7M<}>rLsnkq{t(9}7Qk67UD|N%P zGPzpKs1zJyf@-GG!-}g?Y8vJ0B_mU*7K}P8nug&R^}!BMtU?a?70RayV*~S4ooq#? zi~#>94kVzL2H=+l;792GI8*RlrJu0@`1%0+;{muvaba%Z?CR31#7SJEbHRmY>3rRV z%YOOBg>Tb&*M-Zz7^ggCT-g@|7cTpP>Gk!pm0N<{GM#-za;8zr>6Wo(F};wpa!g;U z*O{KLmdgedNv~8bLx-7ts&3`-@6ma=($H&WwFbSi&UE3ySjiO4Tp2t5|C0tT@G9;} z5d{ostiK3wcK?=+1BSg2h1E}=k;5+u#Cd^n<b(+l{ygFC$@ZozE~yJ2lE)qA3i|x7 z_7Skfyuz^hNybP2{X}K&=5ZE;66@Ey{15ZT`GV8ft^N@KTEA1^<@-r^2^fs;w!cY0 z&6S+nei3ZF>KCOy5p9qoVg1ln+ROTR#YX)AItALM_&9Tpz;fFo=B^z;YzO~=0s6w( Wx?k6I*ceE>>}8-**V19!_J0G>XS*~2 literal 0 HcmV?d00001 diff --git a/goaccess++/src/gstorage.c b/goaccess++/src/gstorage.c new file mode 100644 index 0000000..b6934c1 --- /dev/null +++ b/goaccess++/src/gstorage.c @@ -0,0 +1,140 @@ +/** + * gstorage.c -- common storage handling + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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 <stdio.h> +#if !defined __SUNPRO_C +#include <stdint.h> +#endif +#include <stdlib.h> +#include <string.h> + +#ifdef HAVE_LIBTOKYOCABINET +#include "tcabdb.h" +#else +#include "gkhash.h" +#endif + +#include "gstorage.h" + +#include "error.h" +#include "xmalloc.h" + +/* Allocate memory for a new GMetrics instance. + * + * On success, the newly allocated GMetrics is returned . */ +GMetrics * +new_gmetrics (void) +{ + GMetrics *metrics = xcalloc (1, sizeof (GMetrics)); + + return metrics; +} + +/* Allocate space off the heap to store an int. + * + * On success, the newly allocated pointer is returned . */ +int * +int2ptr (int val) +{ + int *ptr = xmalloc (sizeof (int)); + *ptr = val; + + return ptr; +} + +/* Allocate space off the heap to store a uint64_t. + * + * On success, the newly allocated pointer is returned . */ +uint64_t * +uint642ptr (uint64_t val) +{ + uint64_t *ptr = xmalloc (sizeof (uint64_t)); + *ptr = val; + + return ptr; +} + +/* Set the module totals to calculate percentages. */ +void +set_module_totals (GModule module, GPercTotals * totals) +{ + totals->bw = ht_get_meta_data (module, "bytes"); + totals->hits = ht_get_meta_data (module, "hits"); + totals->visitors = ht_get_meta_data (module, "visitors"); +} + +/* Set numeric metrics for each request given raw data. + * + * On success, numeric metrics are set into the given structure. */ +void +set_data_metrics (GMetrics * ometrics, GMetrics ** nmetrics, GPercTotals totals) +{ + GMetrics *metrics; + + /* determine percentages for certain fields */ + float hits_perc = get_percentage (totals.hits, ometrics->hits); + float visitors_perc = get_percentage (totals.visitors, ometrics->visitors); + float bw_perc = get_percentage (totals.bw, ometrics->bw.nbw); + + metrics = new_gmetrics (); + + /* basic fields */ + metrics->id = ometrics->id; + metrics->hits = ometrics->hits; + metrics->visitors = ometrics->visitors; + + /* percentage fields */ + metrics->hits_perc = hits_perc < 0 ? 0 : hits_perc; + metrics->bw_perc = bw_perc < 0 ? 0 : bw_perc; + metrics->visitors_perc = visitors_perc < 0 ? 0 : visitors_perc; + + /* bandwidth field */ + metrics->bw.nbw = ometrics->bw.nbw; + + /* time served fields */ + if (conf.serve_usecs && ometrics->hits > 0) { + metrics->avgts.nts = ometrics->avgts.nts; + metrics->cumts.nts = ometrics->cumts.nts; + metrics->maxts.nts = ometrics->maxts.nts; + } + + /* method field */ + if (conf.append_method && ometrics->method) + metrics->method = ometrics->method; + + /* protocol field */ + if (conf.append_protocol && ometrics->protocol) + metrics->protocol = ometrics->protocol; + + /* data field */ + metrics->data = ometrics->data; + + *nmetrics = metrics; +} diff --git a/goaccess++/src/gstorage.h b/goaccess++/src/gstorage.h new file mode 100644 index 0000000..ea826f0 --- /dev/null +++ b/goaccess++/src/gstorage.h @@ -0,0 +1,68 @@ +/** + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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 GSTORAGE_H_INCLUDED +#define GSTORAGE_H_INCLUDED + +#include "commons.h" + +/* Total number of storage metrics (GSMetric) */ +#define GSMTRC_TOTAL 14 + +/* Enumerated Storage Metrics */ +typedef enum GSMetric_ +{ + MTRC_KEYMAP, + MTRC_ROOTMAP, + MTRC_DATAMAP, + MTRC_UNIQMAP, + MTRC_ROOT, + MTRC_HITS, + MTRC_VISITORS, + MTRC_BW, + MTRC_CUMTS, + MTRC_MAXTS, + MTRC_METHODS, + MTRC_PROTOCOLS, + MTRC_AGENTS, + MTRC_METADATA, +} GSMetric; + +GMetrics *new_gmetrics (void); + +int *int2ptr (int val); +uint64_t *uint642ptr (uint64_t val); + +void *get_storage_metric_by_module (GModule module, GSMetric metric); +void *get_storage_metric (GModule module, GSMetric metric); +void set_data_metrics (GMetrics * ometrics, GMetrics ** nmetrics, + GPercTotals totals); +void set_module_totals (GModule module, GPercTotals * totals); + +#endif // for #ifndef GSTORAGE_H diff --git a/goaccess++/src/gstorage.o b/goaccess++/src/gstorage.o new file mode 100644 index 0000000000000000000000000000000000000000..6f134657c53756983508e6ba1c107f9320af538b GIT binary patch literal 3136 zcmbuBUuYvm7{Dig>P2mLQ_nwv6K{nm5!xjURjS~zX_|Hmq0O0ADz$94dz&_xKQ%kC zsls{C>){eliYVy2KKSO7kDgK=&IcbX_#nRNOGTk*4<C9;{l3{5yWON9`oZLz`F($8 zcIKPiyqPadhC?ADBt$NelaZi=d=We8Ypkmgi42fK`LUzV7XaMCsGreNF01mz>)0dZ z9kiF+ySJh++DGIj7I%Ff%&vn2=4TE%^AH)(KJWfj(%nP-=F^x!-}*J?WjYYV%>{@X z@jP--ee0{(;?i!}pD#N<?S7M;n|ANa>+W}u`Yz;5=+?%NZXJ1Ru$;8+9_U{lD~Iyn zM6%zb9cQfI9x&of$R3(KK7&!_CVzImEFb)ED97iL{qQ@HjKXgr8Iw~#$*Eu7ig!vw zhqCb_w0&sbcb><`a*IQqQX0}MD{e8ZcS>W>UrXt35jzXX?PGee;|y*8aWw%(4Y&qc z2d#rHf-ZIjFwyqcbO1<P-`=B9!12yQ4DT_V5E!$>z#N-)qe<AM#Ntx+<?Pb#$|kiP zvR0uEd9C79Xrt*6GL_3cr=;drT6Nk|o>fQH^zcZFjYh6!(rS8C%{=9CoC*ccI}WW6 z+SJTE2}21Xi$Ftp&{HJz`U@n~j)yMvpNs8431Q5m+;*Pp1n4yHvuDXm@vZQz6a$8~ z0=GSan%OQhTM~wA+&0B+H^Mn7u@#w-l)9A2O7Sdsj)855`#p|jJSoL*hVxS5?Z||r z+=xy{sja>#NsEw>l*&p<R!WRZ@o_c>59?BxCQ5!g?lJ&?JiRb*u{)>D5w@GB8IB@s zcYE=3-H`d?j&)0f+}j2F8Nt&#ErV>>NA5X|$-|uAAK*BQba@kU0r&&HeGq4z0**Bh zluH15@k!vAN8tgiKA=AXt(X6cz|mg=jlyaMv<VIQGH4W5FQB3Ld*-<g9Q{89jl${% z^!w0y&HK?A{1f1V<o9E7GD4G82d<vEYO5Ae3%NA@jNng()a?ypwPw?1#d3%-RhS*m z7L3`+$x?pKn9GhA@&;*JX0_U|NTp6Q>$FMQHE-Mk@XRPfj!lhP<4UV)8?-^qD%^Q$ ztRl3jX<RX>Nzes5h}dLkUbmZ;U8k@zVm0bzQg3V+v_^*EIZ*J9V~zZI><OL&N|4t* zjPC_jeZqf(bM(h|gy7dWNB{eL+~qvz|E|v;Yf|L-@C^SwAIDl2{`+U}qcgb7uQskn z_T|ZQj_b#oyE6_yAnyctk@JrOe2#O>i4x4OFiO~d;v7Ooc?TIbg^!C|3$F2THNcno z_`LuZbx%}hvqsGo(6s64HPLI@Ra2#Qn-Z1Ple*$KL~S;3fbJtIRJ7Ho)u5h;T5nKW zg-^w>Lrv=yK3=W2)b(ZqijHnVC?>SmjB?Yg*?d9&Qz;OSTOE9#X~0mv<>%myy6-l= z$M7sP;lQ=d6JF!-ScBLV_Zz=kC{IE|9(?l;;=%Ngz;ehC_+ZZe8b1QDm@@;-FJgZ2 zofbARzt9>Ou%8wVTtC6rkL&Y`h!c7mjH2)NyZkSo|0M{*uU*i6fdj>#6#8QS1%4Ge zIDas{&B1Nq$aOFt?@O=qzs*0vZ61f`k6&34FV4T$+!&(q0~OEF4-Eg_1>-Si@azGR e5BR71pL>cBB)Hf3uI?4D@rmAGQ71pa_`d-z?y@=n literal 0 HcmV?d00001 diff --git a/goaccess++/src/gwsocket.c b/goaccess++/src/gwsocket.c new file mode 100644 index 0000000..4b809e0 --- /dev/null +++ b/goaccess++/src/gwsocket.c @@ -0,0 +1,410 @@ +/** + * gwsocket.c -- An interface to send/recv data from/to Web Socket Server + * _______ _______ __ __ + * / ____/ | / / ___/____ _____/ /_____ / /_ + * / / __ | | /| / /\__ \/ __ \/ ___/ //_/ _ \/ __/ + * / /_/ / | |/ |/ /___/ / /_/ / /__/ ,< / __/ /_ + * \____/ |__/|__//____/\____/\___/_/|_|\___/\__/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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 <stdio.h> +#include <signal.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <fcntl.h> +#include <sys/stat.h> +#include <unistd.h> + +#include "gwsocket.h" + +#include "commons.h" +#include "error.h" +#include "goaccess.h" +#include "json.h" +#include "parser.h" +#include "settings.h" +#include "websocket.h" +#include "xmalloc.h" + +/* Allocate memory for a new GWSReader instance. + * + * On success, the newly allocated GWSReader is returned. */ +GWSReader * +new_gwsreader (void) +{ + GWSReader *reader = xmalloc (sizeof (GWSReader)); + memset (reader, 0, sizeof *reader); + + return reader; +} + +/* Allocate memory for a new GWSWriter instance. + * + * On success, the newly allocated GWSWriter is returned. */ +GWSWriter * +new_gwswriter (void) +{ + GWSWriter *writer = xmalloc (sizeof (GWSWriter)); + memset (writer, 0, sizeof *writer); + + return writer; +} + +/* Write the JSON data to a pipe. + * + * If unable to write bytes, -1 is returned. + * On success, the number of written bytes is returned . */ +static int +write_holder (int fd, const char *buf, int len) +{ + int i, ret = 0; + + for (i = 0; i < len;) { + ret = write (fd, buf + i, len - i); + if (ret < 0) { + if (errno == EINTR || errno == EAGAIN) + continue; + return -1; + } else { + i += ret; + } + } + + return i; +} + +/* Clear an incoming FIFO packet and header data. */ +static void +clear_fifo_packet (GWSReader * gwserver) +{ + memset (gwserver->hdr, 0, sizeof (gwserver->hdr)); + gwserver->hlen = 0; + + if (gwserver->packet == NULL) + return; + + if (gwserver->packet->data) + free (gwserver->packet->data); + free (gwserver->packet); + gwserver->packet = NULL; +} + +/* Pack the JSON data into a network byte order and writes it to a + * pipe. + * + * On success, 0 is returned . */ +int +broadcast_holder (int fd, const char *buf, int len) +{ + char *p = NULL, *ptr = NULL; + + p = calloc (sizeof (uint32_t) * 3, sizeof (char)); + + ptr = p; + ptr += pack_uint32 (ptr, 0); + ptr += pack_uint32 (ptr, 0x01); + ptr += pack_uint32 (ptr, len); + + write_holder (fd, p, sizeof (uint32_t) * 3); + write_holder (fd, buf, len); + free (p); + + return 0; +} + +/* Pack the JSON data into a network byte order and write it to a + * pipe. + * + * On success, 0 is returned . */ +int +send_holder_to_client (int fd, int listener, const char *buf, int len) +{ + char *p = NULL, *ptr = NULL; + + p = calloc (sizeof (uint32_t) * 3, sizeof (char)); + + ptr = p; + ptr += pack_uint32 (ptr, listener); + ptr += pack_uint32 (ptr, 0x01); + ptr += pack_uint32 (ptr, len); + + write_holder (fd, p, sizeof (uint32_t) * 3); + write_holder (fd, buf, len); + free (p); + + return 0; +} + +/* Attempt to read data from the named pipe on strict mode. + * Note: For now it only reads on new connections, i.e., onopen. + * + * If there's less data than requested, 0 is returned + * If the thread is done, 1 is returned */ +int +read_fifo (GWSReader * gwsreader, fd_set rfds, fd_set wfds, void (*f) (int)) +{ + WSPacket **pa = &gwsreader->packet; + char *ptr; + int bytes = 0, readh = 0, need = 0, fd = gwsreader->fd, max = 0; + uint32_t listener = 0, type = 0, size = 0; + + FD_ZERO (&rfds); + FD_ZERO (&wfds); + /* self-pipe trick to stop the event loop */ + FD_SET (gwsreader->self_pipe[0], &rfds); + /* fifo */ + FD_SET (fd, &rfds); + max = MAX (fd, gwsreader->self_pipe[0]); + + if (select (max + 1, &rfds, &wfds, NULL, NULL) == -1) { + switch (errno) { + case EINTR: + break; + default: + FATAL ("Unable to select: %s.", strerror (errno)); + } + } + /* handle self-pipe trick */ + if (FD_ISSET (gwsreader->self_pipe[0], &rfds)) + return 1; + if (!FD_ISSET (fd, &rfds)) { + LOG (("No file descriptor set on read_message()\n")); + return 0; + } + + readh = gwsreader->hlen; /* read from header so far */ + need = HDR_SIZE - readh; /* need to read */ + if (need > 0) { + if ((bytes = + ws_read_fifo (fd, gwsreader->hdr, &gwsreader->hlen, readh, need)) < 0) + return 0; + if (bytes != need) + return 0; + } + + /* unpack size, and type */ + ptr = gwsreader->hdr; + ptr += unpack_uint32 (ptr, &listener); + ptr += unpack_uint32 (ptr, &type); + ptr += unpack_uint32 (ptr, &size); + + if ((*pa) == NULL) { + (*pa) = xcalloc (1, sizeof (WSPacket)); + (*pa)->type = type; + (*pa)->size = size; + (*pa)->data = xcalloc (size, sizeof (char)); + } + + readh = (*pa)->len; /* read from payload so far */ + need = (*pa)->size - readh; /* need to read */ + if (need > 0) { + if ((bytes = ws_read_fifo (fd, (*pa)->data, &(*pa)->len, readh, need)) < 0) + return 0; + if (bytes != need) + return 0; + } + clear_fifo_packet (gwsreader); + /* fast forward JSON data to the given client */ + (*f) (listener); + + return 0; +} + +/* Callback once a new connection is established + * + * It writes to a named pipe a header containing the socket, the + * message type, the payload's length and the actual payload */ +static int +onopen (WSPipeOut * pipeout, WSClient * client) +{ + uint32_t hsize = sizeof (uint32_t) * 3; + char *hdr = calloc (hsize, sizeof (char)); + char *ptr = hdr; + + ptr += pack_uint32 (ptr, client->listener); + ptr += pack_uint32 (ptr, WS_OPCODE_TEXT); + ptr += pack_uint32 (ptr, INET6_ADDRSTRLEN); + + ws_write_fifo (pipeout, hdr, hsize); + ws_write_fifo (pipeout, client->remote_ip, INET6_ADDRSTRLEN); + free (hdr); + + return 0; +} + +/* Done parsing, clear out line and set status message. */ +void +set_ready_state (void) +{ + fprintf (stderr, "\33[2K\r"); + fprintf (stderr, "%s\n", INFO_WS_READY_FOR_CONN); +} + +/* Open the named pipe where the websocket server writes to. + * + * If unable to open, -1 is returned. + * On success, return the new file descriptor is returned . */ +int +open_fifoout (void) +{ + const char *fifo = conf.fifo_out ? conf.fifo_out : WS_PIPEOUT; + int fdfifo; + + /* open fifo for reading before writing */ + ws_setfifo (fifo); + if ((fdfifo = open (fifo, O_RDWR | O_NONBLOCK)) == -1) + return -1; + + return fdfifo; +} + +/* Open the named pipe where the websocket server reads from. + * + * If unable to open, -1 is returned. + * On success, return the new file descriptor is returned . */ +int +open_fifoin (void) +{ + const char *fifo = conf.fifo_in ? conf.fifo_in : WS_PIPEIN; + int fdfifo; + + if ((fdfifo = open (fifo, O_WRONLY | O_NONBLOCK)) == -1) + return -1; + + return fdfifo; +} + +/* Set the self-pipe trick to handle select(2). */ +void +set_self_pipe (int *self_pipe) +{ + /* Initialize self pipe. */ + if (pipe (self_pipe) == -1) + FATAL ("Unable to create pipe: %s.", strerror (errno)); + + /* make the read and write pipe non-blocking */ + set_nonblocking (self_pipe[0]); + set_nonblocking (self_pipe[1]); +} + +/* Close the WebSocket server and clean up. */ +void +stop_ws_server (GWSWriter * gwswriter, GWSReader * gwsreader) +{ + pthread_t writer, reader; + WSServer *server = NULL; + + if (!gwsreader || !gwswriter) + return; + if (!(server = gwswriter->server)) + return; + + pthread_mutex_lock (&gwsreader->mutex); + if ((write (gwsreader->self_pipe[1], "x", 1)) == -1 && errno != EAGAIN) + LOG (("Unable to write to self pipe on pipeout.\n")); + pthread_mutex_unlock (&gwsreader->mutex); + + pthread_mutex_lock (&gwswriter->mutex); + /* if it fails to write, force stop */ + if ((write (server->self_pipe[1], "x", 1)) == -1 && errno != EAGAIN) + ws_stop (server); + pthread_mutex_unlock (&gwswriter->mutex); + + reader = gwsreader->thread; + if (pthread_join (reader, NULL) != 0) + LOG (("Unable to join thread: %d %s\n", reader, strerror (errno))); + + writer = gwswriter->thread; + if (pthread_join (writer, NULL) != 0) + LOG (("Unable to join thread: %d %s\n", writer, strerror (errno))); +} + +/* Start the WebSocket server and initialize default options. */ +static void +start_server (void *ptr_data) +{ + GWSWriter *writer = (GWSWriter *) ptr_data; + + writer->server->onopen = onopen; + set_self_pipe (writer->server->self_pipe); + + /* select(2) will block in here */ + ws_start (writer->server); + fprintf (stderr, "Stopping WebSocket server...\n"); + ws_stop (writer->server); +} + +/* Read and set the WebSocket config options. */ +static void +set_ws_opts (void) +{ + ws_set_config_strict (1); + if (conf.addr) + ws_set_config_host (conf.addr); + if (conf.fifo_in) + ws_set_config_pipein (conf.fifo_in); + if (conf.fifo_out) + ws_set_config_pipeout (conf.fifo_out); + if (conf.origin) + ws_set_config_origin (conf.origin); + if (conf.port) + ws_set_config_port (conf.port); + if (conf.sslcert) + ws_set_config_sslcert (conf.sslcert); + if (conf.sslkey) + ws_set_config_sslkey (conf.sslkey); +} + +/* Setup and start the WebSocket threads. */ +int +setup_ws_server (GWSWriter * gwswriter, GWSReader * gwsreader) +{ + int id; + pthread_t *thread; + + if (pthread_mutex_init (&gwswriter->mutex, NULL)) + FATAL ("Failed init gwswriter mutex"); + if (pthread_mutex_init (&gwsreader->mutex, NULL)) + FATAL ("Failed init gwsreader mutex"); + + /* send WS data thread */ + thread = &gwswriter->thread; + + /* pre-init the websocket server, to ensure the FIFOs are created */ + if ((gwswriter->server = ws_init ("0.0.0.0", "7890", set_ws_opts)) == NULL) + FATAL ("Failed init websocket"); + + id = pthread_create (&(*thread), NULL, (void *) &start_server, gwswriter); + if (id) + FATAL ("Return code from pthread_create(): %d", id); + + /* read WS data thread */ + thread = &gwsreader->thread; + id = pthread_create (&(*thread), NULL, (void *) &read_client, gwsreader); + if (id) + FATAL ("Return code from pthread_create(): %d", id); + + return 0; +} diff --git a/goaccess++/src/gwsocket.h b/goaccess++/src/gwsocket.h new file mode 100644 index 0000000..267f60c --- /dev/null +++ b/goaccess++/src/gwsocket.h @@ -0,0 +1,74 @@ +/** + * _______ _______ __ __ + * / ____/ | / / ___/____ _____/ /_____ / /_ + * / / __ | | /| / /\__ \/ __ \/ ___/ //_/ _ \/ __/ + * / /_/ / | |/ |/ /___/ / /_/ / /__/ ,< / __/ /_ + * \____/ |__/|__//____/\____/\___/_/|_|\___/\__/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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 GWSOCKET_H_INCLUDED +#define GWSOCKET_H_INCLUDED + +#define GW_VERSION "0.1" + +#include <pthread.h> +#include "websocket.h" + +typedef struct GWSReader_ +{ + int fd; + int self_pipe[2]; /* self-pipe */ + + pthread_mutex_t mutex; /* Mutex fifo out */ + pthread_t thread; /* Thread fifo in */ + + WSPacket *packet; /* FIFO data's buffer */ + char hdr[HDR_SIZE]; /* FIFO header's buffer */ + int hlen; /* header length */ +} GWSReader; + +typedef struct GWSWriter_ +{ + int fd; + + pthread_mutex_t mutex; /* Mutex fifo in */ + pthread_t thread; /* Thread fifo out */ + + WSServer *server; /* WebSocket server */ +} GWSWriter; + +GWSReader *new_gwsreader (void); +GWSWriter *new_gwswriter (void); +int broadcast_holder (int fd, const char *buf, int len); +int open_fifoin (void); +int open_fifoout (void); +int read_fifo (GWSReader * gwsreader, fd_set rfds, fd_set wfds, + void (*f) (int)); +int send_holder_to_client (int fd, int listener, const char *buf, int len); +int setup_ws_server (GWSWriter * gwswriter, GWSReader * gwsreader); +void set_ready_state (void); +void set_self_pipe (int *self_pipe); +void stop_ws_server (GWSWriter * gwswriter, GWSReader * gwsreader); + +#endif // for #ifndef GWSOCKET_H diff --git a/goaccess++/src/gwsocket.o b/goaccess++/src/gwsocket.o new file mode 100644 index 0000000000000000000000000000000000000000..0ef04bb2f026521b1576c54c94e6fa8c718027ed GIT binary patch literal 17272 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 literal 0 HcmV?d00001 diff --git a/goaccess++/src/hoganjs.h b/goaccess++/src/hoganjs.h new file mode 100644 index 0000000..bd36089 --- /dev/null +++ b/goaccess++/src/hoganjs.h @@ -0,0 +1,782 @@ +const char hogan_js[8555] = { + 0x2f, 0x2a, 0x2a, 0x2a, 0x20, 0x40, 0x70, 0x72, 0x65, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, + 0x68, 0x74, 0x20, 0x32, 0x30, 0x31, 0x32, 0x20, 0x54, 0x77, 0x69, + 0x74, 0x74, 0x65, 0x72, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x2a, + 0x20, 0x40, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x68, + 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x61, + 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x6c, + 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x2f, 0x4c, 0x49, 0x43, + 0x45, 0x4e, 0x53, 0x45, 0x2d, 0x32, 0x2e, 0x30, 0x2e, 0x74, 0x78, + 0x74, 0x2a, 0x2f, 0x76, 0x61, 0x72, 0x20, 0x48, 0x6f, 0x67, 0x61, + 0x6e, 0x3d, 0x7b, 0x7d, 0x3b, 0x21, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x28, 0x74, 0x2c, 0x6e, 0x2c, + 0x65, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x26, 0x26, 0x22, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, 0x65, + 0x6f, 0x66, 0x20, 0x6e, 0x26, 0x26, 0x28, 0x76, 0x6f, 0x69, 0x64, + 0x20, 0x30, 0x21, 0x3d, 0x3d, 0x6e, 0x5b, 0x74, 0x5d, 0x3f, 0x69, + 0x3d, 0x6e, 0x5b, 0x74, 0x5d, 0x3a, 0x65, 0x26, 0x26, 0x6e, 0x2e, + 0x67, 0x65, 0x74, 0x26, 0x26, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, + 0x66, 0x20, 0x6e, 0x2e, 0x67, 0x65, 0x74, 0x26, 0x26, 0x28, 0x69, + 0x3d, 0x6e, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x74, 0x29, 0x29, 0x29, + 0x2c, 0x69, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x65, 0x28, 0x74, 0x2c, 0x6e, 0x2c, 0x65, 0x2c, 0x69, 0x2c, + 0x72, 0x2c, 0x73, 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x61, 0x28, 0x29, 0x7b, 0x7d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x28, 0x29, 0x7b, 0x7d, + 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, + 0x3d, 0x74, 0x2c, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, + 0x79, 0x70, 0x65, 0x3d, 0x74, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x75, 0x2c, 0x63, 0x3d, 0x6e, 0x65, 0x77, + 0x20, 0x61, 0x3b, 0x63, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x3d, 0x6e, + 0x65, 0x77, 0x20, 0x6f, 0x2c, 0x63, 0x2e, 0x73, 0x75, 0x62, 0x73, + 0x54, 0x65, 0x78, 0x74, 0x3d, 0x7b, 0x7d, 0x2c, 0x63, 0x2e, 0x62, + 0x75, 0x66, 0x3d, 0x22, 0x22, 0x2c, 0x69, 0x3d, 0x69, 0x7c, 0x7c, + 0x7b, 0x7d, 0x2c, 0x63, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x53, + 0x75, 0x62, 0x73, 0x3d, 0x69, 0x2c, 0x63, 0x2e, 0x73, 0x75, 0x62, + 0x73, 0x54, 0x65, 0x78, 0x74, 0x3d, 0x73, 0x3b, 0x66, 0x6f, 0x72, + 0x28, 0x75, 0x20, 0x69, 0x6e, 0x20, 0x6e, 0x29, 0x69, 0x5b, 0x75, + 0x5d, 0x7c, 0x7c, 0x28, 0x69, 0x5b, 0x75, 0x5d, 0x3d, 0x6e, 0x5b, + 0x75, 0x5d, 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x75, 0x20, 0x69, + 0x6e, 0x20, 0x69, 0x29, 0x63, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x5b, + 0x75, 0x5d, 0x3d, 0x69, 0x5b, 0x75, 0x5d, 0x3b, 0x72, 0x3d, 0x72, + 0x7c, 0x7c, 0x7b, 0x7d, 0x2c, 0x63, 0x2e, 0x73, 0x74, 0x61, 0x63, + 0x6b, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x3d, 0x72, + 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x75, 0x20, 0x69, 0x6e, 0x20, 0x65, + 0x29, 0x72, 0x5b, 0x75, 0x5d, 0x7c, 0x7c, 0x28, 0x72, 0x5b, 0x75, + 0x5d, 0x3d, 0x65, 0x5b, 0x75, 0x5d, 0x29, 0x3b, 0x66, 0x6f, 0x72, + 0x28, 0x75, 0x20, 0x69, 0x6e, 0x20, 0x72, 0x29, 0x63, 0x2e, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x75, 0x5d, 0x3d, + 0x72, 0x5b, 0x75, 0x5d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x63, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x69, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6e, 0x75, + 0x6c, 0x6c, 0x3d, 0x3d, 0x3d, 0x74, 0x7c, 0x7c, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x30, 0x3d, 0x3d, 0x3d, 0x74, 0x3f, 0x22, 0x22, 0x3a, + 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x72, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x3d, 0x69, 0x28, 0x74, 0x29, 0x2c, 0x6c, 0x2e, + 0x74, 0x65, 0x73, 0x74, 0x28, 0x74, 0x29, 0x3f, 0x74, 0x2e, 0x72, + 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x73, 0x2c, 0x22, 0x26, + 0x61, 0x6d, 0x70, 0x3b, 0x22, 0x29, 0x2e, 0x72, 0x65, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x28, 0x61, 0x2c, 0x22, 0x26, 0x6c, 0x74, 0x3b, + 0x22, 0x29, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, + 0x6f, 0x2c, 0x22, 0x26, 0x67, 0x74, 0x3b, 0x22, 0x29, 0x2e, 0x72, + 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x75, 0x2c, 0x22, 0x26, + 0x23, 0x33, 0x39, 0x3b, 0x22, 0x29, 0x2e, 0x72, 0x65, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x28, 0x63, 0x2c, 0x22, 0x26, 0x71, 0x75, 0x6f, + 0x74, 0x3b, 0x22, 0x29, 0x3a, 0x74, 0x7d, 0x74, 0x2e, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x2c, 0x6e, 0x2c, 0x65, 0x2c, + 0x69, 0x29, 0x7b, 0x74, 0x3d, 0x74, 0x7c, 0x7c, 0x7b, 0x7d, 0x2c, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x3d, 0x74, 0x2e, 0x63, 0x6f, + 0x64, 0x65, 0x7c, 0x7c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x2c, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x3d, 0x65, 0x2c, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3d, + 0x69, 0x7c, 0x7c, 0x7b, 0x7d, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x74, 0x65, 0x78, 0x74, 0x3d, 0x6e, 0x7c, 0x7c, 0x22, 0x22, 0x2c, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, + 0x6c, 0x73, 0x3d, 0x74, 0x2e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, + 0x6c, 0x73, 0x7c, 0x7c, 0x7b, 0x7d, 0x2c, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x73, 0x75, 0x62, 0x73, 0x3d, 0x74, 0x2e, 0x73, 0x75, 0x62, + 0x73, 0x7c, 0x7c, 0x7b, 0x7d, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x62, 0x75, 0x66, 0x3d, 0x22, 0x22, 0x7d, 0x2c, 0x74, 0x2e, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x7b, 0x72, 0x3a, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x22, 0x7d, 0x2c, 0x76, 0x3a, + 0x72, 0x2c, 0x74, 0x3a, 0x69, 0x2c, 0x72, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x74, 0x2c, 0x6e, 0x2c, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x69, 0x28, + 0x5b, 0x74, 0x5d, 0x2c, 0x6e, 0x7c, 0x7c, 0x7b, 0x7d, 0x2c, 0x65, + 0x29, 0x7d, 0x2c, 0x72, 0x69, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x2c, 0x6e, 0x2c, 0x65, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x72, 0x28, 0x74, 0x2c, 0x6e, 0x2c, 0x65, 0x29, 0x7d, 0x2c, + 0x65, 0x70, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x74, 0x2c, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x69, + 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x61, 0x6c, 0x73, 0x5b, 0x74, 0x5d, 0x2c, 0x72, 0x3d, 0x6e, 0x5b, + 0x69, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x3b, 0x69, 0x66, 0x28, + 0x69, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x26, + 0x26, 0x69, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x3d, 0x3d, 0x72, 0x29, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x2e, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x69, 0x66, 0x28, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x3d, 0x3d, 0x74, 0x79, + 0x70, 0x65, 0x6f, 0x66, 0x20, 0x72, 0x29, 0x7b, 0x69, 0x66, 0x28, + 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x29, 0x74, 0x68, 0x72, + 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x28, 0x22, 0x4e, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x22, 0x29, 0x3b, 0x72, 0x3d, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x63, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x28, 0x72, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x7d, 0x69, 0x66, 0x28, 0x21, 0x72, + 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x75, 0x6c, + 0x6c, 0x3b, 0x69, 0x66, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x74, 0x5d, 0x2e, + 0x62, 0x61, 0x73, 0x65, 0x3d, 0x72, 0x2c, 0x69, 0x2e, 0x73, 0x75, + 0x62, 0x73, 0x29, 0x7b, 0x6e, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, + 0x54, 0x65, 0x78, 0x74, 0x7c, 0x7c, 0x28, 0x6e, 0x2e, 0x73, 0x74, + 0x61, 0x63, 0x6b, 0x54, 0x65, 0x78, 0x74, 0x3d, 0x7b, 0x7d, 0x29, + 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x6b, 0x65, 0x79, 0x20, 0x69, 0x6e, + 0x20, 0x69, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x29, 0x6e, 0x2e, 0x73, + 0x74, 0x61, 0x63, 0x6b, 0x54, 0x65, 0x78, 0x74, 0x5b, 0x6b, 0x65, + 0x79, 0x5d, 0x7c, 0x7c, 0x28, 0x6e, 0x2e, 0x73, 0x74, 0x61, 0x63, + 0x6b, 0x54, 0x65, 0x78, 0x74, 0x5b, 0x6b, 0x65, 0x79, 0x5d, 0x3d, + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x30, 0x21, 0x3d, 0x3d, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x75, + 0x62, 0x26, 0x26, 0x6e, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x54, + 0x65, 0x78, 0x74, 0x5b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x53, 0x75, 0x62, 0x5d, 0x3f, 0x6e, 0x2e, + 0x73, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x65, 0x78, 0x74, 0x5b, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, + 0x75, 0x62, 0x5d, 0x3a, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x74, 0x65, + 0x78, 0x74, 0x29, 0x3b, 0x72, 0x3d, 0x65, 0x28, 0x72, 0x2c, 0x69, + 0x2e, 0x73, 0x75, 0x62, 0x73, 0x2c, 0x69, 0x2e, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x61, 0x6c, 0x73, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x73, 0x74, 0x61, 0x63, 0x6b, 0x53, 0x75, 0x62, 0x73, 0x2c, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x50, 0x61, + 0x72, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x2c, 0x6e, 0x2e, 0x73, 0x74, + 0x61, 0x63, 0x6b, 0x54, 0x65, 0x78, 0x74, 0x29, 0x7d, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x74, 0x5d, 0x2e, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x3d, 0x72, 0x2c, + 0x72, 0x7d, 0x2c, 0x72, 0x70, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x2c, 0x6e, 0x2c, 0x65, 0x2c, 0x69, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x65, 0x70, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x3f, 0x72, 0x2e, 0x72, + 0x69, 0x28, 0x6e, 0x2c, 0x65, 0x2c, 0x69, 0x29, 0x3a, 0x22, 0x22, + 0x7d, 0x2c, 0x72, 0x73, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x74, 0x2c, 0x6e, 0x2c, 0x65, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x69, 0x3d, 0x74, 0x5b, 0x74, 0x2e, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, 0x5d, 0x3b, 0x69, 0x66, 0x28, + 0x21, 0x66, 0x28, 0x69, 0x29, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x65, 0x28, 0x74, 0x2c, + 0x6e, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x29, 0x3b, 0x66, 0x6f, 0x72, + 0x28, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x30, 0x3b, 0x72, 0x3c, + 0x69, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x72, 0x2b, + 0x2b, 0x29, 0x74, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x69, 0x5b, + 0x72, 0x5d, 0x29, 0x2c, 0x65, 0x28, 0x74, 0x2c, 0x6e, 0x2c, 0x74, + 0x68, 0x69, 0x73, 0x29, 0x2c, 0x74, 0x2e, 0x70, 0x6f, 0x70, 0x28, + 0x29, 0x7d, 0x2c, 0x73, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x74, 0x2c, 0x6e, 0x2c, 0x65, 0x2c, 0x69, 0x2c, + 0x72, 0x2c, 0x73, 0x2c, 0x61, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, + 0x6f, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x28, + 0x74, 0x29, 0x26, 0x26, 0x30, 0x3d, 0x3d, 0x3d, 0x74, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3f, 0x21, 0x31, 0x3a, 0x28, 0x22, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3d, 0x3d, + 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x74, 0x26, 0x26, 0x28, + 0x74, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x73, 0x28, 0x74, + 0x2c, 0x6e, 0x2c, 0x65, 0x2c, 0x69, 0x2c, 0x72, 0x2c, 0x73, 0x2c, + 0x61, 0x29, 0x29, 0x2c, 0x6f, 0x3d, 0x21, 0x21, 0x74, 0x2c, 0x21, + 0x69, 0x26, 0x26, 0x6f, 0x26, 0x26, 0x6e, 0x26, 0x26, 0x6e, 0x2e, + 0x70, 0x75, 0x73, 0x68, 0x28, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, + 0x74, 0x3f, 0x74, 0x3a, 0x6e, 0x5b, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x2d, 0x31, 0x5d, 0x29, 0x2c, 0x6f, 0x29, 0x7d, + 0x2c, 0x64, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x74, 0x2c, 0x65, 0x2c, 0x69, 0x2c, 0x72, 0x29, 0x7b, 0x76, + 0x61, 0x72, 0x20, 0x73, 0x2c, 0x61, 0x3d, 0x74, 0x2e, 0x73, 0x70, + 0x6c, 0x69, 0x74, 0x28, 0x22, 0x2e, 0x22, 0x29, 0x2c, 0x6f, 0x3d, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x66, 0x28, 0x61, 0x5b, 0x30, 0x5d, + 0x2c, 0x65, 0x2c, 0x69, 0x2c, 0x72, 0x29, 0x2c, 0x75, 0x3d, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x47, 0x65, 0x74, 0x2c, 0x63, + 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x3b, 0x69, 0x66, 0x28, 0x22, 0x2e, + 0x22, 0x3d, 0x3d, 0x3d, 0x74, 0x26, 0x26, 0x66, 0x28, 0x65, 0x5b, + 0x65, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x32, 0x5d, + 0x29, 0x29, 0x6f, 0x3d, 0x65, 0x5b, 0x65, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x2d, 0x31, 0x5d, 0x3b, 0x65, 0x6c, 0x73, 0x65, + 0x20, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x6c, 0x3d, + 0x31, 0x3b, 0x6c, 0x3c, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3b, 0x6c, 0x2b, 0x2b, 0x29, 0x73, 0x3d, 0x6e, 0x28, 0x61, + 0x5b, 0x6c, 0x5d, 0x2c, 0x6f, 0x2c, 0x75, 0x29, 0x2c, 0x76, 0x6f, + 0x69, 0x64, 0x20, 0x30, 0x21, 0x3d, 0x3d, 0x73, 0x3f, 0x28, 0x63, + 0x3d, 0x6f, 0x2c, 0x6f, 0x3d, 0x73, 0x29, 0x3a, 0x6f, 0x3d, 0x22, + 0x22, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x26, + 0x26, 0x21, 0x6f, 0x3f, 0x21, 0x31, 0x3a, 0x28, 0x72, 0x7c, 0x7c, + 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x21, + 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x6f, 0x7c, 0x7c, + 0x28, 0x65, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x63, 0x29, 0x2c, + 0x6f, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x76, 0x28, 0x6f, + 0x2c, 0x65, 0x2c, 0x69, 0x29, 0x2c, 0x65, 0x2e, 0x70, 0x6f, 0x70, + 0x28, 0x29, 0x29, 0x2c, 0x6f, 0x29, 0x7d, 0x2c, 0x66, 0x3a, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x2c, 0x65, + 0x2c, 0x69, 0x2c, 0x72, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, + 0x61, 0x72, 0x20, 0x73, 0x3d, 0x21, 0x31, 0x2c, 0x61, 0x3d, 0x6e, + 0x75, 0x6c, 0x6c, 0x2c, 0x6f, 0x3d, 0x21, 0x31, 0x2c, 0x75, 0x3d, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x47, 0x65, 0x74, 0x2c, + 0x63, 0x3d, 0x65, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, + 0x31, 0x3b, 0x63, 0x3e, 0x3d, 0x30, 0x3b, 0x63, 0x2d, 0x2d, 0x29, + 0x69, 0x66, 0x28, 0x61, 0x3d, 0x65, 0x5b, 0x63, 0x5d, 0x2c, 0x73, + 0x3d, 0x6e, 0x28, 0x74, 0x2c, 0x61, 0x2c, 0x75, 0x29, 0x2c, 0x76, + 0x6f, 0x69, 0x64, 0x20, 0x30, 0x21, 0x3d, 0x3d, 0x73, 0x29, 0x7b, + 0x6f, 0x3d, 0x21, 0x30, 0x3b, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x7d, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x3f, 0x28, 0x72, + 0x7c, 0x7c, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x21, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x73, + 0x7c, 0x7c, 0x28, 0x73, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, + 0x76, 0x28, 0x73, 0x2c, 0x65, 0x2c, 0x69, 0x29, 0x29, 0x2c, 0x73, + 0x29, 0x3a, 0x72, 0x3f, 0x21, 0x31, 0x3a, 0x22, 0x22, 0x7d, 0x2c, + 0x6c, 0x73, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x74, 0x2c, 0x6e, 0x2c, 0x65, 0x2c, 0x72, 0x2c, 0x73, 0x29, + 0x7b, 0x76, 0x61, 0x72, 0x20, 0x61, 0x3d, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x64, 0x65, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x73, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x64, 0x65, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x65, 0x72, 0x73, 0x3d, 0x73, 0x2c, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x62, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, + 0x74, 0x28, 0x69, 0x28, 0x74, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, + 0x6e, 0x2c, 0x72, 0x29, 0x29, 0x2c, 0x6e, 0x2c, 0x65, 0x29, 0x29, + 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, + 0x72, 0x73, 0x3d, 0x61, 0x2c, 0x21, 0x31, 0x7d, 0x2c, 0x63, 0x74, + 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, + 0x2c, 0x6e, 0x2c, 0x65, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x61, 0x6d, 0x62, + 0x64, 0x61, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, + 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x4c, 0x61, + 0x6d, 0x62, 0x64, 0x61, 0x20, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x73, 0x20, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x2e, 0x22, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x2e, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x28, 0x74, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x2e, 0x72, 0x65, + 0x6e, 0x64, 0x65, 0x72, 0x28, 0x6e, 0x2c, 0x65, 0x29, 0x7d, 0x2c, + 0x62, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x74, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x62, 0x75, 0x66, + 0x2b, 0x3d, 0x74, 0x7d, 0x2c, 0x66, 0x6c, 0x3a, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, + 0x20, 0x74, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x62, 0x75, 0x66, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x62, 0x75, 0x66, 0x3d, 0x22, 0x22, 0x2c, 0x74, 0x7d, + 0x2c, 0x6d, 0x73, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x74, 0x2c, 0x6e, 0x2c, 0x65, 0x2c, 0x69, 0x2c, 0x72, + 0x2c, 0x73, 0x2c, 0x61, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6f, + 0x2c, 0x75, 0x3d, 0x6e, 0x5b, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x2d, 0x31, 0x5d, 0x2c, 0x63, 0x3d, 0x74, 0x2e, 0x63, + 0x61, 0x6c, 0x6c, 0x28, 0x75, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x63, + 0x3f, 0x69, 0x3f, 0x21, 0x30, 0x3a, 0x28, 0x6f, 0x3d, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x75, + 0x62, 0x26, 0x26, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x75, 0x62, + 0x73, 0x54, 0x65, 0x78, 0x74, 0x26, 0x26, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x73, 0x75, 0x62, 0x73, 0x54, 0x65, 0x78, 0x74, 0x5b, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, + 0x75, 0x62, 0x5d, 0x3f, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x75, + 0x62, 0x73, 0x54, 0x65, 0x78, 0x74, 0x5b, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x75, 0x62, 0x5d, + 0x3a, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x2c, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x73, 0x28, 0x63, 0x2c, 0x75, + 0x2c, 0x65, 0x2c, 0x6f, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x72, 0x2c, 0x73, 0x29, 0x2c, 0x61, 0x29, + 0x29, 0x3a, 0x63, 0x7d, 0x2c, 0x6d, 0x76, 0x3a, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x2c, 0x6e, 0x2c, 0x65, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x6e, 0x5b, 0x6e, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, 0x5d, 0x2c, + 0x73, 0x3d, 0x74, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x29, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, + 0x65, 0x6f, 0x66, 0x20, 0x73, 0x3f, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x63, 0x74, 0x28, 0x69, 0x28, 0x73, 0x2e, 0x63, 0x61, 0x6c, 0x6c, + 0x28, 0x72, 0x29, 0x29, 0x2c, 0x72, 0x2c, 0x65, 0x29, 0x3a, 0x73, + 0x7d, 0x2c, 0x73, 0x75, 0x62, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x2c, 0x6e, 0x2c, 0x65, 0x2c, 0x69, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x5b, 0x74, 0x5d, 0x3b, 0x72, + 0x26, 0x26, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x53, 0x75, 0x62, 0x3d, 0x74, 0x2c, 0x72, 0x28, + 0x6e, 0x2c, 0x65, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x69, 0x29, + 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x53, 0x75, 0x62, 0x3d, 0x21, 0x31, 0x29, 0x7d, 0x7d, 0x3b, + 0x76, 0x61, 0x72, 0x20, 0x73, 0x3d, 0x2f, 0x26, 0x2f, 0x67, 0x2c, + 0x61, 0x3d, 0x2f, 0x3c, 0x2f, 0x67, 0x2c, 0x6f, 0x3d, 0x2f, 0x3e, + 0x2f, 0x67, 0x2c, 0x75, 0x3d, 0x2f, 0x5c, 0x27, 0x2f, 0x67, 0x2c, + 0x63, 0x3d, 0x2f, 0x5c, 0x22, 0x2f, 0x67, 0x2c, 0x6c, 0x3d, 0x2f, + 0x5b, 0x26, 0x3c, 0x3e, 0x5c, 0x22, 0x5c, 0x27, 0x5d, 0x2f, 0x2c, + 0x66, 0x3d, 0x41, 0x72, 0x72, 0x61, 0x79, 0x2e, 0x69, 0x73, 0x41, + 0x72, 0x72, 0x61, 0x79, 0x7c, 0x7c, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x22, 0x5b, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, + 0x41, 0x72, 0x72, 0x61, 0x79, 0x5d, 0x22, 0x3d, 0x3d, 0x3d, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x74, 0x79, 0x70, 0x65, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x74, 0x29, 0x7d, + 0x7d, 0x28, 0x22, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, + 0x64, 0x22, 0x21, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, + 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x3f, 0x65, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x73, 0x3a, 0x48, 0x6f, 0x67, 0x61, 0x6e, 0x29, + 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, + 0x29, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x22, 0x7d, 0x22, 0x3d, 0x3d, 0x3d, + 0x74, 0x2e, 0x6e, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x74, 0x72, 0x28, + 0x74, 0x2e, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, + 0x31, 0x29, 0x26, 0x26, 0x28, 0x74, 0x2e, 0x6e, 0x3d, 0x74, 0x2e, + 0x6e, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x30, 0x2c, 0x74, 0x2e, 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x2d, 0x31, 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x28, 0x74, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, 0x74, 0x72, 0x69, + 0x6d, 0x3f, 0x74, 0x2e, 0x74, 0x72, 0x69, 0x6d, 0x28, 0x29, 0x3a, + 0x74, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, + 0x5e, 0x5c, 0x73, 0x2a, 0x7c, 0x5c, 0x73, 0x2a, 0x24, 0x2f, 0x67, + 0x2c, 0x22, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x69, 0x28, 0x74, 0x2c, 0x6e, 0x2c, 0x65, 0x29, + 0x7b, 0x69, 0x66, 0x28, 0x6e, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x41, + 0x74, 0x28, 0x65, 0x29, 0x21, 0x3d, 0x74, 0x2e, 0x63, 0x68, 0x61, + 0x72, 0x41, 0x74, 0x28, 0x30, 0x29, 0x29, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x21, 0x31, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, + 0x72, 0x20, 0x69, 0x3d, 0x31, 0x2c, 0x72, 0x3d, 0x74, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x72, 0x3e, 0x69, 0x3b, 0x69, + 0x2b, 0x2b, 0x29, 0x69, 0x66, 0x28, 0x6e, 0x2e, 0x63, 0x68, 0x61, + 0x72, 0x41, 0x74, 0x28, 0x65, 0x2b, 0x69, 0x29, 0x21, 0x3d, 0x74, + 0x2e, 0x63, 0x68, 0x61, 0x72, 0x41, 0x74, 0x28, 0x69, 0x29, 0x29, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x21, 0x31, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x21, 0x30, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x28, 0x6e, 0x2c, 0x65, 0x2c, + 0x69, 0x2c, 0x6f, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x75, 0x3d, + 0x5b, 0x5d, 0x2c, 0x63, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x6c, + 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x66, 0x3d, 0x6e, 0x75, 0x6c, + 0x6c, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x6c, 0x3d, 0x69, 0x5b, 0x69, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, 0x5d, 0x3b, + 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3e, 0x30, 0x3b, + 0x29, 0x7b, 0x69, 0x66, 0x28, 0x66, 0x3d, 0x6e, 0x2e, 0x73, 0x68, + 0x69, 0x66, 0x74, 0x28, 0x29, 0x2c, 0x6c, 0x26, 0x26, 0x22, 0x3c, + 0x22, 0x3d, 0x3d, 0x6c, 0x2e, 0x74, 0x61, 0x67, 0x26, 0x26, 0x21, + 0x28, 0x66, 0x2e, 0x74, 0x61, 0x67, 0x20, 0x69, 0x6e, 0x20, 0x6b, + 0x29, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, + 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x49, 0x6c, 0x6c, + 0x65, 0x67, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x20, 0x69, 0x6e, 0x20, 0x3c, 0x20, 0x73, 0x75, 0x70, 0x65, + 0x72, 0x20, 0x74, 0x61, 0x67, 0x2e, 0x22, 0x29, 0x3b, 0x69, 0x66, + 0x28, 0x74, 0x2e, 0x74, 0x61, 0x67, 0x73, 0x5b, 0x66, 0x2e, 0x74, + 0x61, 0x67, 0x5d, 0x3c, 0x3d, 0x74, 0x2e, 0x74, 0x61, 0x67, 0x73, + 0x2e, 0x24, 0x7c, 0x7c, 0x73, 0x28, 0x66, 0x2c, 0x6f, 0x29, 0x29, + 0x69, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x66, 0x29, 0x2c, 0x66, + 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x3d, 0x72, 0x28, 0x6e, 0x2c, + 0x66, 0x2e, 0x74, 0x61, 0x67, 0x2c, 0x69, 0x2c, 0x6f, 0x29, 0x3b, + 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x69, 0x66, 0x28, 0x22, 0x2f, 0x22, + 0x3d, 0x3d, 0x66, 0x2e, 0x74, 0x61, 0x67, 0x29, 0x7b, 0x69, 0x66, + 0x28, 0x30, 0x3d, 0x3d, 0x3d, 0x69, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, + 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x43, 0x6c, + 0x6f, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, 0x67, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x6f, 0x70, 0x65, 0x6e, + 0x65, 0x72, 0x3a, 0x20, 0x2f, 0x22, 0x2b, 0x66, 0x2e, 0x6e, 0x29, + 0x3b, 0x69, 0x66, 0x28, 0x63, 0x3d, 0x69, 0x2e, 0x70, 0x6f, 0x70, + 0x28, 0x29, 0x2c, 0x66, 0x2e, 0x6e, 0x21, 0x3d, 0x63, 0x2e, 0x6e, + 0x26, 0x26, 0x21, 0x61, 0x28, 0x66, 0x2e, 0x6e, 0x2c, 0x63, 0x2e, + 0x6e, 0x2c, 0x6f, 0x29, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, + 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, + 0x4e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x3a, 0x20, 0x22, 0x2b, 0x63, 0x2e, 0x6e, 0x2b, 0x22, + 0x20, 0x76, 0x73, 0x2e, 0x20, 0x22, 0x2b, 0x66, 0x2e, 0x6e, 0x29, + 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x2e, 0x65, + 0x6e, 0x64, 0x3d, 0x66, 0x2e, 0x69, 0x2c, 0x75, 0x7d, 0x22, 0x5c, + 0x6e, 0x22, 0x3d, 0x3d, 0x66, 0x2e, 0x74, 0x61, 0x67, 0x26, 0x26, + 0x28, 0x66, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x3d, 0x30, 0x3d, 0x3d, + 0x6e, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x7c, 0x7c, 0x22, + 0x5c, 0x6e, 0x22, 0x3d, 0x3d, 0x6e, 0x5b, 0x30, 0x5d, 0x2e, 0x74, + 0x61, 0x67, 0x29, 0x7d, 0x75, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, + 0x66, 0x29, 0x7d, 0x69, 0x66, 0x28, 0x69, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3e, 0x30, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, + 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, + 0x22, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6c, + 0x6f, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, 0x67, 0x3a, 0x20, + 0x22, 0x2b, 0x69, 0x2e, 0x70, 0x6f, 0x70, 0x28, 0x29, 0x2e, 0x6e, + 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x28, + 0x74, 0x2c, 0x6e, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, + 0x72, 0x20, 0x65, 0x3d, 0x30, 0x2c, 0x69, 0x3d, 0x6e, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x69, 0x3e, 0x65, 0x3b, 0x65, + 0x2b, 0x2b, 0x29, 0x69, 0x66, 0x28, 0x6e, 0x5b, 0x65, 0x5d, 0x2e, + 0x6f, 0x3d, 0x3d, 0x74, 0x2e, 0x6e, 0x29, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x74, 0x2e, 0x74, 0x61, 0x67, 0x3d, 0x22, 0x23, + 0x22, 0x2c, 0x21, 0x30, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x61, 0x28, 0x74, 0x2c, 0x6e, 0x2c, 0x65, 0x29, + 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, + 0x30, 0x2c, 0x72, 0x3d, 0x65, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3b, 0x72, 0x3e, 0x69, 0x3b, 0x69, 0x2b, 0x2b, 0x29, 0x69, + 0x66, 0x28, 0x65, 0x5b, 0x69, 0x5d, 0x2e, 0x63, 0x3d, 0x3d, 0x74, + 0x26, 0x26, 0x65, 0x5b, 0x69, 0x5d, 0x2e, 0x6f, 0x3d, 0x3d, 0x6e, + 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x21, 0x30, 0x7d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x28, 0x74, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6e, 0x3d, 0x5b, 0x5d, 0x3b, + 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x65, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x29, 0x6e, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, + 0x27, 0x22, 0x27, 0x2b, 0x63, 0x28, 0x65, 0x29, 0x2b, 0x27, 0x22, + 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x63, 0x2c, 0x70, 0x2c, 0x74, 0x2c, 0x69, 0x29, 0x20, 0x7b, 0x27, + 0x2b, 0x74, 0x5b, 0x65, 0x5d, 0x2b, 0x22, 0x7d, 0x22, 0x29, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x7b, 0x20, 0x22, 0x2b, + 0x6e, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x22, 0x2c, 0x22, 0x29, + 0x2b, 0x22, 0x20, 0x7d, 0x22, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x28, 0x74, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x6e, 0x3d, 0x5b, 0x5d, 0x3b, 0x66, 0x6f, 0x72, 0x28, + 0x76, 0x61, 0x72, 0x20, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x2e, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x29, 0x6e, 0x2e, + 0x70, 0x75, 0x73, 0x68, 0x28, 0x27, 0x22, 0x27, 0x2b, 0x63, 0x28, + 0x65, 0x29, 0x2b, 0x27, 0x22, 0x3a, 0x7b, 0x6e, 0x61, 0x6d, 0x65, + 0x3a, 0x22, 0x27, 0x2b, 0x63, 0x28, 0x74, 0x2e, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x65, 0x5d, 0x2e, 0x6e, 0x61, + 0x6d, 0x65, 0x29, 0x2b, 0x27, 0x22, 0x2c, 0x20, 0x27, 0x2b, 0x75, + 0x28, 0x74, 0x2e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x73, + 0x5b, 0x65, 0x5d, 0x29, 0x2b, 0x22, 0x7d, 0x22, 0x29, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x61, 0x6c, 0x73, 0x3a, 0x20, 0x7b, 0x22, 0x2b, 0x6e, 0x2e, 0x6a, + 0x6f, 0x69, 0x6e, 0x28, 0x22, 0x2c, 0x22, 0x29, 0x2b, 0x22, 0x7d, + 0x2c, 0x20, 0x73, 0x75, 0x62, 0x73, 0x3a, 0x20, 0x22, 0x2b, 0x6f, + 0x28, 0x74, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x29, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x28, 0x74, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, 0x72, + 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x6d, 0x2c, 0x22, 0x5c, + 0x5c, 0x5c, 0x5c, 0x22, 0x29, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, + 0x63, 0x65, 0x28, 0x76, 0x2c, 0x27, 0x5c, 0x5c, 0x22, 0x27, 0x29, + 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x62, 0x2c, + 0x22, 0x5c, 0x5c, 0x6e, 0x22, 0x29, 0x2e, 0x72, 0x65, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x28, 0x64, 0x2c, 0x22, 0x5c, 0x5c, 0x72, 0x22, + 0x29, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x78, + 0x2c, 0x22, 0x5c, 0x5c, 0x75, 0x32, 0x30, 0x32, 0x38, 0x22, 0x29, + 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x77, 0x2c, + 0x22, 0x5c, 0x5c, 0x75, 0x32, 0x30, 0x32, 0x39, 0x22, 0x29, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x28, + 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7e, 0x74, + 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x22, 0x2e, + 0x22, 0x29, 0x3f, 0x22, 0x64, 0x22, 0x3a, 0x22, 0x66, 0x22, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x28, + 0x74, 0x2c, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, + 0x22, 0x3c, 0x22, 0x2b, 0x28, 0x6e, 0x2e, 0x70, 0x72, 0x65, 0x66, + 0x69, 0x78, 0x7c, 0x7c, 0x22, 0x22, 0x29, 0x2c, 0x69, 0x3d, 0x65, + 0x2b, 0x74, 0x2e, 0x6e, 0x2b, 0x79, 0x2b, 0x2b, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x70, 0x61, 0x72, 0x74, + 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x69, 0x5d, 0x3d, 0x7b, 0x6e, 0x61, + 0x6d, 0x65, 0x3a, 0x74, 0x2e, 0x6e, 0x2c, 0x70, 0x61, 0x72, 0x74, + 0x69, 0x61, 0x6c, 0x73, 0x3a, 0x7b, 0x7d, 0x7d, 0x2c, 0x6e, 0x2e, + 0x63, 0x6f, 0x64, 0x65, 0x2b, 0x3d, 0x27, 0x74, 0x2e, 0x62, 0x28, + 0x74, 0x2e, 0x72, 0x70, 0x28, 0x22, 0x27, 0x2b, 0x63, 0x28, 0x69, + 0x29, 0x2b, 0x27, 0x22, 0x2c, 0x63, 0x2c, 0x70, 0x2c, 0x22, 0x27, + 0x2b, 0x28, 0x74, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x7c, + 0x7c, 0x22, 0x22, 0x29, 0x2b, 0x27, 0x22, 0x29, 0x29, 0x3b, 0x27, + 0x2c, 0x69, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x68, 0x28, 0x74, 0x2c, 0x6e, 0x29, 0x7b, 0x6e, 0x2e, 0x63, + 0x6f, 0x64, 0x65, 0x2b, 0x3d, 0x22, 0x74, 0x2e, 0x62, 0x28, 0x74, + 0x2e, 0x74, 0x28, 0x74, 0x2e, 0x22, 0x2b, 0x6c, 0x28, 0x74, 0x2e, + 0x6e, 0x29, 0x2b, 0x27, 0x28, 0x22, 0x27, 0x2b, 0x63, 0x28, 0x74, + 0x2e, 0x6e, 0x29, 0x2b, 0x27, 0x22, 0x2c, 0x63, 0x2c, 0x70, 0x2c, + 0x30, 0x29, 0x29, 0x29, 0x3b, 0x27, 0x7d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x28, 0x74, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x74, 0x2e, 0x62, 0x28, 0x22, + 0x2b, 0x74, 0x2b, 0x22, 0x29, 0x3b, 0x22, 0x7d, 0x76, 0x61, 0x72, + 0x20, 0x67, 0x3d, 0x2f, 0x5c, 0x53, 0x2f, 0x2c, 0x76, 0x3d, 0x2f, + 0x5c, 0x22, 0x2f, 0x67, 0x2c, 0x62, 0x3d, 0x2f, 0x5c, 0x6e, 0x2f, + 0x67, 0x2c, 0x64, 0x3d, 0x2f, 0x5c, 0x72, 0x2f, 0x67, 0x2c, 0x6d, + 0x3d, 0x2f, 0x5c, 0x5c, 0x2f, 0x67, 0x2c, 0x78, 0x3d, 0x2f, 0x5c, + 0x75, 0x32, 0x30, 0x32, 0x38, 0x2f, 0x2c, 0x77, 0x3d, 0x2f, 0x5c, + 0x75, 0x32, 0x30, 0x32, 0x39, 0x2f, 0x3b, 0x74, 0x2e, 0x74, 0x61, + 0x67, 0x73, 0x3d, 0x7b, 0x22, 0x23, 0x22, 0x3a, 0x31, 0x2c, 0x22, + 0x5e, 0x22, 0x3a, 0x32, 0x2c, 0x22, 0x3c, 0x22, 0x3a, 0x33, 0x2c, + 0x24, 0x3a, 0x34, 0x2c, 0x22, 0x2f, 0x22, 0x3a, 0x35, 0x2c, 0x22, + 0x21, 0x22, 0x3a, 0x36, 0x2c, 0x22, 0x3e, 0x22, 0x3a, 0x37, 0x2c, + 0x22, 0x3d, 0x22, 0x3a, 0x38, 0x2c, 0x5f, 0x76, 0x3a, 0x39, 0x2c, + 0x22, 0x7b, 0x22, 0x3a, 0x31, 0x30, 0x2c, 0x22, 0x26, 0x22, 0x3a, + 0x31, 0x31, 0x2c, 0x5f, 0x74, 0x3a, 0x31, 0x32, 0x7d, 0x2c, 0x74, + 0x2e, 0x73, 0x63, 0x61, 0x6e, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x72, 0x2c, 0x73, 0x29, 0x7b, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x28, 0x29, 0x7b, + 0x6d, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3e, 0x30, 0x26, + 0x26, 0x28, 0x78, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x7b, 0x74, + 0x61, 0x67, 0x3a, 0x22, 0x5f, 0x74, 0x22, 0x2c, 0x74, 0x65, 0x78, + 0x74, 0x3a, 0x6e, 0x65, 0x77, 0x20, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x28, 0x6d, 0x29, 0x7d, 0x29, 0x2c, 0x6d, 0x3d, 0x22, 0x22, + 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6f, 0x28, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, + 0x20, 0x6e, 0x3d, 0x21, 0x30, 0x2c, 0x65, 0x3d, 0x79, 0x3b, 0x65, + 0x3c, 0x78, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x65, + 0x2b, 0x2b, 0x29, 0x69, 0x66, 0x28, 0x6e, 0x3d, 0x74, 0x2e, 0x74, + 0x61, 0x67, 0x73, 0x5b, 0x78, 0x5b, 0x65, 0x5d, 0x2e, 0x74, 0x61, + 0x67, 0x5d, 0x3c, 0x74, 0x2e, 0x74, 0x61, 0x67, 0x73, 0x2e, 0x5f, + 0x76, 0x7c, 0x7c, 0x22, 0x5f, 0x74, 0x22, 0x3d, 0x3d, 0x78, 0x5b, + 0x65, 0x5d, 0x2e, 0x74, 0x61, 0x67, 0x26, 0x26, 0x6e, 0x75, 0x6c, + 0x6c, 0x3d, 0x3d, 0x3d, 0x78, 0x5b, 0x65, 0x5d, 0x2e, 0x74, 0x65, + 0x78, 0x74, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x67, 0x29, + 0x2c, 0x21, 0x6e, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x21, + 0x31, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x7d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x28, + 0x74, 0x2c, 0x6e, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x61, 0x28, 0x29, + 0x2c, 0x74, 0x26, 0x26, 0x6f, 0x28, 0x29, 0x29, 0x66, 0x6f, 0x72, + 0x28, 0x76, 0x61, 0x72, 0x20, 0x65, 0x2c, 0x69, 0x3d, 0x79, 0x3b, + 0x69, 0x3c, 0x78, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, + 0x69, 0x2b, 0x2b, 0x29, 0x78, 0x5b, 0x69, 0x5d, 0x2e, 0x74, 0x65, + 0x78, 0x74, 0x26, 0x26, 0x28, 0x28, 0x65, 0x3d, 0x78, 0x5b, 0x69, + 0x2b, 0x31, 0x5d, 0x29, 0x26, 0x26, 0x22, 0x3e, 0x22, 0x3d, 0x3d, + 0x65, 0x2e, 0x74, 0x61, 0x67, 0x26, 0x26, 0x28, 0x65, 0x2e, 0x69, + 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x3d, 0x78, 0x5b, 0x69, 0x5d, 0x2e, + 0x74, 0x65, 0x78, 0x74, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x28, 0x29, 0x29, 0x2c, 0x78, 0x2e, 0x73, 0x70, 0x6c, + 0x69, 0x63, 0x65, 0x28, 0x69, 0x2c, 0x31, 0x29, 0x29, 0x3b, 0x65, + 0x6c, 0x73, 0x65, 0x20, 0x6e, 0x7c, 0x7c, 0x78, 0x2e, 0x70, 0x75, + 0x73, 0x68, 0x28, 0x7b, 0x74, 0x61, 0x67, 0x3a, 0x22, 0x5c, 0x6e, + 0x22, 0x7d, 0x29, 0x3b, 0x77, 0x3d, 0x21, 0x31, 0x2c, 0x79, 0x3d, + 0x78, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x7d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x28, 0x74, 0x2c, + 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, 0x22, 0x3d, + 0x22, 0x2b, 0x53, 0x2c, 0x72, 0x3d, 0x74, 0x2e, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x4f, 0x66, 0x28, 0x69, 0x2c, 0x6e, 0x29, 0x2c, 0x73, + 0x3d, 0x65, 0x28, 0x74, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x74, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x4f, 0x66, 0x28, 0x22, 0x3d, 0x22, 0x2c, 0x6e, 0x29, 0x2b, 0x31, + 0x2c, 0x72, 0x29, 0x29, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, + 0x22, 0x20, 0x22, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x54, 0x3d, 0x73, 0x5b, 0x30, 0x5d, 0x2c, 0x53, 0x3d, 0x73, + 0x5b, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, + 0x5d, 0x2c, 0x72, 0x2b, 0x69, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x2d, 0x31, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x6c, 0x3d, 0x72, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x66, 0x3d, 0x30, + 0x2c, 0x68, 0x3d, 0x31, 0x2c, 0x70, 0x3d, 0x32, 0x2c, 0x76, 0x3d, + 0x66, 0x2c, 0x62, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x64, 0x3d, + 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x6d, 0x3d, 0x22, 0x22, 0x2c, 0x78, + 0x3d, 0x5b, 0x5d, 0x2c, 0x77, 0x3d, 0x21, 0x31, 0x2c, 0x6b, 0x3d, + 0x30, 0x2c, 0x79, 0x3d, 0x30, 0x2c, 0x54, 0x3d, 0x22, 0x7b, 0x7b, + 0x22, 0x2c, 0x53, 0x3d, 0x22, 0x7d, 0x7d, 0x22, 0x3b, 0x66, 0x6f, + 0x72, 0x28, 0x73, 0x26, 0x26, 0x28, 0x73, 0x3d, 0x73, 0x2e, 0x73, + 0x70, 0x6c, 0x69, 0x74, 0x28, 0x22, 0x20, 0x22, 0x29, 0x2c, 0x54, + 0x3d, 0x73, 0x5b, 0x30, 0x5d, 0x2c, 0x53, 0x3d, 0x73, 0x5b, 0x31, + 0x5d, 0x29, 0x2c, 0x6b, 0x3d, 0x30, 0x3b, 0x6c, 0x3e, 0x6b, 0x3b, + 0x6b, 0x2b, 0x2b, 0x29, 0x76, 0x3d, 0x3d, 0x66, 0x3f, 0x69, 0x28, + 0x54, 0x2c, 0x72, 0x2c, 0x6b, 0x29, 0x3f, 0x28, 0x2d, 0x2d, 0x6b, + 0x2c, 0x61, 0x28, 0x29, 0x2c, 0x76, 0x3d, 0x68, 0x29, 0x3a, 0x22, + 0x5c, 0x6e, 0x22, 0x3d, 0x3d, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x72, + 0x41, 0x74, 0x28, 0x6b, 0x29, 0x3f, 0x75, 0x28, 0x77, 0x29, 0x3a, + 0x6d, 0x2b, 0x3d, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x41, 0x74, + 0x28, 0x6b, 0x29, 0x3a, 0x76, 0x3d, 0x3d, 0x68, 0x3f, 0x28, 0x6b, + 0x2b, 0x3d, 0x54, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, + 0x31, 0x2c, 0x64, 0x3d, 0x74, 0x2e, 0x74, 0x61, 0x67, 0x73, 0x5b, + 0x72, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x41, 0x74, 0x28, 0x6b, 0x2b, + 0x31, 0x29, 0x5d, 0x2c, 0x62, 0x3d, 0x64, 0x3f, 0x72, 0x2e, 0x63, + 0x68, 0x61, 0x72, 0x41, 0x74, 0x28, 0x6b, 0x2b, 0x31, 0x29, 0x3a, + 0x22, 0x5f, 0x76, 0x22, 0x2c, 0x22, 0x3d, 0x22, 0x3d, 0x3d, 0x62, + 0x3f, 0x28, 0x6b, 0x3d, 0x63, 0x28, 0x72, 0x2c, 0x6b, 0x29, 0x2c, + 0x76, 0x3d, 0x66, 0x29, 0x3a, 0x28, 0x64, 0x26, 0x26, 0x6b, 0x2b, + 0x2b, 0x2c, 0x76, 0x3d, 0x70, 0x29, 0x2c, 0x77, 0x3d, 0x6b, 0x29, + 0x3a, 0x69, 0x28, 0x53, 0x2c, 0x72, 0x2c, 0x6b, 0x29, 0x3f, 0x28, + 0x78, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x7b, 0x74, 0x61, 0x67, + 0x3a, 0x62, 0x2c, 0x6e, 0x3a, 0x65, 0x28, 0x6d, 0x29, 0x2c, 0x6f, + 0x74, 0x61, 0x67, 0x3a, 0x54, 0x2c, 0x63, 0x74, 0x61, 0x67, 0x3a, + 0x53, 0x2c, 0x69, 0x3a, 0x22, 0x2f, 0x22, 0x3d, 0x3d, 0x62, 0x3f, + 0x77, 0x2d, 0x54, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3a, + 0x6b, 0x2b, 0x53, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x7d, + 0x29, 0x2c, 0x6d, 0x3d, 0x22, 0x22, 0x2c, 0x6b, 0x2b, 0x3d, 0x53, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, 0x2c, 0x76, + 0x3d, 0x66, 0x2c, 0x22, 0x7b, 0x22, 0x3d, 0x3d, 0x62, 0x26, 0x26, + 0x28, 0x22, 0x7d, 0x7d, 0x22, 0x3d, 0x3d, 0x53, 0x3f, 0x6b, 0x2b, + 0x2b, 0x3a, 0x6e, 0x28, 0x78, 0x5b, 0x78, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x2d, 0x31, 0x5d, 0x29, 0x29, 0x29, 0x3a, 0x6d, + 0x2b, 0x3d, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x41, 0x74, 0x28, + 0x6b, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, + 0x28, 0x77, 0x2c, 0x21, 0x30, 0x29, 0x2c, 0x78, 0x7d, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x6b, 0x3d, 0x7b, 0x5f, 0x74, 0x3a, 0x21, 0x30, + 0x2c, 0x22, 0x5c, 0x6e, 0x22, 0x3a, 0x21, 0x30, 0x2c, 0x24, 0x3a, + 0x21, 0x30, 0x2c, 0x22, 0x2f, 0x22, 0x3a, 0x21, 0x30, 0x7d, 0x3b, + 0x74, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x7b, 0x63, + 0x6f, 0x64, 0x65, 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x63, 0x2c, 0x70, 0x2c, 0x69, 0x29, 0x20, + 0x7b, 0x20, 0x22, 0x2b, 0x74, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x4d, + 0x61, 0x69, 0x6e, 0x28, 0x6e, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x29, + 0x2b, 0x22, 0x20, 0x7d, 0x2c, 0x22, 0x2b, 0x75, 0x28, 0x6e, 0x29, + 0x2b, 0x22, 0x7d, 0x22, 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x79, + 0x3d, 0x30, 0x3b, 0x74, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6e, 0x2c, 0x65, 0x2c, 0x69, 0x29, 0x7b, 0x79, 0x3d, 0x30, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x7b, 0x63, 0x6f, 0x64, + 0x65, 0x3a, 0x22, 0x22, 0x2c, 0x73, 0x75, 0x62, 0x73, 0x3a, 0x7b, + 0x7d, 0x2c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x3a, + 0x7b, 0x7d, 0x7d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x2e, 0x77, 0x61, 0x6c, 0x6b, 0x28, 0x6e, 0x2c, 0x72, 0x29, + 0x2c, 0x69, 0x2e, 0x61, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x3f, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x69, 0x66, 0x79, 0x28, 0x72, 0x2c, 0x65, 0x2c, 0x69, 0x29, + 0x3a, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x6b, 0x65, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x28, 0x72, 0x2c, 0x65, + 0x2c, 0x69, 0x29, 0x7d, 0x2c, 0x74, 0x2e, 0x77, 0x72, 0x61, 0x70, + 0x4d, 0x61, 0x69, 0x6e, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x27, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x74, 0x68, 0x69, + 0x73, 0x3b, 0x74, 0x2e, 0x62, 0x28, 0x69, 0x3d, 0x69, 0x7c, 0x7c, + 0x22, 0x22, 0x29, 0x3b, 0x27, 0x2b, 0x74, 0x2b, 0x22, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, 0x66, 0x6c, 0x28, 0x29, + 0x3b, 0x22, 0x7d, 0x2c, 0x74, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x3d, 0x74, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x2c, 0x74, 0x2e, 0x6d, 0x61, 0x6b, 0x65, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x2c, 0x6e, 0x2c, 0x65, + 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x6d, 0x61, 0x6b, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, + 0x61, 0x6c, 0x73, 0x28, 0x74, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x69, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x3d, 0x6e, + 0x65, 0x77, 0x20, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x22, 0x63, 0x22, 0x2c, 0x22, 0x70, 0x22, 0x2c, 0x22, 0x69, + 0x22, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x77, 0x72, 0x61, 0x70, + 0x4d, 0x61, 0x69, 0x6e, 0x28, 0x74, 0x2e, 0x63, 0x6f, 0x64, 0x65, + 0x29, 0x29, 0x2c, 0x6e, 0x65, 0x77, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x28, 0x69, + 0x2c, 0x6e, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x65, 0x29, 0x7d, + 0x2c, 0x74, 0x2e, 0x6d, 0x61, 0x6b, 0x65, 0x50, 0x61, 0x72, 0x74, + 0x69, 0x61, 0x6c, 0x73, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6e, + 0x2c, 0x65, 0x3d, 0x7b, 0x73, 0x75, 0x62, 0x73, 0x3a, 0x7b, 0x7d, + 0x2c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x3a, 0x74, + 0x2e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x2c, 0x6e, + 0x61, 0x6d, 0x65, 0x3a, 0x74, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x7d, + 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x65, + 0x2e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x29, 0x65, + 0x2e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x6e, + 0x5d, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x6b, 0x65, + 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x28, 0x65, 0x2e, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x6e, 0x5d, + 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x6e, 0x20, 0x69, 0x6e, 0x20, + 0x74, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x29, 0x65, 0x2e, 0x73, 0x75, + 0x62, 0x73, 0x5b, 0x6e, 0x5d, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x46, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x22, 0x63, 0x22, + 0x2c, 0x22, 0x70, 0x22, 0x2c, 0x22, 0x74, 0x22, 0x2c, 0x22, 0x69, + 0x22, 0x2c, 0x74, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x5b, 0x6e, 0x5d, + 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x7d, + 0x2c, 0x74, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x67, 0x65, 0x6e, 0x3d, + 0x7b, 0x22, 0x23, 0x22, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x65, 0x29, 0x7b, 0x65, 0x2e, 0x63, + 0x6f, 0x64, 0x65, 0x2b, 0x3d, 0x22, 0x69, 0x66, 0x28, 0x74, 0x2e, + 0x73, 0x28, 0x74, 0x2e, 0x22, 0x2b, 0x6c, 0x28, 0x6e, 0x2e, 0x6e, + 0x29, 0x2b, 0x27, 0x28, 0x22, 0x27, 0x2b, 0x63, 0x28, 0x6e, 0x2e, + 0x6e, 0x29, 0x2b, 0x27, 0x22, 0x2c, 0x63, 0x2c, 0x70, 0x2c, 0x31, + 0x29, 0x2c, 0x63, 0x2c, 0x70, 0x2c, 0x30, 0x2c, 0x27, 0x2b, 0x6e, + 0x2e, 0x69, 0x2b, 0x22, 0x2c, 0x22, 0x2b, 0x6e, 0x2e, 0x65, 0x6e, + 0x64, 0x2b, 0x27, 0x2c, 0x22, 0x27, 0x2b, 0x6e, 0x2e, 0x6f, 0x74, + 0x61, 0x67, 0x2b, 0x22, 0x20, 0x22, 0x2b, 0x6e, 0x2e, 0x63, 0x74, + 0x61, 0x67, 0x2b, 0x27, 0x22, 0x29, 0x29, 0x7b, 0x74, 0x2e, 0x72, + 0x73, 0x28, 0x63, 0x2c, 0x70, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x63, 0x2c, 0x70, 0x2c, 0x74, 0x29, 0x7b, + 0x27, 0x2c, 0x74, 0x2e, 0x77, 0x61, 0x6c, 0x6b, 0x28, 0x6e, 0x2e, + 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x2c, 0x65, 0x29, 0x2c, 0x65, 0x2e, + 0x63, 0x6f, 0x64, 0x65, 0x2b, 0x3d, 0x22, 0x7d, 0x29, 0x3b, 0x63, + 0x2e, 0x70, 0x6f, 0x70, 0x28, 0x29, 0x3b, 0x7d, 0x22, 0x7d, 0x2c, + 0x22, 0x5e, 0x22, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x2c, 0x65, 0x29, 0x7b, 0x65, 0x2e, 0x63, 0x6f, + 0x64, 0x65, 0x2b, 0x3d, 0x22, 0x69, 0x66, 0x28, 0x21, 0x74, 0x2e, + 0x73, 0x28, 0x74, 0x2e, 0x22, 0x2b, 0x6c, 0x28, 0x6e, 0x2e, 0x6e, + 0x29, 0x2b, 0x27, 0x28, 0x22, 0x27, 0x2b, 0x63, 0x28, 0x6e, 0x2e, + 0x6e, 0x29, 0x2b, 0x27, 0x22, 0x2c, 0x63, 0x2c, 0x70, 0x2c, 0x31, + 0x29, 0x2c, 0x63, 0x2c, 0x70, 0x2c, 0x31, 0x2c, 0x30, 0x2c, 0x30, + 0x2c, 0x22, 0x22, 0x29, 0x29, 0x7b, 0x27, 0x2c, 0x74, 0x2e, 0x77, + 0x61, 0x6c, 0x6b, 0x28, 0x6e, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x73, + 0x2c, 0x65, 0x29, 0x2c, 0x65, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x2b, + 0x3d, 0x22, 0x7d, 0x3b, 0x22, 0x7d, 0x2c, 0x22, 0x3e, 0x22, 0x3a, + 0x66, 0x2c, 0x22, 0x3c, 0x22, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x65, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x69, 0x3d, 0x7b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, + 0x6c, 0x73, 0x3a, 0x7b, 0x7d, 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x3a, + 0x22, 0x22, 0x2c, 0x73, 0x75, 0x62, 0x73, 0x3a, 0x7b, 0x7d, 0x2c, + 0x69, 0x6e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x3a, 0x21, + 0x30, 0x7d, 0x3b, 0x74, 0x2e, 0x77, 0x61, 0x6c, 0x6b, 0x28, 0x6e, + 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x2c, 0x69, 0x29, 0x3b, 0x76, + 0x61, 0x72, 0x20, 0x72, 0x3d, 0x65, 0x2e, 0x70, 0x61, 0x72, 0x74, + 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x66, 0x28, 0x6e, 0x2c, 0x65, 0x29, + 0x5d, 0x3b, 0x72, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x3d, 0x69, 0x2e, + 0x73, 0x75, 0x62, 0x73, 0x2c, 0x72, 0x2e, 0x70, 0x61, 0x72, 0x74, + 0x69, 0x61, 0x6c, 0x73, 0x3d, 0x69, 0x2e, 0x70, 0x61, 0x72, 0x74, + 0x69, 0x61, 0x6c, 0x73, 0x7d, 0x2c, 0x24, 0x3a, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x65, 0x29, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, 0x7b, 0x73, 0x75, 0x62, 0x73, + 0x3a, 0x7b, 0x7d, 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x3a, 0x22, 0x22, + 0x2c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x3a, 0x65, + 0x2e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x2c, 0x70, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x3a, 0x6e, 0x2e, 0x6e, 0x7d, 0x3b, + 0x74, 0x2e, 0x77, 0x61, 0x6c, 0x6b, 0x28, 0x6e, 0x2e, 0x6e, 0x6f, + 0x64, 0x65, 0x73, 0x2c, 0x69, 0x29, 0x2c, 0x65, 0x2e, 0x73, 0x75, + 0x62, 0x73, 0x5b, 0x6e, 0x2e, 0x6e, 0x5d, 0x3d, 0x69, 0x2e, 0x63, + 0x6f, 0x64, 0x65, 0x2c, 0x65, 0x2e, 0x69, 0x6e, 0x50, 0x61, 0x72, + 0x74, 0x69, 0x61, 0x6c, 0x7c, 0x7c, 0x28, 0x65, 0x2e, 0x63, 0x6f, + 0x64, 0x65, 0x2b, 0x3d, 0x27, 0x74, 0x2e, 0x73, 0x75, 0x62, 0x28, + 0x22, 0x27, 0x2b, 0x63, 0x28, 0x6e, 0x2e, 0x6e, 0x29, 0x2b, 0x27, + 0x22, 0x2c, 0x63, 0x2c, 0x70, 0x2c, 0x69, 0x29, 0x3b, 0x27, 0x29, + 0x7d, 0x2c, 0x22, 0x5c, 0x6e, 0x22, 0x3a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x2c, 0x6e, 0x29, 0x7b, 0x6e, + 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x2b, 0x3d, 0x70, 0x28, 0x27, 0x22, + 0x5c, 0x5c, 0x6e, 0x22, 0x27, 0x2b, 0x28, 0x74, 0x2e, 0x6c, 0x61, + 0x73, 0x74, 0x3f, 0x22, 0x22, 0x3a, 0x22, 0x20, 0x2b, 0x20, 0x69, + 0x22, 0x29, 0x29, 0x7d, 0x2c, 0x5f, 0x76, 0x3a, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x2c, 0x6e, 0x29, 0x7b, + 0x6e, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x2b, 0x3d, 0x22, 0x74, 0x2e, + 0x62, 0x28, 0x74, 0x2e, 0x76, 0x28, 0x74, 0x2e, 0x22, 0x2b, 0x6c, + 0x28, 0x74, 0x2e, 0x6e, 0x29, 0x2b, 0x27, 0x28, 0x22, 0x27, 0x2b, + 0x63, 0x28, 0x74, 0x2e, 0x6e, 0x29, 0x2b, 0x27, 0x22, 0x2c, 0x63, + 0x2c, 0x70, 0x2c, 0x30, 0x29, 0x29, 0x29, 0x3b, 0x27, 0x7d, 0x2c, + 0x5f, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x74, 0x2c, 0x6e, 0x29, 0x7b, 0x6e, 0x2e, 0x63, 0x6f, 0x64, + 0x65, 0x2b, 0x3d, 0x70, 0x28, 0x27, 0x22, 0x27, 0x2b, 0x63, 0x28, + 0x74, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x29, 0x2b, 0x27, 0x22, 0x27, + 0x29, 0x7d, 0x2c, 0x22, 0x7b, 0x22, 0x3a, 0x68, 0x2c, 0x22, 0x26, + 0x22, 0x3a, 0x68, 0x7d, 0x2c, 0x74, 0x2e, 0x77, 0x61, 0x6c, 0x6b, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x2c, 0x65, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, + 0x20, 0x69, 0x2c, 0x72, 0x3d, 0x30, 0x2c, 0x73, 0x3d, 0x6e, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x73, 0x3e, 0x72, 0x3b, + 0x72, 0x2b, 0x2b, 0x29, 0x69, 0x3d, 0x74, 0x2e, 0x63, 0x6f, 0x64, + 0x65, 0x67, 0x65, 0x6e, 0x5b, 0x6e, 0x5b, 0x72, 0x5d, 0x2e, 0x74, + 0x61, 0x67, 0x5d, 0x2c, 0x69, 0x26, 0x26, 0x69, 0x28, 0x6e, 0x5b, + 0x72, 0x5d, 0x2c, 0x65, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x65, 0x7d, 0x2c, 0x74, 0x2e, 0x70, 0x61, 0x72, 0x73, + 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x74, 0x2c, 0x6e, 0x2c, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x65, 0x3d, 0x65, 0x7c, 0x7c, 0x7b, 0x7d, 0x2c, + 0x72, 0x28, 0x74, 0x2c, 0x22, 0x22, 0x2c, 0x5b, 0x5d, 0x2c, 0x65, + 0x2e, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x67, + 0x73, 0x7c, 0x7c, 0x5b, 0x5d, 0x29, 0x7d, 0x2c, 0x74, 0x2e, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x3d, 0x7b, 0x7d, 0x2c, 0x74, 0x2e, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x4b, 0x65, 0x79, 0x3d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x2c, 0x6e, 0x29, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, 0x74, 0x2c, 0x21, 0x21, + 0x6e, 0x2e, 0x61, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, + 0x21, 0x21, 0x6e, 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x4c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x2c, 0x6e, 0x2e, 0x64, 0x65, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x73, 0x2c, 0x21, 0x21, + 0x6e, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x47, 0x65, 0x74, 0x5d, + 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x22, 0x7c, 0x7c, 0x22, 0x29, + 0x7d, 0x2c, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x2c, 0x65, 0x29, 0x7b, 0x65, 0x3d, 0x65, 0x7c, 0x7c, 0x7b, 0x7d, + 0x3b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, 0x74, 0x2e, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x4b, 0x65, 0x79, 0x28, 0x6e, 0x2c, 0x65, 0x29, + 0x2c, 0x72, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x5b, 0x69, 0x5d, 0x3b, 0x69, 0x66, 0x28, 0x72, 0x29, + 0x7b, 0x76, 0x61, 0x72, 0x20, 0x73, 0x3d, 0x72, 0x2e, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x3b, 0x66, 0x6f, 0x72, 0x28, + 0x76, 0x61, 0x72, 0x20, 0x61, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x29, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x73, 0x5b, 0x61, 0x5d, + 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x7d, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x72, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x73, 0x63, 0x61, 0x6e, 0x28, 0x6e, 0x2c, 0x65, + 0x2e, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x73, + 0x29, 0x2c, 0x6e, 0x2c, 0x65, 0x29, 0x2c, 0x6e, 0x2c, 0x65, 0x29, + 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x5b, 0x69, 0x5d, 0x3d, 0x72, 0x7d, 0x7d, 0x28, 0x22, 0x75, 0x6e, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x22, 0x21, 0x3d, 0x74, + 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x65, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x73, 0x3f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x3a, + 0x48, 0x6f, 0x67, 0x61, 0x6e, 0x29, 0x3b, 0x00 +}; + +const int hogan_js_length = 8555; diff --git a/goaccess++/src/json.c b/goaccess++/src/json.c new file mode 100644 index 0000000..cefbde1 --- /dev/null +++ b/goaccess++/src/json.c @@ -0,0 +1,1251 @@ +/** + * output.c -- output json to the standard output stream + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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. + */ + +#define _LARGEFILE_SOURCE +#define _LARGEFILE64_SOURCE +#define _FILE_OFFSET_BITS 64 + +#include <errno.h> +#include <ctype.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/stat.h> +#include <time.h> +#include <unistd.h> +#include <inttypes.h> + +#include "json.h" + +#ifdef HAVE_LIBTOKYOCABINET +#include "tcabdb.h" +#else +#include "gkhash.h" +#endif + +#include "error.h" +#include "settings.h" +#include "ui.h" +#include "util.h" +#include "websocket.h" +#include "xmalloc.h" + +typedef struct GPanel_ +{ + GModule module; + void (*render) (GJSON * json, GHolder * h, GPercTotals totals, + const struct GPanel_ *); + void (*subitems) (GJSON * json, GHolderItem * item, GPercTotals totals, + int size, int iisp); +} GPanel; + +/* number of new lines (applicable fields) */ +static int nlines = 0; +/* escape HTML in JSON data values */ +static int escape_html_output = 0; + +static void print_json_data (GJSON * json, GHolder * h, GPercTotals totals, + const struct GPanel_ *); +static void print_json_host_items (GJSON * json, GHolderItem * item, + GPercTotals totals, int size, int iisp); +static void print_json_sub_items (GJSON * json, GHolderItem * item, + GPercTotals totals, int size, int iisp); + +/* *INDENT-OFF* */ +static GPanel paneling[] = { + {VISITORS , print_json_data , NULL } , + {REQUESTS , print_json_data , NULL } , + {REQUESTS_STATIC , print_json_data , NULL } , + {NOT_FOUND , print_json_data , NULL } , + {HOSTS , print_json_data , print_json_host_items } , + {OS , print_json_data , print_json_sub_items } , + {BROWSERS , print_json_data , print_json_sub_items } , + {VISIT_TIMES , print_json_data , NULL } , + {VIRTUAL_HOSTS , print_json_data , NULL } , + {REFERRERS , print_json_data , NULL } , + {REFERRING_SITES , print_json_data , NULL } , + {KEYPHRASES , print_json_data , NULL } , + {STATUS_CODES , print_json_data , print_json_sub_items } , + {REMOTE_USER , print_json_data , NULL } , +#ifdef HAVE_GEOLOCATION + {GEO_LOCATION , print_json_data , print_json_sub_items } , +#endif +}; +/* *INDENT-ON* */ + +/* Get panel output data for the given module. + * + * If not found, NULL is returned. + * On success, panel data is returned . */ +static GPanel * +panel_lookup (GModule module) +{ + int i, num_panels = ARRAY_SIZE (paneling); + + for (i = 0; i < num_panels; i++) { + if (paneling[i].module == module) + return &paneling[i]; + } + return NULL; +} + +/* Allocate memory for a new GJSON instance. + * + * On success, the newly allocated GJSON is returned . */ +static GJSON * +new_gjson (void) +{ + GJSON *json = xcalloc (1, sizeof (GJSON)); + + return json; +} + +/* Free malloc'd GJSON resources. */ +static void +free_json (GJSON * json) +{ + if (!json) + return; + + free (json->buf); + free (json); +} + +/* Set number of new lines when --json-pretty-print is used. */ +void +set_json_nlines (int newline) +{ + nlines = newline; +} + +/* Make sure that we have enough storage to write "len" bytes at the + * current offset. */ +static void +set_json_buffer (GJSON * json, int len) +{ + char *tmp = NULL; + /* Maintain a null byte at the end of the buffer */ + size_t need = json->offset + len + 1, newlen = 0; + + if (need <= json->size) + return; + + if (json->size == 0) { + newlen = INIT_BUF_SIZE; + } else { + newlen = json->size; + newlen += newlen / 2; /* resize by 3/2 */ + } + + if (newlen < need) + newlen = need; + + tmp = realloc (json->buf, newlen); + if (tmp == NULL) { + free_json (json); + FATAL (("Unable to realloc JSON buffer.\n")); + } + json->buf = tmp; + json->size = newlen; +} + +#pragma GCC diagnostic ignored "-Wformat-nonliteral" +/* A wrapper function to write a formatted string and expand the + * buffer if necessary. + * + * On success, data is outputted. */ +static void +pjson (GJSON * json, const char *fmt, ...) +{ + int len = 0; + va_list args; + + va_start (args, fmt); + if ((len = vsnprintf (NULL, 0, fmt, args)) < 0) + FATAL (("Unable to write JSON formatted data.\n")); + va_end (args); + + /* malloc/realloc buffer as needed */ + set_json_buffer (json, len); + + va_start (args, fmt); /* restart args */ + vsprintf (json->buf + json->offset, fmt, args); + va_end (args); + json->offset += len; +} + +/* A wrapper function to output a formatted string to a file pointer. + * + * On success, data is outputted. */ +void +fpjson (FILE * fp, const char *fmt, ...) +{ + va_list args; + + va_start (args, fmt); + vfprintf (fp, fmt, args); + va_end (args); +} + +#pragma GCC diagnostic warning "-Wformat-nonliteral" + +/* Escape all other characters accordingly. */ +static void +escape_json_other (GJSON * json, char **s) +{ + /* Since JSON data is bootstrapped into the HTML document of a report, + * then we perform the following four translations in case weird stuff + * is put into the document. + * + * Note: The following scenario assumes that the user manually makes + * the HTML report a PHP file (GoAccess doesn't allow the creation of a + * PHP file): + * + * /index.html<?php eval(base_decode('iZWNobyAiPGgxPkhFTExPPC9oMT4iOw=='));?> + */ + if (escape_html_output) { + switch (**s) { + case '\'': + pjson (json, "'"); + return; + case '&': + pjson (json, "&"); + return; + case '<': + pjson (json, "<"); + return; + case '>': + pjson (json, ">"); + return; + } + } + + if ((uint8_t) ** s <= 0x1f) { + /* Control characters (U+0000 through U+001F) */ + char buf[8]; + snprintf (buf, sizeof buf, "\\u%04x", **s); + pjson (json, "%s", buf); + } else if ((uint8_t) ** s == 0xe2 && (uint8_t) * (*s + 1) == 0x80 && + (uint8_t) * (*s + 2) == 0xa8) { + /* Line separator (U+2028) - 0xE2 0x80 0xA8 */ + pjson (json, "\\u2028"); + *s += 2; + } else if ((uint8_t) ** s == 0xe2 && (uint8_t) * (*s + 1) == 0x80 && + (uint8_t) * (*s + 2) == 0xa9) { + /* Paragraph separator (U+2019) - 0xE2 0x80 0xA9 */ + pjson (json, "\\u2029"); + *s += 2; + } else { + char buf[2]; + snprintf (buf, sizeof buf, "%c", **s); + pjson (json, "%s", buf); + } +} + +/* Escape and write to a valid JSON buffer. + * + * On success, escaped JSON data is outputted. */ +static void +escape_json_output (GJSON * json, char *s) +{ + while (*s) { + switch (*s) { + /* These are required JSON special characters that need to be escaped. */ + case '"': + pjson (json, "\\\""); + break; + case '\\': + pjson (json, "\\\\"); + break; + case '\b': + pjson (json, "\\b"); + break; + case '\f': + pjson (json, "\\f"); + break; + case '\n': + pjson (json, "\\n"); + break; + case '\r': + pjson (json, "\\r"); + break; + case '\t': + pjson (json, "\\t"); + break; + case '/': + pjson (json, "\\/"); + break; + default: + escape_json_other (json, &s); + break; + } + s++; + } +} + +/* Write to a buffer a JSON a key/value pair. */ +static void +pskeysval (GJSON * json, const char *key, const char *val, int sp, int last) +{ + if (!last) + pjson (json, "%.*s\"%s\": \"%s\",%.*s", sp, TAB, key, val, nlines, NL); + else + pjson (json, "%.*s\"%s\": \"%s\"", sp, TAB, key, val); +} + +/* Output a JSON string key, array value pair. */ +void +fpskeyaval (FILE * fp, const char *key, const char *val, int sp, int last) +{ + if (!last) + fpjson (fp, "%.*s\"%s\": %s,%.*s", sp, TAB, key, val, nlines, NL); + else + fpjson (fp, "%.*s\"%s\": %s", sp, TAB, key, val); +} + +/* Output a JSON a key/value pair. */ +void +fpskeysval (FILE * fp, const char *key, const char *val, int sp, int last) +{ + if (!last) + fpjson (fp, "%.*s\"%s\": \"%s\",%.*s", sp, TAB, key, val, nlines, NL); + else + fpjson (fp, "%.*s\"%s\": \"%s\"", sp, TAB, key, val); +} + +/* Write to a buffer a JSON string key, int value pair. */ +static void +pskeyival (GJSON * json, const char *key, int val, int sp, int last) +{ + if (!last) + pjson (json, "%.*s\"%s\": %d,%.*s", sp, TAB, key, val, nlines, NL); + else + pjson (json, "%.*s\"%s\": %d", sp, TAB, key, val); +} + +/* Output a JSON string key, int value pair. */ +void +fpskeyival (FILE * fp, const char *key, int val, int sp, int last) +{ + if (!last) + fpjson (fp, "%.*s\"%s\": %d,%.*s", sp, TAB, key, val, nlines, NL); + else + fpjson (fp, "%.*s\"%s\": %d", sp, TAB, key, val); +} + +/* Write to a buffer a JSON string key, uint64_t value pair. */ +static void +pskeyu64val (GJSON * json, const char *key, uint64_t val, int sp, int last) +{ + if (!last) + pjson (json, "%.*s\"%s\": %" PRIu64 ",%.*s", sp, TAB, key, val, nlines, NL); + else + pjson (json, "%.*s\"%s\": %" PRIu64 "", sp, TAB, key, val); +} + +/* Write to a buffer a JSON string key, int value pair. */ +static void +pskeyfval (GJSON * json, const char *key, float val, int sp, int last) +{ + if (!last) + pjson (json, "%.*s\"%s\": \"%4.2f\",%.*s", sp, TAB, key, val, nlines, NL); + else + pjson (json, "%.*s\"%s\": \"%4.2f\"", sp, TAB, key, val); +} + +/* Write to a buffer the open block item object. */ +static void +popen_obj (GJSON * json, int iisp) +{ + /* open data metric block */ + pjson (json, "%.*s{%.*s", iisp, TAB, nlines, NL); +} + +/* Output the open block item object. */ +void +fpopen_obj (FILE * fp, int iisp) +{ + /* open data metric block */ + fpjson (fp, "%.*s{%.*s", iisp, TAB, nlines, NL); +} + +/* Write to a buffer a JSON open object attribute. */ +static void +popen_obj_attr (GJSON * json, const char *attr, int sp) +{ + /* open object attribute */ + pjson (json, "%.*s\"%s\": {%.*s", sp, TAB, attr, nlines, NL); +} + +/* Output a JSON open object attribute. */ +void +fpopen_obj_attr (FILE * fp, const char *attr, int sp) +{ + /* open object attribute */ + fpjson (fp, "%.*s\"%s\": {%.*s", sp, TAB, attr, nlines, NL); +} + +/* Close JSON object. */ +static void +pclose_obj (GJSON * json, int iisp, int last) +{ + if (!last) + pjson (json, "%.*s%.*s},%.*s", nlines, NL, iisp, TAB, nlines, NL); + else + pjson (json, "%.*s%.*s}", nlines, NL, iisp, TAB); +} + +/* Close JSON object. */ +void +fpclose_obj (FILE * fp, int iisp, int last) +{ + if (!last) + fpjson (fp, "%.*s%.*s},%.*s", nlines, NL, iisp, TAB, nlines, NL); + else + fpjson (fp, "%.*s%.*s}", nlines, NL, iisp, TAB); +} + +/* Write to a buffer a JSON open array attribute. */ +static void +popen_arr_attr (GJSON * json, const char *attr, int sp) +{ + /* open object attribute */ + pjson (json, "%.*s\"%s\": [%.*s", sp, TAB, attr, nlines, NL); +} + +/* Output a JSON open array attribute. */ +void +fpopen_arr_attr (FILE * fp, const char *attr, int sp) +{ + /* open object attribute */ + fpjson (fp, "%.*s\"%s\": [%.*s", sp, TAB, attr, nlines, NL); +} + +/* Close the data array. */ +static void +pclose_arr (GJSON * json, int sp, int last) +{ + if (!last) + pjson (json, "%.*s%.*s],%.*s", nlines, NL, sp, TAB, nlines, NL); + else + pjson (json, "%.*s%.*s]", nlines, NL, sp, TAB); +} + +/* Close the data array. */ +void +fpclose_arr (FILE * fp, int sp, int last) +{ + if (!last) + fpjson (fp, "%.*s%.*s],%.*s", nlines, NL, sp, TAB, nlines, NL); + else + fpjson (fp, "%.*s%.*s]", nlines, NL, sp, TAB); +} + +/* Write to a buffer the date and time for the overall object. */ +static void +poverall_datetime (GJSON * json, int sp) +{ + char now[DATE_TIME]; + + generate_time (); + strftime (now, DATE_TIME, "%Y-%m-%d %H:%M:%S %z", now_tm); + + pskeysval (json, OVERALL_DATETIME, now, sp, 0); +} + +/* Write to a buffer the date and time for the overall object. */ +static void +poverall_start_end_date (GJSON * json, GHolder * h, int sp) +{ + char *start = NULL, *end = NULL; + + if (h->idx == 0 || get_start_end_parsing_dates (h, &start, &end, "%d/%b/%Y")) + return; + + pskeysval (json, OVERALL_STARTDATE, start, sp, 0); + pskeysval (json, OVERALL_ENDDATE, end, sp, 0); + + free (end); + free (start); +} + +/* Write to a buffer date and time for the overall object. */ +static void +poverall_requests (GJSON * json, GLog * glog, int sp) +{ + pskeyival (json, OVERALL_REQ, glog->processed, sp, 0); +} + +/* Write to a buffer the number of valid requests under the overall + * object. */ +static void +poverall_valid_reqs (GJSON * json, GLog * glog, int sp) +{ + pskeyival (json, OVERALL_VALID, glog->valid, sp, 0); +} + +/* Write to a buffer the number of invalid requests under the overall + * object. */ +static void +poverall_invalid_reqs (GJSON * json, GLog * glog, int sp) +{ + pskeyival (json, OVERALL_FAILED, glog->invalid, sp, 0); +} + +/* Write to a buffer the total processed time under the overall + * object. */ +static void +poverall_processed_time (GJSON * json, int sp) +{ + uint64_t elapsed_proc = end_proc - start_proc; + +#ifdef TCB_BTREE + if (conf.store_accumulated_time) + elapsed_proc = (uint64_t) ht_get_genstats ("accumulated_time"); +#endif + + pskeyu64val (json, OVERALL_GENTIME, elapsed_proc, sp, 0); +} + +/* Write to a buffer the total number of unique visitors under the + * overall object. */ +static void +poverall_visitors (GJSON * json, int sp) +{ + pskeyival (json, OVERALL_VISITORS, ht_get_size_uniqmap (VISITORS), sp, 0); +} + +/* Write to a buffer the total number of unique files under the + * overall object. */ +static void +poverall_files (GJSON * json, int sp) +{ + pskeyival (json, OVERALL_FILES, ht_get_size_datamap (REQUESTS), sp, 0); +} + +/* Write to a buffer the total number of excluded requests under the + * overall object. */ +static void +poverall_excluded (GJSON * json, GLog * glog, int sp) +{ + pskeyival (json, OVERALL_EXCL_HITS, glog->excluded_ip, sp, 0); +} + +/* Write to a buffer the number of referrers under the overall object. */ +static void +poverall_refs (GJSON * json, int sp) +{ + pskeyival (json, OVERALL_REF, ht_get_size_datamap (REFERRERS), sp, 0); +} + +/* Write to a buffer the number of not found (404s) under the overall + * object. */ +static void +poverall_notfound (GJSON * json, int sp) +{ + pskeyival (json, OVERALL_NOTFOUND, ht_get_size_datamap (NOT_FOUND), sp, 0); +} + +/* Write to a buffer the number of static files (jpg, pdf, etc) under + * the overall object. */ +static void +poverall_static_files (GJSON * json, int sp) +{ + pskeyival (json, OVERALL_STATIC, ht_get_size_datamap (REQUESTS_STATIC), sp, + 0); +} + +/* Write to a buffer the size of the log being parsed under the + * overall object. */ +static void +poverall_log_size (GJSON * json, int sp) +{ + pjson (json, "%.*s\"%s\": %jd,%.*s", sp, TAB, OVERALL_LOGSIZE, + (intmax_t) get_log_sizes (), nlines, NL); +} + +/* Write to a buffer the total bandwidth consumed under the overall + * object. */ +static void +poverall_bandwidth (GJSON * json, GLog * glog, int sp) +{ + pskeyu64val (json, OVERALL_BANDWIDTH, glog->resp_size, sp, 0); +} + +static void +poverall_log_path (GJSON * json, int idx, int isp) +{ + pjson (json, "%.*s\"", isp, TAB); + if (conf.filenames[idx][0] == '-' && conf.filenames[idx][1] == '\0') + pjson (json, "STDIN"); + else + escape_json_output (json, (char *) conf.filenames[idx]); + pjson (json, conf.filenames_idx - 1 != idx ? "\",\n" : "\""); +} + +/* Write to a buffer the path of the log being parsed under the + * overall object. */ +static void +poverall_log (GJSON * json, int sp) +{ + int idx, isp = 0; + + /* use tabs to prettify output */ + if (conf.json_pretty_print) + isp = sp + 1; + + popen_arr_attr (json, OVERALL_LOG, sp); + for (idx = 0; idx < conf.filenames_idx; ++idx) + poverall_log_path (json, idx, isp); + pclose_arr (json, sp, 1); +} + +/* Write to a buffer hits data. */ +static void +phits (GJSON * json, GMetrics * nmetrics, int sp) +{ + int isp = 0; + + /* use tabs to prettify output */ + if (conf.json_pretty_print) + isp = sp + 1; + + popen_obj_attr (json, "hits", sp); + /* print hits */ + pskeyival (json, "count", nmetrics->hits, isp, 0); + /* print hits percent */ + pskeyfval (json, "percent", nmetrics->hits_perc, isp, 1); + pclose_obj (json, sp, 0); +} + +/* Write to a buffer visitors data. */ +static void +pvisitors (GJSON * json, GMetrics * nmetrics, int sp) +{ + int isp = 0; + + /* use tabs to prettify output */ + if (conf.json_pretty_print) + isp = sp + 1; + + popen_obj_attr (json, "visitors", sp); + /* print visitors */ + pskeyival (json, "count", nmetrics->visitors, isp, 0); + /* print visitors percent */ + pskeyfval (json, "percent", nmetrics->visitors_perc, isp, 1); + pclose_obj (json, sp, 0); +} + +/* Write to a buffer bandwidth data. */ +static void +pbw (GJSON * json, GMetrics * nmetrics, int sp) +{ + int isp = 0; + + /* use tabs to prettify output */ + if (conf.json_pretty_print) + isp = sp + 1; + + if (!conf.bandwidth) + return; + + popen_obj_attr (json, "bytes", sp); + /* print bandwidth */ + pskeyu64val (json, "count", nmetrics->bw.nbw, isp, 0); + /* print bandwidth percent */ + pskeyfval (json, "percent", nmetrics->bw_perc, isp, 1); + pclose_obj (json, sp, 0); +} + +/* Write to a buffer average time served data. */ +static void +pavgts (GJSON * json, GMetrics * nmetrics, int sp) +{ + if (!conf.serve_usecs) + return; + pskeyu64val (json, "avgts", nmetrics->avgts.nts, sp, 0); +} + +/* Write to a buffer cumulative time served data. */ +static void +pcumts (GJSON * json, GMetrics * nmetrics, int sp) +{ + if (!conf.serve_usecs) + return; + pskeyu64val (json, "cumts", nmetrics->cumts.nts, sp, 0); +} + +/* Write to a buffer maximum time served data. */ +static void +pmaxts (GJSON * json, GMetrics * nmetrics, int sp) +{ + if (!conf.serve_usecs) + return; + pskeyu64val (json, "maxts", nmetrics->maxts.nts, sp, 0); +} + +/* Write to a buffer request method data. */ +static void +pmethod (GJSON * json, GMetrics * nmetrics, int sp) +{ + /* request method */ + if (conf.append_method && nmetrics->method) { + pskeysval (json, "method", nmetrics->method, sp, 0); + } +} + +/* Write to a buffer protocol method data. */ +static void +pprotocol (GJSON * json, GMetrics * nmetrics, int sp) +{ + /* request protocol */ + if (conf.append_protocol && nmetrics->protocol) { + pskeysval (json, "protocol", nmetrics->protocol, sp, 0); + } +} + +/* Write to a buffer the hits meta data object. */ +static void +pmeta_data_unique (GJSON * json, int ht_size, int sp) +{ + int isp = 0; + + /* use tabs to prettify output */ + if (conf.json_pretty_print) + isp = sp + 1; + + popen_obj_attr (json, "data", sp); + pskeyu64val (json, "unique", ht_size, isp, 1); + pclose_obj (json, sp, 1); +} + +/* Write to a buffer the hits meta data object. */ +static void +pmeta_data_hits (GJSON * json, GModule module, int sp) +{ + int isp = 0; + int max = 0, min = 0; + + ht_get_hits_min_max (module, &min, &max); + + /* use tabs to prettify output */ + if (conf.json_pretty_print) + isp = sp + 1; + + popen_obj_attr (json, "hits", sp); + pskeyu64val (json, "count", ht_get_meta_data (module, "hits"), isp, 0); + pskeyival (json, "max", max, isp, 0); + pskeyival (json, "min", min, isp, 1); + pclose_obj (json, sp, 0); +} + +/* Write to a buffer the visitors meta data object. */ +static void +pmeta_data_visitors (GJSON * json, GModule module, int sp) +{ + int isp = 0; + int max = 0, min = 0; + + ht_get_visitors_min_max (module, &min, &max); + + /* use tabs to prettify output */ + if (conf.json_pretty_print) + isp = sp + 1; + + popen_obj_attr (json, "visitors", sp); + pskeyu64val (json, "count", ht_get_meta_data (module, "visitors"), isp, 0); + pskeyival (json, "max", max, isp, 0); + pskeyival (json, "min", min, isp, 1); + pclose_obj (json, sp, 0); +} + +/* Write to a buffer the bytes meta data object. */ +static void +pmeta_data_bw (GJSON * json, GModule module, int sp) +{ + int isp = 0; + uint64_t max = 0, min = 0; + + if (!conf.bandwidth) + return; + + ht_get_bw_min_max (module, &min, &max); + + /* use tabs to prettify output */ + if (conf.json_pretty_print) + isp = sp + 1; + + popen_obj_attr (json, "bytes", sp); + pskeyu64val (json, "count", ht_get_meta_data (module, "bytes"), isp, 0); + pskeyu64val (json, "max", max, isp, 0); + pskeyu64val (json, "min", min, isp, 1); + pclose_obj (json, sp, 0); +} + +/* Write to a buffer the average of the average time served meta data + * object. */ +static void +pmeta_data_avgts (GJSON * json, GModule module, int sp) +{ + int isp = 0; + uint64_t avg = 0, hits = 0, cumts = 0; + + if (!conf.serve_usecs) + return; + + /* use tabs to prettify output */ + if (conf.json_pretty_print) + isp = sp + 1; + + cumts = ht_get_meta_data (module, "cumts"); + hits = ht_get_meta_data (module, "hits"); + if (hits > 0) + avg = cumts / hits; + + popen_obj_attr (json, "avgts", sp); + pskeyu64val (json, "avg", avg, isp, 1); + pclose_obj (json, sp, 0); +} + +/* Write to a buffer the cumulative time served meta data object. */ +static void +pmeta_data_cumts (GJSON * json, GModule module, int sp) +{ + int isp = 0; + uint64_t max = 0, min = 0; + + if (!conf.serve_usecs) + return; + + ht_get_cumts_min_max (module, &min, &max); + + /* use tabs to prettify output */ + if (conf.json_pretty_print) + isp = sp + 1; + + popen_obj_attr (json, "cumts", sp); + pskeyu64val (json, "count", ht_get_meta_data (module, "cumts"), isp, 0); + pskeyu64val (json, "max", max, isp, 0); + pskeyu64val (json, "min", min, isp, 1); + pclose_obj (json, sp, 0); +} + +/* Write to a buffer the maximum time served meta data object. */ +static void +pmeta_data_maxts (GJSON * json, GModule module, int sp) +{ + int isp = 0; + uint64_t max = 0, min = 0; + + if (!conf.serve_usecs) + return; + + ht_get_maxts_min_max (module, &min, &max); + + /* use tabs to prettify output */ + if (conf.json_pretty_print) + isp = sp + 1; + + popen_obj_attr (json, "maxts", sp); + pskeyu64val (json, "count", ht_get_meta_data (module, "maxts"), isp, 0); + pskeyu64val (json, "max", max, isp, 0); + pskeyu64val (json, "min", min, isp, 1); + pclose_obj (json, sp, 0); +} + +/* Entry point to output panel's metadata. */ +static void +print_meta_data (GJSON * json, GHolder * h, int sp) +{ + int isp = 0, iisp = 0; + /* use tabs to prettify output */ + if (conf.json_pretty_print) + isp = sp + 1, iisp = sp + 2; + + popen_obj_attr (json, "metadata", isp); + + pmeta_data_avgts (json, h->module, iisp); + pmeta_data_cumts (json, h->module, iisp); + pmeta_data_maxts (json, h->module, iisp); + pmeta_data_bw (json, h->module, iisp); + pmeta_data_visitors (json, h->module, iisp); + pmeta_data_hits (json, h->module, iisp); + pmeta_data_unique (json, h->ht_size, iisp); + + pclose_obj (json, isp, 0); +} + +/* A wrapper function to ouput data metrics per panel. */ +static void +print_json_block (GJSON * json, GMetrics * nmetrics, int sp) +{ + /* print hits */ + phits (json, nmetrics, sp); + /* print visitors */ + pvisitors (json, nmetrics, sp); + /* print bandwidth */ + pbw (json, nmetrics, sp); + + /* print time served metrics */ + pavgts (json, nmetrics, sp); + pcumts (json, nmetrics, sp); + pmaxts (json, nmetrics, sp); + + /* print protocol/method */ + pmethod (json, nmetrics, sp); + pprotocol (json, nmetrics, sp); + + /* data metric */ + pjson (json, "%.*s\"data\": \"", sp, TAB); + escape_json_output (json, nmetrics->data); + pjson (json, "\""); +} + +/* Add the given user agent value into our array of GAgents. + * + * On error, 1 is returned. + * On success, the user agent is added to the array and 0 is returned. */ +static int +fill_host_agents (void *val, void *user_data) +{ + GAgents *agents = user_data; + char *agent = ht_get_host_agent_val ((*(int *) val)); + + if (agent == NULL) + return 1; + + agents->items[agents->size].agent = agent; + agents->size++; + + return 0; +} + +/* Iterate over the list of agents */ +static void +load_host_agents (void *list, void *user_data, GO_UNUSED int count) +{ + GSLList *lst = list; + GAgents *agents = user_data; + + agents->items = new_gagent_item (count); + list_foreach (lst, fill_host_agents, agents); +} + +/* A wrapper function to ouput an array of user agents for each host. */ +static void +process_host_agents (GJSON * json, GHolderItem * item, int iisp) +{ + GAgents *agents = new_gagents (); + int i, n = 0, iiisp = 0; + + /* use tabs to prettify output */ + if (conf.json_pretty_print) + iiisp = iisp + 1; + + if (set_host_agents (item->metrics->data, load_host_agents, agents) == 1) + return; + + pjson (json, ",%.*s%.*s\"items\": [%.*s", nlines, NL, iisp, TAB, nlines, NL); + + n = agents->size > 10 ? 10 : agents->size; + for (i = 0; i < n; ++i) { + pjson (json, "%.*s\"", iiisp, TAB); + escape_json_output (json, agents->items[i].agent); + if (i == n - 1) + pjson (json, "\""); + else + pjson (json, "\",%.*s", nlines, NL); + } + + pclose_arr (json, iisp, 1); + + /* clean stuff up */ + free_agents_array (agents); +} + +/* A wrapper function to ouput children nodes. */ +static void +print_json_sub_items (GJSON * json, GHolderItem * item, GPercTotals totals, + int size, int iisp) +{ + GMetrics *nmetrics; + GSubItem *iter; + GSubList *sl = item->sub_list; + int i = 0, iiisp = 0, iiiisp = 0; + + /* no sub items, nothing to output */ + if (size == 0) + return; + + /* use tabs to prettify output */ + if (conf.json_pretty_print) + iiisp = iisp + 1, iiiisp = iiisp + 1; + + if (sl == NULL) + return; + + pjson (json, ",%.*s%.*s\"items\": [%.*s", nlines, NL, iisp, TAB, nlines, NL); + for (iter = sl->head; iter; iter = iter->next, i++) { + set_data_metrics (iter->metrics, &nmetrics, totals); + + popen_obj (json, iiisp); + print_json_block (json, nmetrics, iiiisp); + pclose_obj (json, iiisp, (i == sl->size - 1)); + free (nmetrics); + } + pclose_arr (json, iisp, 1); +} + +/* A wrapper function to ouput geolocation fields for the given host. */ +static void +print_json_host_geo (GJSON * json, GSubList * sl, int iisp) +{ + GSubItem *iter; + int i; + static const char *key[] = { + "country", + "city", + "hostname", + }; + + pjson (json, ",%.*s", nlines, NL); + + /* Iterate over child properties (country, city, etc) and print them out */ + for (i = 0, iter = sl->head; iter; iter = iter->next, i++) { + pjson (json, "%.*s\"%s\": \"", iisp, TAB, key[iter->metrics->id]); + escape_json_output (json, iter->metrics->data); + pjson (json, (i != sl->size - 1) ? "\",%.*s" : "\"", nlines, NL); + } +} + +/* Ouput Geolocation data and the IP's hostname. */ +static void +print_json_host_items (GJSON * json, GHolderItem * item, GPercTotals totals, + int size, int iisp) +{ + (void) totals; + /* print geolocation fields */ + if (size > 0 && item->sub_list != NULL) + print_json_host_geo (json, item->sub_list, iisp); + + /* print list of user agents */ + if (conf.list_agents) + process_host_agents (json, item, iisp); +} + +/* Ouput data and determine if there are children nodes. */ +static void +print_data_metrics (GJSON * json, GHolder * h, GPercTotals totals, int sp, + const struct GPanel_ *panel) +{ + GMetrics *nmetrics; + int i, isp = 0, iisp = 0, iiisp = 0; + + /* use tabs to prettify output */ + if (conf.json_pretty_print) + isp = sp + 1, iisp = sp + 2, iiisp = sp + 3; + + popen_arr_attr (json, "data", isp); + /* output data metrics */ + for (i = 0; i < h->idx; i++) { + set_data_metrics (h->items[i].metrics, &nmetrics, totals); + + /* open data metric block */ + popen_obj (json, iisp); + /* output data metric block */ + print_json_block (json, nmetrics, iiisp); + /* if there are children nodes, spit them out */ + if (panel->subitems) + panel->subitems (json, h->items + i, totals, h->sub_items_size, iiisp); + /* close data metric block */ + pclose_obj (json, iisp, (i == h->idx - 1)); + + free (nmetrics); + } + pclose_arr (json, isp, 1); +} + +/* Entry point to ouput data metrics per panel. */ +static void +print_json_data (GJSON * json, GHolder * h, GPercTotals totals, + const struct GPanel_ *panel) +{ + int sp = 0; + /* use tabs to prettify output */ + if (conf.json_pretty_print) + sp = 1; + + /* output open panel attribute */ + popen_obj_attr (json, module_to_id (h->module), sp); + /* output panel metadata */ + print_meta_data (json, h, sp); + /* output panel data */ + print_data_metrics (json, h, totals, sp, panel); + /* output close panel attribute */ + pclose_obj (json, sp, 1); +} + +/* Get the number of available panels. + * + * On success, the total number of available panels is returned . */ +static int +num_panels (void) +{ + size_t idx = 0, npanels = 0; + + FOREACH_MODULE (idx, module_list) + npanels++; + + return npanels; +} + +/* Write to a buffer overall data. */ +static void +print_json_summary (GJSON * json, GLog * glog, GHolder * holder) +{ + int sp = 0, isp = 0; + + /* use tabs to prettify output */ + if (conf.json_pretty_print) + sp = 1, isp = 2; + + popen_obj_attr (json, GENER_ID, sp); + /* generated start/end date */ + poverall_start_end_date (json, holder, isp); + /* generated date time */ + poverall_datetime (json, isp); + /* total requests */ + poverall_requests (json, glog, isp); + /* valid requests */ + poverall_valid_reqs (json, glog, isp); + /* invalid requests */ + poverall_invalid_reqs (json, glog, isp); + /* generated time */ + poverall_processed_time (json, isp); + /* visitors */ + poverall_visitors (json, isp); + /* files */ + poverall_files (json, isp); + /* excluded hits */ + poverall_excluded (json, glog, isp); + /* referrers */ + poverall_refs (json, isp); + /* not found */ + poverall_notfound (json, isp); + /* static files */ + poverall_static_files (json, isp); + /* log size */ + poverall_log_size (json, isp); + /* bandwidth */ + poverall_bandwidth (json, glog, isp); + /* log path */ + poverall_log (json, isp); + pclose_obj (json, sp, num_panels () > 0 ? 0 : 1); +} + +/* Iterate over all panels and generate json output. */ +static GJSON * +init_json_output (GLog * glog, GHolder * holder) +{ + GJSON *json = NULL; + GModule module; + GPercTotals totals; + const GPanel *panel = NULL; + size_t idx = 0, npanels = num_panels (), cnt = 0; + + json = new_gjson (); + + popen_obj (json, 0); + print_json_summary (json, glog, holder); + + FOREACH_MODULE (idx, module_list) { + module = module_list[idx]; + + if (!(panel = panel_lookup (module))) + continue; + + set_module_totals (module, &totals); + panel->render (json, holder + module, totals, panel); + pjson (json, (cnt++ != npanels - 1) ? ",%.*s" : "%.*s", nlines, NL); + } + + pclose_obj (json, 0, 1); + + return json; +} + +/* Open and write to a dynamically sized output buffer. + * + * On success, the newly allocated buffer is returned . */ +char * +get_json (GLog * glog, GHolder * holder, int escape_html) +{ + GJSON *json = NULL; + char *buf = NULL; + + if (holder == NULL) + return NULL; + + escape_html_output = escape_html; + if ((json = init_json_output (glog, holder)) && json->size > 0) { + buf = xstrdup (json->buf); + free_json (json); + } + + return buf; +} + +/* Entry point to generate a json report writing it to the fp */ +void +output_json (GLog * glog, GHolder * holder, const char *filename) +{ + GJSON *json = NULL; + FILE *fp; + + if (filename != NULL) + fp = fopen (filename, "w"); + else + fp = stdout; + + if (!fp) + FATAL ("Unable to open JSON file: %s.", strerror (errno)); + + /* use new lines to prettify output */ + if (conf.json_pretty_print) + nlines = 1; + + /* spit it out */ + if ((json = init_json_output (glog, holder)) && json->size > 0) { + fprintf (fp, "%s", json->buf); + free_json (json); + } + + fclose (fp); +} diff --git a/goaccess++/src/json.h b/goaccess++/src/json.h new file mode 100644 index 0000000..2d042f2 --- /dev/null +++ b/goaccess++/src/json.h @@ -0,0 +1,65 @@ +/** + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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. + */ + +#if HAVE_CONFIG_H +#include <config.h> +#endif + +#ifndef JSON_H_INCLUDED +#define JSON_H_INCLUDED + +#define TAB "\t\t\t\t\t\t\t\t\t\t\t" +#define NL "\n\n\n" + +#include "parser.h" + +typedef struct GJSON_ +{ + char *buf; /* pointer to buffer */ + size_t size; /* size of malloc'd buffer */ + size_t offset; /* current write offset */ +} GJSON; + +char *get_json (GLog * glog, GHolder * holder, int escape_html); + +void output_json (GLog * glog, GHolder * holder, const char *filename); +void set_json_nlines (int nl); + +void fpskeyival (FILE * fp, const char *key, int val, int sp, int last); +void fpskeysval (FILE * fp, const char *key, const char *val, int sp, int last); +void fpskeyaval (FILE * fp, const char *key, const char *val, int sp, int last); + +void fpclose_arr (FILE * fp, int sp, int last); +void fpclose_obj (FILE * fp, int iisp, int last); +void fpjson (FILE * fp, const char *fmt, ...); +void fpopen_arr_attr (FILE * fp, const char *attr, int sp); +void fpopen_obj_attr (FILE * fp, const char *attr, int sp); +void fpopen_obj (FILE * fp, int iisp); + +#endif diff --git a/goaccess++/src/json.o b/goaccess++/src/json.o new file mode 100644 index 0000000000000000000000000000000000000000..1094e7c4dad5e510e5283eff982bbe40c05f57f2 GIT binary patch literal 34256 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 literal 0 HcmV?d00001 diff --git a/goaccess++/src/khash.h b/goaccess++/src/khash.h new file mode 100644 index 0000000..0708bd5 --- /dev/null +++ b/goaccess++/src/khash.h @@ -0,0 +1,675 @@ +/* The MIT License + + Copyright (c) 2008, 2009, 2011 by Attractive Chaos <attractor@live.co.uk> + + 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. +*/ + +/* + An example: + +#include "khash.h" +KHASH_MAP_INIT_INT(32, char) +int main() { + int ret, is_missing; + khiter_t k; + khash_t(32) *h = kh_init(32); + k = kh_put(32, h, 5, &ret); + kh_value(h, k) = 10; + k = kh_get(32, h, 10); + is_missing = (k == kh_end(h)); + k = kh_get(32, h, 5); + kh_del(32, h, k); + for (k = kh_begin(h); k != kh_end(h); ++k) + if (kh_exist(h, k)) kh_value(h, k) = 1; + kh_destroy(32, h); + return 0; +} +*/ + +/* + 2013-05-02 (0.2.8): + + * Use quadratic probing. When the capacity is power of 2, stepping function + i*(i+1)/2 guarantees to traverse each bucket. It is better than double + hashing on cache performance and is more robust than linear probing. + + In theory, double hashing should be more robust than quadratic probing. + However, my implementation is probably not for large hash tables, because + the second hash function is closely tied to the first hash function, + which reduce the effectiveness of double hashing. + + Reference: http://research.cs.vt.edu/AVresearch/hashing/quadratic.php + + 2011-12-29 (0.2.7): + + * Minor code clean up; no actual effect. + + 2011-09-16 (0.2.6): + + * The capacity is a power of 2. This seems to dramatically improve the + speed for simple keys. Thank Zilong Tan for the suggestion. Reference: + + - http://code.google.com/p/ulib/ + - http://nothings.org/computer/judy/ + + * Allow to optionally use linear probing which usually has better + performance for random input. Double hashing is still the default as it + is more robust to certain non-random input. + + * Added Wang's integer hash function (not used by default). This hash + function is more robust to certain non-random input. + + 2011-02-14 (0.2.5): + + * Allow to declare global functions. + + 2009-09-26 (0.2.4): + + * Improve portability + + 2008-09-19 (0.2.3): + + * Corrected the example + * Improved interfaces + + 2008-09-11 (0.2.2): + + * Improved speed a little in kh_put() + + 2008-09-10 (0.2.1): + + * Added kh_clear() + * Fixed a compiling error + + 2008-09-02 (0.2.0): + + * Changed to token concatenation which increases flexibility. + + 2008-08-31 (0.1.2): + + * Fixed a bug in kh_get(), which has not been tested previously. + + 2008-08-31 (0.1.1): + + * Added destructor +*/ + + +#ifndef __AC_KHASH_H +#define __AC_KHASH_H + +/*! + @header + + Generic hash table library. + */ + +#define AC_VERSION_KHASH_H "0.2.8" + +#include <stdlib.h> +#include <string.h> +#include <limits.h> + +/* compiler specific configuration */ + +#if UINT_MAX == 0xffffffffu +typedef unsigned int khint32_t; +#elif ULONG_MAX == 0xffffffffu +typedef unsigned long khint32_t; +#endif + +#if ULONG_MAX == ULLONG_MAX +typedef unsigned long khint64_t; +#else +typedef unsigned long long khint64_t; +#endif + +#ifndef kh_inline +#ifdef _MSC_VER +#define kh_inline __inline +#else +#define kh_inline inline +#endif +#endif /* kh_inline */ + +#ifndef klib_unused +#if (defined __clang__ && __clang_major__ >= 3) || (defined __GNUC__ && __GNUC__ >= 3) +#define klib_unused __attribute__ ((__unused__)) +#else +#define klib_unused +#endif +#endif /* klib_unused */ + +typedef khint32_t khint_t; +typedef khint_t khiter_t; + +#define __ac_isempty(flag, i) ((flag[i>>4]>>((i&0xfU)<<1))&2) +#define __ac_isdel(flag, i) ((flag[i>>4]>>((i&0xfU)<<1))&1) +#define __ac_iseither(flag, i) ((flag[i>>4]>>((i&0xfU)<<1))&3) +#define __ac_set_isdel_false(flag, i) (flag[i>>4]&=~(1ul<<((i&0xfU)<<1))) +#define __ac_set_isempty_false(flag, i) (flag[i>>4]&=~(2ul<<((i&0xfU)<<1))) +#define __ac_set_isboth_false(flag, i) (flag[i>>4]&=~(3ul<<((i&0xfU)<<1))) +#define __ac_set_isdel_true(flag, i) (flag[i>>4]|=1ul<<((i&0xfU)<<1)) + +#define __ac_fsize(m) ((m) < 16? 1 : (m)>>4) + +#ifndef kroundup32 +#define kroundup32(x) (--(x), (x)|=(x)>>1, (x)|=(x)>>2, (x)|=(x)>>4, (x)|=(x)>>8, (x)|=(x)>>16, ++(x)) +#endif + +#ifndef kcalloc +#define kcalloc(N,Z) calloc(N,Z) +#endif +#ifndef kmalloc +#define kmalloc(Z) malloc(Z) +#endif +#ifndef krealloc +#define krealloc(P,Z) realloc(P,Z) +#endif +#ifndef kfree +#define kfree(P) free(P) +#endif + +static const double __ac_HASH_UPPER = 0.77; + +#define __KHASH_TYPE(name, khkey_t, khval_t) \ + typedef struct kh_##name##_s { \ + khint_t n_buckets, size, n_occupied, upper_bound; \ + khint32_t *flags; \ + khkey_t *keys; \ + khval_t *vals; \ + } kh_##name##_t; + +#define __KHASH_PROTOTYPES(name, khkey_t, khval_t) \ + extern kh_##name##_t *kh_init_##name(void); \ + extern void kh_destroy_##name(kh_##name##_t *h); \ + extern void kh_clear_##name(kh_##name##_t *h); \ + extern khint_t kh_get_##name(const kh_##name##_t *h, khkey_t key); \ + extern int kh_resize_##name(kh_##name##_t *h, khint_t new_n_buckets); \ + extern khint_t kh_put_##name(kh_##name##_t *h, khkey_t key, int *ret); \ + extern void kh_del_##name(kh_##name##_t *h, khint_t x); \ + +#define __KHASH_IMPL(name, SCOPE, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) \ + SCOPE kh_##name##_t *kh_init_##name(void) { \ + return (kh_##name##_t*) kcalloc(1, sizeof(kh_##name##_t)); \ + } \ + SCOPE void kh_destroy_##name(kh_##name##_t *h) \ + { \ + if (h) { \ + kfree ((void *) h->keys); \ + kfree (h->flags); \ + kfree ((void *) h->vals); \ + kfree (h); \ + } \ + } \ + SCOPE void kh_clear_##name(kh_##name##_t *h) \ + { \ + if (h && h->flags) { \ + memset (h->flags, 0xaa, __ac_fsize (h->n_buckets) * sizeof (khint32_t)); \ + h->size = h->n_occupied = 0; \ + } \ + } \ + SCOPE khint_t kh_get_##name(const kh_##name##_t *h, khkey_t key) \ + { \ + if (h->n_buckets) { \ + khint_t k, i, last, mask, step = 0; \ + mask = h->n_buckets - 1; \ + k = __hash_func (key); \ + i = k & mask; \ + last = i; \ + while (!__ac_isempty (h->flags, i) && \ + (__ac_isdel (h->flags, i) || !__hash_equal (h->keys[i], key))) { \ + i = (i + (++step)) & mask; \ + if (i == last) \ + return h->n_buckets; \ + } \ + return __ac_iseither (h->flags, i) ? h->n_buckets : i; \ + } else \ + return 0; \ + } \ + SCOPE int kh_resize_##name(kh_##name##_t *h, khint_t new_n_buckets) \ + { \ + /* This function uses 0.25*n_buckets bytes of working space instead of */ \ + /* [sizeof(key_t+val_t)+.25]*n_buckets. */ \ + khint32_t *new_flags = 0; \ + khint_t j = 1; \ + { \ + kroundup32 (new_n_buckets); \ + if (new_n_buckets < 4) \ + new_n_buckets = 4; \ + if (h->size >= (khint_t) (new_n_buckets * __ac_HASH_UPPER + 0.5)) \ + j = 0; /* requested size is too small */ \ + else { /* hash table size to be changed (shrink or expand); rehash */ \ + new_flags = (khint32_t *) kmalloc (__ac_fsize (new_n_buckets) * sizeof (khint32_t)); \ + if (!new_flags) \ + return -1; \ + memset (new_flags, 0xaa, __ac_fsize (new_n_buckets) * sizeof (khint32_t)); \ + if (h->n_buckets < new_n_buckets) { /* expand */ \ + khkey_t *new_keys = (khkey_t *) krealloc ((void *) h->keys, new_n_buckets * sizeof (khkey_t)); \ + if (!new_keys) { \ + kfree (new_flags); \ + return -1; \ + } \ + h->keys = new_keys; \ + if (kh_is_map) { \ + khval_t *new_vals = (khval_t *) krealloc ((void *) h->vals, new_n_buckets * sizeof (khval_t)); \ + if (!new_vals) { \ + kfree (new_flags); \ + return -1; \ + } \ + h->vals = new_vals; \ + } \ + } /* otherwise shrink */ \ + } \ + } \ + if (j) { /* rehashing is needed */ \ + for (j = 0; j != h->n_buckets; ++j) { \ + if (__ac_iseither (h->flags, j) == 0) { \ + khkey_t key = h->keys[j]; \ + khval_t val; \ + khint_t new_mask; \ + new_mask = new_n_buckets - 1; \ + if (kh_is_map) \ + val = h->vals[j]; \ + __ac_set_isdel_true (h->flags, j); \ + while (1) { /* kick-out process; sort of like in Cuckoo hashing */ \ + khint_t k, i, step = 0; \ + k = __hash_func (key); \ + i = k & new_mask; \ + while (!__ac_isempty (new_flags, i)) \ + i = (i + (++step)) & new_mask; \ + __ac_set_isempty_false (new_flags, i); \ + if (i < h->n_buckets && __ac_iseither (h->flags, i) == 0) { /* kick out the existing element */ \ + { \ + khkey_t tmp = h->keys[i]; \ + h->keys[i] = key; \ + key = tmp; \ + } \ + if (kh_is_map) { \ + khval_t tmp = h->vals[i]; \ + h->vals[i] = val; \ + val = tmp; \ + } \ + __ac_set_isdel_true (h->flags, i); /* mark it as deleted in the old hash table */ \ + } else { /* write the element and jump out of the loop */ \ + h->keys[i] = key; \ + if (kh_is_map) \ + h->vals[i] = val; \ + break; \ + } \ + } \ + } \ + } \ + if (h->n_buckets > new_n_buckets) { /* shrink the hash table */ \ + h->keys = (khkey_t *) krealloc ((void *) h->keys, new_n_buckets * sizeof (khkey_t)); \ + if (kh_is_map) \ + h->vals = (khval_t *) krealloc ((void *) h->vals, new_n_buckets * sizeof (khval_t)); \ + } \ + kfree (h->flags); /* free the working space */ \ + h->flags = new_flags; \ + h->n_buckets = new_n_buckets; \ + h->n_occupied = h->size; \ + h->upper_bound = (khint_t) (h->n_buckets * __ac_HASH_UPPER + 0.5); \ + } \ + return 0; \ + } \ + SCOPE khint_t kh_put_##name(kh_##name##_t *h, khkey_t key, int *ret) \ + { \ + khint_t x; \ + if (h->n_occupied >= h->upper_bound) { /* update the hash table */ \ + if (h->n_buckets > (h->size << 1)) { \ + if (kh_resize_##name (h, h->n_buckets - 1) < 0) { /* clear "deleted" elements */ \ + *ret = -1; \ + return h->n_buckets; \ + } \ + } else if (kh_resize_##name (h, h->n_buckets + 1) < 0) { /* expand the hash table */ \ + *ret = -1; \ + return h->n_buckets; \ + } \ + } /* TODO: to implement automatically shrinking; resize() already support shrinking */ \ + { \ + khint_t k, i, site, last, mask = h->n_buckets - 1, step = 0; \ + x = site = h->n_buckets; \ + k = __hash_func (key); \ + i = k & mask; \ + if (__ac_isempty (h->flags, i)) \ + x = i; /* for speed up */ \ + else { \ + last = i; \ + while (!__ac_isempty (h->flags, i) && (__ac_isdel (h->flags, i) || !__hash_equal (h->keys[i], key))) { \ + if (__ac_isdel (h->flags, i)) \ + site = i; \ + i = (i + (++step)) & mask; \ + if (i == last) { \ + x = site; \ + break; \ + } \ + } \ + if (x == h->n_buckets) { \ + if (__ac_isempty (h->flags, i) && site != h->n_buckets) \ + x = site; \ + else \ + x = i; \ + } \ + } \ + } \ + if (__ac_isempty (h->flags, x)) { /* not present at all */ \ + h->keys[x] = key; \ + __ac_set_isboth_false (h->flags, x); \ + ++h->size; \ + ++h->n_occupied; \ + *ret = 1; \ + } else if (__ac_isdel (h->flags, x)) { /* deleted */ \ + h->keys[x] = key; \ + __ac_set_isboth_false (h->flags, x); \ + ++h->size; \ + *ret = 2; \ + } else \ + *ret = 0; /* Don't touch h->keys[x] if present and not deleted */ \ + return x; \ + } \ + SCOPE void kh_del_##name(kh_##name##_t *h, khint_t x) \ + { \ + if (x != h->n_buckets && !__ac_iseither (h->flags, x)) { \ + __ac_set_isdel_true (h->flags, x); \ + --h->size; \ + } \ + } \ + +#define KHASH_DECLARE(name, khkey_t, khval_t) \ + __KHASH_TYPE(name, khkey_t, khval_t) \ + __KHASH_PROTOTYPES(name, khkey_t, khval_t) + +#define KHASH_INIT2(name, SCOPE, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) \ + __KHASH_TYPE(name, khkey_t, khval_t) \ + __KHASH_IMPL(name, SCOPE, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) + +#define KHASH_INIT(name, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) \ + KHASH_INIT2(name, static kh_inline klib_unused, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) \ + +/* --- BEGIN OF HASH FUNCTIONS --- */ + +/*! @function + @abstract Integer hash function + @param key The integer [khint32_t] + @return The hash value [khint_t] + */ +#define kh_int_hash_func(key) (khint32_t)(key) +/*! @function + @abstract Integer comparison function + */ +#define kh_int_hash_equal(a, b) ((a) == (b)) +/*! @function + @abstract 64-bit integer hash function + @param key The integer [khint64_t] + @return The hash value [khint_t] + */ +#define kh_int64_hash_func(key) (khint32_t)((key)>>33^(key)^(key)<<11) +/*! @function + @abstract 64-bit integer comparison function + */ +#define kh_int64_hash_equal(a, b) ((a) == (b)) +/*! @function + @abstract const char* hash function + @param s Pointer to a null terminated string + @return The hash value + */ +static kh_inline khint_t +__ac_X31_hash_string (const char *s) +{ + khint_t h = (khint_t) * s; + if (h) + for (++s; *s; ++s) + h = (h << 5) - h + (khint_t) * s; + return h; +} + +/*! @function + @abstract Another interface to const char* hash function + @param key Pointer to a null terminated string [const char*] + @return The hash value [khint_t] + */ +#define kh_str_hash_func(key) __ac_X31_hash_string(key) +/*! @function + @abstract Const char* comparison function + */ +#define kh_str_hash_equal(a, b) (strcmp(a, b) == 0) + +static kh_inline khint_t +__ac_Wang_hash (khint_t key) +{ + key += ~(key << 15); + key ^= (key >> 10); + key += (key << 3); + key ^= (key >> 6); + key += ~(key << 11); + key ^= (key >> 16); + return key; +} + +#define kh_int_hash_func2(k) __ac_Wang_hash((khint_t)key) + +/* --- END OF HASH FUNCTIONS --- */ + +/* Other convenient macros... */ + +/*! + @abstract Type of the hash table. + @param name Name of the hash table [symbol] + */ +#define khash_t(name) kh_##name##_t + +/*! @function + @abstract Initiate a hash table. + @param name Name of the hash table [symbol] + @return Pointer to the hash table [khash_t(name)*] + */ +#define kh_init(name) kh_init_##name() + +/*! @function + @abstract Destroy a hash table. + @param name Name of the hash table [symbol] + @param h Pointer to the hash table [khash_t(name)*] + */ +#define kh_destroy(name, h) kh_destroy_##name(h) + +/*! @function + @abstract Reset a hash table without deallocating memory. + @param name Name of the hash table [symbol] + @param h Pointer to the hash table [khash_t(name)*] + */ +#define kh_clear(name, h) kh_clear_##name(h) + +/*! @function + @abstract Resize a hash table. + @param name Name of the hash table [symbol] + @param h Pointer to the hash table [khash_t(name)*] + @param s New size [khint_t] + */ +#define kh_resize(name, h, s) kh_resize_##name(h, s) + +/*! @function + @abstract Insert a key to the hash table. + @param name Name of the hash table [symbol] + @param h Pointer to the hash table [khash_t(name)*] + @param k Key [type of keys] + @param r Extra return code: -1 if the operation failed; + 0 if the key is present in the hash table; + 1 if the bucket is empty (never used); 2 if the element in + the bucket has been deleted [int*] + @return Iterator to the inserted element [khint_t] + */ +#define kh_put(name, h, k, r) kh_put_##name(h, k, r) + +/*! @function + @abstract Retrieve a key from the hash table. + @param name Name of the hash table [symbol] + @param h Pointer to the hash table [khash_t(name)*] + @param k Key [type of keys] + @return Iterator to the found element, or kh_end(h) if the element is absent [khint_t] + */ +#define kh_get(name, h, k) kh_get_##name(h, k) + +/*! @function + @abstract Remove a key from the hash table. + @param name Name of the hash table [symbol] + @param h Pointer to the hash table [khash_t(name)*] + @param k Iterator to the element to be deleted [khint_t] + */ +#define kh_del(name, h, k) kh_del_##name(h, k) + +/*! @function + @abstract Test whether a bucket contains data. + @param h Pointer to the hash table [khash_t(name)*] + @param x Iterator to the bucket [khint_t] + @return 1 if containing data; 0 otherwise [int] + */ +#define kh_exist(h, x) (!__ac_iseither((h)->flags, (x))) + +/*! @function + @abstract Get key given an iterator + @param h Pointer to the hash table [khash_t(name)*] + @param x Iterator to the bucket [khint_t] + @return Key [type of keys] + */ +#define kh_key(h, x) ((h)->keys[x]) + +/*! @function + @abstract Get value given an iterator + @param h Pointer to the hash table [khash_t(name)*] + @param x Iterator to the bucket [khint_t] + @return Value [type of values] + @discussion For hash sets, calling this results in segfault. + */ +#define kh_val(h, x) ((h)->vals[x]) + +/*! @function + @abstract Alias of kh_val() + */ +#define kh_value(h, x) ((h)->vals[x]) + +/*! @function + @abstract Get the start iterator + @param h Pointer to the hash table [khash_t(name)*] + @return The start iterator [khint_t] + */ +#define kh_begin(h) (khint_t)(0) + +/*! @function + @abstract Get the end iterator + @param h Pointer to the hash table [khash_t(name)*] + @return The end iterator [khint_t] + */ +#define kh_end(h) ((h)->n_buckets) + +/*! @function + @abstract Get the number of elements in the hash table + @param h Pointer to the hash table [khash_t(name)*] + @return Number of elements in the hash table [khint_t] + */ +#define kh_size(h) ((h)->size) + +/*! @function + @abstract Get the number of buckets in the hash table + @param h Pointer to the hash table [khash_t(name)*] + @return Number of buckets in the hash table [khint_t] + */ +#define kh_n_buckets(h) ((h)->n_buckets) + +/*! @function + @abstract Iterate over the entries in the hash table + @param h Pointer to the hash table [khash_t(name)*] + @param kvar Variable to which key will be assigned + @param vvar Variable to which value will be assigned + @param code Block of code to execute + */ +#define kh_foreach(h, kvar, vvar, code) { khint_t __i; \ + for (__i = kh_begin(h); __i != kh_end(h); ++__i) { \ + if (!kh_exist(h,__i)) continue; \ + (kvar) = kh_key(h,__i); \ + (vvar) = kh_val(h,__i); \ + code; \ + } } + +/*! @function + @abstract Iterate over the values in the hash table + @param h Pointer to the hash table [khash_t(name)*] + @param vvar Variable to which value will be assigned + @param code Block of code to execute + */ +#define kh_foreach_value(h, vvar, code) { khint_t __i; \ + for (__i = kh_begin (h); __i != kh_end (h); ++__i) { \ + if (!kh_exist (h, __i)) \ + continue; \ + (vvar) = kh_val (h, __i); \ + code; \ + } } + +/* More conenient interfaces */ + +/*! @function + @abstract Instantiate a hash set containing integer keys + @param name Name of the hash table [symbol] + */ +#define KHASH_SET_INIT_INT(name) \ + KHASH_INIT(name, khint32_t, char, 0, kh_int_hash_func, kh_int_hash_equal) + +/*! @function + @abstract Instantiate a hash map containing integer keys + @param name Name of the hash table [symbol] + @param khval_t Type of values [type] + */ +#define KHASH_MAP_INIT_INT(name, khval_t) \ + KHASH_INIT(name, khint32_t, khval_t, 1, kh_int_hash_func, kh_int_hash_equal) + +/*! @function + @abstract Instantiate a hash map containing 64-bit integer keys + @param name Name of the hash table [symbol] + */ +#define KHASH_SET_INIT_INT64(name) \ + KHASH_INIT(name, khint64_t, char, 0, kh_int64_hash_func, kh_int64_hash_equal) + +/*! @function + @abstract Instantiate a hash map containing 64-bit integer keys + @param name Name of the hash table [symbol] + @param khval_t Type of values [type] + */ +#define KHASH_MAP_INIT_INT64(name, khval_t) \ + KHASH_INIT(name, khint64_t, khval_t, 1, kh_int64_hash_func, kh_int64_hash_equal) + +typedef const char *kh_cstr_t; +/*! @function + @abstract Instantiate a hash map containing const char* keys + @param name Name of the hash table [symbol] + */ +#define KHASH_SET_INIT_STR(name) \ + KHASH_INIT(name, kh_cstr_t, char, 0, kh_str_hash_func, kh_str_hash_equal) + +/*! @function + @abstract Instantiate a hash map containing const char* keys + @param name Name of the hash table [symbol] + @param khval_t Type of values [type] + */ +#define KHASH_MAP_INIT_STR(name, khval_t) \ + KHASH_INIT(name, kh_cstr_t, khval_t, 1, kh_str_hash_func, kh_str_hash_equal) + +#endif /* __AC_KHASH_H */ diff --git a/goaccess++/src/labels.h b/goaccess++/src/labels.h new file mode 100644 index 0000000..1022d83 --- /dev/null +++ b/goaccess++/src/labels.h @@ -0,0 +1,497 @@ +/** + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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 LABELS_H_INCLUDED +#define LABELS_H_INCLUDED + +#include <libintl.h> + +#define _(String) dgettext (PACKAGE , String) +#define gettext_noop(String) String +#define N_(String) gettext_noop (String) + +/* global lang attribute */ +#define DOC_LANG _( "en") + +/* General */ +#define GEN_EXPAND_PANEL _( "Exp. Panel") +#define GEN_HELP _( "Help") +#define GEN_QUIT _( "Quit") +#define GEN_TOTAL _( "Total") + +/* Sort Labels */ +#define SORT_ASC_SEL _( "[x] ASC [ ] DESC") +#define SORT_DESC_SEL _( "[ ] ASC [x] DESC") + +/* Overall Stats Labels */ +#define T_ACTIVE_PANEL _("[Active Panel: %1$s]") +#define T_QUIT _("[q]uit GoAccess") +#define T_HELP_ENTER _("[?] Help [Enter] Exp. Panel") +#define T_DASH _( "Dashboard") +#define T_DASH_HEAD _( "Dashboard - Overall Analyzed Requests") +#define T_HEAD N_( "Overall Analyzed Requests") + +#define T_BW _( "Tx. Amount") +#define T_DATETIME _( "Date/Time") +#define T_EXCLUDE_IP _( "Excl. IP Hits") +#define T_FAILED _( "Failed Requests") +#define T_GEN_TIME _( "Init. Proc. Time") +#define T_LOG _( "Log Size") +#define T_LOG_PATH _( "Log Source") +#define T_REFERRER _( "Referrers") +#define T_REQUESTS _( "Total Requests") +#define T_STATIC_FILES _( "Static Files") +#define T_UNIQUE404 _( "Not Found") +#define T_UNIQUE_FILES _( "Requested Files") +#define T_UNIQUE_VISITORS _( "Unique Visitors") +#define T_VALID _( "Valid Requests") + +/* Metric Labels */ +#define MTRC_HITS_LBL _( "Hits") +#define MTRC_HITS_PERC_LBL _( "h%") +#define MTRC_VISITORS_LBL _( "Visitors") +#define MTRC_VISITORS_SHORT_LBL _( "Vis.") +#define MTRC_VISITORS_PERC_LBL _( "v%") +#define MTRC_BW_LBL _( "Tx. Amount") +#define MTRC_AVGTS_LBL _( "Avg. T.S.") +#define MTRC_CUMTS_LBL _( "Cum. T.S.") +#define MTRC_MAXTS_LBL _( "Max. T.S.") +#define MTRC_METHODS_LBL _( "Method") +#define MTRC_METHODS_SHORT_LBL _( "Mtd") +#define MTRC_PROTOCOLS_LBL _( "Protocol") +#define MTRC_PROTOCOLS_SHORT_LBL _( "Proto") +#define MTRC_CITY_LBL _( "City") +#define MTRC_COUNTRY_LBL _( "Country") +#define MTRC_HOSTNAME_LBL _( "Hostname") +#define MTRC_DATA_LBL _( "Data") + +#define HTML_PLOT_HITS_VIS _( "Hits/Visitors") + +/* Panel Labels and Descriptions */ +#define VISITORS_HEAD \ + N_("Unique visitors per day") +#define VISITORS_HEAD_BOTS \ + N_("Unique visitors per day - Including spiders") +#define VISITORS_DESC \ + N_("Hits having the same IP, date and agent are a unique visit.") +#define VISITORS_LABEL \ + N_("Visitors") + +#define REQUESTS_HEAD \ + N_("Requested Files (URLs)") +#define REQUESTS_DESC \ + N_("Top requests sorted by hits [, avgts, cumts, maxts, mthd, proto]") +#define REQUESTS_LABEL \ + N_("Requests") + +#define REQUESTS_STATIC_HEAD \ + N_("Static Requests") +#define REQUESTS_STATIC_DESC \ + N_("Top static requests sorted by hits [, avgts, cumts, maxts, mthd, proto]") +#define REQUESTS_STATIC_LABEL \ + N_("Static Requests") + +#define VISIT_TIMES_HEAD \ + N_("Time Distribution") +#define VISIT_TIMES_DESC \ + N_("Data sorted by hour [, avgts, cumts, maxts]") +#define VISIT_TIMES_LABEL \ + N_("Time") + +#define VIRTUAL_HOSTS_HEAD \ + N_("Virtual Hosts") +#define VIRTUAL_HOSTS_DESC \ + N_("Data sorted by hits [, avgts, cumts, maxts]") +#define VIRTUAL_HOSTS_LABEL \ + N_("Virtual Hosts") + +#define REMOTE_USER_HEAD \ + N_("Remote User (HTTP authentication)") +#define REMOTE_USER_DESC \ + N_("Data sorted by hits [, avgts, cumts, maxts]") +#define REMOTE_USER_LABEL \ + N_("Remote User") + +#define NOT_FOUND_HEAD \ + N_("Not Found URLs (404s)") +#define NOT_FOUND_DESC \ + N_("Top not found URLs sorted by hits [, avgts, cumts, maxts, mthd, proto]") +#define NOT_FOUND_LABEL \ + N_("Not Found") + +#define HOSTS_HEAD \ + N_("Visitor Hostnames and IPs") +#define HOSTS_DESC \ + N_("Top visitor hosts sorted by hits [, avgts, cumts, maxts]") +#define HOSTS_LABEL \ + N_("Hosts") + +#define OS_HEAD \ + N_("Operating Systems") +#define OS_DESC \ + N_("Top Operating Systems sorted by hits [, avgts, cumts, maxts]") +#define OS_LABEL \ + N_("OS") + +#define BROWSERS_HEAD \ + N_("Browsers") +#define BROWSERS_DESC \ + N_("Top Browsers sorted by hits [, avgts, cumts, maxts]") +#define BROWSERS_LABEL \ + N_("Browsers") + +#define REFERRERS_HEAD \ + N_("Referrers URLs") +#define REFERRERS_DESC \ + N_("Top Requested Referrers sorted by hits [, avgts, cumts, maxts]") +#define REFERRERS_LABEL \ + N_("Referrers") + +#define REFERRING_SITES_HEAD \ + N_("Referring Sites") +#define REFERRING_SITES_DESC \ + N_("Top Referring Sites sorted by hits [, avgts, cumts, maxts]") +#define REFERRING_SITES_LABEL \ + N_("Referring Sites") + +#define KEYPHRASES_HEAD \ + N_("Keyphrases from Google's search engine") +#define KEYPHRASES_DESC \ + N_("Top Keyphrases sorted by hits [, avgts, cumts, maxts]") +#define KEYPHRASES_LABEL \ + N_("Keyphrases") + +#define GEO_LOCATION_HEAD \ + N_("Geo Location") +#define GEO_LOCATION_DESC \ + N_("Continent > Country sorted by unique hits [, avgts, cumts, maxts]") +#define GEO_LOCATION_LABEL \ + N_("Geo Location") + +#define STATUS_CODES_HEAD \ + N_("HTTP Status Codes") +#define STATUS_CODES_DESC \ + N_("Top HTTP Status Codes sorted by hits [, avgts, cumts, maxts]") +#define STATUS_CODES_LABEL \ + N_("Status Codes") + +/* Find Labels */ +#define CISENSITIVE \ + _("[ ] case sensitive") +#define CSENSITIVE \ + _("[x] case sensitive") +#define FIND_DESC \ + _("Regex allowed - ^g to cancel - TAB switch case") +#define FIND_HEAD \ + _("Find pattern in all views") + +/* Config Dialog */ +#define CONFDLG_HEAD \ + _("Log Format Configuration") +#define CONFDLG_KEY_HINTS \ + _("[SPACE] to toggle - [ENTER] to proceed - [q] to quit") +#define CONFDLG_LOG_FORMAT \ + _("Log Format - [c] to add/edit format") +#define CONFDLG_DATE_FORMAT \ + _("Date Format - [d] to add/edit format") +#define CONFDLG_TIME_FORMAT \ + _("Time Format - [t] to add/edit format") +#define CONFDLG_DESC \ + _("[UP/DOWN] to scroll - [q] to close window") + +/* Agents Dialog */ +#define AGENTSDLG_DESC \ + _("[UP/DOWN] to scroll - [q] to close window") +#define AGENTSDLG_HEAD \ + _("User Agents for %1$s") + +/* Color Scheme Dialog */ +#define SCHEMEDLG_HEAD \ + _("Scheme Configuration") +#define SCHEMEDLG_DESC \ + _("[ENTER] to use scheme - [q]uit") + +/* Sort Dialog */ +#define SORTDLG_HEAD \ + _("Sort active module by") +#define SORTDLG_DESC \ + _("[ENTER] select - [TAB] sort - [q]uit") + +/* Help TUI Dialog */ +#define HELPDLG_HEAD \ + _("GoAccess Quick Help") +#define HELPDLG_DESC \ + _("[UP/DOWN] to scroll - [q] to quit") + +/* Storage Built-in Option */ +#define BUILT_WITH_TCBTREE \ + _("Built using Tokyo Cabinet on-disk B+ Tree.") +#define BUILT_WITH_TCMEMHASH \ + _("Built using Tokyo Cabinet in-memory hash database.") +#define BUILT_WITH_DEFHASH \ + _("Built using the default in-memory hash database.") + +/* Common UI Errors */ +#define ERR_FORMAT_HEADER \ + _("Format Errors - Verify your log/date/time format") +#define ERR_FORMAT_NO_DATE_FMT \ + _("No date format was found on your conf file.") +#define ERR_FORMAT_NO_LOG_FMT \ + _("No log format was found on your conf file.") +#define ERR_FORMAT_NO_TIME_FMT \ + _("No time format was found on your conf file.") +#define ERR_NODEF_CONF_FILE \ + _("No default config file found.") +#define ERR_NODEF_CONF_FILE_DESC \ + _("You may specify one with") +#define ERR_PARSED_NLINES_DESC \ + _("producing the following errors") +#define ERR_PARSED_NLINES \ + _("Parsed %1$d lines") +#define ERR_PLEASE_REPORT \ + _("Please report it by opening an issue on GitHub") +#define ERR_FORMAT_NO_TIME_FMT_DLG \ + _("Select a time format.") +#define ERR_FORMAT_NO_DATE_FMT_DLG \ + _("Select a date format.") +#define ERR_FORMAT_NO_LOG_FMT_DLG \ + _("Select a log format.") +#define ERR_PANEL_DISABLED \ + _("'%1$s' panel is disabled") + +/* Other */ +#define INFO_MORE_INFO \ + _("For more details visit") +#define INFO_LAST_UPDATED \ + _("Last Updated") +#define INFO_WS_READY_FOR_CONN \ + _("WebSocket server ready to accept new client connections") + +#define INFO_HELP_FOLLOWING_OPTS \ + _("The following options can also be supplied to the command") +#define INFO_HELP_EXAMPLES \ + _("Examples can be found by running") + +#define HTML_REPORT_TITLE \ + _( "Server Statistics") +#define HTML_REPORT_NAV_THEME \ + N_("Theme") +#define HTML_REPORT_NAV_DARK_GRAY \ + N_("Dark Gray") +#define HTML_REPORT_NAV_BRIGHT \ + N_("Bright") +#define HTML_REPORT_NAV_DARK_BLUE \ + N_("Dark Blue") +#define HTML_REPORT_NAV_DARK_PURPLE \ + N_("Dark Purple") +#define HTML_REPORT_NAV_PANELS \ + N_("Panels") +#define HTML_REPORT_NAV_ITEMS_PER_PAGE \ + N_("Items per Page") +#define HTML_REPORT_NAV_TABLES \ + N_("Tables") +#define HTML_REPORT_NAV_DISPLAY_TABLES \ + N_("Display Tables") +#define HTML_REPORT_NAV_AH_SMALL \ + N_("Auto-Hide on Small Devices") +#define HTML_REPORT_NAV_AH_SMALL_TITLE \ + N_("Automatically hide tables on small screen devices") +#define HTML_REPORT_NAV_LAYOUT \ + N_("Layout") +#define HTML_REPORT_NAV_HOR \ + N_("Horizontal") +#define HTML_REPORT_NAV_VER \ + N_("Vertical") +#define HTML_REPORT_NAV_FILE_OPTS \ + N_("File Options") +#define HTML_REPORT_NAV_EXPORT_JSON \ + N_("Export as JSON") +#define HTML_REPORT_PANEL_PANEL_OPTS \ + N_("Panel Options") +#define HTML_REPORT_PANEL_PREVIOUS \ + N_("Previous") +#define HTML_REPORT_PANEL_NEXT \ + N_("Next") +#define HTML_REPORT_PANEL_FIRST \ + N_("First") +#define HTML_REPORT_PANEL_LAST \ + N_("Last") +#define HTML_REPORT_PANEL_CHART_OPTS \ + N_("Chart Options") +#define HTML_REPORT_PANEL_CHART \ + N_("Chart") +#define HTML_REPORT_PANEL_TYPE \ + N_("Type") +#define HTML_REPORT_PANEL_AREA_SPLINE \ + N_("Area Spline") +#define HTML_REPORT_PANEL_BAR \ + N_("Bar") +#define HTML_REPORT_PANEL_PLOT_METRIC \ + N_("Plot Metric") +#define HTML_REPORT_PANEL_TABLE_COLS \ + N_("Table Columns") + +/* Status Codes */ +#define STATUS_CODE_1XX \ + N_("1xx Informational") +#define STATUS_CODE_2XX \ + N_("2xx Success") +#define STATUS_CODE_3XX \ + N_("3xx Redirection") +#define STATUS_CODE_4XX \ + N_("4xx Client Errors") +#define STATUS_CODE_5XX \ + N_("5xx Server Errors") + +#define STATUS_CODE_100 \ + N_("100 - Continue: Server received the initial part of the request") +#define STATUS_CODE_101 \ + N_("101 - Switching Protocols: Client asked to switch protocols") +#define STATUS_CODE_200 \ + N_("200 - OK: The request sent by the client was successful") +#define STATUS_CODE_201 \ + N_("201 - Created: The request has been fulfilled and created") +#define STATUS_CODE_202 \ + N_("202 - Accepted: The request has been accepted for processing") +#define STATUS_CODE_203 \ + N_("203 - Non-authoritative Information: Response from a third party") +#define STATUS_CODE_204 \ + N_("204 - No Content: Request did not return any content") +#define STATUS_CODE_205 \ + N_("205 - Reset Content: Server asked the client to reset the document") +#define STATUS_CODE_206 \ + N_("206 - Partial Content: The partial GET has been successful") +#define STATUS_CODE_207 \ + N_("207 - Multi-Status: WebDAV; RFC 4918") +#define STATUS_CODE_208 \ + N_("208 - Already Reported: WebDAV; RFC 5842") +#define STATUS_CODE_300 \ + N_("300 - Multiple Choices: Multiple options for the resource") +#define STATUS_CODE_301 \ + N_("301 - Moved Permanently: Resource has permanently moved") +#define STATUS_CODE_302 \ + N_("302 - Moved Temporarily (redirect)") +#define STATUS_CODE_303 \ + N_("303 - See Other Document: The response is at a different URI") +#define STATUS_CODE_304 \ + N_("304 - Not Modified: Resource has not been modified") +#define STATUS_CODE_305 \ + N_("305 - Use Proxy: Can only be accessed through the proxy") +#define STATUS_CODE_307 \ + N_("307 - Temporary Redirect: Resource temporarily moved") +#define STATUS_CODE_400 \ + N_("400 - Bad Request: The syntax of the request is invalid") +#define STATUS_CODE_401 \ + N_("401 - Unauthorized: Request needs user authentication") +#define STATUS_CODE_402 \ + N_("402 - Payment Required") +#define STATUS_CODE_403 \ + N_("403 - Forbidden: Server is refusing to respond to it") +#define STATUS_CODE_404 \ + N_("404 - Not Found: Requested resource could not be found") +#define STATUS_CODE_405 \ + N_("405 - Method Not Allowed: Request method not supported") +#define STATUS_CODE_406 \ + N_("406 - Not Acceptable") +#define STATUS_CODE_407 \ + N_("407 - Proxy Authentication Required") +#define STATUS_CODE_408 \ + N_("408 - Request Timeout: Server timed out waiting for the request") +#define STATUS_CODE_409 \ + N_("409 - Conflict: Conflict in the request") +#define STATUS_CODE_410 \ + N_("410 - Gone: Resource requested is no longer available") +#define STATUS_CODE_411 \ + N_("411 - Length Required: Invalid Content-Length") +#define STATUS_CODE_412 \ + N_("412 - Precondition Failed: Server does not meet preconditions") +#define STATUS_CODE_413 \ + N_("413 - Payload Too Large") +#define STATUS_CODE_414 \ + N_("414 - Request-URI Too Long") +#define STATUS_CODE_415 \ + N_("415 - Unsupported Media Type: Media type is not supported") +#define STATUS_CODE_416 \ + N_("416 - Requested Range Not Satisfiable: Cannot supply that portion") +#define STATUS_CODE_417 \ + N_("417 - Expectation Failed") +#define STATUS_CODE_421 \ + N_("421 - Misdirected Request") +#define STATUS_CODE_422 \ + N_("422 - Unprocessable Entity due to semantic errors: WebDAV") +#define STATUS_CODE_423 \ + N_("423 - The resource that is being accessed is locked") +#define STATUS_CODE_424 \ + N_("424 - Failed Dependency: WebDAV") +#define STATUS_CODE_426 \ + N_("426 - Upgrade Required: Client should switch to a different protocol") +#define STATUS_CODE_428 \ + N_("428 - Precondition Required") +#define STATUS_CODE_429 \ + N_("429 - Too Many Requests: The user has sent too many requests") +#define STATUS_CODE_431 \ + N_("431 - Request Header Fields Too Large") +#define STATUS_CODE_451 \ + N_("451 - Unavailable For Legal Reasons") +#define STATUS_CODE_444 \ + N_("444 - (Nginx) Connection closed without sending any headers") +#define STATUS_CODE_494 \ + N_("494 - (Nginx) Request Header Too Large") +#define STATUS_CODE_495 \ + N_("495 - (Nginx) SSL client certificate error") +#define STATUS_CODE_496 \ + N_("496 - (Nginx) Client didn't provide certificate") +#define STATUS_CODE_497 \ + N_("497 - (Nginx) HTTP request sent to HTTPS port") +#define STATUS_CODE_499 \ + N_("499 - (Nginx) Connection closed by client while processing request") +#define STATUS_CODE_500 \ + N_("500 - Internal Server Error") +#define STATUS_CODE_501 \ + N_("501 - Not Implemented") +#define STATUS_CODE_502 \ + N_("502 - Bad Gateway: Received an invalid response from the upstream") +#define STATUS_CODE_503 \ + N_("503 - Service Unavailable: The server is currently unavailable") +#define STATUS_CODE_504 \ + N_("504 - Gateway Timeout: The upstream server failed to send request") +#define STATUS_CODE_505 \ + N_("505 - HTTP Version Not Supported") +#define STATUS_CODE_520 \ + N_("520 - CloudFlare - Web server is returning an unknown error") +#define STATUS_CODE_521 \ + N_("521 - CloudFlare - Web server is down") +#define STATUS_CODE_522 \ + N_("522 - CloudFlare - Connection timed out") +#define STATUS_CODE_523 \ + N_("523 - CloudFlare - Origin is unreachable") +#define STATUS_CODE_524 \ + N_("524 - CloudFlare - A timeout occurred") + +#endif // for #ifndef LABELS_H diff --git a/goaccess++/src/opesys.c b/goaccess++/src/opesys.c new file mode 100644 index 0000000..98c6c02 --- /dev/null +++ b/goaccess++/src/opesys.c @@ -0,0 +1,398 @@ +/** + * opesys.c -- functions for dealing with operating systems + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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 <ctype.h> +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stddef.h> + +#include "opesys.h" + +#include "settings.h" +#include "util.h" +#include "xmalloc.h" + +/* ###NOTE: The size of the list is proportional to the run time, + * which makes this pretty slow */ + +/* {"search string", "belongs to"} */ +static const char *os[][2] = { + {"Android", "Android"}, + {"Windows NT 10.0", "Windows"}, + {"Windows NT 6.3; ARM", "Windows"}, + {"Windows NT 6.3", "Windows"}, + {"Windows NT 6.2; ARM", "Windows"}, + {"Windows NT 6.2", "Windows"}, + {"Windows NT 6.1", "Windows"}, + {"Windows NT 6.0", "Windows"}, + {"Windows NT 5.2", "Windows"}, + {"Windows NT 5.1", "Windows"}, + {"Windows NT 5.01", "Windows"}, + {"Windows NT 5.0", "Windows"}, + {"Windows NT 4.0", "Windows"}, + {"Windows NT", "Windows"}, + {"Win 9x 4.90", "Windows"}, + {"Windows 98", "Windows"}, + {"Windows 95", "Windows"}, + {"Windows CE", "Windows"}, + {"Windows Phone 8.1", "Windows"}, + {"Windows Phone 8.0", "Windows"}, + + {"Googlebot", "Unix-like"}, + {"Mastodon", "Unix-like"}, + {"bingbot", "Windows"}, + + {"iPad", "iOS"}, + {"iPod", "iOS"}, + {"iPhone", "iOS"}, + {"AppleTV", "iOS"}, + {"iTunes", "Macintosh"}, + {"OS X", "Macintosh"}, + {"Darwin", "Darwin"}, + + {"Debian", "Linux"}, + {"Ubuntu", "Linux"}, + {"Fedora", "Linux"}, + {"Mint", "Linux"}, + {"SUSE", "Linux"}, + {"Mandriva", "Linux"}, + {"Red Hat", "Linux"}, + {"Gentoo", "Linux"}, + {"CentOS", "Linux"}, + {"PCLinuxOS", "Linux"}, + {"Linux", "Linux"}, + + {"FreeBSD", "BSD"}, + {"NetBSD", "BSD"}, + {"OpenBSD", "BSD"}, + {"DragonFly", "BSD"}, + {"PlayStation", "BSD"}, + + {"CrOS", "Chrome OS"}, + {"SunOS", "Unix-like"}, + {"QNX", "Unix-like"}, + {"BB10", "Unix-like"}, + + {"BlackBerry", "Others"}, + {"Sony", "Others"}, + {"AmigaOS", "Others"}, + {"SymbianOS", "Others"}, + {"Nokia", "Others"}, + {"Nintendo", "Others"}, + {"Apache", "Others"}, + {"Xbox One", "Windows"}, + {"Xbox", "Windows"}, +}; + +/* Get the Android code name (if applicable). + * + * On error, the given name is allocated and returned. + * On success, the matching Android codename is allocated and + * returned. */ +static char * +get_real_android (const char *droid) +{ + if (strstr (droid, "9")) + return alloc_string ("Pie 9"); + else if (strstr (droid, "8.1")) + return alloc_string ("Oreo 8.1"); + else if (strstr (droid, "8.0")) + return alloc_string ("Oreo 8.0"); + else if (strstr (droid, "7.1")) + return alloc_string ("Nougat 7.1"); + else if (strstr (droid, "7.0")) + return alloc_string ("Nougat 7.0"); + else if (strstr (droid, "6.0.1")) + return alloc_string ("Marshmallow 6.0.1"); + else if (strstr (droid, "6.0")) + return alloc_string ("Marshmallow 6.0"); + else if (strstr (droid, "5.1")) + return alloc_string ("Lollipop 5.1"); + else if (strstr (droid, "5.0")) + return alloc_string ("Lollipop 5.0"); + else if (strstr (droid, "4.4")) + return alloc_string ("KitKat 4.4"); + else if (strstr (droid, "4.3")) + return alloc_string ("Jelly Bean 4.3"); + else if (strstr (droid, "4.2")) + return alloc_string ("Jelly Bean 4.2"); + else if (strstr (droid, "4.1")) + return alloc_string ("Jelly Bean 4.1"); + else if (strstr (droid, "4.0")) + return alloc_string ("Ice Cream Sandwich 4.0"); + else if (strstr (droid, "3.")) + return alloc_string ("Honeycomb 3"); + else if (strstr (droid, "2.3")) + return alloc_string ("Gingerbread 2.3"); + else if (strstr (droid, "2.2")) + return alloc_string ("Froyo 2.2"); + else if (strstr (droid, "2.0") || strstr (droid, "2.1")) + return alloc_string ("Eclair 2"); + else if (strstr (droid, "1.6")) + return alloc_string ("Donut 1.6"); + else if (strstr (droid, "1.5")) + return alloc_string ("Cupcake 1.5"); + return alloc_string (droid); +} + +/* Get the Windows marketing name (if applicable). + * + * On error, the given name is allocated and returned. + * On success, the matching Windows marketing name is allocated and + * returned. */ +static char * +get_real_win (const char *win) +{ + if (strstr (win, "10.0")) + return alloc_string ("Windows 10"); + else if (strstr (win, "6.3")) + return alloc_string ("Windows 8.1"); + else if (strstr (win, "6.3; ARM")) + return alloc_string ("Windows RT"); + else if (strstr (win, "6.2; ARM")) + return alloc_string ("Windows RT"); + else if (strstr (win, "6.2")) + return alloc_string ("Windows 8"); + else if (strstr (win, "6.1")) + return alloc_string ("Windows 7"); + else if (strstr (win, "6.0")) + return alloc_string ("Windows Vista"); + else if (strstr (win, "5.2")) + return alloc_string ("Windows XP x64"); + else if (strstr (win, "5.1")) + return alloc_string ("Windows XP"); + else if (strstr (win, "5.0")) + return alloc_string ("Windows 2000"); + return NULL; +} + +/* Get the Mac OS X code name (if applicable). + * + * On error, the given name is allocated and returned. + * On success, the matching Mac OS X codename is allocated and + * returned. */ +static char * +get_real_mac_osx (const char *osx) +{ + if (strstr (osx, "10.14")) + return alloc_string ("macOS 10.14 Mojave"); + else if (strstr (osx, "10.13")) + return alloc_string ("macOS 10.13 High Sierra"); + else if (strstr (osx, "10.12")) + return alloc_string ("macOS 10.12 Sierra"); + else if (strstr (osx, "10.11")) + return alloc_string ("OS X 10.11 El Capitan"); + else if (strstr (osx, "10.10")) + return alloc_string ("OS X 10.10 Yosemite"); + else if (strstr (osx, "10.9")) + return alloc_string ("OS X 10.9 Mavericks"); + else if (strstr (osx, "10.8")) + return alloc_string ("OS X 10.8 Mountain Lion"); + else if (strstr (osx, "10.7")) + return alloc_string ("OS X 10.7 Lion"); + else if (strstr (osx, "10.6")) + return alloc_string ("OS X 10.6 Snow Leopard"); + else if (strstr (osx, "10.5")) + return alloc_string ("OS X 10.5 Leopard"); + else if (strstr (osx, "10.4")) + return alloc_string ("OS X 10.4 Tiger"); + else if (strstr (osx, "10.3")) + return alloc_string ("OS X 10.3 Panther"); + else if (strstr (osx, "10.2")) + return alloc_string ("OS X 10.2 Jaguar"); + else if (strstr (osx, "10.1")) + return alloc_string ("OS X 10.1 Puma"); + else if (strstr (osx, "10.0")) + return alloc_string ("OS X 10.0 Cheetah"); + return alloc_string (osx); +} + +/* Parse all other operating systems. + * + * On error, the given name is returned. + * On success, the parsed OS is returned. */ +static char * +parse_others (char *agent, int spaces) +{ + char *p; + int space = 0; + p = agent; + /* assume the following chars are within the given agent */ + while (*p != ';' && *p != ')' && *p != '(' && *p != '\0') { + if (*p == ' ') + space++; + if (space > spaces) + break; + p++; + } + *p = 0; + + return agent; +} + +/* Parse iOS string including version number. + * + * On error, the matching token is returned (no version). + * On success, the parsed iOS is returned. */ +static char * +parse_ios (char *agent, int tlen) +{ + char *p = NULL, *q = NULL; + ptrdiff_t offset; + + p = agent; + if ((p = strstr (agent, " OS ")) == NULL) + goto out; + + if ((offset = p - agent) <= 0) + goto out; + + if ((q = strstr (p, " like Mac")) == NULL) + goto out; + + *q = 0; + memmove (agent + tlen, agent + offset, offset); + return char_replace (agent, '_', '.'); + +out: + agent[tlen] = 0; + return agent; +} + +/* Parse a Mac OS X string. + * + * On error, the given name is returned. + * On success, the parsed Mac OS X is returned. */ +static char * +parse_osx (char *agent) +{ + int space = 0; + char *p; + + p = agent; + /* assume the following chars are within the given agent */ + while (*p != ';' && *p != ')' && *p != '(' && *p != '\0') { + if (*p == '_') + *p = '.'; + if (*p == ' ') + space++; + if (space > 3) + break; + p++; + } + *p = 0; + + return agent; +} + +/* Parse an Android string. + * + * On error, the given name is returned. + * On success, the parsed Android is returned. */ +static char * +parse_android (char *agent) +{ + char *p; + p = agent; + /* assume the following chars are within the given agent */ + while (*p != ';' && *p != ')' && *p != '(' && *p != '\0') + p++; + *p = 0; + + return agent; +} + +/* Attempt to parse specific OS. + * + * On success, a malloc'd string containing the OS is returned. */ +static char * +parse_os (const char *str, char *tkn, char *os_type, int idx) +{ + char *b; + int spaces = 0; + + xstrncpy (os_type, os[idx][1], OPESYS_TYPE_LEN); + /* Windows */ + if ((strstr (str, "Windows")) != NULL) + return conf.real_os && (b = get_real_win (tkn)) ? b : xstrdup (os[idx][0]); + /* Android */ + if ((strstr (tkn, "Android")) != NULL) { + tkn = parse_android (tkn); + return conf.real_os ? get_real_android (tkn) : xstrdup (tkn); + } + /* iOS */ + if (strstr (tkn, "iPad") || strstr (tkn, "iPod")) + return xstrdup (parse_ios (tkn, 4)); + if (strstr (tkn, "iPhone")) + return xstrdup (parse_ios (tkn, 6)); + /* Mac OS X */ + if ((strstr (tkn, "OS X")) != NULL) { + tkn = parse_osx (tkn); + return conf.real_os ? get_real_mac_osx (tkn) : xstrdup (tkn); + } + /* Darwin - capture the first part of agents such as: + * Slack/248000 CFNetwork/808.0.2 Darwin/16.0.0 */ + if ((strstr (tkn, "Darwin")) != NULL) { + if ((b = strchr (str, ' '))) + *b = 0; + return xstrdup (str); + } + /* all others */ + spaces = count_matches (os[idx][0], ' '); + + return alloc_string (parse_others (tkn, spaces)); +} + +/* Given a user agent, determine the operating system used. + * + * ###NOTE: The size of the list is proportional to the run time, + * which makes this pretty slow + * + * On error, NULL is returned. + * On success, a malloc'd string containing the OS is returned. */ +char * +verify_os (const char *str, char *os_type) +{ + char *a; + size_t i; + + if (str == NULL || *str == '\0') + return NULL; + + for (i = 0; i < ARRAY_SIZE (os); i++) { + if ((a = strstr (str, os[i][0])) != NULL) + return parse_os (str, a, os_type, i); + } + xstrncpy (os_type, "Unknown", OPESYS_TYPE_LEN); + + return alloc_string ("Unknown"); +} diff --git a/goaccess++/src/opesys.h b/goaccess++/src/opesys.h new file mode 100644 index 0000000..15f8fd7 --- /dev/null +++ b/goaccess++/src/opesys.h @@ -0,0 +1,44 @@ +/** + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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 OPESYS_H_INCLUDED +#define OPESYS_H_INCLUDED + +#define OPESYS_TYPE_LEN 10 + +/* Each OS contains the number of hits and the OS's type */ +typedef struct GOpeSys_ +{ + char os_type[OPESYS_TYPE_LEN]; + int hits; +} GOpeSys; + +char *verify_os (const char *str, char *os_type); + +#endif diff --git a/goaccess++/src/opesys.o b/goaccess++/src/opesys.o new file mode 100644 index 0000000000000000000000000000000000000000..c16473f8a821e764f21cf4fd0d8dfd7c285a2003 GIT binary patch literal 17184 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 TTlY-<+o=72<Alj>rT_l`s!yG_ literal 0 HcmV?d00001 diff --git a/goaccess++/src/options.c b/goaccess++/src/options.c new file mode 100644 index 0000000..f1ea1ff --- /dev/null +++ b/goaccess++/src/options.c @@ -0,0 +1,839 @@ +/** + * options.c -- functions related to parsing program options + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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. + */ + +#if HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <getopt.h> +#include <errno.h> + +#ifdef HAVE_LIBTOKYOCABINET +#include "tcabdb.h" +#include "tcbtdb.h" +#endif + +#ifdef HAVE_LIBGEOIP +#include <GeoIP.h> +#endif + +#include "options.h" + +#include "error.h" +#include "labels.h" +#include "util.h" +#include "xmalloc.h" + +static char short_options[] = "f:e:p:o:l:H:M:S:b:" +#ifdef HAVE_LIBGEOIP + "g" +#endif + "acirmMhHqdsV"; + +/* *INDENT-OFF* */ +struct option long_opts[] = { + {"agent-list" , no_argument , 0 , 'a' } , + {"browsers-file" , required_argument , 0 , 'b' } , + {"config-dialog" , no_argument , 0 , 'c' } , + {"config-file" , required_argument , 0 , 'p' } , + {"debug-file" , required_argument , 0 , 'l' } , + {"exclude-ip" , required_argument , 0 , 'e' } , +#ifdef HAVE_LIBGEOIP + {"std-geoip" , no_argument , 0 , 'g' } , +#endif + {"help" , no_argument , 0 , 'h' } , + {"hl-header" , no_argument , 0 , 'i' } , + {"http-method" , required_argument , 0 , 'M' } , + {"http-protocol" , required_argument , 0 , 'H' } , + {"log-file" , required_argument , 0 , 'f' } , + {"log-size" , required_argument , 0 , 'S' } , + {"no-query-string" , no_argument , 0 , 'q' } , + {"no-term-resolver" , no_argument , 0 , 'r' } , + {"output-format" , required_argument , 0 , 'o' } , + {"storage" , no_argument , 0 , 's' } , + {"version" , no_argument , 0 , 'V' } , + {"with-mouse" , no_argument , 0 , 'm' } , + {"with-output-resolver" , no_argument , 0 , 'd' } , + {"444-as-404" , no_argument , 0 , 0 } , + {"4xx-to-unique-count" , no_argument , 0 , 0 } , + {"anonymize-ip" , no_argument , 0 , 0 } , + {"addr" , required_argument , 0 , 0 } , + {"all-static-files" , no_argument , 0 , 0 } , + {"color" , required_argument , 0 , 0 } , + {"color-scheme" , required_argument , 0 , 0 } , + {"crawlers-only" , no_argument , 0 , 0 } , + {"daemonize" , no_argument , 0 , 0 } , + {"date-format" , required_argument , 0 , 0 } , + {"date-spec" , required_argument , 0 , 0 } , + {"dcf" , no_argument , 0 , 0 } , + {"double-decode" , no_argument , 0 , 0 } , + {"enable-panel" , required_argument , 0 , 0 } , + {"fifo-in" , required_argument , 0 , 0 } , + {"fifo-out" , required_argument , 0 , 0 } , + {"hide-referer" , required_argument , 0 , 0 } , + {"hour-spec" , required_argument , 0 , 0 } , + {"html-custom-css" , required_argument , 0 , 0 } , + {"html-custom-js" , required_argument , 0 , 0 } , + {"html-prefs" , required_argument , 0 , 0 } , + {"html-report-title" , required_argument , 0 , 0 } , + {"ignore-crawlers" , no_argument , 0 , 0 } , + {"ignore-statics" , required_argument , 0 , 0 } , + {"ignore-panel" , required_argument , 0 , 0 } , + {"ignore-referer" , required_argument , 0 , 0 } , + {"ignore-status" , required_argument , 0 , 0 } , + {"invalid-requests" , required_argument , 0 , 0 } , + {"json-pretty-print" , no_argument , 0 , 0 } , + {"log-format" , required_argument , 0 , 0 } , + {"max-items" , required_argument , 0 , 0 } , + {"no-color" , no_argument , 0 , 0 } , + {"no-column-names" , no_argument , 0 , 0 } , + {"no-csv-summary" , no_argument , 0 , 0 } , + {"no-global-config" , no_argument , 0 , 0 } , + {"no-html-last-updated" , no_argument , 0 , 0 } , + {"no-parsing-spinner" , no_argument , 0 , 0 } , + {"no-progress" , no_argument , 0 , 0 } , + {"no-tab-scroll" , no_argument , 0 , 0 } , + {"num-tests" , required_argument , 0 , 0 } , + {"origin" , required_argument , 0 , 0 } , + {"output" , required_argument , 0 , 0 } , + {"pid-file" , required_argument , 0 , 0 } , + {"port" , required_argument , 0 , 0 } , + {"process-and-exit" , no_argument , 0 , 0 } , + {"real-os" , no_argument , 0 , 0 } , + {"real-time-html" , no_argument , 0 , 0 } , + {"sort-panel" , required_argument , 0 , 0 } , + {"static-file" , required_argument , 0 , 0 } , +#ifdef HAVE_LIBSSL + {"ssl-cert" , required_argument , 0 , 0 } , + {"ssl-key" , required_argument , 0 , 0 } , +#endif + {"time-format" , required_argument , 0 , 0 } , + {"ws-url" , required_argument , 0 , 0 } , +#ifdef HAVE_GEOLOCATION + {"geoip-database" , required_argument , 0 , 0 } , +#endif +#ifdef HAVE_LIBGEOIP + {"geoip-city-data" , required_argument , 0 , 0 } , +#endif +#ifdef TCB_BTREE + {"accumulated-time" , no_argument , 0 , 0 } , + {"cache-lcnum" , required_argument , 0 , 0 } , + {"cache-ncnum" , required_argument , 0 , 0 } , + {"compression" , required_argument , 0 , 0 } , + {"db-path" , required_argument , 0 , 0 } , + {"keep-db-files" , no_argument , 0 , 0 } , + {"load-from-disk" , no_argument , 0 , 0 } , + {"tune-bnum" , required_argument , 0 , 0 } , + {"tune-lmemb" , required_argument , 0 , 0 } , + {"tune-nmemb" , required_argument , 0 , 0 } , + {"xmmap" , required_argument , 0 , 0 } , +#endif + {0, 0, 0, 0} +}; + +/* Command line help. */ +void +cmd_help (void) +{ + printf ("\nGoAccess - %s\n\n", GO_VERSION); + printf ( + "Usage: " + "goaccess [filename] [ options ... ] [-c][-M][-H][-S][-q][-d][...]\n" + "%s:\n\n", INFO_HELP_FOLLOWING_OPTS); + + printf ( + /* Log & Date Format Options */ + "Log & Date Format Options\n\n" + " --date-format=<dateformat> - Specify log date format. e.g., %%d/%%b/%%Y\n" + " --log-format=<logformat> - Specify log format. Inner quotes need to be\n" + " escaped, or use single quotes.\n" + " --time-format=<timeformat> - Specify log time format. e.g., %%H:%%M:%%S\n\n" + + /* User Interface Options */ + "User Interface Options\n\n" + " -c --config-dialog - Prompt log/date/time configuration window.\n" + " -i --hl-header - Color highlight active panel.\n" + " -m --with-mouse - Enable mouse support on main dashboard.\n" + " --color=<fg:bg[attrs, PANEL]> - Specify custom colors. See manpage for more\n" + " details and options.\n" + " --color-scheme=<1|2|3> - Schemes: 1 => Grey, 2 => Green, 3 => Monokai.\n" + " --html-custom-css=<path.css> - Specify a custom CSS file in the HTML report.\n" + " --html-custom-js=<path.js> - Specify a custom JS file in the HTML report.\n" + " --html-prefs=<json_obj> - Set default HTML report preferences.\n" + " --html-report-title=<title> - Set HTML report page title and header.\n" + " --json-pretty-print - Format JSON output w/ tabs & newlines.\n" + " --max-items - Maximum number of items to show per panel.\n" + " See man page for limits.\n" + " --no-color - Disable colored output.\n" + " --no-column-names - Don't write column names in term output.\n" + " --no-csv-summary - Disable summary metrics on the CSV output.\n" + " --no-html-last-updated - Hide HTML last updated field.\n" + " --no-parsing-spinner - Disable progress metrics and parsing spinner.\n" + " --no-progress - Disable progress metrics.\n" + " --no-tab-scroll - Disable scrolling through panels on TAB.\n" + "\n" + + /* Server Options */ + "Server Options\n\n" + " --addr=<addr> - Specify IP address to bind server to.\n" + " --daemonize - Run as daemon (if --real-time-html enabled).\n" + " --fifo-in=<path> - Path to read named pipe (FIFO).\n" + " --fifo-out=<path> - Path to write named pipe (FIFO).\n" + " --origin=<addr> - Ensure clients send the specified origin header\n" + " upon the WebSocket handshake.\n" + " --pid-file=<path> - Write PID to a file when --daemonize is used.\n" + " --port=<port> - Specify the port to use.\n" + " --real-time-html - Enable real-time HTML output.\n" + " --ssl-cert=<cert.crt> - Path to TLS/SSL certificate.\n" + " --ssl-key=<priv.key> - Path to TLS/SSL private key.\n" + " --ws-url=<url> - URL to which the WebSocket server responds.\n" + "\n" + + /* File Options */ + "File Options\n\n" + " - - The log file to parse is read from stdin.\n" + " -f --log-file=<filename> - Path to input log file.\n" + " -S --log-size=<number> - Specify the log size, useful when piping in logs.\n" + " -l --debug-file=<filename> - Send all debug messages to the specified\n" + " file.\n" + " -p --config-file=<filename> - Custom configuration file.\n" + " --invalid-requests=<filename> - Log invalid requests to the specified file.\n" + " --no-global-config - Don't load global configuration file.\n" + "\n" + + /* Parse Options */ + "Parse Options\n\n" + " -a --agent-list - Enable a list of user-agents by host.\n" + " -b --browsers-file=<path> - Use additional custom list of browsers.\n" + " -d --with-output-resolver - Enable IP resolver on HTML|JSON output.\n" + " -e --exclude-ip=<IP> - Exclude one or multiple IPv4/6. Allows IP\n" + " ranges e.g. 192.168.0.1-192.168.0.10\n" + " -H --http-protocol=<yes|no> - Set/unset HTTP request protocol if found.\n" + " -M --http-method=<yes|no> - Set/unset HTTP request method if found.\n" + " -o --output=file.html|json|csv - Output either an HTML, JSON or a CSV file.\n" + " -q --no-query-string - Ignore request's query string. Removing the\n" + " query string can greatly decrease memory\n" + " consumption.\n" + " -r --no-term-resolver - Disable IP resolver on terminal output.\n" + " --444-as-404 - Treat non-standard status code 444 as 404.\n" + " --4xx-to-unique-count - Add 4xx client errors to the unique visitors\n" + " count.\n" +#ifdef TCB_BTREE + " --accumulated-time - Store accumulated time from parsing day-by-day logs.\n" +#endif + " --anonymize-ip - Anonymize IP addresses before outputting to report.\n" + " --all-static-files - Include static files with a query string.\n" + " --crawlers-only - Parse and display only crawlers.\n" + " --date-spec=<date|hr> - Date specificity. Possible values: `date`\n" + " (default), or `hr`.\n" + " --double-decode - Decode double-encoded values.\n" + " --enable-panel=<PANEL> - Enable parsing/displaying the given panel.\n" + " --hide-referer=<NEEDLE> - Hide a referer but still count it. Wild cards\n" + " are allowed. i.e., *.bing.com\n" + " --hour-spec=<hr|min> - Hour specificity. Possible values: `hr`\n" + " (default), or `min` (tenth of a min).\n" + " --ignore-crawlers - Ignore crawlers.\n" + " --ignore-panel=<PANEL> - Ignore parsing/displaying the given panel.\n" + " --ignore-referer=<NEEDLE> - Ignore a referer from being counted. Wild cards\n" + " are allowed. i.e., *.bing.com\n" + " --ignore-statics=<req|panel> - Ignore static requests.\n" + " req => Ignore from valid requests.\n" + " panel => Ignore from valid requests and panels.\n" + " --ignore-status=<CODE> - Ignore parsing the given status code.\n" + " --num-tests=<number> - Number of lines to test. >= 0 (10 default)\n" + " --process-and-exit - Parse log and exit without outputting data.\n" + " --real-os - Display real OS names. e.g, Windows XP, Snow\n" + " Leopard.\n" + " --sort-panel=PANEL,METRIC,ORDER - Sort panel on initial load. For example:\n" + " --sort-panel=VISITORS,BY_HITS,ASC. See\n" + " manpage for a list of panels/fields.\n" + " --static-file=<extension> - Add static file extension. e.g.: .mp3.\n" + " Extensions are case sensitive.\n" + "\n" + +/* GeoIP Options */ +#ifdef HAVE_GEOLOCATION + "GeoIP Options\n\n" +#ifdef HAVE_LIBGEOIP + " -g --std-geoip - Standard GeoIP database for less memory\n" + " consumption.\n" +#endif + " --geoip-database=<path> - Specify path to GeoIP database file. i.e.,\n" + " GeoLiteCity.dat, GeoIPv6.dat ...\n" + "\n" +#endif + +/* On-Disk Database Options */ +#ifdef TCB_BTREE + "On-Disk Database Options\n\n" + " --keep-db-files - Persist parsed data into disk.\n" + " --load-from-disk - Load previously stored data from disk.\n" + " --db-path=<path> - Path of the database file. Default [%s]\n" + " --cache-lcnum=<number> - Max number of leaf nodes to be cached. Default\n" + " [%d]\n" + " --cache-ncnum=<number> - Max number of non-leaf nodes to be cached.\n" + " Default [%d]\n" + " --tune-bnum=<number> - Number of elements of the bucket array. Default\n" + " [%d]\n" + " --tune-lmemb=<number> - Number of members in each leaf page. Default\n" + " [%d]\n" + " --tune-nmemb=<number> - Number of members in each non-leaf page.\n" + " Default [%d]\n" + " --xmmap=<number> - Set the size in bytes of the extra mapped\n" + " memory. Default [%d]\n" +#if defined(HAVE_ZLIB) || defined(HAVE_BZ2) + " --compression=<zlib|bz2> - Specifies that each page is compressed with\n" + " ZLIB|BZ2 encoding.\n" + "\n" +#endif +#endif + +/* Other Options */ + "Other Options\n\n" + " -h --help - This help.\n" + " -V --version - Display version information and exit.\n" + " -s --storage - Display current storage method. e.g., B+\n" + " Tree, Hash.\n" + " --dcf - Display the path of the default config\n" + " file when `-p` is not used.\n" + "\n" + + "%s `man goaccess`.\n\n" + "%s: http://goaccess.io\n" + "GoAccess Copyright (C) 2009-2017 by Gerardo Orellana" + "\n\n" +#ifdef TCB_BTREE + , TC_DBPATH, TC_MMAP, TC_LCNUM, TC_NCNUM, TC_LMEMB, TC_NMEMB, TC_BNUM +#endif + , INFO_HELP_EXAMPLES, INFO_MORE_INFO + ); + exit (EXIT_FAILURE); +} +/* *INDENT-ON* */ + +/* Push a command line option to the given array if within bounds and if it's + * not in the array. */ +static void +set_array_opt (const char *oarg, const char *arr[], int *size, int max) +{ + if (str_inarray (oarg, arr, *size) < 0 && *size < max) + arr[(*size)++] = oarg; +} + +/* Parse command line long options. */ +static void +parse_long_opt (const char *name, const char *oarg) +{ + if (!strcmp ("no-global-config", name)) + return; + + /* LOG & DATE FORMAT OPTIONS + * ========================= */ + /* log format */ + if (!strcmp ("log-format", name)) + set_log_format_str (oarg); + + /* time format */ + if (!strcmp ("time-format", name)) + set_time_format_str (oarg); + + /* date format */ + if (!strcmp ("date-format", name)) + set_date_format_str (oarg); + + /* USER INTERFACE OPTIONS + * ========================= */ + /* colors */ + if (!strcmp ("color", name)) + set_array_opt (oarg, conf.colors, &conf.color_idx, MAX_CUSTOM_COLORS); + + /* color scheme */ + if (!strcmp ("color-scheme", name)) + conf.color_scheme = atoi (oarg); + + /* html custom CSS */ + if (!strcmp ("html-custom-css", name)) + conf.html_custom_css = oarg; + + /* html custom JS */ + if (!strcmp ("html-custom-js", name)) + conf.html_custom_js = oarg; + + /* html JSON object containing default preferences */ + if (!strcmp ("html-prefs", name)) + conf.html_prefs = oarg; + + /* html report title */ + if (!strcmp ("html-report-title", name)) + conf.html_report_title = oarg; + + /* json pretty print */ + if (!strcmp ("json-pretty-print", name)) + conf.json_pretty_print = 1; + + /* max items */ + if (!strcmp ("max-items", name)) { + char *sEnd; + int max = strtol (oarg, &sEnd, 10); + if (oarg == sEnd || *sEnd != '\0' || errno == ERANGE) + conf.max_items = 1; + else + conf.max_items = max; + } + + /* no color */ + if (!strcmp ("no-color", name)) + conf.no_color = 1; + + /* no columns */ + if (!strcmp ("no-column-names", name)) + conf.no_column_names = 1; + + /* no csv summary */ + if (!strcmp ("no-csv-summary", name)) + conf.no_csv_summary = 1; + + /* no parsing spinner */ + if (!strcmp ("no-parsing-spinner", name)) + conf.no_parsing_spinner = 1; + + /* no progress */ + if (!strcmp ("no-progress", name)) + conf.no_progress = 1; + + /* no tab scroll */ + if (!strcmp ("no-tab-scroll", name)) + conf.no_tab_scroll = 1; + + /* no html last updated field */ + if (!strcmp ("no-html-last-updated", name)) + conf.no_html_last_updated = 1; + + /* SERVER OPTIONS + * ========================= */ + /* address to bind to */ + if (!strcmp ("addr", name)) + conf.addr = oarg; + + /* FIFO in (read) */ + if (!strcmp ("fifo-in", name)) + conf.fifo_in = oarg; + + /* FIFO out (write) */ + if (!strcmp ("fifo-out", name)) + conf.fifo_out = oarg; + + /* run program as a Unix daemon */ + if (!strcmp ("daemonize", name)) + conf.daemonize = 1; + + /* WebSocket origin */ + if (!strcmp ("origin", name)) + conf.origin = oarg; + + /* PID file to write */ + if (!strcmp ("pid-file", name)) + conf.pidfile = oarg; + + /* port to use */ + if (!strcmp ("port", name)) { + int port = strtol (oarg, NULL, 10); + if (port < 0 || port > 65535) + LOG_DEBUG (("Invalid port.")); + else + conf.port = oarg; + } + + /* real time HTML */ + if (!strcmp ("real-time-html", name)) + conf.real_time_html = 1; + + /* TLS/SSL certificate */ + if (!strcmp ("ssl-cert", name)) + conf.sslcert = oarg; + + /* TLS/SSL private key */ + if (!strcmp ("ssl-key", name)) + conf.sslkey = oarg; + + /* URL to which the WebSocket server responds. */ + if (!strcmp ("ws-url", name)) + conf.ws_url = oarg; + + /* FILE OPTIONS + * ========================= */ + /* invalid requests */ + if (!strcmp ("invalid-requests", name)) { + conf.invalid_requests_log = oarg; + invalid_log_open (conf.invalid_requests_log); + } + + /* output file */ + if (!strcmp ("output", name)) + set_array_opt (oarg, conf.output_formats, &conf.output_format_idx, + MAX_OUTFORMATS); + + /* PARSE OPTIONS + * ========================= */ + /* 444 as 404 */ + if (!strcmp ("444-as-404", name)) + conf.code444_as_404 = 1; + + /* 4xx to unique count */ + if (!strcmp ("4xx-to-unique-count", name)) + conf.client_err_to_unique_count = 1; + + /* anonymize ip */ + if (!strcmp ("anonymize-ip", name)) + conf.anonymize_ip = 1; + + /* store accumulated time in tcb */ + if (!strcmp ("accumulated-time", name)) + conf.store_accumulated_time = 1; + + /* all static files */ + if (!strcmp ("all-static-files", name)) + conf.all_static_files = 1; + + /* crawlers only */ + if (!strcmp ("crawlers-only", name)) + conf.crawlers_only = 1; + + /* date specificity */ + if (!strcmp ("date-spec", name) && !strcmp (oarg, "hr")) + conf.date_spec_hr = 1; + + /* double decode */ + if (!strcmp ("double-decode", name)) + conf.double_decode = 1; + + /* enable panel */ + if (!strcmp ("enable-panel", name)) + set_array_opt (oarg, conf.enable_panels, &conf.enable_panel_idx, + TOTAL_MODULES); + + /* hour specificity */ + if (!strcmp ("hour-spec", name) && !strcmp (oarg, "min")) + conf.hour_spec_min = 1; + + /* ignore crawlers */ + if (!strcmp ("ignore-crawlers", name)) + conf.ignore_crawlers = 1; + + /* ignore panel */ + if (!strcmp ("ignore-panel", name)) + set_array_opt (oarg, conf.ignore_panels, &conf.ignore_panel_idx, + TOTAL_MODULES); + + /* ignore referer */ + if (!strcmp ("ignore-referer", name)) + set_array_opt (oarg, conf.ignore_referers, &conf.ignore_referer_idx, + MAX_IGNORE_REF); + + /* hide referer from report (e.g. within same site) */ + if (!strcmp ("hide-referer", name)) + set_array_opt (oarg, conf.hide_referers, &conf.hide_referer_idx, + MAX_IGNORE_REF); + + /* ignore status code */ + if (!strcmp ("ignore-status", name)) + set_array_opt (oarg, conf.ignore_status, &conf.ignore_status_idx, + MAX_IGNORE_STATUS); + + /* ignore static requests */ + if (!strcmp ("ignore-statics", name)) { + if (!strcmp ("req", oarg)) + conf.ignore_statics = IGNORE_LEVEL_REQ; + else if (!strcmp ("panel", oarg)) + conf.ignore_statics = IGNORE_LEVEL_PANEL; + else + LOG_DEBUG (("Invalid statics ignore option.")); + } + + /* number of line tests */ + if (!strcmp ("num-tests", name)) { + char *sEnd; + int tests = strtol (oarg, &sEnd, 10); + if (oarg == sEnd || *sEnd != '\0' || errno == ERANGE) + return; + conf.num_tests = tests >= 0 ? tests : 0; + } + + /* process and exit */ + if (!strcmp ("process-and-exit", name)) + conf.process_and_exit = 1; + + /* real os */ + if (!strcmp ("real-os", name)) + conf.real_os = 1; + + /* sort view */ + if (!strcmp ("sort-panel", name)) + set_array_opt (oarg, conf.sort_panels, &conf.sort_panel_idx, TOTAL_MODULES); + + /* static file */ + if (!strcmp ("static-file", name) && conf.static_file_idx < MAX_EXTENSIONS) { + if (conf.static_file_max_len < strlen (oarg)) + conf.static_file_max_len = strlen (oarg); + set_array_opt (oarg, conf.static_files, &conf.static_file_idx, + MAX_EXTENSIONS); + } + + /* GEOIP OPTIONS + * ========================= */ + /* specifies the path of the GeoIP City database file */ + if (!strcmp ("geoip-city-data", name) || !strcmp ("geoip-database", name)) + conf.geoip_database = oarg; + + /* BTREE OPTIONS + * ========================= */ + /* keep database files */ + if (!strcmp ("keep-db-files", name)) + conf.keep_db_files = 1; + + /* load data from disk */ + if (!strcmp ("load-from-disk", name)) + conf.load_from_disk = 1; + + /* specifies the path of the database file */ + if (!strcmp ("db-path", name)) + conf.db_path = oarg; + + /* specifies the maximum number of leaf nodes to be cached */ + if (!strcmp ("cache-lcnum", name)) + conf.cache_lcnum = atoi (oarg); + + /* specifies the maximum number of non-leaf nodes to be cached */ + if (!strcmp ("cache-ncnum", name)) + conf.cache_ncnum = atoi (oarg); + + /* number of elements of the bucket array */ + if (!strcmp ("tune-bnum", name)) + conf.tune_bnum = atoi (oarg); + + /* number of members in each non-leaf page */ + if (!strcmp ("tune-nmemb", name)) + conf.tune_nmemb = atoi (oarg); + + /* number of members in each leaf page */ + if (!strcmp ("tune-lmemb", name)) + conf.tune_lmemb = atoi (oarg); + + /* set the size in bytes of the extra mapped memory */ + if (!strcmp ("xmmap", name)) + conf.xmmap = atoi (oarg); + + /* specifies that each page is compressed with X encoding */ + if (!strcmp ("compression", name)) { +#ifdef HAVE_ZLIB + if (!strcmp ("zlib", oarg)) + conf.compression = TC_ZLIB; +#endif +#ifdef HAVE_BZ2 + if (!strcmp ("bz2", oarg)) + conf.compression = TC_BZ2; +#endif + } + + /* default config file --dwf */ + if (!strcmp ("dcf", name)) { + display_default_config_file (); + exit (EXIT_SUCCESS); + } +} + +/* Determine if the '--no-global-config' command line option needs to be + * enabled or not. */ +void +verify_global_config (int argc, char **argv) +{ + int o, idx = 0; + + conf.load_global_config = 1; + while ((o = getopt_long (argc, argv, short_options, long_opts, &idx)) >= 0) { + if (-1 == o || EOF == o) + break; + + switch (o) { + case 'p': + conf.iconfigfile = xstrdup (optarg); + break; + case 0: + if (!strcmp ("no-global-config", long_opts[idx].name)) + conf.load_global_config = 0; + break; + case '?': + exit (EXIT_FAILURE); + } + } + + /* reset it to 1 */ + optind = 1; +} + +/* Attempt to add - to the array of filenames if it hasn't been added it yet. */ +void +add_dash_filename (void) +{ + int i; + // pre-scan for '-' and don't add if already exists: github.com/allinurl/goaccess/issues/907 + for (i = 0; i < conf.filenames_idx; ++i) { + if (conf.filenames[i][0] == '-' && conf.filenames[i][1] == '\0') + return; + } + + if (conf.filenames_idx < MAX_FILENAMES && !conf.read_stdin) { + conf.read_stdin = 1; + conf.filenames[conf.filenames_idx++] = "-"; + } +} + +/* Read the user's supplied command line options. */ +void +read_option_args (int argc, char **argv) +{ + int o, idx = 0; + +#ifdef HAVE_LIBGEOIP + conf.geo_db = GEOIP_MEMORY_CACHE; +#endif + + while ((o = getopt_long (argc, argv, short_options, long_opts, &idx)) >= 0) { + if (-1 == o || EOF == o) + break; + switch (o) { + case 'f': + if (conf.filenames_idx < MAX_FILENAMES) + conf.filenames[conf.filenames_idx++] = optarg; + break; + case 'S': + if (strchr (optarg, '-')) { + printf ("[ERROR] log-size must be a positive integer\n"); + exit (EXIT_FAILURE); + } + conf.log_size = (uint64_t) atoll (optarg); + break; + case 'p': + /* ignore it */ + break; +#ifdef HAVE_LIBGEOIP + case 'g': + conf.geo_db = GEOIP_STANDARD; + break; +#endif + case 'e': + if (conf.ignore_ip_idx < MAX_IGNORE_IPS) + conf.ignore_ips[conf.ignore_ip_idx++] = optarg; + else + LOG_DEBUG (("Max num of (%d) IPs to ignore reached.", MAX_IGNORE_IPS)); + break; + case 'a': + conf.list_agents = 1; + break; + case 'b': + conf.browsers_file = optarg; + break; + case 'c': + conf.load_conf_dlg = 1; + break; + case 'i': + conf.hl_header = 1; + break; + case 'q': + conf.ignore_qstr = 1; + break; + case 'o': + if (!valid_output_type (optarg)) { + printf + ("[ERROR] Invalid filename extension used, must be any of .csv, .json, or .html\n"); + exit (EXIT_FAILURE); + } + if (conf.output_format_idx < MAX_OUTFORMATS) + conf.output_formats[conf.output_format_idx++] = optarg; + break; + case 'l': + conf.debug_log = optarg; + dbg_log_open (conf.debug_log); + break; + case 'r': + conf.skip_term_resolver = 1; + break; + case 'd': + conf.enable_html_resolver = 1; + break; + case 'm': + conf.mouse_support = 1; + break; + case 'M': + if (strcmp ("no", optarg) == 0) + conf.append_method = 0; + else + conf.append_method = 1; + break; + case 'h': + cmd_help (); + break; + case 'H': + if (strcmp ("no", optarg) == 0) + conf.append_protocol = 0; + else + conf.append_protocol = 1; + break; + case 'V': + display_version (); + exit (EXIT_SUCCESS); + break; + case 0: + parse_long_opt (long_opts[idx].name, optarg); + break; + case 's': + display_storage (); + exit (EXIT_SUCCESS); + case '?': + exit (EXIT_FAILURE); + default: + exit (EXIT_FAILURE); + } + } + + for (idx = optind; idx < argc; ++idx) { + /* read from standard input */ + if (!conf.read_stdin && strcmp ("-", argv[idx]) == 0) + add_dash_filename (); + /* read filenames */ + else { + if (conf.filenames_idx < MAX_FILENAMES) + conf.filenames[conf.filenames_idx++] = argv[idx]; + } + } +} diff --git a/goaccess++/src/options.h b/goaccess++/src/options.h new file mode 100644 index 0000000..fad12b4 --- /dev/null +++ b/goaccess++/src/options.h @@ -0,0 +1,38 @@ +/** + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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 OPTIONS_H_INCLUDED +#define OPTIONS_H_INCLUDED + +void add_dash_filename (void); +void cmd_help (void); +void read_option_args (int argc, char **argv); +void verify_global_config (int argc, char **argv); + +#endif diff --git a/goaccess++/src/options.o b/goaccess++/src/options.o new file mode 100644 index 0000000000000000000000000000000000000000..1b22a3e15e39dcd5c10cdd429a52474a9885b77a GIT binary patch literal 33032 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�LaFKzv;A2Z<jP{1M{Qf<Hn0h~Uo=w<upGoi7o$1%HKji{Nh%9}xU! z#K#4Hm-s=!@n0mNn-)Akc0MAwZS0Q?7aV${okPTJ!PgLP5!{>;4+w6~iN^&u&*vW$ z+&rH@Ex36;|A^o%lpphIkxBn);x^gC@LiZma4mx0tg$s9xOtv`TyXO~#X-SwjfZYp z@JlJ(M+8sNy+w94=``;JnDQ}v4e4nS^5%Vz0l~Y-4&#EG=lKr`Zr(4L797{)=#B_} zx5oZ@)THwP;x_d+hMRe9i{R!xg#p3Mdj#WxoA(zE3Z5qWObdRevA^K{dnH)u!I^YE zp>Hi)@G$Wf!OgsOK=8jK`EkMDAbwErw}?**j%R7;jtK6*H$>-~CjB31amyCmyqDA> zxOp#WKydS3#<<`E7!kOGf}8horUf_e6CDxU%p1&u%O?Hiy$^E^Yq)vuqoqQ}Z@78? zXh3lDKFGM>=6#TZg7<2**0kW}y`&?8`|nNAxt>YSn^fOy(ucQ%6iEu+L-!Mcs|pEh zT5?h**GJ<fl8`r+f<Gf=h49H&^&2-=@OOD4A@yi4{!ylg6&mzBE0lHd2F2?_@K7<o zg(r$t7|rNLNdpeyL#;^*|FU2T{zQ@$g1;=}gy7v?{L`G#U35R3&WGS{s=?pX&yA4+ z2cG)P!k_A)oc(q`HUu}e=bBpRW{}n)#&4;)pkI7e2D`Qvx;H;P*XpZf%k(dX!+59~ zScKIx8pus|uBD;e%=*Uw`nAP<4cwzn8Q!e(gt(~|KCXi+jKAI|`oe@a&tDmDltpKL zTj*MbZ^4Hu!98+`{x#nw|0aANc;L0Een##@gT6X!1j&Pj5hG@G!&NE!#}iuQ2%QU~ z{jm!%@f-U`fMFEUe$)7{0XXwsjlQ!i+g#A^4e(nk{%}qUyhi;l#*a;1#*gy{jK3B> zMXp8PVfk{0vgph&o|Tzv<w0LHE&Q%<EoJWnFSLuae{G8nW9uLP+oa!sFTe%rl;L|? zw8SzIp$w1XeJT6dc&G<%RR5@F&hhBYgg50^DsBuCZ`A>7m+0Sf;U@wg86L|-mOX|z f(1qWY^`C{O$c}pEU5Kb~2PpjytGmLN4FA6X1YxiY literal 0 HcmV?d00001 diff --git a/goaccess++/src/output.c b/goaccess++/src/output.c new file mode 100644 index 0000000..b57786b --- /dev/null +++ b/goaccess++/src/output.c @@ -0,0 +1,1240 @@ +/** + * output.c -- output to the standard output stream + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana <hello @ goaccess.io> + * + * 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. + */ + +#define _LARGEFILE_SOURCE +#define _LARGEFILE64_SOURCE +#define _FILE_OFFSET_BITS 64 + +#include <errno.h> +#include <ctype.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "output.h" + +#ifdef HAVE_LIBTOKYOCABINET +#include "tcabdb.h" +#else +#include "gkhash.h" +#endif + +#include "error.h" +#include "gwsocket.h" +#include "json.h" +#include "settings.h" +#include "ui.h" +#include "util.h" +#include "xmalloc.h" + +#include "tpls.h" +#include "bootstrapcss.h" +#include "facss.h" +#include "appcss.h" +#include "d3js.h" +#include "hoganjs.h" +#include "chartsjs.h" +#include "appjs.h" + +static void hits_bw_plot (FILE * fp, GHTMLPlot plot, int sp); +static void hits_bw_req_plot (FILE * fp, GHTMLPlot plot, int sp); +static void hits_visitors_plot (FILE * fp, GHTMLPlot plot, int sp); +static void hits_visitors_req_plot (FILE * fp, GHTMLPlot plot, int sp); + +static void print_metrics (FILE * fp, const GHTML * def, int sp); +static void print_host_metrics (FILE * fp, const GHTML * def, int sp); + +/* *INDENT-OFF* */ +static GHTML htmldef[] = { + {VISITORS, 1, print_metrics, { + {CHART_AREASPLINE, hits_visitors_plot, 1, 1} , + {CHART_AREASPLINE, hits_bw_plot, 1, 1} , + }}, + {REQUESTS, 1, print_metrics, { + {CHART_VBAR, hits_visitors_req_plot, 0, 0}, + {CHART_VBAR, hits_bw_req_plot, 0, 0}, + }}, + {REQUESTS_STATIC, 1, print_metrics, { + {CHART_VBAR, hits_visitors_req_plot, 0, 0}, + {CHART_VBAR, hits_bw_req_plot, 0, 0}, + }}, + {NOT_FOUND, 1, print_metrics, { + {CHART_VBAR, hits_visitors_req_plot, 0, 0}, + {CHART_VBAR, hits_bw_req_plot, 0, 0}, + }}, + {HOSTS, 1, print_host_metrics, { + {CHART_VBAR, hits_visitors_plot, 0, 0}, + {CHART_VBAR, hits_bw_plot, 0, 0}, + }}, + {OS, 1, print_metrics, { + {CHART_VBAR, hits_visitors_plot, 0, 1}, + {CHART_VBAR, hits_bw_plot, 0, 1}, + }}, + {BROWSERS, 1, print_metrics, { + {CHART_VBAR, hits_visitors_plot, 0, 1}, + {CHART_VBAR, hits_bw_plot, 0, 1}, + }}, + {VISIT_TIMES, 1, print_metrics, { + {CHART_AREASPLINE, hits_visitors_plot, 0, 1}, + {CHART_AREASPLINE, hits_bw_plot, 0, 1}, + }}, + {VIRTUAL_HOSTS, 1, print_metrics, { + {CHART_VBAR, hits_visitors_plot, 0, 0}, + {CHART_VBAR, hits_bw_plot, 0, 0}, + }}, + {REFERRERS, 1, print_metrics, { + {CHART_VBAR, hits_visitors_plot, 0, 0}, + {CHART_VBAR, hits_bw_plot, 0, 0}, + }}, + {REFERRING_SITES, 1, print_metrics, { + {CHART_VBAR, hits_visitors_plot, 0, 0}, + {CHART_VBAR, hits_bw_plot, 0, 0}, + }}, + {KEYPHRASES, 1, print_metrics, { + {CHART_VBAR, hits_visitors_plot, 0, 0}, + {CHART_VBAR, hits_bw_plot, 0, 0}, + }}, + {STATUS_CODES, 1, print_metrics, { + {CHART_VBAR, hits_visitors_plot, 0, 1}, + {CHART_VBAR, hits_bw_plot, 0, 1}, + }}, + {REMOTE_USER, 1, print_metrics, { + {CHART_VBAR, hits_visitors_plot, 0, 0}, + {CHART_VBAR, hits_bw_plot, 0, 0}, + }}, +#ifdef HAVE_GEOLOCATION + {GEO_LOCATION, 1, print_metrics, { + {CHART_VBAR, hits_visitors_plot, 0, 1}, + {CHART_VBAR, hits_bw_plot, 0, 1}, + }}, +#endif +}; +/* *INDENT-ON* */ + +/* number of new lines (applicable fields) */ +static int nlines = 0; + +/* Get the chart type for the JSON definition. + * + * On success, the chart type string is returned. */ +static const char * +chart2str (GChartType type) +{ + static const char *strings[] = { "null", "bar", "area-spline" }; + return strings[type]; +} + +/* Get panel output data for the given module. + * + * If not found, NULL is returned. + * On success, panel data is returned . */ +static GHTML * +panel_lookup (GModule module) +{ + int i, num_panels = ARRAY_SIZE (htmldef); + + for (i = 0; i < num_panels; i++) { + if (htmldef[i].module == module) + return &htmldef[i]; + } + return NULL; +} + +/* Sanitize output with html entities for special chars */ +static void +clean_output (FILE * fp, char *s) +{ + if (!s) { + LOG_DEBUG (("NULL data on clean_output.\n")); + return; + } + + while (*s) { + switch (*s) { + case '\'': + fprintf (fp, "'"); + break; + case '"': + fprintf (fp, """); + break; + case '&': + fprintf (fp, "&"); + break; + case '<': + fprintf (fp, "<"); + break; + case '>': + fprintf (fp, ">"); + break; + case ' ': + fprintf (fp, " "); + break; + default: + fputc (*s, fp); + break; + } + s++; + } +} + +/* Set the HTML document title and the generated date/time */ +static void +print_html_title (FILE * fp) +{ + const char *title = + conf.html_report_title ? conf.html_report_title : HTML_REPORT_TITLE; + + fprintf (fp, "<title>"); + clean_output (fp, (char *) title); + fprintf (fp, ""); +} + +/* *INDENT-OFF* */ +/* Output all the document head elements. */ +static void +print_html_header (FILE * fp) +{ + fprintf (fp, + "" + "" + "" + "" + "" + "" + "" + "" + "", _(DOC_LANG)); + + print_html_title (fp); + + fprintf (fp, "", fa_css); + fprintf (fp, "", bootstrap_css); + fprintf (fp, "", app_css); + /* load custom CSS file, if any */ + if (conf.html_custom_css) + fprintf (fp, "", conf.html_custom_css); + + fprintf (fp, + "" + ""); +} + +/* Output all structural elements of the HTML document. */ +static void +print_html_body (FILE * fp, const char *now) +{ + fprintf (fp, + "

" + + "" + "
" + "
" + "
" + "
" + "" + "
" + "
" + "
" + "
" + "
" + "
", conf.html_report_title ? conf.html_report_title : ""); + + fprintf (fp, "%s", tpls); +} + +/* Output all the document footer elements such as script and closing + * tags. */ +static void +print_html_footer (FILE * fp) +{ + fprintf (fp, "", d3_js); + fprintf (fp, "", hogan_js); + fprintf (fp, "", app_js); + fprintf (fp, "", charts_js); + + /* load custom JS file, if any */ + if (conf.html_custom_js) + fprintf (fp, "", conf.html_custom_js); + + fprintf (fp, ""); + fprintf (fp, ""); +} +/* *INDENT-ON* */ + +static const GChartDef ChartDefStopper = { NULL, NULL }; + +/* Get the number of chart definitions per panel. + * + * The number of chart definitions is returned . */ +static int +get_chartdef_cnt (GChart * chart) +{ + GChartDef *def = chart->def; + + while (memcmp (def, &ChartDefStopper, sizeof ChartDefStopper)) + ++def; + + return def - chart->def; +} + +/* Output the given JSON chart axis definition for the given panel. */ +static void +print_d3_chart_def_axis (FILE * fp, GChart * chart, size_t cnt, int isp) +{ + GChartDef *def = chart->def; + size_t j = 0; + + for (j = 0; j < cnt; ++j) { + if (strchr (def[j].value, '[') != NULL) + fpskeyaval (fp, def[j].key, def[j].value, isp, j == cnt - 1); + else + fpskeysval (fp, def[j].key, def[j].value, isp, j == cnt - 1); + } +} + +/* Output the given JSON chart definition for the given panel. */ +static void +print_d3_chart_def (FILE * fp, GChart * chart, size_t n, int sp) +{ + size_t i = 0, cnt = 0; + int isp = 0; + + /* use tabs to prettify output */ + if (conf.json_pretty_print) + isp = sp + 1; + + for (i = 0; i < n; ++i) { + cnt = get_chartdef_cnt (chart + i); + + fpopen_obj_attr (fp, chart[i].key, sp); + print_d3_chart_def_axis (fp, chart + i, cnt, isp); + fpclose_obj (fp, sp, (i == n - 1)); + } +} + +static void +print_plot_def (FILE * fp, const GHTMLPlot plot, GChart * chart, int n, int sp) +{ + int isp = 0, iisp = 0; + + /* use tabs to prettify output */ + if (conf.json_pretty_print) + isp = sp + 1, iisp = sp + 2; + + fpskeysval (fp, "className", plot.chart_key, isp, 0); + fpskeysval (fp, "label", plot.chart_lbl, isp, 0); + fpskeysval (fp, "chartType", chart2str (plot.chart_type), isp, 0); + fpskeyival (fp, "chartReverse", plot.chart_reverse, isp, 0); + fpskeyival (fp, "redrawOnExpand", plot.redraw_expand, isp, 0); + + /* D3.js data */ + fpopen_obj_attr (fp, "d3", isp); + /* print chart definitions */ + print_d3_chart_def (fp, chart, n, iisp); + /* close D3 */ + fpclose_obj (fp, isp, 1); +} + +/* Output D3.js hits/visitors plot definitions. */ +static void +hits_visitors_plot (FILE * fp, GHTMLPlot plot, int sp) +{ + /* *INDENT-OFF* */ + GChart def[] = { + {"y0", (GChartDef[]) { + {"key", "hits"}, {"label", MTRC_HITS_LBL}, ChartDefStopper + }}, + {"y1", (GChartDef[]) { + {"key", "visitors"}, {"label", MTRC_VISITORS_LBL}, ChartDefStopper + }}, + }; + + plot.chart_key = (char[]) {"hits-visitors"}; + plot.chart_lbl = (char *) {HTML_PLOT_HITS_VIS}; + /* *INDENT-ON* */ + print_plot_def (fp, plot, def, ARRAY_SIZE (def), sp); +} + +/* Output D3.js hits/visitors plot definitions. */ +static void +hits_visitors_req_plot (FILE * fp, GHTMLPlot plot, int sp) +{ + /* *INDENT-OFF* */ + GChart def[] = { + {"x", (GChartDef[]) { + {"key", "[\"method\", \"data\", \"protocol\"]"}, ChartDefStopper + }}, + {"y0", (GChartDef[]) { + {"key", "hits"}, {"label", MTRC_HITS_LBL}, ChartDefStopper + }}, + {"y1", (GChartDef[]) { + {"key", "visitors"}, {"label", MTRC_VISITORS_LBL}, ChartDefStopper + }}, + }; + + plot.chart_key = (char[]) {"hits-visitors"}; + plot.chart_lbl = (char *) {HTML_PLOT_HITS_VIS}; + /* *INDENT-ON* */ + print_plot_def (fp, plot, def, ARRAY_SIZE (def), sp); +} + +/* Output C3.js bandwidth plot definitions. */ +static void +hits_bw_plot (FILE * fp, GHTMLPlot plot, int sp) +{ + /* *INDENT-OFF* */ + GChart def[] = { + {"y0", (GChartDef[]) { + {"key", "bytes"}, {"label", MTRC_BW_LBL}, {"format", "bytes"}, ChartDefStopper + }}, + }; + + if (!conf.bandwidth) + return; + + plot.chart_key = (char[]) {"bandwidth"}; + plot.chart_lbl = (char *) {MTRC_BW_LBL}; + /* *INDENT-ON* */ + print_plot_def (fp, plot, def, ARRAY_SIZE (def), sp); +} + +/* Output C3.js bandwidth plot definitions. */ +static void +hits_bw_req_plot (FILE * fp, GHTMLPlot plot, int sp) +{ + /* *INDENT-OFF* */ + GChart def[] = { + {"x", (GChartDef[]) { + {"key", "[\"method\", \"protocol\", \"data\"]"}, ChartDefStopper + }}, + {"y0", (GChartDef[]) { + {"key", "bytes"}, {"label", MTRC_BW_LBL}, {"format", "bytes"}, ChartDefStopper + }}, + }; + + if (!conf.bandwidth) + return; + + plot.chart_key = (char[]) {"bandwidth"}; + plot.chart_lbl = (char *) {MTRC_BW_LBL}; + /* *INDENT-ON* */ + print_plot_def (fp, plot, def, ARRAY_SIZE (def), sp); +} + +/* Output JSON data definitions. */ +static void +print_json_data (FILE * fp, GLog * glog, GHolder * holder) +{ + char *json = NULL; + + if ((json = get_json (glog, holder, 1)) == NULL) + return; + + fprintf (fp, ""); + + free (json); +} + +/* Output WebSocket connection definition. */ +static void +print_conn_def (FILE * fp) +{ + int sp = 0; + /* use tabs to prettify output */ + if (conf.json_pretty_print) + sp += 1; + + if (!conf.real_time_html) + return; + + fprintf (fp, ""); +} + +/* Output JSON per panel metric definitions. */ +static void +print_def_metric (FILE * fp, const GDefMetric def, int sp) +{ + int isp = 0; + + /* use tabs to prettify output */ + if (conf.json_pretty_print) + isp = sp + 1; + + if (def.cname) + fpskeysval (fp, "className", def.cname, isp, 0); + if (def.cwidth) + fpskeysval (fp, "colWidth", def.cwidth, isp, 0); + if (def.metakey) + fpskeysval (fp, "meta", def.metakey, isp, 0); + if (def.metatype) + fpskeysval (fp, "metaType", def.metatype, isp, 0); + if (def.metalbl) + fpskeysval (fp, "metaLabel", def.metalbl, isp, 0); + if (def.datatype) + fpskeysval (fp, "dataType", def.datatype, isp, 0); + if (def.datakey) + fpskeysval (fp, "key", def.datakey, isp, 0); + if (def.lbl) + fpskeysval (fp, "label", def.lbl, isp, 1); +} + +/* Output JSON metric definition block. */ +static void +print_def_block (FILE * fp, const GDefMetric def, int sp, int last) +{ + fpopen_obj (fp, sp); + print_def_metric (fp, def, sp); + fpclose_obj (fp, sp, last); +} + +/* Output JSON overall requests definition block. */ +static void +print_def_overall_requests (FILE * fp, int sp) +{ + GDefMetric def = { + .lbl = T_REQUESTS, + .datatype = "numeric", + .cname = "black" + }; + fpopen_obj_attr (fp, OVERALL_REQ, sp); + print_def_metric (fp, def, sp); + fpclose_obj (fp, sp, 0); +} + +/* Output JSON overall valid requests definition block. */ +static void +print_def_overall_valid_reqs (FILE * fp, int sp) +{ + GDefMetric def = { + .lbl = T_VALID, + .datatype = "numeric", + .cname = "green" + }; + fpopen_obj_attr (fp, OVERALL_VALID, sp); + print_def_metric (fp, def, sp); + fpclose_obj (fp, sp, 0); +} + +/* Output JSON overall invalid requests definition block. */ +static void +print_def_overall_invalid_reqs (FILE * fp, int sp) +{ + GDefMetric def = { + .lbl = T_FAILED, + .datatype = "numeric", + .cname = "red" + }; + fpopen_obj_attr (fp, OVERALL_FAILED, sp); + print_def_metric (fp, def, sp); + fpclose_obj (fp, sp, 0); +} + +/* Output JSON process time definition block. */ +static void +print_def_overall_processed_time (FILE * fp, int sp) +{ + GDefMetric def = { + .lbl = T_GEN_TIME, + .datatype = "secs", + .cname = "gray" + }; + fpopen_obj_attr (fp, OVERALL_GENTIME, sp); + print_def_metric (fp, def, sp); + fpclose_obj (fp, sp, 0); +} + +/* Output JSON overall visitors definition block. */ +static void +print_def_overall_visitors (FILE * fp, int sp) +{ + GDefMetric def = { + .lbl = T_UNIQUE_VISITORS, + .datatype = "numeric", + .cname = "blue" + }; + fpopen_obj_attr (fp, OVERALL_VISITORS, sp); + print_def_metric (fp, def, sp); + fpclose_obj (fp, sp, 0); +} + +/* Output JSON overall files definition block. */ +static void +print_def_overall_files (FILE * fp, int sp) +{ + GDefMetric def = { + .lbl = T_UNIQUE_FILES, + .datatype = "numeric", + }; + fpopen_obj_attr (fp, OVERALL_FILES, sp); + print_def_metric (fp, def, sp); + fpclose_obj (fp, sp, 0); +} + +/* Output JSON overall excluded requests definition block. */ +static void +print_def_overall_excluded (FILE * fp, int sp) +{ + GDefMetric def = { + .lbl = T_EXCLUDE_IP, + .datatype = "numeric", + }; + fpopen_obj_attr (fp, OVERALL_EXCL_HITS, sp); + print_def_metric (fp, def, sp); + fpclose_obj (fp, sp, 0); +} + +/* Output JSON overall referrers definition block. */ +static void +print_def_overall_refs (FILE * fp, int sp) +{ + GDefMetric def = { + .lbl = T_REFERRER, + .datatype = "numeric", + }; + fpopen_obj_attr (fp, OVERALL_REF, sp); + print_def_metric (fp, def, sp); + fpclose_obj (fp, sp, 0); +} + +/* Output JSON overall not found definition block. */ +static void +print_def_overall_notfound (FILE * fp, int sp) +{ + GDefMetric def = { + .lbl = T_UNIQUE404, + .datatype = "numeric", + }; + fpopen_obj_attr (fp, OVERALL_NOTFOUND, sp); + print_def_metric (fp, def, sp); + fpclose_obj (fp, sp, 0); +} + +/* Output JSON overall static files definition block. */ +static void +print_def_overall_static_files (FILE * fp, int sp) +{ + GDefMetric def = { + .lbl = T_STATIC_FILES, + .datatype = "numeric", + }; + fpopen_obj_attr (fp, OVERALL_STATIC, sp); + print_def_metric (fp, def, sp); + fpclose_obj (fp, sp, 0); +} + +/* Output JSON log size definition block. */ +static void +print_def_overall_log_size (FILE * fp, int sp) +{ + GDefMetric def = { + .lbl = T_LOG, + .datatype = "bytes", + }; + fpopen_obj_attr (fp, OVERALL_LOGSIZE, sp); + print_def_metric (fp, def, sp); + fpclose_obj (fp, sp, 0); +} + +/* Output JSON overall bandwidth definition block. */ +static void +print_def_overall_bandwidth (FILE * fp, int sp) +{ + GDefMetric def = { + .lbl = T_BW, + .datatype = "bytes", + }; + fpopen_obj_attr (fp, OVERALL_BANDWIDTH, sp); + print_def_metric (fp, def, sp); + fpclose_obj (fp, sp, 1); +} + +/* Output JSON hits definition block. */ +static void +print_def_hits (FILE * fp, int sp) +{ + GDefMetric def = { + .datakey = "hits", + .lbl = MTRC_HITS_LBL, + .datatype = "numeric", + .metakey = "count", + .cwidth = "12%", + }; + print_def_block (fp, def, sp, 0); +} + +/* Output JSON visitors definition block. */ +static void +print_def_visitors (FILE * fp, int sp) +{ + GDefMetric def = { + .datakey = "visitors", + .lbl = MTRC_VISITORS_LBL, + .datatype = "numeric", + .metakey = "count", + .cwidth = "12%", + }; + print_def_block (fp, def, sp, 0); +} + +/* Output JSON bandwidth definition block. */ +static void +print_def_bw (FILE * fp, int sp) +{ + GDefMetric def = { + .datakey = "bytes", + .lbl = MTRC_BW_LBL, + .datatype = "bytes", + .metakey = "count", + .cwidth = "12%", + }; + + if (!conf.bandwidth) + return; + + print_def_block (fp, def, sp, 0); +} + +/* Output JSON Avg. T.S. definition block. */ +static void +print_def_avgts (FILE * fp, int sp) +{ + GDefMetric def = { + .datakey = "avgts", + .lbl = MTRC_AVGTS_LBL, + .datatype = "utime", + .metakey = "avg", + .cwidth = "8%", + }; + + if (!conf.serve_usecs) + return; + + print_def_block (fp, def, sp, 0); +} + +/* Output JSON Cum. T.S. definition block. */ +static void +print_def_cumts (FILE * fp, int sp) +{ + GDefMetric def = { + .datakey = "cumts", + .lbl = MTRC_CUMTS_LBL, + .datatype = "utime", + .metakey = "count", + .cwidth = "8%", + }; + + if (!conf.serve_usecs) + return; + + print_def_block (fp, def, sp, 0); +} + +/* Output JSON Max. T.S. definition block. */ +static void +print_def_maxts (FILE * fp, int sp) +{ + GDefMetric def = { + .datakey = "maxts", + .lbl = MTRC_MAXTS_LBL, + .datatype = "utime", + .metakey = "count", + .cwidth = "8%", + }; + + if (!conf.serve_usecs) + return; + print_def_block (fp, def, sp, 0); +} + +/* Output JSON method definition block. */ +static void +print_def_method (FILE * fp, int sp) +{ + GDefMetric def = { + .datakey = "method", + .lbl = MTRC_METHODS_LBL, + .datatype = "string", + .cwidth = "6%", + }; + + if (!conf.append_method) + return; + + print_def_block (fp, def, sp, 0); +} + +/* Output JSON protocol definition block. */ +static void +print_def_protocol (FILE * fp, int sp) +{ + GDefMetric def = { + .datakey = "protocol", + .lbl = MTRC_PROTOCOLS_LBL, + .datatype = "string", + .cwidth = "7%", + }; + + if (!conf.append_protocol) + return; + + print_def_block (fp, def, sp, 0); +} + +/* Output JSON city definition block. */ +static void +print_def_city (FILE * fp, int sp) +{ + GDefMetric def = { + .datakey = "city", + .lbl = MTRC_CITY_LBL, + .datatype = "string", + }; + + if (!conf.has_geocity) + return; + + print_def_block (fp, def, sp, 0); +} + +/* Output JSON country definition block. */ +static void +print_def_country (FILE * fp, int sp) +{ + GDefMetric def = { + .datakey = "country", + .lbl = MTRC_COUNTRY_LBL, + .datatype = "string", + }; + + if (!conf.has_geocountry) + return; + + print_def_block (fp, def, sp, 0); +} + +/* Output JSON hostname definition block. */ +static void +print_def_hostname (FILE * fp, int sp) +{ + GDefMetric def = { + .datakey = "hostname", + .lbl = MTRC_HOSTNAME_LBL, + .datatype = "string", + .cname = "light", + }; + + if (!conf.enable_html_resolver) + return; + + print_def_block (fp, def, sp, 0); +} + +/* Output JSON data definition block. */ +static void +print_def_data (FILE * fp, GModule module, int sp) +{ + GDefMetric def = { + .cname = "trunc", + .cwidth = "100%", + .datakey = "data", + .datatype = module == VISITORS ? "date" : "string", + .lbl = MTRC_DATA_LBL, + .metakey = "unique", + .metalbl = "Total", + .metatype = "numeric", + }; + + print_def_block (fp, def, sp, 1); +} + +/* Get the number of plots for the given panel definition. + * + * The number of plots for the given panel is returned. */ +static int +count_plot_fp (const GHTML * def) +{ + int i = 0; + for (i = 0; def->chart[i].plot != 0; ++i); + return i; +} + +/* Entry function to output JSON plot definition block. */ +static void +print_def_plot (FILE * fp, const GHTML * def, int sp) +{ + int i, isp = 0, n = count_plot_fp (def); + /* use tabs to prettify output */ + if (conf.json_pretty_print) + isp = sp + 1; + + fpopen_arr_attr (fp, "plot", sp); + + for (i = 0; i < n; ++i) { + fpopen_obj (fp, isp); + def->chart[i].plot (fp, def->chart[i], isp); + fpclose_obj (fp, isp, (i == n - 1)); + } + + fpclose_arr (fp, sp, 0); +} + +/* Output JSON host panel definitions. */ +static void +print_host_metrics (FILE * fp, const GHTML * def, int sp) +{ + const GOutput *output = output_lookup (def->module); + + print_def_hits (fp, sp); + print_def_visitors (fp, sp); + print_def_bw (fp, sp); + print_def_avgts (fp, sp); + print_def_cumts (fp, sp); + print_def_maxts (fp, sp); + + if (output->method) + print_def_method (fp, sp); + if (output->protocol) + print_def_protocol (fp, sp); + + print_def_city (fp, sp); + print_def_country (fp, sp); + print_def_hostname (fp, sp); + + print_def_data (fp, def->module, sp); +} + +/* Output JSON panel definitions. */ +static void +print_metrics (FILE * fp, const GHTML * def, int sp) +{ + const GOutput *output = output_lookup (def->module); + + print_def_hits (fp, sp); + print_def_visitors (fp, sp); + print_def_bw (fp, sp); + print_def_avgts (fp, sp); + print_def_cumts (fp, sp); + print_def_maxts (fp, sp); + + if (output->method) + print_def_method (fp, sp); + if (output->protocol) + print_def_protocol (fp, sp); + + print_def_data (fp, def->module, sp); +} + +/* Entry point to output JSON metric definitions. */ +static void +print_def_metrics (FILE * fp, const GHTML * def, int sp) +{ + int isp = 0; + /* use tabs to prettify output */ + if (conf.json_pretty_print) + isp = sp + 1; + + /* open data metric data */ + fpopen_arr_attr (fp, "items", sp); + /* definition metrics */ + def->metrics (fp, def, isp); + /* close metrics block */ + fpclose_arr (fp, sp, 1); +} + +/* Output panel header and description metadata definitions. */ +static void +print_def_meta (FILE * fp, const char *head, const char *desc, int sp) +{ + int isp = 0; + /* use tabs to prettify output */ + if (conf.json_pretty_print) + isp = sp + 1; + + fpskeysval (fp, "head", head, isp, 0); + fpskeysval (fp, "desc", desc, isp, 0); +} + +/* Output panel sort metadata definitions. */ +static void +print_def_sort (FILE * fp, const GHTML * def, int sp) +{ + GSort sort = module_sort[def->module]; + int isp = 0; + /* use tabs to prettify output */ + if (conf.json_pretty_print) + isp = sp + 1; + + /* output open sort attribute */ + fpopen_obj_attr (fp, "sort", sp); + fpskeysval (fp, "field", get_sort_field_key (sort.field), isp, 0); + fpskeysval (fp, "order", get_sort_order_str (sort.sort), isp, 1); + /* output close sort attribute */ + fpclose_obj (fp, sp, 0); +} + +/* Output panel metadata definitions. */ +static void +print_panel_def_meta (FILE * fp, const GHTML * def, int sp) +{ + const char *desc = module_to_desc (def->module); + const char *head = module_to_head (def->module); + const char *id = module_to_id (def->module); + + int isp = 0; + /* use tabs to prettify output */ + if (conf.json_pretty_print) + isp = sp + 1; + + print_def_meta (fp, head, desc, sp); + + fpskeysval (fp, "id", id, isp, 0); + fpskeyival (fp, "table", def->table, isp, 0); + + print_def_sort (fp, def, isp); + print_def_plot (fp, def, isp); + print_def_metrics (fp, def, isp); +} + +/* Output definitions for the given panel. */ +static void +print_json_def (FILE * fp, const GHTML * def) +{ + int sp = 0; + /* use tabs to prettify output */ + if (conf.json_pretty_print) + sp = 1; + + /* output open panel attribute */ + fpopen_obj_attr (fp, module_to_id (def->module), sp); + /* output panel data definitions */ + print_panel_def_meta (fp, def, sp); + /* output close panel attribute */ + fpclose_obj (fp, sp, 1); + + fpjson (fp, (def->module != TOTAL_MODULES - 1) ? ",%.*s" : "%.*s", nlines, + NL); +} + +/* Output overall definitions. */ +static void +print_def_summary (FILE * fp, int sp) +{ + int isp = 0, iisp = 0; + /* use tabs to prettify output */ + if (conf.json_pretty_print) + isp = sp + 1, iisp = sp + 2; + + /* open metrics block */ + fpopen_obj_attr (fp, "items", isp); + + print_def_overall_requests (fp, iisp); + print_def_overall_valid_reqs (fp, iisp); + print_def_overall_invalid_reqs (fp, iisp); + print_def_overall_processed_time (fp, iisp); + print_def_overall_visitors (fp, iisp); + print_def_overall_files (fp, iisp); + print_def_overall_excluded (fp, iisp); + print_def_overall_refs (fp, iisp); + print_def_overall_notfound (fp, iisp); + print_def_overall_static_files (fp, iisp); + print_def_overall_log_size (fp, iisp); + print_def_overall_bandwidth (fp, iisp); + + /* close metrics block */ + fpclose_obj (fp, isp, 1); +} + +/* Cheap JSON internationalisation (i18n) - report labels */ +static void +print_json_i18n_def (FILE * fp) +{ + int sp = 0; + size_t i = 0; + + /* *INDENT-OFF* */ + static const char *json_i18n[][2] = { + {"theme" , HTML_REPORT_NAV_THEME} , + {"dark_gray" , HTML_REPORT_NAV_DARK_GRAY} , + {"bright" , HTML_REPORT_NAV_BRIGHT} , + {"dark_blue" , HTML_REPORT_NAV_DARK_BLUE} , + {"dark_purple" , HTML_REPORT_NAV_DARK_PURPLE} , + {"panels" , HTML_REPORT_NAV_PANELS} , + {"items_per_page" , HTML_REPORT_NAV_ITEMS_PER_PAGE} , + {"tables" , HTML_REPORT_NAV_TABLES} , + {"display_tables" , HTML_REPORT_NAV_DISPLAY_TABLES} , + {"ah_small" , HTML_REPORT_NAV_AH_SMALL} , + {"ah_small_title" , HTML_REPORT_NAV_AH_SMALL_TITLE} , + {"layout" , HTML_REPORT_NAV_LAYOUT} , + {"horizontal" , HTML_REPORT_NAV_HOR} , + {"vertical" , HTML_REPORT_NAV_VER} , + {"file_opts" , HTML_REPORT_NAV_FILE_OPTS} , + {"export_json" , HTML_REPORT_NAV_EXPORT_JSON} , + {"panel_opts" , HTML_REPORT_PANEL_PANEL_OPTS} , + {"previous" , HTML_REPORT_PANEL_PREVIOUS} , + {"next" , HTML_REPORT_PANEL_NEXT} , + {"first" , HTML_REPORT_PANEL_FIRST} , + {"last" , HTML_REPORT_PANEL_LAST} , + {"chart_opts" , HTML_REPORT_PANEL_CHART_OPTS} , + {"chart" , HTML_REPORT_PANEL_CHART} , + {"type" , HTML_REPORT_PANEL_TYPE} , + {"area_spline" , HTML_REPORT_PANEL_AREA_SPLINE} , + {"bar" , HTML_REPORT_PANEL_BAR} , + {"plot_metric" , HTML_REPORT_PANEL_PLOT_METRIC} , + {"table_columns" , HTML_REPORT_PANEL_TABLE_COLS} , + {"thead" , T_HEAD} , + {"version" , GO_VERSION} , + }; + /* *INDENT-ON* */ + + /* use tabs to prettify output */ + if (conf.json_pretty_print) + sp = 1; + + fpopen_obj (fp, 0); + for (i = 0; i < ARRAY_SIZE (json_i18n); ++i) { + fpskeysval (fp, json_i18n[i][0], _(json_i18n[i][1]), sp, 0); + } + fpclose_obj (fp, 0, 1); +} + +/* Output definitions for the given panel. */ +static void +print_json_def_summary (FILE * fp) +{ + int sp = 0; + + /* use tabs to prettify output */ + if (conf.json_pretty_print) + sp = 1; + + /* output open panel attribute */ + fpopen_obj_attr (fp, GENER_ID, sp); + print_def_meta (fp, _(T_HEAD), "", sp); + print_def_summary (fp, sp); + /* output close panel attribute */ + fpclose_obj (fp, sp, 0); +} + +/* Entry point to output definitions for all panels. */ +static void +print_json_defs (FILE * fp) +{ + const GHTML *def; + size_t idx = 0; + + fprintf (fp, ""); +} + +/* entry point to generate a report writing it to the fp */ +void +output_html (GLog * glog, GHolder * holder, const char *filename) +{ + FILE *fp; + char now[DATE_TIME]; + + if (filename != NULL) + fp = fopen (filename, "w"); + else + fp = stdout; + + if (!fp) + FATAL ("Unable to open HTML file: %s.", strerror (errno)); + + /* use new lines to prettify output */ + if (conf.json_pretty_print) + nlines = 1; + set_json_nlines (nlines); + + generate_time (); + strftime (now, DATE_TIME, "%Y-%m-%d %H:%M:%S %z", now_tm); + + print_html_header (fp); + + print_html_body (fp, now); + print_json_defs (fp); + print_json_data (fp, glog, holder); + print_conn_def (fp); + + print_html_footer (fp); + + fclose (fp); +} diff --git a/goaccess++/src/output.h b/goaccess++/src/output.h new file mode 100644 index 0000000..35468f0 --- /dev/null +++ b/goaccess++/src/output.h @@ -0,0 +1,99 @@ +/** + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana + * + * 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. + */ + +#if HAVE_CONFIG_H +#include +#endif + +#ifndef OUTPUT_H_INCLUDED +#define OUTPUT_H_INCLUDED + +#define MAX_PLOTS 5 /* number of metrics we can plot */ + +#include "commons.h" +#include "parser.h" + +/* Enumerated chart types */ +typedef enum GChartType_ +{ + CHART_NONE, + CHART_VBAR, + CHART_AREASPLINE, +} GChartType; + +/* Chart axis structure */ +typedef struct GChartDef_ +{ + const char *key; + const char *value; +} GChartDef; + +/* Chart axis structure */ +typedef struct GChart_ +{ + const char *key; + GChartDef *def; +} GChart; + +/* Chart behavior */ +typedef struct GHTMLPlot_ +{ + GChartType chart_type; + void (*plot) (FILE * fp, struct GHTMLPlot_ plot, int sp); + int8_t chart_reverse; + int8_t redraw_expand; + char *chart_key; + char *chart_lbl; +} GHTMLPlot; + +/* Controls HTML panel output. */ +typedef struct GHTML_ +{ + GModule module; + int8_t table; + void (*metrics) (FILE * fp, const struct GHTML_ * def, int sp); + GHTMLPlot chart[MAX_PLOTS]; +} GHTML; + +/* Metric definition . */ +typedef struct GDefMetric_ +{ + const char *cname; /* metric class name */ + const char *cwidth; /* metric column width */ + const char *datakey; /* metric JSON data key */ + const char *datatype; /* metric data value type */ + const char *lbl; /* metric label (column name) */ + const char *metakey; /* metric JSON meta key */ + const char *metatype; /* metric meta value type */ + const char *metalbl; /* metric meta value label */ +} GDefMetric; + +void output_html (GLog * glog, GHolder * holder, const char *filename); + +#endif diff --git a/goaccess++/src/output.o b/goaccess++/src/output.o new file mode 100644 index 0000000000000000000000000000000000000000..016c740616043e524c95238b452bb3874569f1f6 GIT binary patch literal 361872 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

QW;zR(*B928+u7J`vbY5x-ZMQ! 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

-BUqXCex_`1o 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 jt$TzL+gfew*`b5RwEH_H-HB$aR*Z= + * + * 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. + */ + +/* + * "_XOPEN_SOURCE" is required for the GNU libc to export "strptime(3)" + * correctly. + */ +#define _LARGEFILE_SOURCE +#define _LARGEFILE64_SOURCE +#define _FILE_OFFSET_BITS 64 + +#define _XOPEN_SOURCE 700 + +#include +#include + +#if HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_LIBTOKYOCABINET +#include "tcabdb.h" +#include "tcbtdb.h" +#else +#include "gkhash.h" +#endif + +#ifdef HAVE_GEOLOCATION +#include "geoip1.h" +#endif + +#include "parser.h" + +#include "browsers.h" +#include "goaccess.h" +#include "error.h" +#include "opesys.h" +#include "util.h" +#include "xmalloc.h" + +/* private prototypes */ +/* key/data generators for each module */ +static int gen_visitor_key (GKeyData * kdata, GLogItem * logitem); +static int gen_404_key (GKeyData * kdata, GLogItem * logitem); +static int gen_browser_key (GKeyData * kdata, GLogItem * logitem); +static int gen_host_key (GKeyData * kdata, GLogItem * logitem); +static int gen_keyphrase_key (GKeyData * kdata, GLogItem * logitem); +static int gen_os_key (GKeyData * kdata, GLogItem * logitem); +static int gen_vhost_key (GKeyData * kdata, GLogItem * logitem); +static int gen_remote_user_key (GKeyData * kdata, GLogItem * logitem); +static int gen_referer_key (GKeyData * kdata, GLogItem * logitem); +static int gen_ref_site_key (GKeyData * kdata, GLogItem * logitem); +static int gen_request_key (GKeyData * kdata, GLogItem * logitem); +static int gen_static_request_key (GKeyData * kdata, GLogItem * logitem); +static int gen_status_code_key (GKeyData * kdata, GLogItem * logitem); +static int gen_visit_time_key (GKeyData * kdata, GLogItem * logitem); +#ifdef HAVE_GEOLOCATION +static int gen_geolocation_key (GKeyData * kdata, GLogItem * logitem); +#endif + +/* insertion routines */ +static void insert_data (int data_nkey, const char *data, GModule module); +static void insert_rootmap (int root_nkey, const char *root, GModule module); + +/* insertion metric routines */ +static void insert_hit (int data_nkey, GModule module); +static void insert_visitor (int uniq_nkey, GModule module); +static void insert_bw (int data_nkey, uint64_t size, GModule module); +static void insert_cumts (int data_nkey, uint64_t ts, GModule module); +static void insert_maxts (int data_nkey, uint64_t ts, GModule module); +static void insert_method (int data_nkey, const char *method, GModule module); +static void insert_protocol (int data_nkey, const char *proto, GModule module); +static void insert_agent (int data_nkey, int agent_nkey, GModule module); + +/* *INDENT-OFF* */ +static GParse paneling[] = { + { + VISITORS, + gen_visitor_key, + insert_data, + NULL, + insert_hit, + insert_visitor, + insert_bw, + insert_cumts, + insert_maxts, + NULL, + NULL, + NULL, + }, { + REQUESTS, + gen_request_key, + insert_data, + NULL, + insert_hit, + insert_visitor, + insert_bw, + insert_cumts, + insert_maxts, + insert_method, + insert_protocol, + NULL, + }, { + REQUESTS_STATIC, + gen_static_request_key, + insert_data, + NULL, + insert_hit, + insert_visitor, + insert_bw, + insert_cumts, + insert_maxts, + insert_method, + insert_protocol, + NULL, + }, { + NOT_FOUND, + gen_404_key, + insert_data, + NULL, + insert_hit, + insert_visitor, + insert_bw, + insert_cumts, + insert_maxts, + insert_method, + insert_protocol, + NULL, + }, { + HOSTS, + gen_host_key, + insert_data, + NULL, + insert_hit, + insert_visitor, + insert_bw, + insert_cumts, + insert_maxts, + NULL, + NULL, + insert_agent, + }, { + OS, + gen_os_key, + insert_data, + insert_rootmap, + insert_hit, + insert_visitor, + insert_bw, + insert_cumts, + insert_maxts, + insert_method, + insert_protocol, + NULL, + }, { + BROWSERS, + gen_browser_key, + insert_data, + insert_rootmap, + insert_hit, + insert_visitor, + insert_bw, + insert_cumts, + insert_maxts, + NULL, + NULL, + NULL, + }, { + REFERRERS, + gen_referer_key, + insert_data, + NULL, + insert_hit, + insert_visitor, + insert_bw, + insert_cumts, + insert_maxts, + NULL, + NULL, + NULL, + }, { + REFERRING_SITES, + gen_ref_site_key, + insert_data, + NULL, + insert_hit, + insert_visitor, + insert_bw, + insert_cumts, + insert_maxts, + NULL, + NULL, + NULL, + }, { + KEYPHRASES, + gen_keyphrase_key, + insert_data, + NULL, + insert_hit, + insert_visitor, + insert_bw, + insert_cumts, + insert_maxts, + NULL, + NULL, + NULL, + }, +#ifdef HAVE_GEOLOCATION + { + GEO_LOCATION, + gen_geolocation_key, + insert_data, + insert_rootmap, + insert_hit, + insert_visitor, + insert_bw, + insert_cumts, + insert_maxts, + NULL, + NULL, + NULL, + }, +#endif + { + STATUS_CODES, + gen_status_code_key, + insert_data, + insert_rootmap, + insert_hit, + insert_visitor, + insert_bw, + insert_cumts, + insert_maxts, + NULL, + NULL, + NULL, + }, { + VISIT_TIMES, + gen_visit_time_key, + insert_data, + NULL, + insert_hit, + insert_visitor, + insert_bw, + insert_cumts, + insert_maxts, + NULL, + NULL, + NULL, + }, { + VIRTUAL_HOSTS, + gen_vhost_key, + insert_data, + NULL, + insert_hit, + insert_visitor, + insert_bw, + insert_cumts, + insert_maxts, + NULL, + NULL, + NULL, + }, { + REMOTE_USER, + gen_remote_user_key, + insert_data, + NULL, + insert_hit, + insert_visitor, + insert_bw, + insert_cumts, + insert_maxts, + NULL, + NULL, + NULL, + }, +}; +/* *INDENT-ON* */ + +/* Initialize a new GKeyData instance */ +static void +new_modulekey (GKeyData * kdata) +{ + GKeyData key = { + .data = NULL, + .data_key = NULL, + .data_nkey = 0, + .root = NULL, + .root_key = NULL, + .root_nkey = 0, + .uniq_key = NULL, + .uniq_nkey = 0, + }; + *kdata = key; +} + +/* Get a panel from the GParse structure given a module. + * + * On error, or if not found, NULL is returned. + * On success, the panel value is returned. */ +static GParse * +panel_lookup (GModule module) +{ + int i, num_panels = ARRAY_SIZE (paneling); + + for (i = 0; i < num_panels; i++) { + if (paneling[i].module == module) + return &paneling[i]; + } + return NULL; +} + +/* Allocate memory for a new GRawData instance. + * + * On success, the newly allocated GRawData is returned . */ +GRawData * +new_grawdata (void) +{ + GRawData *raw_data = xmalloc (sizeof (*raw_data)); + memset (raw_data, 0, sizeof *raw_data); + + return raw_data; +} + +/* Allocate memory for a new GRawDataItem instance. + * + * On success, the newly allocated GRawDataItem is returned . */ +GRawDataItem * +new_grawdata_item (unsigned int size) +{ + GRawDataItem *item = xcalloc (size, sizeof (*item)); + return item; +} + +#ifdef HAVE_LIBTOKYOCABINET +/* This is due to an additional allocation on tokyo's value + * retrieval :( on tcadbget() */ +static void +free_raw_data_str_value (GRawData * raw_data) +{ + int i = 0; + char *str = NULL; + + for (i = 0; i < raw_data->size; ++i) { + str = raw_data->items[i].value.svalue; + if (str) + free (str); + } +} +#endif + +/* Free memory allocated for a GRawData and GRawDataItem instance. */ +void +free_raw_data (GRawData * raw_data) +{ +#ifdef HAVE_LIBTOKYOCABINET + if (raw_data->type == STRING) + free_raw_data_str_value (raw_data); +#endif + free (raw_data->items); + free (raw_data); +} + +/* Reset an instance of GLog structure. */ +void +reset_struct (GLog * glog) +{ + glog->invalid = 0; + glog->processed = 0; + glog->resp_size = 0LL; + glog->valid = 0; +} + +/* Allocate memory for a new GLog instance. + * + * On success, the newly allocated GLog is returned . */ +GLog * +init_log (void) +{ + GLog *glog = xmalloc (sizeof (GLog)); + memset (glog, 0, sizeof *glog); + + return glog; +} + +/* Initialize a new GLogItem instance. + * + * On success, the new GLogItem instance is returned. */ +GLogItem * +init_log_item (GLog * glog) +{ + GLogItem *logitem; + glog->items = xmalloc (sizeof (GLogItem)); + logitem = glog->items; + memset (logitem, 0, sizeof *logitem); + + logitem->agent = NULL; + logitem->browser = NULL; + logitem->browser_type = NULL; + logitem->continent = NULL; + logitem->country = NULL; + logitem->date = NULL; + logitem->errstr = NULL; + logitem->host = NULL; + logitem->keyphrase = NULL; + logitem->method = NULL; + logitem->os = NULL; + logitem->os_type = NULL; + logitem->protocol = NULL; + logitem->qstr = NULL; + logitem->ref = NULL; + logitem->req_key = NULL; + logitem->req = NULL; + logitem->resp_size = 0LL; + logitem->serve_time = 0; + logitem->status = NULL; + logitem->time = NULL; + logitem->uniq_key = NULL; + logitem->vhost = NULL; + logitem->userid = NULL; + + memset (logitem->site, 0, sizeof (logitem->site)); + + return logitem; +} + +/* Free all members of a GLogItem */ +static void +free_glog (GLogItem * logitem) +{ + if (logitem->agent != NULL) + free (logitem->agent); + if (logitem->browser != NULL) + free (logitem->browser); + if (logitem->browser_type != NULL) + free (logitem->browser_type); + if (logitem->continent != NULL) + free (logitem->continent); + if (logitem->country != NULL) + free (logitem->country); + if (logitem->date != NULL) + free (logitem->date); + if (logitem->errstr != NULL) + free (logitem->errstr); + if (logitem->host != NULL) + free (logitem->host); + if (logitem->keyphrase != NULL) + free (logitem->keyphrase); + if (logitem->method != NULL) + free (logitem->method); + if (logitem->os != NULL) + free (logitem->os); + if (logitem->os_type != NULL) + free (logitem->os_type); + if (logitem->protocol != NULL) + free (logitem->protocol); + if (logitem->qstr != NULL) + free (logitem->qstr); + if (logitem->ref != NULL) + free (logitem->ref); + if (logitem->req_key != NULL) + free (logitem->req_key); + if (logitem->req != NULL) + free (logitem->req); + if (logitem->status != NULL) + free (logitem->status); + if (logitem->time != NULL) + free (logitem->time); + if (logitem->uniq_key != NULL) + free (logitem->uniq_key); + if (logitem->userid != NULL) + free (logitem->userid); + if (logitem->vhost != NULL) + free (logitem->vhost); + + free (logitem); +} + +/* Decodes the given URL-encoded string. + * + * On success, the decoded string is assigned to the output buffer. */ +#define B16210(x) (((x) >= '0' && (x) <= '9') ? ((x) - '0') : (toupper((x)) - 'A' + 10)) +static void +decode_hex (char *url, char *out) +{ + char *ptr; + const char *c; + + for (c = url, ptr = out; *c; c++) { + if (*c != '%' || !isxdigit (c[1]) || !isxdigit (c[2])) { + *ptr++ = *c; + } else { + *ptr++ = (B16210 (c[1]) * 16) + (B16210 (c[2])); + c += 2; + } + } + *ptr = 0; +} + +/* Entry point to decode the given URL-encoded string. + * + * On success, the decoded trimmed string is assigned to the output + * buffer. */ +static char * +decode_url (char *url) +{ + char *out, *decoded; + + if ((url == NULL) || (*url == '\0')) + return NULL; + + out = decoded = xstrdup (url); + decode_hex (url, out); + /* double encoded URL? */ + if (conf.double_decode) + decode_hex (decoded, out); + strip_newlines (out); + + return trim_str (out); +} + +/* Process keyphrases from Google search, cache, and translate. + * Note that the referer hasn't been decoded at the entry point + * since there could be '&' within the search query. + * + * On error, 1 is returned. + * On success, the extracted keyphrase is assigned and 0 is returned. */ +static int +extract_keyphrase (char *ref, char **keyphrase) +{ + char *r, *ptr, *pch, *referer; + int encoded = 0; + + if (!(strstr (ref, "http://www.google.")) && + !(strstr (ref, "http://webcache.googleusercontent.com/")) && + !(strstr (ref, "http://translate.googleusercontent.com/")) && + !(strstr (ref, "https://www.google.")) && + !(strstr (ref, "https://webcache.googleusercontent.com/")) && + !(strstr (ref, "https://translate.googleusercontent.com/"))) + return 1; + + /* webcache.googleusercontent */ + if ((r = strstr (ref, "/+&")) != NULL) + return 1; + /* webcache.googleusercontent */ + else if ((r = strstr (ref, "/+")) != NULL) + r += 2; + /* webcache.googleusercontent */ + else if ((r = strstr (ref, "q=cache:")) != NULL) { + pch = strchr (r, '+'); + if (pch) + r += pch - r + 1; + } + /* www.google.* or translate.googleusercontent */ + else if ((r = strstr (ref, "&q=")) != NULL || + (r = strstr (ref, "?q=")) != NULL) + r += 3; + else if ((r = strstr (ref, "%26q%3D")) != NULL || + (r = strstr (ref, "%3Fq%3D")) != NULL) + encoded = 1, r += 7; + else + return 1; + + if (!encoded && (ptr = strchr (r, '&')) != NULL) + *ptr = '\0'; + else if (encoded && (ptr = strstr (r, "%26")) != NULL) + *ptr = '\0'; + + referer = decode_url (r); + if (referer == NULL || *referer == '\0') + return 1; + + referer = char_replace (referer, '+', ' '); + *keyphrase = trim_str (referer); + + return 0; +} + +#ifdef HAVE_GEOLOCATION +/* Extract geolocation for the given host. + * + * On error, 1 is returned. + * On success, the extracted continent and country are set and 0 is + * returned. */ +static int +extract_geolocation (GLogItem * logitem, char *continent, char *country) +{ + if (!is_geoip_resource ()) + return 1; + + geoip_get_country (logitem->host, country, logitem->type_ip); + geoip_get_continent (logitem->host, continent, logitem->type_ip); + + return 0; +} +#endif + + +/* Parse a URI and extracts the *host* part from it + * i.e., //www.example.com/path?googleguy > www.example.com + * + * On error, 1 is returned. + * On success, the extracted referer is set and 0 is returned. */ +static int +extract_referer_site (const char *referer, char *host) +{ + char *url, *begin, *end; + int len = 0; + + if ((referer == NULL) || (*referer == '\0')) + return 1; + + url = strdup (referer); + if ((begin = strstr (url, "//")) == NULL) + goto clean; + + begin += 2; + if ((len = strlen (begin)) == 0) + goto clean; + + if ((end = strchr (begin, '/')) != NULL) + len = end - begin; + + if (len == 0) + goto clean; + + if (len >= REF_SITE_LEN) + len = REF_SITE_LEN; + + memcpy (host, begin, len); + host[len] = '\0'; + free (url); + return 0; +clean: + free (url); + + return 1; +} + +/* Determine if the given request is static (e.g., jpg, css, js, etc). + * + * On error, or if not static, 0 is returned. + * On success, the 1 is returned. */ +static int +verify_static_content (const char *req) +{ + const char *nul = req + strlen (req); + const char *ext = NULL, *pch = NULL; + int elen = 0, i; + + if (strlen (req) < conf.static_file_max_len) + return 0; + + for (i = 0; i < conf.static_file_idx; ++i) { + ext = conf.static_files[i]; + if (ext == NULL || *ext == '\0') + continue; + + elen = strlen (ext); + if (conf.all_static_files && (pch = strchr (req, '?')) != NULL && + pch - req > elen) { + pch -= elen; + if (0 == strncasecmp (ext, pch, elen)) + return 1; + continue; + } + + if (!strncasecmp (nul - elen, ext, elen)) + return 1; + } + + return 0; +} + +/* Extract the HTTP method. + * + * On error, or if not found, NULL is returned. + * On success, the HTTP method is returned. */ +static const char * +extract_method (const char *token) +{ + const char *methods[] = { + "OPTIONS", "GET", "HEAD", "POST", "PUT", + "DELETE", "TRACE", "CONNECT", "PATCH", "options", + "get", "head", "post", "put", "delete", + "trace", "connect", "patch", + /* WebDAV */ + "PROPFIND", "PROPPATCH", "MKCOL", "COPY", "MOVE", + "LOCK", "UNLOCK", "VERSION-CONTROL", "REPORT", "CHECKOUT", + "CHECKIN", "UNCHECKOUT", "MKWORKSPACE", "UPDATE", "LABEL", + "MERGE", "BASELINE-CONTROL", "MKACTIVITY", "ORDERPATCH", "propfind", + "propwatch", "mkcol", "copy", "move", "lock", + "unlock", "version-control", "report", "checkout", "checkin", + "uncheckout", "mkworkspace", "update", "label", "merge", + "baseline-control", "mkactivity", "orderpatch" + }; + + const int methods_count = sizeof (methods) / sizeof (*methods); + + int i; + /* Length of every string in list */ + static int list_length[sizeof (methods) / sizeof (*methods)] = { -1 }; + /* Only calculate length on first time */ + if (list_length[0] == -1) { + for (i = 0; i < methods_count; i++) { + list_length[i] = strlen (methods[i]); + } + } + + for (i = 0; i < methods_count; i++) { + if (strncmp (token, methods[i], list_length[i]) == 0) { + return methods[i]; + } + } + return NULL; +} + +/* Determine if time-served data was stored on-disk. */ +static void +contains_usecs (void) +{ + if (conf.serve_usecs) + return; + +#ifdef TCB_BTREE + ht_insert_genstats ("serve_usecs", 1); +#endif + conf.serve_usecs = 1; /* flag */ +} + +/* Determine if the given token is a valid HTTP protocol. + * + * If not valid, 1 is returned. + * If valid, 0 is returned. */ +static const char * +extract_protocol (const char *token) +{ + const char *lookfor; + + if ((lookfor = "HTTP/1.0", !strncmp (token, lookfor, 8)) || + (lookfor = "HTTP/1.1", !strncmp (token, lookfor, 8)) || + (lookfor = "HTTP/2", !strncmp (token, lookfor, 6))) + return lookfor; + return NULL; +} + +/* Parse a request containing the method and protocol. + * + * On error, or unable to parse, NULL is returned. + * On success, the HTTP request is returned and the method and + * protocol are assigned to the corresponding buffers. */ +static char * +parse_req (char *line, char **method, char **protocol) +{ + char *req = NULL, *request = NULL, *dreq = NULL, *ptr = NULL; + const char *meth, *proto; + ptrdiff_t rlen; + + meth = extract_method (line); + + /* couldn't find a method, so use the whole request line */ + if (meth == NULL) { + request = xstrdup (line); + } + /* method found, attempt to parse request */ + else { + req = line + strlen (meth); + if (!(ptr = strrchr (req, ' ')) || !(proto = extract_protocol (++ptr))) + return alloc_string ("-"); + + req++; + if ((rlen = ptr - req) <= 0) + return alloc_string ("-"); + + request = xmalloc (rlen + 1); + strncpy (request, req, rlen); + request[rlen] = 0; + + if (conf.append_method) + (*method) = strtoupper (xstrdup (meth)); + + if (conf.append_protocol) + (*protocol) = strtoupper (xstrdup (proto)); + } + + if (!(dreq = decode_url (request))) + return request; + else if (*dreq == '\0') { + free (dreq); + return request; + } + + free (request); + return dreq; +} + +/* Extract the next delimiter given a log format and copy the + * delimiter(s) to the destination buffer. + * Note that it's possible to store up to two delimiters. + * + * On error, the function returns. + * On success, the delimiter(s) are stored in the dest buffer and the + * number of extra delimiters is returned. */ +static int +get_delim (char *dest, const char *p) +{ + /* done, nothing to do */ + if (p[0] == '\0' || p[1] == '\0') { + dest[0] = '\0'; + return 0; + } + /* add the first delim */ + dest[0] = *(p + 1); + /* check if there's another possible delim */ + if (p[2] == '|' && p[3] != '%' && p[3] != '\0') { + dest[1] = *(p + 3); + return 1; + } + return 0; +} + +/* Extract and malloc a token given the parsed rule. + * + * On success, the malloc'd token is returned. */ +static char * +parsed_string (const char *pch, char **str, int move_ptr) +{ + char *p; + size_t len = (pch - *str + 1); + + p = xmalloc (len); + memcpy (p, *str, (len - 1)); + p[len - 1] = '\0'; + if (move_ptr) + *str += len - 1; + + return trim_str (p); +} + +/* Find and extract a token given a log format rule. + * + * On error, or unable to parse it, NULL is returned. + * On success, the malloc'd token is returned. */ +static char * +parse_string (char **str, const char *delims, int cnt) +{ + int idx = 0; + char *pch = *str, *p = NULL; + char end; + + if ((*delims != 0x0) && (p = strpbrk (*str, delims)) == NULL) + return NULL; + + end = !*delims ? 0x0 : *p; + do { + /* match number of delims */ + if (*pch == end) + idx++; + /* delim found, parse string then */ + if ((*pch == end && cnt == idx) || *pch == '\0') + return parsed_string (pch, str, 1); + /* advance to the first unescaped delim */ + if (*pch == '\\') + pch++; + } while (*pch++); + + return NULL; +} + +/* Move forward through the log string until a non-space (!isspace) + * char is found. */ +static void +find_alpha (char **str) +{ + char *s = *str; + while (*s) { + if (isspace (*s)) + s++; + else + break; + } + *str += s - *str; +} + +/* Format the broken-down time tm to a numeric date format. + * + * On error, or unable to format the given tm, 1 is returned. + * On success, a malloc'd format is returned. */ +#pragma GCC diagnostic ignored "-Wformat-nonliteral" +static int +set_date (char **fdate, struct tm tm) +{ + char buf[DATE_LEN] = ""; /* Ymd */ + + memset (buf, 0, sizeof (buf)); + if (strftime (buf, DATE_LEN, conf.date_num_format, &tm) <= 0) + return 1; + *fdate = xstrdup (buf); + + return 0; +} + +/* Format the broken-down time tm to a numeric time format. + * + * On error, or unable to format the given tm, 1 is returned. + * On success, a malloc'd format is returned. */ +static int +set_time (char **ftime, struct tm tm) +{ + char buf[TIME_LEN] = ""; + + memset (buf, 0, sizeof (buf)); + if (strftime (buf, TIME_LEN, "%H:%M:%S", &tm) <= 0) + return 1; + *ftime = xstrdup (buf); + + return 0; +} + +/* Determine the parsing specifier error and construct a message out + * of it. + * + * On success, a malloc'd error message is assigned to the log + * structure and 1 is returned. */ +static int +spec_err (GLogItem * logitem, int code, const char spec, const char *tkn) +{ + char *err = NULL; + const char *fmt = NULL; + + switch (code) { + case SPEC_TOKN_INV: + fmt = "Token '%s' doesn't match specifier '%%%c'"; + err = xmalloc (snprintf (NULL, 0, fmt, (tkn ? tkn : "-"), spec) + 1); + sprintf (err, fmt, (tkn ? tkn : "-"), spec); + break; + case SPEC_TOKN_SET: + fmt = "Token already set for '%%%c' specifier."; + err = xmalloc (snprintf (NULL, 0, fmt, spec) + 1); + sprintf (err, fmt, spec); + break; + case SPEC_TOKN_NUL: + fmt = "Token for '%%%c' specifier is NULL."; + err = xmalloc (snprintf (NULL, 0, fmt, spec) + 1); + sprintf (err, fmt, spec); + break; + case SPEC_SFMT_MIS: + fmt = "Missing braces '%s' and ignore chars for specifier '%%%c'"; + err = xmalloc (snprintf (NULL, 0, fmt, (tkn ? tkn : "-"), spec) + 1); + sprintf (err, fmt, (tkn ? tkn : "-"), spec); + break; + } + logitem->errstr = err; + + return 1; +} + +#pragma GCC diagnostic warning "-Wformat-nonliteral" + +/* Parse the log string given log format rule. + * + * On error, or unable to parse it, 1 is returned. + * On success, the malloc'd token is assigned to a GLogItem member. */ +static int +parse_specifier (GLogItem * logitem, char **str, const char *p, const char *end) +{ + struct tm tm; + const char *dfmt = conf.date_format; + const char *tfmt = conf.time_format; + + char *pch, *sEnd, *bEnd, *tkn = NULL; + double serve_secs = 0.0; + uint64_t bandw = 0, serve_time = 0; + long status = 0L; + + errno = 0; + memset (&tm, 0, sizeof (tm)); + + switch (*p) { + /* date */ + case 'd': + if (logitem->date) + return spec_err (logitem, SPEC_TOKN_SET, *p, NULL); + /* parse date format including dates containing spaces, + * i.e., syslog date format (Jul 15 20:10:56) */ + if (!(tkn = parse_string (&(*str), end, count_matches (dfmt, ' ') + 1))) + return spec_err (logitem, SPEC_TOKN_NUL, *p, NULL); + + if (str_to_time (tkn, dfmt, &tm) != 0 || set_date (&logitem->date, tm) != 0) { + spec_err (logitem, SPEC_TOKN_INV, *p, tkn); + free (tkn); + return 1; + } + free (tkn); + break; + /* time */ + case 't': + if (logitem->time) + return spec_err (logitem, SPEC_TOKN_SET, *p, NULL); + if (!(tkn = parse_string (&(*str), end, 1))) + return spec_err (logitem, SPEC_TOKN_NUL, *p, NULL); + + if (str_to_time (tkn, tfmt, &tm) != 0 || set_time (&logitem->time, tm) != 0) { + spec_err (logitem, SPEC_TOKN_INV, *p, tkn); + free (tkn); + return 1; + } + free (tkn); + break; + /* date/time as decimal, i.e., timestamps, ms/us */ + case 'x': + if (logitem->time && logitem->date) + return spec_err (logitem, SPEC_TOKN_SET, *p, NULL); + if (!(tkn = parse_string (&(*str), end, 1))) + return spec_err (logitem, SPEC_TOKN_NUL, *p, NULL); + + if (str_to_time (tkn, tfmt, &tm) != 0 || set_date (&logitem->date, tm) != 0 + || set_time (&logitem->time, tm) != 0) { + spec_err (logitem, SPEC_TOKN_INV, *p, tkn); + free (tkn); + return 1; + } + break; + /* Virtual Host */ + case 'v': + if (logitem->vhost) + return spec_err (logitem, SPEC_TOKN_SET, *p, NULL); + tkn = parse_string (&(*str), end, 1); + if (tkn == NULL) + return spec_err (logitem, SPEC_TOKN_NUL, *p, NULL); + logitem->vhost = tkn; + break; + /* remote user */ + case 'e': + if (logitem->userid) + return spec_err (logitem, SPEC_TOKN_SET, *p, NULL); + tkn = parse_string (&(*str), end, 1); + if (tkn == NULL) + return spec_err (logitem, SPEC_TOKN_NUL, *p, NULL); + logitem->userid = tkn; + break; + /* remote hostname (IP only) */ + case 'h': + if (logitem->host) + return spec_err (logitem, SPEC_TOKN_SET, *p, NULL); + if (!(tkn = parse_string (&(*str), end, 1))) + return spec_err (logitem, SPEC_TOKN_NUL, *p, NULL); + + if (invalid_ipaddr (tkn, &logitem->type_ip)) { + spec_err (logitem, SPEC_TOKN_INV, *p, tkn); + free (tkn); + return 1; + } + logitem->host = tkn; + break; + /* request method */ + case 'm': + if (logitem->method) + return spec_err (logitem, SPEC_TOKN_SET, *p, NULL); + if (!(tkn = parse_string (&(*str), end, 1))) + return spec_err (logitem, SPEC_TOKN_NUL, *p, NULL); + + if (!extract_method (tkn)) { + spec_err (logitem, SPEC_TOKN_INV, *p, tkn); + free (tkn); + return 1; + } + logitem->method = tkn; + break; + /* request not including method or protocol */ + case 'U': + if (logitem->req) + return spec_err (logitem, SPEC_TOKN_SET, *p, NULL); + tkn = parse_string (&(*str), end, 1); + if (tkn == NULL || *tkn == '\0') + return spec_err (logitem, SPEC_TOKN_NUL, *p, NULL); + + if ((logitem->req = decode_url (tkn)) == NULL) { + spec_err (logitem, SPEC_TOKN_INV, *p, tkn); + free (tkn); + return 1; + } + free (tkn); + break; + /* query string alone, e.g., ?param=goaccess&tbm=shop */ + case 'q': + if (logitem->qstr) + return spec_err (logitem, SPEC_TOKN_SET, *p, NULL); + tkn = parse_string (&(*str), end, 1); + if (tkn == NULL || *tkn == '\0') + return 0; + + if ((logitem->qstr = decode_url (tkn)) == NULL) { + spec_err (logitem, SPEC_TOKN_INV, *p, tkn); + free (tkn); + return 1; + } + free (tkn); + break; + /* request protocol */ + case 'H': + if (logitem->protocol) + return spec_err (logitem, SPEC_TOKN_SET, *p, NULL); + if (!(tkn = parse_string (&(*str), end, 1))) + return spec_err (logitem, SPEC_TOKN_NUL, *p, NULL); + + if (!extract_protocol (tkn)) { + spec_err (logitem, SPEC_TOKN_INV, *p, tkn); + free (tkn); + return 1; + } + logitem->protocol = tkn; + break; + /* request, including method + protocol */ + case 'r': + if (logitem->req) + return spec_err (logitem, SPEC_TOKN_SET, *p, NULL); + if (!(tkn = parse_string (&(*str), end, 1))) + return spec_err (logitem, SPEC_TOKN_NUL, *p, NULL); + + logitem->req = parse_req (tkn, &logitem->method, &logitem->protocol); + free (tkn); + break; + /* Status Code */ + case 's': + if (logitem->status) + return spec_err (logitem, SPEC_TOKN_SET, *p, NULL); + if (!(tkn = parse_string (&(*str), end, 1))) + return spec_err (logitem, SPEC_TOKN_NUL, *p, NULL); + + status = strtol (tkn, &sEnd, 10); + if (tkn == sEnd || *sEnd != '\0' || errno == ERANGE || status < 100 || + status > 599) { + spec_err (logitem, SPEC_TOKN_INV, *p, tkn); + free (tkn); + return 1; + } + logitem->status = tkn; + break; + /* size of response in bytes - excluding HTTP headers */ + case 'b': + if (logitem->resp_size) + return spec_err (logitem, SPEC_TOKN_SET, *p, NULL); + if (!(tkn = parse_string (&(*str), end, 1))) + return spec_err (logitem, SPEC_TOKN_NUL, *p, NULL); + + bandw = strtoull (tkn, &bEnd, 10); + if (tkn == bEnd || *bEnd != '\0' || errno == ERANGE) + bandw = 0; + logitem->resp_size = bandw; + conf.bandwidth = 1; + free (tkn); + break; + /* referrer */ + case 'R': + if (logitem->ref) + return spec_err (logitem, SPEC_TOKN_SET, *p, NULL); + + if (!(tkn = parse_string (&(*str), end, 1))) + tkn = alloc_string ("-"); + if (*tkn == '\0') { + free (tkn); + tkn = alloc_string ("-"); + } + if (strcmp (tkn, "-") != 0) { + extract_keyphrase (tkn, &logitem->keyphrase); + extract_referer_site (tkn, logitem->site); + + /* hide referrers from report */ + if (hide_referer (logitem->site)) { + logitem->site[0] = '\0'; + free (tkn); + } else + logitem->ref = tkn; + break; + } + logitem->ref = tkn; + + break; + /* user agent */ + case 'u': + if (logitem->agent) + return spec_err (logitem, SPEC_TOKN_SET, *p, NULL); + + tkn = parse_string (&(*str), end, 1); + if (tkn != NULL && *tkn != '\0') { + /* Make sure the user agent is decoded (i.e.: CloudFront) + * and replace all '+' with ' ' (i.e.: w3c) */ + logitem->agent = decode_url (tkn); + free (tkn); + break; + } else if (tkn != NULL && *tkn == '\0') { + free (tkn); + tkn = alloc_string ("-"); + } + /* must be null */ + else { + tkn = alloc_string ("-"); + } + logitem->agent = tkn; + break; + /* time taken to serve the request, in milliseconds as a decimal number */ + case 'L': + /* ignore it if we already have served time */ + if (logitem->serve_time) + return 0; + if (!(tkn = parse_string (&(*str), end, 1))) + return spec_err (logitem, SPEC_TOKN_NUL, *p, NULL); + + serve_secs = strtoull (tkn, &bEnd, 10); + if (tkn == bEnd || *bEnd != '\0' || errno == ERANGE) + serve_secs = 0; + /* convert it to microseconds */ + logitem->serve_time = (serve_secs > 0) ? serve_secs * MILS : 0; + + contains_usecs (); /* set flag */ + free (tkn); + break; + /* time taken to serve the request, in seconds with a milliseconds + * resolution */ + case 'T': + /* ignore it if we already have served time */ + if (logitem->serve_time) + return 0; + if (!(tkn = parse_string (&(*str), end, 1))) + return spec_err (logitem, SPEC_TOKN_NUL, *p, NULL); + + if (strchr (tkn, '.') != NULL) + serve_secs = strtod (tkn, &bEnd); + else + serve_secs = strtoull (tkn, &bEnd, 10); + + if (tkn == bEnd || *bEnd != '\0' || errno == ERANGE) + serve_secs = 0; + /* convert it to microseconds */ + logitem->serve_time = (serve_secs > 0) ? serve_secs * SECS : 0; + + contains_usecs (); /* set flag */ + free (tkn); + break; + /* time taken to serve the request, in microseconds */ + case 'D': + /* ignore it if we already have served time */ + if (logitem->serve_time) + return 0; + if (!(tkn = parse_string (&(*str), end, 1))) + return spec_err (logitem, SPEC_TOKN_NUL, *p, NULL); + + serve_time = strtoull (tkn, &bEnd, 10); + if (tkn == bEnd || *bEnd != '\0' || errno == ERANGE) + serve_time = 0; + logitem->serve_time = serve_time; + + contains_usecs (); /* set flag */ + free (tkn); + break; + /* move forward through str until not a space */ + case '~': + find_alpha (&(*str)); + break; + /* everything else skip it */ + default: + if ((pch = strchr (*str, p[1])) != NULL) + *str += pch - *str; + } + + return 0; +} + +/* Parse the special host specifier and extract the characters that + * need to be rejected when attempting to parse the XFF field. + * + * If no unable to find both curly braces (boundaries), NULL is returned. + * On success, the malloc'd reject set is returned. */ +static char * +extract_braces (char **p) +{ + char *b1 = NULL, *b2 = NULL, *ret = NULL, *s = *p; + int esc = 0; + ptrdiff_t len = 0; + + /* iterate over the log format */ + for (; *s; s++) { + if (*s == '\\') { + esc = 1; + } else if (*s == '{' && !esc) { + b1 = s; + } else if (*s == '}' && !esc) { + b2 = s; + break; + } else { + esc = 0; + } + } + + if ((!b1) || (!b2)) + return NULL; + if ((len = b2 - (b1 + 1)) <= 0) + return NULL; + + /* Found braces, extract 'reject' character set. */ + ret = xmalloc (len + 1); + memcpy (ret, b1 + 1, len); + ret[len] = '\0'; + (*p) = b2 + 1; + + return ret; +} + +/* Attempt to extract the client IP from an X-Forwarded-For (XFF) field. + * + * If no IP is found, 1 is returned. + * On success, the malloc'd token is assigned to a GLogItem->host and + * 0 is returned. */ +static int +find_xff_host (GLogItem * logitem, char **str, char **p) +{ + char *ptr = NULL, *tkn = NULL, *skips = NULL; + int invalid_ip = 1, len = 0, type_ip = TYPE_IPINV; + + if (!(skips = extract_braces (p))) + return spec_err (logitem, SPEC_SFMT_MIS, **p, "{}"); + + ptr = *str; + while (*ptr != '\0') { + if ((len = strcspn (ptr, skips)) == 0) { + len++, ptr++; + goto move; + } + + ptr += len; + /* extract possible IP */ + if (!(tkn = parsed_string (ptr, str, 0))) + break; + + invalid_ip = invalid_ipaddr (tkn, &type_ip); + /* done, already have IP and current token is not a host */ + if (logitem->host && invalid_ip) { + free (tkn); + break; + } + if (!logitem->host && !invalid_ip) { + logitem->host = xstrdup (tkn); + logitem->type_ip = type_ip; + } + free (tkn); + + move: + *str += len; + } + + free (skips); + + return logitem->host == NULL; +} + +/* Handle special specifiers. + * + * On error, or unable to parse it, 1 is returned. + * On success, the malloc'd token is assigned to a GLogItem member and + * 0 is returned. */ +static int +special_specifier (GLogItem * logitem, char **str, char **p) +{ + switch (**p) { + /* XFF remote hostname (IP only) */ + case 'h': + if (logitem->host) + return spec_err (logitem, SPEC_TOKN_SET, **p, NULL); + if (find_xff_host (logitem, str, p)) + return spec_err (logitem, SPEC_TOKN_NUL, 'h', NULL); + break; + } + + return 0; +} + +/* Iterate over the given log format. + * + * On error, or unable to parse it, 1 is returned. + * On success, the malloc'd token is assigned to a GLogItem member and + * 0 is returned. */ +static int +parse_format (GLogItem * logitem, char *str) +{ + char end[2 + 1] = { 0 }; + char *lfmt = conf.log_format, *p = NULL; + int perc = 0, tilde = 0, optdelim = 0; + + if (str == NULL || *str == '\0') + return 1; + + /* iterate over the log format */ + for (p = lfmt; *p; p++) { + /* advance to the first unescaped delim */ + if (*p == '\\') + continue; + if (*p == '%') { + perc++; + continue; + } + if (*p == '~' && perc == 0) { + tilde++; + continue; + } + + if (tilde && *p != '\0') { + if ((str == NULL) || (*str == '\0')) + return 0; + if (special_specifier (logitem, &str, &p) == 1) + return 1; + tilde = 0; + } + /* %h */ + else if (perc && *p != '\0') { + if ((str == NULL) || (*str == '\0')) + return 0; + + memset (end, 0, sizeof end); + optdelim = get_delim (end, p); + /* attempt to parse format specifiers */ + if (parse_specifier (logitem, &str, p, end) == 1) + return 1; + /* account for the extra delimiter */ + if (optdelim) + p++; + perc = 0; + } else if (perc && isspace (p[0])) { + return 1; + } else { + str++; + } + } + + return 0; +} + +/* Determine if the log string is valid and if it's not a comment. + * + * On error, or invalid, 1 is returned. + * On success, or valid line, 0 is returned. */ +static int +valid_line (char *line) +{ + /* invalid line */ + if ((line == NULL) || (*line == '\0')) + return 1; + /* ignore comments */ + if (*line == '#' || *line == '\n') + return 1; + + return 0; +} + +/* Determine if we need to lock the mutex. */ +static void +lock_spinner (void) +{ + if (parsing_spinner != NULL && parsing_spinner->state == SPN_RUN) + pthread_mutex_lock (&parsing_spinner->mutex); +} + +/* Determine if we need to unlock the mutex. */ +static void +unlock_spinner (void) +{ + if (parsing_spinner != NULL && parsing_spinner->state == SPN_RUN) + pthread_mutex_unlock (&parsing_spinner->mutex); +} + +/* Ignore request's query string. e.g., + * /index.php?timestamp=1454385289 */ +static void +strip_qstring (char *req) +{ + char *qmark; + if ((qmark = strchr (req, '?')) != NULL) { + if ((qmark - req) > 0) + *qmark = '\0'; + } +} + +/* Increment the overall bandwidth. */ +static void +inc_resp_size (GLog * glog, uint64_t resp_size) +{ + glog->resp_size += resp_size; +#ifdef TCB_BTREE + ht_insert_genstats_bw ("bandwidth", resp_size); +#endif +} + +/* Output all log errors stored during parsing. */ +void +output_logerrors (GLog * glog) +{ + int i; + + if (!glog->log_erridx) + return; + + fprintf (stderr, ERR_PARSED_NLINES, glog->log_erridx); + fprintf (stderr, "%s:\n\n", ERR_PARSED_NLINES_DESC); + + for (i = 0; i < glog->log_erridx; ++i) + fprintf (stderr, "%s\n", glog->errors[i]); + fprintf (stderr, "\n%s\n", ERR_FORMAT_HEADER); +} + +/* Free all log errors stored during parsing. */ +void +free_logerrors (GLog * glog) +{ + int i; + + if (!glog->log_erridx) + return; + + for (i = 0; i < glog->log_erridx; ++i) + free (glog->errors[i]); + free (glog->errors); + + glog->errors = NULL; + glog->log_erridx = 0; +} + +/* Ensure we have the following fields. */ +static int +verify_missing_fields (GLogItem * logitem) +{ + /* must have the following fields */ + if (logitem->host == NULL) + logitem->errstr = xstrdup ("IPv4/6 is required."); + else if (logitem->date == NULL) + logitem->errstr = xstrdup ("A valid date is required."); + else if (logitem->req == NULL) + logitem->errstr = xstrdup ("A request is required."); + + return logitem->errstr != NULL; +} + +/* Keep track of all invalid log strings. */ +static void +count_invalid (GLog * glog, const char *line) +{ + glog->invalid++; +#ifdef TCB_BTREE + ht_insert_genstats ("failed_requests", 1); +#endif + if (conf.invalid_requests_log) { + LOG_INVALID (("%s", line)); + } + + if (glog->items->errstr && glog->invalid < MAX_LOG_ERRORS) { + if (glog->errors == NULL) + glog->errors = xcalloc (MAX_LOG_ERRORS, sizeof (char *)); + glog->errors[glog->log_erridx++] = xstrdup (glog->items->errstr); + } +} + +/* Count down the number of invalids hits. + * Note: Upon performing a log test, invalid hits are counted, since + * no valid records were found, then we count down by the number of + * tests ran. +*/ +static void +uncount_invalid (GLog * glog) +{ + glog->invalid -= conf.num_tests; +#ifdef TCB_BTREE + ht_replace_genstats ("failed_requests", glog->invalid); +#endif +} + +/* Count down the number of processed hits. + * Note: Upon performing a log test, processed hits are counted, since + * no valid records were found, then we count down by the number of + * tests ran. +*/ +static void +uncount_processed (GLog * glog) +{ + glog->processed -= conf.num_tests; +#ifdef TCB_BTREE + ht_replace_genstats ("total_requests", glog->processed); +#endif +} + +/* Keep track of all valid log strings. */ +static void +count_valid (GLog * glog) +{ + lock_spinner (); + glog->valid++; +#ifdef TCB_BTREE + ht_insert_genstats ("valid_requests", 1); +#endif + unlock_spinner (); +} + +/* Keep track of all valid and processed log strings. */ +static void +count_process (GLog * glog) +{ + lock_spinner (); + glog->processed++; +#ifdef TCB_BTREE + ht_insert_genstats ("total_requests", 1); +#endif + unlock_spinner (); +} + +/* Keep track of all excluded log strings (IPs). + * + * If IP not range, 1 is returned. + * If IP is excluded, 0 is returned. */ +static int +excluded_ip (GLog * glog, GLogItem * logitem) +{ + if (conf.ignore_ip_idx && ip_in_range (logitem->host)) { + glog->excluded_ip++; +#ifdef TCB_BTREE + ht_insert_genstats ("excluded_ip", 1); +#endif + return 0; + } + return 1; +} + +/* Determine if the request is from a robot or spider and check if we + * need to ignore or show crawlers only. + * + * If the request line is not ignored, 0 is returned. + * If the request line is ignored, 1 is returned. */ +static int +handle_crawler (const char *agent) +{ + int bot = 0; + + if (!conf.ignore_crawlers && !conf.crawlers_only) + return 1; + + bot = is_crawler (agent); + return (conf.ignore_crawlers && bot) || (conf.crawlers_only && !bot) ? 0 : 1; +} + +/* A wrapper function to determine if the request is static. + * + * If the request is not static, 0 is returned. + * If the request is static, 1 is returned. */ +static int +is_static (const char *req) +{ + return verify_static_content (req); +} + +/* Determine if the request of the given status code needs to be + * ignored. + * + * If the status code is not within the ignore-array, 0 is returned. + * If the status code is within the ignore-array, 1 is returned. */ +static int +ignore_status_code (const char *status) +{ + if (conf.ignore_status_idx == 0) + return 0; + + if (str_inarray (status, conf.ignore_status, conf.ignore_status_idx) != -1) + return 1; + return 0; +} + +/* Determine if static file request should be ignored + * + * If the request line is not ignored, 0 is returned. + * If the request line is ignored, 1 is returned. */ +static int +ignore_static (const char *req) +{ + if (conf.ignore_statics && is_static (req)) + return 1; + return 0; +} + +/* Determine if the request status code is a 404. + * + * If the request is not a 404, 0 is returned. + * If the request is a 404, 1 is returned. */ +static int +is_404 (GLogItem * logitem) +{ + /* is this a 404? */ + if (logitem->status && !memcmp (logitem->status, "404", 3)) + return 1; + /* treat 444 as 404? */ + else if (logitem->status && !memcmp (logitem->status, "444", 3) && + conf.code444_as_404) + return 1; + return 0; +} + +/* A wrapper function to determine if a log line needs to be ignored. + * + * If the request line is not ignored, 0 is returned. + * If the request line is ignored, IGNORE_LEVEL_PANEL is returned. + * If the request line is only not counted as valid, IGNORE_LEVEL_REQ is returned. */ +static int +ignore_line (GLog * glog, GLogItem * logitem) +{ + if (excluded_ip (glog, logitem) == 0) + return IGNORE_LEVEL_PANEL; + if (handle_crawler (logitem->agent) == 0) + return IGNORE_LEVEL_PANEL; + if (ignore_referer (logitem->site)) + return IGNORE_LEVEL_PANEL; + if (ignore_status_code (logitem->status)) + return IGNORE_LEVEL_PANEL; + if (ignore_static (logitem->req)) + return conf.ignore_statics; // IGNORE_LEVEL_PANEL or IGNORE_LEVEL_REQ + + /* check if we need to remove the request's query string */ + if (conf.ignore_qstr) + strip_qstring (logitem->req); + + return 0; +} + +/* A wrapper function to insert a keymap string key. + * + * If the given key exists, its value is returned. + * On error, -1 is returned. + * On success the value of the key inserted is returned */ +static int +insert_keymap (char *key, GModule module) +{ + return ht_insert_keymap (module, key); +} + +/* A wrapper function to insert a datamap int key and string value. */ +static void +insert_data (int nkey, const char *data, GModule module) +{ + ht_insert_datamap (module, nkey, data); +} + +/* A wrapper function to insert a uniqmap string key. + * + * If the given key exists, 0 is returned. + * On error, -1 is returned. + * On success the value of the key inserted is returned */ +static int +insert_uniqmap (char *uniq_key, GModule module) +{ + return ht_insert_uniqmap (module, uniq_key); +} + +/* A wrapper function to insert a rootmap int key from the keymap + * store mapped to its string value. */ +static void +insert_rootmap (int root_nkey, const char *root, GModule module) +{ + ht_insert_rootmap (module, root_nkey, root); +} + +/* A wrapper function to insert a data int key mapped to the + * corresponding int root key. */ +static void +insert_root (int data_nkey, int root_nkey, GModule module) +{ + ht_insert_root (module, data_nkey, root_nkey); +} + +/* A wrapper function to increase hits counter from an int key. */ +static void +insert_hit (int data_nkey, GModule module) +{ + ht_insert_hits (module, data_nkey, 1); + ht_insert_meta_data (module, "hits", 1); +} + +/* A wrapper function to increase visitors counter from an int + * key. */ +static void +insert_visitor (int uniq_nkey, GModule module) +{ + ht_insert_visitor (module, uniq_nkey, 1); + ht_insert_meta_data (module, "visitors", 1); +} + +/* A wrapper function to increases bandwidth counter from an int + * key. */ +static void +insert_bw (int data_nkey, uint64_t size, GModule module) +{ + ht_insert_bw (module, data_nkey, size); + ht_insert_meta_data (module, "bytes", size); +} + +/* A wrapper call to increases cumulative time served counter + * from an int key. */ +static void +insert_cumts (int data_nkey, uint64_t ts, GModule module) +{ + ht_insert_cumts (module, data_nkey, ts); + ht_insert_meta_data (module, "cumts", ts); +} + +/* A wrapper call to insert the maximum time served counter from + * an int key. */ +static void +insert_maxts (int data_nkey, uint64_t ts, GModule module) +{ + ht_insert_maxts (module, data_nkey, ts); + ht_insert_meta_data (module, "maxts", ts); +} + +static void +insert_method (int nkey, const char *data, GModule module) +{ + ht_insert_method (module, nkey, data ? data : "---"); +} + +/* A wrapper call to insert a method given an int key and string + * value. */ +static void +insert_protocol (int nkey, const char *data, GModule module) +{ + ht_insert_protocol (module, nkey, data ? data : "---"); +} + +/* A wrapper call to insert an agent for a hostname given an int + * key and int value. */ +static void +insert_agent (int data_nkey, int agent_nkey, GModule module) +{ + ht_insert_agent (module, data_nkey, agent_nkey); +} + +/* The following generates a unique key to identity unique visitors. + * The key is made out of the IP, date, and user agent. + * Note that for readability, doing a simple snprintf/sprintf should + * suffice, however, memcpy is the fastest solution + * + * On success the new unique visitor key is returned */ +static char * +get_uniq_visitor_key (GLogItem * logitem) +{ + char *ua = NULL, *key = NULL; + size_t s1, s2, s3; + + ua = deblank (xstrdup (logitem->agent)); + + s1 = strlen (logitem->host); + s2 = strlen (logitem->date); + s3 = strlen (ua); + + /* includes terminating null */ + key = xcalloc (s1 + s2 + s3 + 3, sizeof (char)); + + memcpy (key, logitem->host, s1); + + key[s1] = '|'; + memcpy (key + s1 + 1, logitem->date, s2 + 1); + + key[s1 + s2 + 1] = '|'; + memcpy (key + s1 + s2 + 2, ua, s3 + 1); + + free (ua); + return key; +} + +/* The following generates a unique key to identity unique requests. + * The key is made out of the actual request, and if available, the + * method and the protocol. Note that for readability, doing a simple + * snprintf/sprintf should suffice, however, memcpy is the fastest + * solution + * + * On success the new unique request key is returned */ +static char * +gen_unique_req_key (GLogItem * logitem) +{ + char *key = NULL; + size_t s1 = 0, s2 = 0, s3 = 0, nul = 1, sep = 0; + + /* nothing to do */ + if (!conf.append_method && !conf.append_protocol) + return xstrdup (logitem->req); + /* still nothing to do */ + if (!logitem->method && !logitem->protocol) + return xstrdup (logitem->req); + + s1 = strlen (logitem->req); + if (logitem->method && conf.append_method) { + s2 = strlen (logitem->method); + nul++; + } + if (logitem->protocol && conf.append_protocol) { + s3 = strlen (logitem->protocol); + nul++; + } + + /* includes terminating null */ + key = xcalloc (s1 + s2 + s3 + nul, sizeof (char)); + /* append request */ + memcpy (key, logitem->req, s1); + + if (logitem->method && conf.append_method) { + key[s1] = '|'; + sep++; + memcpy (key + s1 + sep, logitem->method, s2 + 1); + } + if (logitem->protocol && conf.append_protocol) { + key[s1 + s2 + sep] = '|'; + sep++; + memcpy (key + s1 + s2 + sep, logitem->protocol, s3 + 1); + } + + return key; +} + +/* Append the query string to the request, and therefore, it modifies + * the original logitem->req */ +static void +append_query_string (char **req, const char *qstr) +{ + char *r; + size_t s1, s2, qm = 0; + + s1 = strlen (*req); + s2 = strlen (qstr); + + /* add '?' between the URL and the query string */ + if (*qstr != '?') + qm = 1; + + r = xmalloc (s1 + s2 + qm + 1); + memcpy (r, *req, s1); + if (qm) + r[s1] = '?'; + memcpy (r + s1 + qm, qstr, s2 + 1); + + free (*req); + *req = r; +} + +/* A wrapper to assign the given data key and the data item to the key + * data structure */ +static void +get_kdata (GKeyData * kdata, char *data_key, char *data) +{ + /* inserted in keymap */ + kdata->data_key = data_key; + /* inserted in datamap */ + kdata->data = data; +} + +/* Generate a visitor's key given the date specificity. For instance, + * if the specificity if set to hours, then a generated key would + * look like: 03/Jan/2016:09 */ +static void +set_spec_visitor_key (char **fdate, const char *ftime) +{ + size_t dlen = 0, tlen = 0; + char *key = NULL, *tkey = NULL, *pch = NULL; + + tkey = xstrdup (ftime); + if (conf.date_spec_hr && (pch = strchr (tkey, ':')) && (pch - tkey) > 0) + *pch = '\0'; + + dlen = strlen (*fdate); + tlen = strlen (tkey); + + key = xmalloc (dlen + tlen + 1); + memcpy (key, *fdate, dlen); + memcpy (key + dlen, tkey, tlen + 1); + + free (*fdate); + free (tkey); + *fdate = key; +} + +/* Generate a unique key for the visitors panel from the given logitem + * structure and assign it to the output key data structure. + * + * On error, or if no date is found, 1 is returned. + * On success, the date key is assigned to our key data structure. + */ +static int +gen_visitor_key (GKeyData * kdata, GLogItem * logitem) +{ + if (!logitem->date || !logitem->time) + return 1; + + /* Append time specificity to date */ + if (conf.date_spec_hr) + set_spec_visitor_key (&logitem->date, logitem->time); + + get_kdata (kdata, logitem->date, logitem->date); + + return 0; +} + +/* Generate a unique key for the requests panel from the given logitem + * structure and assign it to out key data structure. + * + * On success, the generated request key is assigned to our key data + * structure. + */ +static int +gen_req_key (GKeyData * kdata, GLogItem * logitem) +{ + if (logitem->req && logitem->qstr) + append_query_string (&logitem->req, logitem->qstr); + logitem->req_key = gen_unique_req_key (logitem); + + get_kdata (kdata, logitem->req_key, logitem->req); + + return 0; +} + +/* A wrapper to generate a unique key for the request panel. + * + * On error, or if the request is static or a 404, 1 is returned. + * On success, the generated request key is assigned to our key data + * structure. + */ +static int +gen_request_key (GKeyData * kdata, GLogItem * logitem) +{ + if (!logitem->req || logitem->is_404 || logitem->is_static) + return 1; + + return gen_req_key (kdata, logitem); +} + +/* A wrapper to generate a unique key for the request panel. + * + * On error, or if the request is not a 404, 1 is returned. + * On success, the generated request key is assigned to our key data + * structure. */ +static int +gen_404_key (GKeyData * kdata, GLogItem * logitem) +{ + if (logitem->req && logitem->is_404) + return gen_req_key (kdata, logitem); + return 1; +} + +/* A wrapper to generate a unique key for the request panel. + * + * On error, or if the request is not a static request, 1 is returned. + * On success, the generated request key is assigned to our key data + * structure. */ +static int +gen_static_request_key (GKeyData * kdata, GLogItem * logitem) +{ + if (logitem->req && logitem->is_static) + return gen_req_key (kdata, logitem); + return 1; +} + +/* A wrapper to generate a unique key for the virtual host panel. + * + * On error, 1 is returned. + * On success, the generated vhost key is assigned to our key data + * structure. */ +static int +gen_vhost_key (GKeyData * kdata, GLogItem * logitem) +{ + if (!logitem->vhost) + return 1; + + get_kdata (kdata, logitem->vhost, logitem->vhost); + + return 0; +} + +/* A wrapper to generate a unique key for the virtual host panel. + * + * On error, 1 is returned. + * On success, the generated userid key is assigned to our key data + * structure. */ +static int +gen_remote_user_key (GKeyData * kdata, GLogItem * logitem) +{ + if (!logitem->userid) + return 1; + + get_kdata (kdata, logitem->userid, logitem->userid); + + return 0; +} + +/* A wrapper to generate a unique key for the hosts panel. + * + * On error, 1 is returned. + * On success, the generated host key is assigned to our key data + * structure. */ +static int +gen_host_key (GKeyData * kdata, GLogItem * logitem) +{ + if (!logitem->host) + return 1; + + get_kdata (kdata, logitem->host, logitem->host); + + return 0; +} + +/* Generate a browser unique key for the browser's panel given a user + * agent and assign the browser type/category as a root element. + * + * On error, 1 is returned. + * On success, the generated browser key is assigned to our key data + * structure. */ +static int +gen_browser_key (GKeyData * kdata, GLogItem * logitem) +{ + char *agent = NULL; + char browser_type[BROWSER_TYPE_LEN] = ""; + + if (logitem->agent == NULL || *logitem->agent == '\0') + return 1; + + agent = xstrdup (logitem->agent); + logitem->browser = verify_browser (agent, browser_type); + logitem->browser_type = xstrdup (browser_type); + + /* e.g., Firefox 11.12 */ + kdata->data = logitem->browser; + kdata->data_key = logitem->browser; + + /* Firefox */ + kdata->root = logitem->browser_type; + kdata->root_key = logitem->browser_type; + + free (agent); + + return 0; +} + +/* Generate an operating system unique key for the OS' panel given a + * user agent and assign the OS type/category as a root element. + * + * On error, 1 is returned. + * On success, the generated OS key is assigned to our key data + * structure. */ +static int +gen_os_key (GKeyData * kdata, GLogItem * logitem) +{ + char *agent = NULL; + char os_type[OPESYS_TYPE_LEN] = ""; + + if (logitem->agent == NULL || *logitem->agent == '\0') + return 1; + + agent = xstrdup (logitem->agent); + logitem->os = verify_os (agent, os_type); + logitem->os_type = xstrdup (os_type); + + /* e.g., Linux,Ubuntu 10.12 */ + kdata->data = logitem->os; + kdata->data_key = logitem->os; + + /* Linux */ + kdata->root = logitem->os_type; + kdata->root_key = logitem->os_type; + + free (agent); + + return 0; +} + +/* A wrapper to generate a unique key for the referrers panel. + * + * On error, 1 is returned. + * On success, the generated referrer key is assigned to our key data + * structure. */ +static int +gen_referer_key (GKeyData * kdata, GLogItem * logitem) +{ + if (!logitem->ref) + return 1; + + get_kdata (kdata, logitem->ref, logitem->ref); + + return 0; +} + +/* A wrapper to generate a unique key for the referring sites panel. + * + * On error, 1 is returned. + * On success, the generated referring site key is assigned to our key data + * structure. */ +static int +gen_ref_site_key (GKeyData * kdata, GLogItem * logitem) +{ + if (logitem->site[0] == '\0') + return 1; + + get_kdata (kdata, logitem->site, logitem->site); + + return 0; +} + +/* A wrapper to generate a unique key for the keyphrases panel. + * + * On error, 1 is returned. + * On success, the generated keyphrase key is assigned to our key data + * structure. */ +static int +gen_keyphrase_key (GKeyData * kdata, GLogItem * logitem) +{ + if (!logitem->keyphrase) + return 1; + + get_kdata (kdata, logitem->keyphrase, logitem->keyphrase); + + return 0; +} + +/* A wrapper to generate a unique key for the geolocation panel. + * + * On error, 1 is returned. + * On success, the generated geolocation key is assigned to our key + * data structure. */ +#ifdef HAVE_GEOLOCATION +static int +gen_geolocation_key (GKeyData * kdata, GLogItem * logitem) +{ + char continent[CONTINENT_LEN] = ""; + char country[COUNTRY_LEN] = ""; + + if (extract_geolocation (logitem, continent, country) == 1) + return 1; + + if (country[0] != '\0') + logitem->country = xstrdup (country); + + if (continent[0] != '\0') + logitem->continent = xstrdup (continent); + + kdata->data_key = logitem->country; + kdata->data = logitem->country; + + kdata->root = logitem->continent; + kdata->root_key = logitem->continent; + + return 0; +} +#endif + +/* A wrapper to generate a unique key for the status code panel. + * + * On error, 1 is returned. + * On success, the generated status code key is assigned to our key + * data structure. */ +static int +gen_status_code_key (GKeyData * kdata, GLogItem * logitem) +{ + const char *status = NULL, *type = NULL; + + if (!logitem->status) + return 1; + + type = verify_status_code_type (logitem->status); + status = verify_status_code (logitem->status); + + kdata->data = (char *) status; + kdata->data_key = (char *) status; + + kdata->root = (char *) type; + kdata->root_key = (char *) type; + + return 0; +} + +/* Given a time string containing at least %H:%M, extract either the + * tenth of a minute or an hour. + * + * On error, the given string is not modified. + * On success, the conf specificity is extracted. */ +static void +parse_time_specificity_string (char *hmark, char *ftime) +{ + /* tenth of a minute specificity - e.g., 18:2 */ + if (conf.hour_spec_min && hmark[1] != '\0') { + hmark[2] = '\0'; + return; + } + + /* hour specificity (default) */ + if ((hmark - ftime) > 0) + *hmark = '\0'; +} + +/* A wrapper to generate a unique key for the time distribution panel. + * + * On error, 1 is returned. + * On success, the generated time key is assigned to our key data + * structure. */ +static int +gen_visit_time_key (GKeyData * kdata, GLogItem * logitem) +{ + char *hmark = NULL; + char hour[HRMI_LEN] = ""; /* %H:%M */ + if (!logitem->time) + return 1; + + /* if not a timestamp, then it must be a string containing the hour. + * this is faster than actual date conversion */ + if (!has_timestamp (conf.time_format) && + (hmark = strchr (logitem->time, ':'))) { + parse_time_specificity_string (hmark, logitem->time); + get_kdata (kdata, logitem->time, logitem->time); + return 0; + } + + /* otherwise it attempts to convert the date given a time format, + * though this is slower */ + memset (hour, 0, sizeof *hour); + if (convert_date (hour, logitem->time, conf.time_format, "%H:%M", HRMI_LEN) != + 0) + return 1; + + if (*hour == '\0') + return 1; + + if ((hmark = strchr (hour, ':'))) + parse_time_specificity_string (hmark, hour); + + free (logitem->time); + logitem->time = xstrdup (hour); + get_kdata (kdata, logitem->time, logitem->time); + + return 0; +} + +/* Determine if 404s need to be added to the unique visitors count. + * + * If it needs to be added, 0 is returned else 1 is returned. */ +static int +include_uniq (GLogItem * logitem) +{ + int u = conf.client_err_to_unique_count; + + if (!logitem->status || logitem->status[0] != '4' || + (u && logitem->status[0] == '4')) + return 1; + return 0; +} + +/* Convert two integers keys to to a string (concatenated). + * + * On success, the given numbers as a string are returned. */ +static char * +intkeys2str (int a, int b) +{ + char *s = xmalloc (snprintf (NULL, 0, "%d|%d", a, b) + 1); + sprintf (s, "%d|%d", a, b); + + return s; +} + +/* Determine which data metrics need to be set and set them. */ +static void +set_datamap (GLogItem * logitem, GKeyData * kdata, const GParse * parse) +{ + GModule module; + module = parse->module; + + /* insert data */ + parse->datamap (kdata->data_nkey, kdata->data, module); + + /* insert rootmap and root-data map */ + if (parse->rootmap) { + parse->rootmap (kdata->root_nkey, kdata->root, module); + insert_root (kdata->data_nkey, kdata->root_nkey, module); + } + /* insert hits */ + if (parse->hits) + parse->hits (kdata->data_nkey, module); + /* insert visitors */ + if (parse->visitor && kdata->uniq_nkey != 0) + parse->visitor (kdata->data_nkey, module); + /* insert bandwidth */ + if (parse->bw) + parse->bw (kdata->data_nkey, logitem->resp_size, module); + /* insert averages time served */ + if (parse->cumts) + parse->cumts (kdata->data_nkey, logitem->serve_time, module); + /* insert averages time served */ + if (parse->maxts) + parse->maxts (kdata->data_nkey, logitem->serve_time, module); + /* insert method */ + if (parse->method && conf.append_method) + parse->method (kdata->data_nkey, logitem->method, module); + /* insert protocol */ + if (parse->protocol && conf.append_protocol) + parse->protocol (kdata->data_nkey, logitem->protocol, module); + /* insert agent */ + if (parse->agent && conf.list_agents) + parse->agent (kdata->data_nkey, logitem->agent_nkey, module); +} + +/* Set data mapping and metrics. */ +static void +map_log (GLogItem * logitem, const GParse * parse, GModule module) +{ + GKeyData kdata; + char *uniq_key = NULL; + + new_modulekey (&kdata); + if (parse->key_data (&kdata, logitem) == 1) + return; + + /* each module requires a data key/value */ + if (parse->datamap && kdata.data_key) + kdata.data_nkey = insert_keymap (kdata.data_key, module); + + /* each module contains a uniq visitor key/value */ + if (parse->visitor && logitem->uniq_key && include_uniq (logitem)) { + uniq_key = intkeys2str (logitem->uniq_nkey, kdata.data_nkey); + /* unique key already exists? */ + kdata.uniq_nkey = insert_uniqmap (uniq_key, module); + free (uniq_key); + } + + /* root keys are optional */ + if (parse->rootmap && kdata.root_key) + kdata.root_nkey = insert_keymap (kdata.root_key, module); + + /* each module requires a root key/value */ + if (parse->datamap && kdata.data_key) + set_datamap (logitem, &kdata, parse); +} + +/* Process a log line and set the data into the corresponding data + * structure. */ +static void +process_log (GLogItem * logitem) +{ + GModule module; + const GParse *parse = NULL; + size_t idx = 0; + + /* Insert one unique visitor key per request to avoid the + * overhead of storing one key per module */ + logitem->uniq_nkey = ht_insert_unique_key (logitem->uniq_key); + + /* If we need to store user agents per IP, then we store them and retrieve + * its numeric key. + * It maintains two maps, one for key -> value, and another + * map for value -> key*/ + if (conf.list_agents) { + /* insert UA key and get a numeric value */ + logitem->agent_nkey = ht_insert_agent_key (logitem->agent); + /* insert a numeric key and map it to a UA string */ + ht_insert_agent_value (logitem->agent_nkey, logitem->agent); + } + + FOREACH_MODULE (idx, module_list) { + module = module_list[idx]; + if (!(parse = panel_lookup (module))) + continue; + map_log (logitem, parse, module); + } +} + +/* Process a line from the log and store it accordingly taking into + * account multiple parsing options prior to setting data into the + * corresponding data structure. + * + * On success, 0 is returned */ +static int +pre_process_log (GLog * glog, char *line, int dry_run) +{ + GLogItem *logitem; + int ret = 0; + int ignorelevel = 0; + + /* soft ignore these lines */ + if (valid_line (line)) + return -1; + + count_process (glog); + logitem = init_log_item (glog); + /* Parse a line of log, and fill structure with appropriate values */ + if (parse_format (logitem, line) || verify_missing_fields (logitem)) { + ret = 1; + count_invalid (glog, line); + goto cleanup; + } + + /* agent will be null in cases where %u is not specified */ + if (logitem->agent == NULL) + logitem->agent = alloc_string ("-"); + + /* testing log only */ + if (dry_run) + goto cleanup; + + ignorelevel = ignore_line (glog, logitem); + /* ignore line */ + if (ignorelevel == IGNORE_LEVEL_PANEL) + goto cleanup; + + if (is_404 (logitem)) + logitem->is_404 = 1; + else if (is_static (logitem->req)) + logitem->is_static = 1; + + logitem->uniq_key = get_uniq_visitor_key (logitem); + + inc_resp_size (glog, logitem->resp_size); + process_log (logitem); + + /* don't ignore line but neither count as valid */ + if (ignorelevel != IGNORE_LEVEL_REQ) + count_valid (glog); + +cleanup: + free_glog (logitem); + + return ret; +} + +/* Entry point to process the given live from the log. + * + * On error, 1 is returned. + * On success or soft ignores, 0 is returned. */ +static int +read_line (GLog * glog, char *line, int *test, int *cnt, int dry_run) +{ + int ret = 0; + int tests = conf.num_tests; + + /* start processing log line */ + if ((ret = pre_process_log (glog, line, dry_run)) == 0 && *test) + *test = 0; + + /* soft ignores */ + if (ret == -1) + return 0; + + /* glog->processed can actually be less than conf.num_tests, so we make sure + * (cnt) compares to the right number */ + tests = MIN (conf.num_tests, glog->processed); + + /* reached num of lines to test and no valid records were found, log + * format is likely not matching */ + if (conf.num_tests && ++(*cnt) == tests && *test) { + uncount_processed (glog); + uncount_invalid (glog); + return 1; + } + + return 0; +} + +/* A replacement for GNU getline() to dynamically expand fgets buffer. + * + * On error, NULL is returned. + * On success, the malloc'd line is returned. */ +char * +fgetline (FILE * fp) +{ + char buf[LINE_BUFFER] = { 0 }; + char *line = NULL, *tmp = NULL; + size_t linelen = 0, len = 0; + + while (1) { + if (!fgets (buf, sizeof (buf), fp)) { + if (conf.process_and_exit && errno == EAGAIN) { + nanosleep ((const struct timespec[]) { { + 0, 100000000L}}, NULL); + continue; + } else + break; + } + + len = strlen (buf); + + /* overflow check */ + if (SIZE_MAX - len - 1 < linelen) + break; + + if ((tmp = realloc (line, linelen + len + 1)) == NULL) + break; + + line = tmp; + /* append */ + strcpy (line + linelen, buf); + linelen += len; + + if (feof (fp) || buf[len - 1] == '\n') + return line; + } + free (line); + + return NULL; +} + +/* Iterate over the log and read line by line (use GNU get_line to parse the + * whole line). + * + * On error, 1 is returned. + * On success, 0 is returned. */ +#ifdef WITH_GETLINE +static int +read_lines (FILE * fp, GLog ** glog, int dry_run) +{ + char *line = NULL; + int ret = 0, cnt = 0, test = conf.num_tests > 0 ? 1 : 0; + + while ((line = fgetline (fp)) != NULL) { + /* handle SIGINT */ + if (conf.stop_processing) + goto out; + if ((ret = read_line ((*glog), line, &test, &cnt, dry_run))) + goto out; + if (dry_run && NUM_TESTS == cnt) + goto out; + free (line); + } + + /* if no data was available to read from (probably from a pipe) and + * still in test mode, we simply return until data becomes available */ + if (!line && (errno == EAGAIN || errno == EWOULDBLOCK) && test) + return 0; + + return (line && test) || ret; + +out: + free (line); + return test || ret; +} +#endif + +/* Iterate over the log and read line by line (uses a buffer of fixed size). + * + * On error, 1 is returned. + * On success, 0 is returned. */ +#ifndef WITH_GETLINE +static int +read_lines (FILE * fp, GLog ** glog, int dry_run) +{ + char *s = NULL; + char line[LINE_BUFFER] = { 0 }; + int ret = 0, cnt = 0, test = conf.num_tests > 0 ? 1 : 0; + + while ((s = fgets (line, LINE_BUFFER, fp)) != NULL) { + /* handle SIGINT */ + if (conf.stop_processing) + break; + if ((ret = read_line ((*glog), line, &test, &cnt, dry_run))) + break; + if (dry_run && NUM_TESTS == cnt) + break; + } + + /* if no data was available to read from (probably from a pipe) and + * still in test mode, we simply return until data becomes available */ + if (!s && (errno == EAGAIN || errno == EWOULDBLOCK) && test) + return 0; + + return (s && test) || ret; +} +#endif + +/* Read the given log line by line and process its data. + * + * On error, 1 is returned. + * On success, 0 is returned. */ +static int +read_log (GLog ** glog, const char *fn, int dry_run) +{ + FILE *fp = NULL; + int piping = 0; + + /* Ensure we have a valid pipe to read from stdin. Only checking for + * conf.read_stdin without verifying for a valid FILE pointer would certainly + * lead to issues. */ + if (fn[0] == '-' && fn[1] == '\0' && (*glog)->pipe) { + fp = (*glog)->pipe; + (*glog)->piping = piping = 1; + } + + /* make sure we can open the log (if not reading from stdin) */ + if (!piping && (fp = fopen (fn, "r")) == NULL) + FATAL ("Unable to open the specified log file. %s", strerror (errno)); + + /* read line by line */ + if (read_lines (fp, glog, dry_run)) { + if (!piping) + fclose (fp); + return 1; + } + + /* close log file if not a pipe */ + if (!piping) + fclose (fp); + + return 0; +} + +/* Entry point to parse the log line by line. + * + * On error, 1 is returned. + * On success, 0 is returned. */ +int +parse_log (GLog ** glog, char *tail, int dry_run) +{ + const char *err_log = NULL; + int i; + + /* process tail data and return */ + if (tail != NULL) { + /* no line testing on tail */ + if (pre_process_log ((*glog), tail, dry_run)) + return 1; + return 0; + } + + /* verify that we have the required formats */ + if ((err_log = verify_formats ())) + FATAL ("%s", err_log); + + /* no data piped, no logs passed, load from disk only then */ + if (conf.load_from_disk && !conf.filenames_idx && !conf.read_stdin) { + (*glog)->load_from_disk_only = 1; + return 0; + } + + for (i = 0; i < conf.filenames_idx; ++i) { + if (read_log (glog, conf.filenames[i], dry_run)) { + fprintf (stderr, "%s\n", conf.filenames[i]); + return 1; + } + } + + return 0; +} + +/* Ensure we have valid hits + * + * On error, an array of pointers containing the error strings. + * On success, NULL is returned. */ +char ** +test_format (GLog * glog, int *len) +{ + char **errors = NULL; + int i; + + if (parse_log (&glog, NULL, 1) == 0) + goto clean; + + errors = xcalloc (glog->log_erridx, sizeof (char *)); + for (i = 0; i < glog->log_erridx; ++i) + errors[i] = xstrdup (glog->errors[i]); + *len = glog->log_erridx; + +clean: + free_logerrors (glog); + + return errors; +} diff --git a/goaccess++/src/parser.h b/goaccess++/src/parser.h new file mode 100644 index 0000000..e2b89c3 --- /dev/null +++ b/goaccess++/src/parser.h @@ -0,0 +1,185 @@ +/** + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana + * + * 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 PARSER_H_INCLUDED +#define PARSER_H_INCLUDED + +#define KEY_FOUND 1 +#define KEY_NOT_FOUND -1 +#define LINE_BUFFER 4096 /* read at most this num of chars */ +#define NUM_TESTS 20 /* test this many lines from the log */ +#define MAX_LOG_ERRORS 20 + +#define LINE_LEN 23 +#define ERROR_LEN 255 +#define REF_SITE_LEN 511 /* maximum length of a referring site */ + +#define SPEC_TOKN_SET 0x1 +#define SPEC_TOKN_NUL 0x2 +#define SPEC_TOKN_INV 0x3 +#define SPEC_SFMT_MIS 0x4 + +#include "commons.h" + +/* Log properties. Note: This is per line parsed */ +typedef struct GLogItem_ +{ + char *agent; + char *browser; + char *browser_type; + char *continent; + char *country; + char *date; + char *host; + char *keyphrase; + char *method; + char *os; + char *os_type; + char *protocol; + char *qstr; + char *ref; + char *req; + char *req_key; + char *status; + char *time; + char *uniq_key; + char *vhost; + char *userid; + + char site[REF_SITE_LEN + 1]; + + uint64_t resp_size; + uint64_t serve_time; + + int type_ip; + int is_404; + int is_static; + int uniq_nkey; + int agent_nkey; + + char *errstr; +} GLogItem; + +/* Overall parsed log properties */ +typedef struct GLog_ +{ + unsigned int excluded_ip; + unsigned int invalid; + unsigned int offset; + unsigned int processed; + unsigned int valid; + unsigned long long resp_size; + unsigned short load_from_disk_only; + unsigned short piping; + GLogItem *items; + + unsigned short log_erridx; + char **errors; + + FILE *pipe; +} GLog; + +/* Raw data field type */ +typedef enum +{ + INTEGER, + STRING +} GRawDataType; + +/* Raw Data extracted from table stores */ +typedef struct GRawDataItem_ +{ + int key; + union + { + char *svalue; + int ivalue; + } value; +} GRawDataItem; + +/* Raw Data per module */ +typedef struct GRawData_ +{ + GRawDataItem *items; /* data */ + GModule module; /* current module */ + GRawDataType type; /* raw data items type */ + int idx; /* first level index */ + int size; /* total num of items on ht */ +} GRawData; + +/* Each record contains a data value, i.e., Windows XP, and it may contain a + * root value, i.e., Windows, and a unique key which is the combination of + * date, IP and user agent */ +typedef struct GKeyData_ +{ + void *data; + void *data_key; + int data_nkey; + + void *root; + void *root_key; + int root_nkey; + + void *uniq_key; + int uniq_nkey; +} GKeyData; + +typedef struct GParse_ +{ + GModule module; + int (*key_data) (GKeyData * kdata, GLogItem * logitem); + + /* data field */ + void (*datamap) (int data_nkey, const char *data, GModule module); + void (*rootmap) (int root_nkey, const char *root, GModule module); + + /* metrics */ + void (*hits) (int data_nkey, GModule module); + void (*visitor) (int uniq_nkey, GModule module); + void (*bw) (int data_nkey, uint64_t size, GModule module); + void (*cumts) (int data_nkey, uint64_t ts, GModule module); + void (*maxts) (int data_nkey, uint64_t ts, GModule module); + void (*method) (int data_nkey, const char *method, GModule module); + void (*protocol) (int data_nkey, const char *proto, GModule module); + void (*agent) (int data_nkey, int agent_nkey, GModule module); +} GParse; + +char *fgetline (FILE * fp); +char **test_format (GLog * glog, int *len); +GLog *init_log (void); +GLogItem *init_log_item (GLog * glog); +GRawDataItem *new_grawdata_item (unsigned int size); +GRawData *new_grawdata (void); +int parse_log (GLog ** glog, char *tail, int dry_run); +void free_logerrors (GLog * glog); +void free_raw_data (GRawData * raw_data); +void output_logerrors (GLog * glog); +void reset_struct (GLog * glog); + +#endif diff --git a/goaccess++/src/parser.o b/goaccess++/src/parser.o new file mode 100644 index 0000000000000000000000000000000000000000..4c733e2f5315a180581fa8175e506eeab91e5e4e GIT binary patch literal 48848 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 + * + * 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. + */ + +#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) + +#include +#include +#include +#include +#include +#include + +#include "settings.h" + +#include "error.h" +#include "labels.h" +#include "util.h" +#include "xmalloc.h" + +static char **nargv; +static int nargc = 0; + +/* *INDENT-OFF* */ +static GEnum LOGTYPE[] = { + {"COMBINED" , COMBINED} , + {"VCOMBINED" , VCOMBINED} , + {"COMMON" , COMMON} , + {"VCOMMON" , VCOMMON} , + {"W3C" , W3C} , + {"SQUID" , SQUID} , + {"CLOUDFRONT" , CLOUDFRONT} , + {"CLOUDSTORAGE" , CLOUDSTORAGE} , + {"AWSELB" , AWSELB} , + {"AWSS3" , AWSS3} , +}; + +static const GPreConfLog logs = { + "%h %^[%d:%t %^] \"%r\" %s %b \"%R\" \"%u\"", /* NCSA */ + "%v:%^ %h %^[%d:%t %^] \"%r\" %s %b \"%R\" \"%u\"", /* NCSA + VHost */ + "%h %^[%d:%t %^] \"%r\" %s %b", /* CLF */ + "%v:%^ %h %^[%d:%t %^] \"%r\" %s %b", /* CLF+VHost */ + "%d %t %^ %m %U %q %^ %^ %h %u %R %s %^ %^ %L", /* W3C */ + "%d\\t%t\\t%^\\t%b\\t%h\\t%m\\t%^\\t%r\\t%s\\t%R\\t%u\\t%^", /* CloudFront */ + "\"%x\",\"%h\",%^,%^,\"%m\",\"%U\",\"%s\",%^,\"%b\",\"%D\",%^,\"%R\",\"%u\"", /* Cloud Storage */ + "%dT%t.%^ %^ %h:%^ %^ %T %^ %^ %^ %s %^ %b \"%r\" \"%u\"", /* AWS Elastic Load Balancing */ + "%^ %^ %^ %v %^: %x.%^ %~%L %h %^/%s %b %m %U", /* Squid Native */ + "%^ %v [%d:%t %^] %h %^\"%r\" %s %^ %b %^ %L %^ \"%R\" \"%u\"", /* Amazon S3 */ +}; + +static const GPreConfTime times = { + "%H:%M:%S", + "%f", /* Cloud Storage (usec) */ + "%s", /* Squid (sec) */ +}; + +static const GPreConfDate dates = { + "%d/%b/%Y", /* Apache */ + "%Y-%m-%d", /* W3C */ + "%f", /* Cloud Storage (usec) */ + "%s", /* Squid (sec) */ +}; +/* *INDENT-ON* */ + +/* Ignore the following options */ +static const char *ignore_cmd_opts[] = { + "help", + "storage", + "version", +}; + +/* Determine if the given command line option needs to be ignored. + * + * If needs to be ignored, 1 is returned. + * If not within the list of ignored command line options, 0 is returned. */ +static int +in_ignore_cmd_opts (const char *val) +{ + size_t i; + for (i = 0; i < ARRAY_SIZE (ignore_cmd_opts); i++) { + if (strstr (val, ignore_cmd_opts[i]) != NULL) + return 1; + } + return 0; +} + +/* Get the location of the configuration file. + * + * By default, it attempts to read it from the user supplied path, else it will + * try to open the global config file path (sysconfdir) or from the HOME + * environment variable (~/.goaccessrc). + * + * On success, the path to the configuration file is returned. */ +char * +get_config_file_path (void) +{ + char *upath = NULL, *rpath = NULL; + + /* determine which config file to open, default or custom */ + if (conf.iconfigfile != NULL) { + rpath = realpath (conf.iconfigfile, NULL); + if (rpath == NULL) + FATAL ("Unable to open the specified config file. %s", strerror (errno)); + return rpath; + } + + /* attempt to use the user's config file */ + upath = get_home (); + rpath = realpath (upath, NULL); + if (upath) { + free (upath); + } + + /* otherwise, fallback to global config file */ + if (rpath == NULL && conf.load_global_config) { + upath = get_global_config (); + rpath = realpath (upath, NULL); + if (upath) { + free (upath); + } + } + + return rpath; +} + +/* Use predefined static files when no config file is used. Note that + * the order in which are listed is from the most to the least common + * (most cases). */ +void +set_default_static_files (void) +{ + size_t i; + const char *exts[] = { + ".css", + ".js ", + ".jpg", + ".png", + ".gif", + ".ico", + ".jpeg", + ".pdf", + ".txt", + ".csv", + ".mpeg", + ".mpg", + ".swf", + ".woff", + ".woff2", + ".xls", + ".xlsx", + ".doc ", + ".docx", + ".ppt ", + ".pptx", + ".zip", + ".mp3", + ".mp4", + ".exe", + ".iso ", + ".gz ", + ".rar ", + ".svg ", + ".bmp ", + ".tar ", + ".tgz ", + ".tiff", + ".tif ", + ".ttf ", + ".flv ", + }; + + if (conf.static_file_idx > 0) + return; + + for (i = 0; i < ARRAY_SIZE (exts); i++) { + if (conf.static_file_max_len < strlen (exts[i])) + conf.static_file_max_len = strlen (exts[i]); + conf.static_files[conf.static_file_idx++] = exts[i]; + } +} + +/* Clean malloc'd log/date/time escaped formats. */ +void +free_formats (void) +{ + free (conf.log_format); + free (conf.date_format); + free (conf.date_num_format); + free (conf.spec_date_time_format); + free (conf.spec_date_time_num_format); + free (conf.time_format); +} + +/* Clean malloc'd command line arguments. */ +void +free_cmd_args (void) +{ + int i; + if (nargc == 0) + return; + for (i = 0; i < nargc; i++) + free (nargv[i]); + free (nargv); + free (conf.iconfigfile); +} + +/* Append extra value to argv */ +static void +append_to_argv (int *argc, char ***argv, char *val) +{ + char **_argv = xrealloc (*argv, (*argc + 2) * sizeof (*_argv)); + _argv[*argc] = val; + _argv[*argc + 1] = (char *) '\0'; + (*argc)++; + *argv = _argv; +} + +/* Parses the configuration file to feed getopt_long. + * + * On error, ENOENT error code is returned. + * On success, 0 is returned and config file enabled options are appended to + * argv. */ +int +parse_conf_file (int *argc, char ***argv) +{ + char line[MAX_LINE_CONF + 1]; + char *path = NULL, *val, *opt, *p; + FILE *file; + int i, n = 0; + size_t idx; + + /* assumes program name is on argv[0], though, it is not guaranteed */ + append_to_argv (&nargc, &nargv, xstrdup ((char *) *argv[0])); + + /* determine which config file to open, default or custom */ + path = get_config_file_path (); + if (path == NULL) + return ENOENT; + + /* could not open conf file, if so prompt conf dialog */ + if ((file = fopen (path, "r")) == NULL) { + free (path); + return ENOENT; + } + + while (fgets (line, sizeof line, file) != NULL) { + while (line[0] == ' ' || line[0] == '\t') + memmove (line, line + 1, strlen (line)); + n++; + if (line[0] == '\n' || line[0] == '\r' || line[0] == '#') + continue; + + /* key */ + idx = strcspn (line, " \t"); + if (strlen (line) == idx) + FATAL ("Malformed config key at line: %d", n); + + line[idx] = '\0'; + + /* make old config options backwards compatible by + * substituting underscores with dashes */ + while ((p = strpbrk (line, "_")) != NULL) + *p = '-'; + + /* Ignore the following options when reading the config file */ + if (in_ignore_cmd_opts (line)) + continue; + + /* value */ + val = line + (idx + 1); + idx = strspn (val, " \t"); + if (strlen (line) == idx) + FATAL ("Malformed config value at line: %d", n); + val = val + idx; + val = trim_str (val); + + if (strcmp ("false", val) == 0) + continue; + + /* set it as command line options */ + opt = xmalloc (snprintf (NULL, 0, "--%s", line) + 1); + sprintf (opt, "--%s", line); + + append_to_argv (&nargc, &nargv, opt); + if (strcmp ("true", val) != 0) + append_to_argv (&nargc, &nargv, xstrdup (val)); + } + + /* give priority to command line arguments */ + for (i = 1; i < *argc; i++) + append_to_argv (&nargc, &nargv, xstrdup ((char *) (*argv)[i])); + + *argc = nargc; + *argv = (char **) nargv; + + fclose (file); + + if (conf.iconfigfile == NULL) + conf.iconfigfile = xstrdup (path); + + free (path); + return 0; +} + +/* Get the enumerated log format given its equivalent format string. + * + * On error, -1 is returned. + * On success, the enumerated format is returned. */ +static int +get_log_format_item_enum (const char *str) +{ + return str2enum (LOGTYPE, ARRAY_SIZE (LOGTYPE), str); +} + +/* Determine the selected log format from the config file or command line + * option. + * + * On error, -1 is returned. + * On success, the index of the matched item is returned. */ +size_t +get_selected_format_idx (void) +{ + if (conf.log_format == NULL) + return -1; + if (strcmp (conf.log_format, logs.common) == 0) + return COMMON; + else if (strcmp (conf.log_format, logs.vcommon) == 0) + return VCOMMON; + else if (strcmp (conf.log_format, logs.combined) == 0) + return COMBINED; + else if (strcmp (conf.log_format, logs.vcombined) == 0) + return VCOMBINED; + else if (strcmp (conf.log_format, logs.w3c) == 0) + return W3C; + else if (strcmp (conf.log_format, logs.cloudfront) == 0) + return CLOUDFRONT; + else if (strcmp (conf.log_format, logs.cloudstorage) == 0) + return CLOUDSTORAGE; + else if (strcmp (conf.log_format, logs.awselb) == 0) + return AWSELB; + else if (strcmp (conf.log_format, logs.squid) == 0) + return SQUID; + else if (strcmp (conf.log_format, logs.awss3) == 0) + return AWSS3; + else + return -1; +} + +/* Determine the selected log format from the config file or command line + * option. + * + * On error, NULL is returned. + * On success, an allocated string containing the log format is returned. */ +char * +get_selected_format_str (size_t idx) +{ + char *fmt = NULL; + switch (idx) { + case COMMON: + fmt = alloc_string (logs.common); + break; + case VCOMMON: + fmt = alloc_string (logs.vcommon); + break; + case COMBINED: + fmt = alloc_string (logs.combined); + break; + case VCOMBINED: + fmt = alloc_string (logs.vcombined); + break; + case W3C: + fmt = alloc_string (logs.w3c); + break; + case CLOUDFRONT: + fmt = alloc_string (logs.cloudfront); + break; + case CLOUDSTORAGE: + fmt = alloc_string (logs.cloudstorage); + break; + case AWSELB: + fmt = alloc_string (logs.awselb); + break; + case SQUID: + fmt = alloc_string (logs.squid); + break; + case AWSS3: + fmt = alloc_string (logs.awss3); + break; + } + + return fmt; +} + +/* Determine the selected date format from the config file or command line + * option. + * + * On error, NULL is returned. + * On success, an allocated string containing the date format is returned. */ +char * +get_selected_date_str (size_t idx) +{ + char *fmt = NULL; + switch (idx) { + case COMMON: + case VCOMMON: + case COMBINED: + case VCOMBINED: + case AWSS3: + fmt = alloc_string (dates.apache); + break; + case AWSELB: + case CLOUDFRONT: + case W3C: + fmt = alloc_string (dates.w3c); + break; + case CLOUDSTORAGE: + fmt = alloc_string (dates.usec); + break; + case SQUID: + fmt = alloc_string (dates.sec); + break; + } + + return fmt; +} + +/* Determine the selected time format from the config file or command line + * option. + * + * On error, NULL is returned. + * On success, an allocated string containing the time format is returned. */ +char * +get_selected_time_str (size_t idx) +{ + char *fmt = NULL; + switch (idx) { + case AWSELB: + case CLOUDFRONT: + case COMBINED: + case COMMON: + case VCOMBINED: + case VCOMMON: + case W3C: + case AWSS3: + fmt = alloc_string (times.fmt24); + break; + case CLOUDSTORAGE: + fmt = alloc_string (times.usec); + break; + case SQUID: + fmt = alloc_string (times.sec); + break; + } + + return fmt; +} + +/* Determine if the log/date/time were set, otherwise exit the program + * execution. */ +const char * +verify_formats (void) +{ + if (conf.time_format == NULL || *conf.time_format == '\0') + return ERR_FORMAT_NO_TIME_FMT; + + if (conf.date_format == NULL || *conf.date_format == '\0') + return ERR_FORMAT_NO_DATE_FMT; + + if (conf.log_format == NULL || *conf.log_format == '\0') + return ERR_FORMAT_NO_LOG_FMT; + + return NULL; +} + +/* A wrapper function to concat the given specificity to the date + * format. */ +static char * +append_spec_date_format (const char *date_format, const char *spec_format) +{ + char *s = xmalloc (snprintf (NULL, 0, "%s%s", date_format, spec_format) + 1); + sprintf (s, "%s%s", date_format, spec_format); + + return s; +} + +/* Iterate over the given format and clean unwanted chars and keep all + * date/time specifiers such as %b%Y%d%M%S. + * + * On error NULL is returned. + * On success, a clean format containing only date/time specifiers is + * returned. */ +static char * +clean_date_time_format (const char *format) +{ + char *fmt = NULL, *pr = NULL, *pw = NULL; + int special = 0; + + if (format == NULL || *format == '\0') + return NULL; + + fmt = xstrdup (format); + pr = fmt; + pw = fmt; + while (*pr) { + *pw = *pr++; + if (*pw == '%' || special) { + special = !special; + pw++; + } + } + *pw = '\0'; + + return fmt; +} + +/* Determine if the given specifier character is an abbreviated type + * of date. + * + * If it is, 1 is returned, otherwise, 0 is returned. */ +static int +is_date_abbreviated (const char *fdate) +{ + if (strpbrk (fdate, "cDF")) + return 1; + + return 0; +} + +/* A wrapper to extract time specifiers from a time format. + * + * On error NULL is returned. + * On success, a clean format containing only time specifiers is + * returned. */ +static char * +set_format_time (void) +{ + char *ftime = NULL; + + if (has_timestamp (conf.date_format) || !strcmp ("%T", conf.time_format)) + ftime = xstrdup ("%H%M%S"); + else + ftime = clean_date_time_format (conf.time_format); + + return ftime; +} + +/* A wrapper to extract date specifiers from a date format. + * + * On error NULL is returned. + * On success, a clean format containing only date specifiers is + * returned. */ +static char * +set_format_date (void) +{ + char *fdate = NULL; + + if (has_timestamp (conf.date_format)) + fdate = xstrdup ("%Y%m%d"); + else + fdate = clean_date_time_format (conf.date_format); + + return fdate; +} + +/* Once we have a numeric date format, we attempt to read the time + * format and construct a date_time numeric specificity format (if any + * specificity is given). The result may look like Ymd[HM]. + * + * On success, the numeric date time specificity format is set. */ +static void +set_spec_date_time_num_format (void) +{ + char *buf = NULL, *tf = set_format_time (); + const char *df = conf.date_num_format; + + if (!df || !tf) + return; + + if (conf.date_spec_hr && strchr (tf, 'H')) + buf = append_spec_date_format (df, "%H"); + else + buf = xstrdup (df); + + conf.spec_date_time_num_format = buf; + free (tf); +} + +/* Set a human readable specificity date and time format. + * + * On success, the human readable date time specificity format is set. */ +static void +set_spec_date_time_format (void) +{ + char *buf = NULL; + const char *fmt = conf.spec_date_time_num_format; + int buflen = 0, flen = 0; + + if (!fmt) + return; + + flen = (strlen (fmt) * 2) + 1; + buf = xcalloc (flen, sizeof (char)); + + if (strchr (fmt, 'd')) + buflen += snprintf (buf + buflen, flen - buflen, "%%d/"); + if (strchr (fmt, 'm')) + buflen += snprintf (buf + buflen, flen - buflen, "%%b/"); + if (strchr (fmt, 'Y')) + buflen += snprintf (buf + buflen, flen - buflen, "%%Y"); + if (strchr (fmt, 'H')) + buflen += snprintf (buf + buflen, flen - buflen, ":%%H"); + + conf.spec_date_time_format = buf; +} + +/* Normalize the date format from the date format given by the user to + * Ymd so it can be sorted out properly afterwards. + * + * On error or unable to determine the format, 1 is returned. + * On success, the numeric date format as Ymd is set and 0 is + * returned. */ +static int +set_date_num_format (void) +{ + char *fdate = NULL, *buf = NULL; + int buflen = 0, flen = 0; + + fdate = set_format_date (); + if (!fdate) + return 1; + + if (is_date_abbreviated (fdate)) { + free (fdate); + conf.date_num_format = xstrdup ("%Y%m%d"); + return 0; + } + + flen = strlen (fdate) + 1; + buf = xcalloc (flen, sizeof (char)); + + if (strpbrk (fdate, "Yy")) + buflen += snprintf (buf + buflen, flen - buflen, "%%Y"); + if (strpbrk (fdate, "hbmB")) + buflen += snprintf (buf + buflen, flen - buflen, "%%m"); + if (strpbrk (fdate, "de")) + buflen += snprintf (buf + buflen, flen - buflen, "%%d"); + + conf.date_num_format = buf; + free (fdate); + + return buflen == 0 ? 1 : 0; +} + +/* If specificity is supplied, then determine which value we need to + * append to the date format. */ +void +set_spec_date_format (void) +{ + if (verify_formats ()) + return; + + if (conf.date_num_format) + free (conf.date_num_format); + if (conf.spec_date_time_format) + free (conf.spec_date_time_format); + if (conf.spec_date_time_num_format) + free (conf.spec_date_time_num_format); + + if (set_date_num_format () == 0) { + set_spec_date_time_num_format (); + set_spec_date_time_format (); + } +} + +/* Attempt to set the date format given a command line option + * argument. The supplied optarg can be either an actual format string + * or the enumerated value such as VCOMBINED */ +void +set_date_format_str (const char *oarg) +{ + char *fmt = NULL; + int type = get_log_format_item_enum (oarg); + + /* free date format if it was previously set by set_log_format_str() */ + if (conf.date_format) + free (conf.date_format); + + /* type not found, use whatever was given by the user then */ + if (type == -1) { + conf.date_format = unescape_str (oarg); + return; + } + + /* attempt to get the format string by the enum value */ + if ((fmt = get_selected_date_str (type)) == NULL) { + LOG_DEBUG (("Unable to set date format from enum: %s\n", oarg)); + return; + } + + conf.date_format = fmt; +} + +/* Attempt to set the time format given a command line option + * argument. The supplied optarg can be either an actual format string + * or the enumerated value such as VCOMBINED */ +void +set_time_format_str (const char *oarg) +{ + char *fmt = NULL; + int type = get_log_format_item_enum (oarg); + + /* free time format if it was previously set by set_log_format_str() */ + if (conf.time_format) + free (conf.time_format); + + /* type not found, use whatever was given by the user then */ + if (type == -1) { + conf.time_format = unescape_str (oarg); + return; + } + + /* attempt to get the format string by the enum value */ + if ((fmt = get_selected_time_str (type)) == NULL) { + LOG_DEBUG (("Unable to set time format from enum: %s\n", oarg)); + return; + } + + conf.time_format = fmt; +} + +/* Attempt to set the log format given a command line option argument. + * The supplied optarg can be either an actual format string or the + * enumerated value such as VCOMBINED */ +void +set_log_format_str (const char *oarg) +{ + char *fmt = NULL; + int type = get_log_format_item_enum (oarg); + + /* free log format if it was previously set */ + if (conf.log_format) + free (conf.log_format); + + /* type not found, use whatever was given by the user then */ + if (type == -1) { + conf.log_format = unescape_str (oarg); + return; + } + + /* attempt to get the format string by the enum value */ + if ((fmt = get_selected_format_str (type)) == NULL) { + LOG_DEBUG (("Unable to set log format from enum: %s\n", oarg)); + return; + } + + conf.log_format = unescape_str (fmt); + /* assume we are using the default date/time formats */ + set_time_format_str (oarg); + set_date_format_str (oarg); + free (fmt); +} diff --git a/goaccess++/src/settings.h b/goaccess++/src/settings.h new file mode 100644 index 0000000..8faf66c --- /dev/null +++ b/goaccess++/src/settings.h @@ -0,0 +1,237 @@ +/** + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana + * + * 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 SETTINGS_H_INCLUDED +#define SETTINGS_H_INCLUDED + +#include +#include "commons.h" + +#define MAX_LINE_CONF 512 +#define MAX_EXTENSIONS 128 +#define MAX_IGNORE_IPS 1024 + 128 +#define MAX_IGNORE_REF 64 +#define MAX_CUSTOM_COLORS 64 +#define MAX_IGNORE_STATUS 64 +#define MAX_OUTFORMATS 3 +#define MAX_FILENAMES 512 +#define NO_CONFIG_FILE "No config file used" + +typedef enum LOGTYPE +{ + COMBINED, + VCOMBINED, + COMMON, + VCOMMON, + W3C, + SQUID, + CLOUDFRONT, + CLOUDSTORAGE, + AWSELB, + AWSS3, +} GLogType; + +/* predefined log times */ +typedef struct GPreConfTime_ +{ + const char *fmt24; + const char *usec; + const char *sec; +} GPreConfTime; + +/* predefined log dates */ +typedef struct GPreConfDate_ +{ + const char *apache; + const char *w3c; + const char *usec; + const char *sec; +} GPreConfDate; + +/* predefined log formats */ +typedef struct GPreConfLog_ +{ + const char *combined; + const char *vcombined; + const char *common; + const char *vcommon; + const char *w3c; + const char *cloudfront; + const char *cloudstorage; + const char *awselb; + const char *squid; + const char *awss3; +} GPreConfLog; + +/* *INDENT-OFF* */ +/* All configuration properties */ +typedef struct GConf_ +{ + /* Array options */ + const char *colors[MAX_CUSTOM_COLORS]; /* colors */ + const char *enable_panels[TOTAL_MODULES]; /* array of panels to enable */ + const char *filenames[MAX_FILENAMES]; /* log files */ + const char *hide_referers[MAX_IGNORE_REF]; /* hide referrers from report */ + const char *ignore_ips[MAX_IGNORE_IPS]; /* array of ips to ignore */ + const char *ignore_panels[TOTAL_MODULES]; /* array of panels to ignore */ + const char *ignore_referers[MAX_IGNORE_REF]; /* referrers to ignore */ + const char *ignore_status[MAX_IGNORE_STATUS]; /* status to ignore */ + const char *output_formats[MAX_OUTFORMATS]; /* output format, e.g. , HTML */ + const char *sort_panels[TOTAL_MODULES]; /* sorting options for each panel */ + const char *static_files[MAX_EXTENSIONS]; /* static extensions */ + + /* Log/date/time formats */ + char *date_format; /* date format */ + char *date_num_format; /* numeric date format %Y%m%d */ + char *time_format; /* time format as given by the user */ + char *spec_date_time_format; /* date format w/ specificity */ + char *spec_date_time_num_format; /* numeric date format w/ specificity */ + char *log_format; /* log format */ + char *iconfigfile; /* config file path */ + char ***user_browsers_hash; /* custom list of browsers */ + + const char *debug_log; /* debug log path */ + const char *geoip_database; /* geoip db path */ + const char *html_custom_css; /* custom CSS */ + const char *html_custom_js; /* custom JS */ + const char *html_prefs; /* default HTML JSON preferences */ + const char *html_report_title; /* report title */ + const char *invalid_requests_log; /* invalid lines log path */ + const char *pidfile; /* daemonize pid file path */ + const char *browsers_file; /* browser's file path */ + + /* HTML real-time */ + const char *addr; /* IP address to bind to */ + const char *fifo_in; /* path FIFO in (reader) */ + const char *fifo_out; /* path FIFO out (writer) */ + const char *origin; /* WebSocket origin */ + const char *port; /* port to use */ + const char *sslcert; /* TLS/SSL path to certificate */ + const char *sslkey; /* TLS/SSL path to private key */ + const char *ws_url; /* WebSocket URL */ + + /* User flags */ + int store_accumulated_time; /* store accumulated processing time in tcb */ + int all_static_files; /* parse all static files */ + int anonymize_ip; /* anonymize ip addresses */ + int append_method; /* append method to the req key */ + int append_protocol; /* append protocol to the req key */ + int client_err_to_unique_count; /* count 400s as visitors */ + int code444_as_404; /* 444 as 404s? */ + int color_scheme; /* color scheme */ + int crawlers_only ; /* crawlers only */ + int daemonize; /* run program as a Unix daemon */ + int double_decode; /* need to double decode */ + int enable_html_resolver; /* html/json/csv resolver */ + int geo_db; /* legacy geoip db */ + int hl_header; /* highlight header on term */ + int ignore_crawlers; /* ignore crawlers */ + int ignore_qstr; /* ignore query string */ + int ignore_statics; /* ignore static files */ + int json_pretty_print; /* pretty print JSON data */ + int list_agents; /* show list of agents per host */ + int load_conf_dlg; /* load curses config dialog */ + int load_global_config; /* use global config file */ + int max_items; /* max number of items to output */ + int mouse_support; /* add curses mouse support */ + int no_color; /* no terminal colors */ + int no_column_names; /* don't show col names on termnal */ + int no_csv_summary; /* don't show overall metrics */ + int no_html_last_updated; /* don't show HTML last updated field */ + int no_parsing_spinner; /* disable parsing spinner */ + int no_progress; /* disable progress metrics */ + int no_tab_scroll; /* don't scroll dashboard on tab */ + int output_stdout; /* outputting to stdout */ + int process_and_exit; /* parse and exit without outputting */ + int real_os; /* show real OSs */ + int real_time_html; /* enable real-time HTML output */ + int skip_term_resolver; /* no terminal resolver */ + uint32_t num_tests; /* number of lines to test */ + uint64_t log_size; /* log size override */ + + /* Internal flags */ + int bandwidth; /* is there bandwidth within the req line */ + int date_spec_hr; /* date specificity - hour */ + int has_geocity; + int has_geocountry; + int hour_spec_min; /* hour specificity - min */ + int read_stdin; /* read from stdin */ + int serve_usecs; /* is there time served within req line */ + int stop_processing; /* stop all processing */ + int tailing_mode; /* in tailing-mode? */ + + /* Array indices */ + int color_idx; /* colors index */ + int enable_panel_idx; /* enable panels index */ + int filenames_idx; /* filenames index */ + int hide_referer_idx; /* hide referrers index */ + int ignore_ip_idx; /* ignored ips index */ + int ignore_panel_idx; /* ignored panels index */ + int ignore_referer_idx; /* ignored referrers index */ + int ignore_status_idx; /* ignore status index */ + int output_format_idx; /* output format index */ + int sort_panel_idx; /* sort panel index */ + int static_file_idx; /* static extensions index */ + int browsers_hash_idx; /* browsers hash index */ + + size_t static_file_max_len; + + /* TokyoCabinet */ + const char *db_path; /* db path to files */ + int64_t xmmap; /* size of the extra mapped memory */ + int cache_lcnum; /* max num of leaf nodes to cache */ + int cache_ncnum; /* max num of non-leaf nodes to cache */ + int compression; /* deflate or BZIP2 */ + int keep_db_files; /* persist parsed data into disk */ + int load_from_disk; /* load stored data */ + int tune_bnum; /* num of elems of the bucket array */ + int tune_lmemb; /* num of memb in each leaf page */ + int tune_nmemb; /* num of memb in each non-leaf page */ +} GConf; +/* *INDENT-ON* */ + +char *get_selected_date_str (size_t idx); +char *get_selected_format_str (size_t idx); +char *get_selected_time_str (size_t idx); +const char *verify_formats (void); +size_t get_selected_format_idx (void); +void set_date_format_str (const char *optarg); +void set_log_format_str (const char *optarg); +void set_spec_date_format (void); +void set_time_format_str (const char *optarg); + +extern GConf conf; + +char *get_config_file_path (void); +int parse_conf_file (int *argc, char ***argv); +void free_cmd_args (void); +void free_formats (void); +void set_default_static_files (void); + +#endif diff --git a/goaccess++/src/settings.o b/goaccess++/src/settings.o new file mode 100644 index 0000000000000000000000000000000000000000..040d79c22ef83f78ca4b1eda66fa3373bad772d0 GIT binary patch literal 23984 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 NAw8rHsl8eLe*v)K6N>-< literal 0 HcmV?d00001 diff --git a/goaccess++/src/sha1.c b/goaccess++/src/sha1.c new file mode 100644 index 0000000..5bc4fec --- /dev/null +++ b/goaccess++/src/sha1.c @@ -0,0 +1,235 @@ +/* +SHA-1 in C +By Steve Reid +100% Public Domain + +Test Vectors (from FIPS PUB 180-1) +"abc" + A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D +"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" + 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1 +A million repetitions of "a" + 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F +*/ + +/* #define LITTLE_ENDIAN * This should be #define'd if true. */ +#if __LITTLE_ENDIAN__ +#define LITTLE_ENDIAN +#endif +/* #define SHA1HANDSOFF * Copies data before messing with it. */ + +#include +#include + +#include "sha1.h" + +void SHA1Transform (uint32_t state[5], uint8_t buffer[64]); + +#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) + +/* blk0() and blk() perform the initial expand. */ +/* I got the idea of expanding during the round function from SSLeay */ +#ifdef LITTLE_ENDIAN +#define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \ + |(rol(block->l[i],8)&0x00FF00FF)) +#else +#define blk0(i) block->l[i] +#endif +#define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \ + ^block->l[(i+2)&15]^block->l[i&15],1)) + +/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ +#define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30); +#define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30); +#define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30); +#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30); +#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30); + + +/* Hash a single 512-bit block. This is the core of the algorithm. */ + +void +SHA1Transform (uint32_t state[5], uint8_t buffer[64]) +{ + uint32_t a, b, c, d, e; + typedef union + { + uint8_t c[64]; + uint32_t l[16]; + } CHAR64LONG16; + CHAR64LONG16 *block; +#ifdef SHA1HANDSOFF + static uint8_t workspace[64]; + block = (CHAR64LONG16 *) workspace; + memcpy (block, buffer, 64); +#else + block = (CHAR64LONG16 *) buffer; +#endif + /* Copy context->state[] to working vars */ + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + e = state[4]; + /* 4 rounds of 20 operations each. Loop unrolled. */ + R0 (a, b, c, d, e, 0); + R0 (e, a, b, c, d, 1); + R0 (d, e, a, b, c, 2); + R0 (c, d, e, a, b, 3); + R0 (b, c, d, e, a, 4); + R0 (a, b, c, d, e, 5); + R0 (e, a, b, c, d, 6); + R0 (d, e, a, b, c, 7); + R0 (c, d, e, a, b, 8); + R0 (b, c, d, e, a, 9); + R0 (a, b, c, d, e, 10); + R0 (e, a, b, c, d, 11); + R0 (d, e, a, b, c, 12); + R0 (c, d, e, a, b, 13); + R0 (b, c, d, e, a, 14); + R0 (a, b, c, d, e, 15); + R1 (e, a, b, c, d, 16); + R1 (d, e, a, b, c, 17); + R1 (c, d, e, a, b, 18); + R1 (b, c, d, e, a, 19); + R2 (a, b, c, d, e, 20); + R2 (e, a, b, c, d, 21); + R2 (d, e, a, b, c, 22); + R2 (c, d, e, a, b, 23); + R2 (b, c, d, e, a, 24); + R2 (a, b, c, d, e, 25); + R2 (e, a, b, c, d, 26); + R2 (d, e, a, b, c, 27); + R2 (c, d, e, a, b, 28); + R2 (b, c, d, e, a, 29); + R2 (a, b, c, d, e, 30); + R2 (e, a, b, c, d, 31); + R2 (d, e, a, b, c, 32); + R2 (c, d, e, a, b, 33); + R2 (b, c, d, e, a, 34); + R2 (a, b, c, d, e, 35); + R2 (e, a, b, c, d, 36); + R2 (d, e, a, b, c, 37); + R2 (c, d, e, a, b, 38); + R2 (b, c, d, e, a, 39); + R3 (a, b, c, d, e, 40); + R3 (e, a, b, c, d, 41); + R3 (d, e, a, b, c, 42); + R3 (c, d, e, a, b, 43); + R3 (b, c, d, e, a, 44); + R3 (a, b, c, d, e, 45); + R3 (e, a, b, c, d, 46); + R3 (d, e, a, b, c, 47); + R3 (c, d, e, a, b, 48); + R3 (b, c, d, e, a, 49); + R3 (a, b, c, d, e, 50); + R3 (e, a, b, c, d, 51); + R3 (d, e, a, b, c, 52); + R3 (c, d, e, a, b, 53); + R3 (b, c, d, e, a, 54); + R3 (a, b, c, d, e, 55); + R3 (e, a, b, c, d, 56); + R3 (d, e, a, b, c, 57); + R3 (c, d, e, a, b, 58); + R3 (b, c, d, e, a, 59); + R4 (a, b, c, d, e, 60); + R4 (e, a, b, c, d, 61); + R4 (d, e, a, b, c, 62); + R4 (c, d, e, a, b, 63); + R4 (b, c, d, e, a, 64); + R4 (a, b, c, d, e, 65); + R4 (e, a, b, c, d, 66); + R4 (d, e, a, b, c, 67); + R4 (c, d, e, a, b, 68); + R4 (b, c, d, e, a, 69); + R4 (a, b, c, d, e, 70); + R4 (e, a, b, c, d, 71); + R4 (d, e, a, b, c, 72); + R4 (c, d, e, a, b, 73); + R4 (b, c, d, e, a, 74); + R4 (a, b, c, d, e, 75); + R4 (e, a, b, c, d, 76); + R4 (d, e, a, b, c, 77); + R4 (c, d, e, a, b, 78); + R4 (b, c, d, e, a, 79); + /* Add the working vars back into context.state[] */ + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + state[4] += e; + /* Wipe variables */ + a = b = c = d = e = 0; +} + + +/* SHA1Init - Initialize new context */ + +void +SHA1Init (SHA1_CTX * context) +{ + /* SHA1 initialization constants */ + context->state[0] = 0x67452301; + context->state[1] = 0xEFCDAB89; + context->state[2] = 0x98BADCFE; + context->state[3] = 0x10325476; + context->state[4] = 0xC3D2E1F0; + context->count[0] = context->count[1] = 0; +} + + +/* Run your data through this. */ + +void +SHA1Update (SHA1_CTX * context, uint8_t * data, unsigned int len) +{ + unsigned int i, j; + + j = (context->count[0] >> 3) & 63; + if ((context->count[0] += len << 3) < (len << 3)) + context->count[1]++; + context->count[1] += (len >> 29); + if ((j + len) > 63) { + memcpy (&context->buffer[j], data, (i = 64 - j)); + SHA1Transform (context->state, context->buffer); + for (; i + 63 < len; i += 64) { + SHA1Transform (context->state, &data[i]); + } + j = 0; + } else + i = 0; + memcpy (&context->buffer[j], &data[i], len - i); +} + + +/* Add padding and return the message digest. */ + +void +SHA1Final (uint8_t digest[20], SHA1_CTX * context) +{ + uint32_t i, j; + uint8_t finalcount[8]; + + for (i = 0; i < 8; i++) { + finalcount[i] = (uint8_t) ((context->count[(i >= 4 ? 0 : 1)] + >> ((3 - (i & 3)) * 8)) & 255); /* Endian independent */ + } + SHA1Update (context, (uint8_t *) "\200", 1); + while ((context->count[0] & 504) != 448) { + SHA1Update (context, (uint8_t *) "\0", 1); + } + SHA1Update (context, finalcount, 8); /* Should cause a SHA1Transform() */ + for (i = 0; i < 20; i++) { + digest[i] = (uint8_t) + ((context->state[i >> 2] >> ((3 - (i & 3)) * 8)) & 255); + } + /* Wipe variables */ + i = j = 0; + memset (context->buffer, 0, 64); + memset (context->state, 0, 20); + memset (context->count, 0, 8); + memset (&finalcount, 0, 8); +#ifdef SHA1HANDSOFF /* make SHA1Transform overwrite it's own static vars */ + SHA1Transform (context->state, context->buffer); +#endif +} diff --git a/goaccess++/src/sha1.h b/goaccess++/src/sha1.h new file mode 100644 index 0000000..cc07482 --- /dev/null +++ b/goaccess++/src/sha1.h @@ -0,0 +1,20 @@ +#ifndef SHA1_H_INCLUDED +#define SHA1_H_INCLUDED + +#include +#include + +// From http://www.mirrors.wiretapped.net/security/cryptography/hashes/sha1/sha1.c + +typedef struct +{ + uint32_t state[5]; + uint32_t count[2]; + uint8_t buffer[64]; +} SHA1_CTX; + +extern void SHA1Init (SHA1_CTX * context); +extern void SHA1Update (SHA1_CTX * context, uint8_t * data, uint32_t len); +extern void SHA1Final (uint8_t digest[20], SHA1_CTX * context); + +#endif // for #ifndef SHA1_H diff --git a/goaccess++/src/sha1.o b/goaccess++/src/sha1.o new file mode 100644 index 0000000000000000000000000000000000000000..5830f2cdf36e7a4edccef700928ffe7e6c23d00c GIT binary patch literal 7664 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 + * + * 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. + */ + +#if HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include + +#include "error.h" +#include "settings.h" +#include "util.h" + +#include "sort.h" + +/* *INDENT-OFF* */ +const int sort_choices[][SORT_MAX_OPTS] = { + /* VISITORS */ + {SORT_BY_HITS, SORT_BY_VISITORS, SORT_BY_DATA, SORT_BY_BW, SORT_BY_AVGTS, SORT_BY_CUMTS, SORT_BY_MAXTS, -1}, + /* REQUESTS */ + {SORT_BY_HITS, SORT_BY_VISITORS, SORT_BY_DATA, SORT_BY_BW, SORT_BY_AVGTS, SORT_BY_CUMTS, SORT_BY_MAXTS, SORT_BY_PROT, SORT_BY_MTHD, -1}, + /* REQUESTS_STATIC */ + {SORT_BY_HITS, SORT_BY_VISITORS, SORT_BY_DATA, SORT_BY_BW, SORT_BY_AVGTS, SORT_BY_CUMTS, SORT_BY_MAXTS, SORT_BY_PROT, SORT_BY_MTHD, -1}, + /* NOT_FOUND */ + {SORT_BY_HITS, SORT_BY_VISITORS, SORT_BY_DATA, SORT_BY_BW, SORT_BY_AVGTS, SORT_BY_CUMTS, SORT_BY_MAXTS, SORT_BY_PROT, SORT_BY_MTHD, -1}, + /* HOSTS */ + {SORT_BY_HITS, SORT_BY_VISITORS, SORT_BY_DATA, SORT_BY_BW, SORT_BY_AVGTS, SORT_BY_CUMTS, SORT_BY_MAXTS, -1}, + /* OS */ + {SORT_BY_HITS, SORT_BY_VISITORS, SORT_BY_DATA, SORT_BY_BW, SORT_BY_AVGTS, SORT_BY_CUMTS, SORT_BY_MAXTS, -1}, + /* BROWSERS */ + {SORT_BY_HITS, SORT_BY_VISITORS, SORT_BY_DATA, SORT_BY_BW, SORT_BY_AVGTS, SORT_BY_CUMTS, SORT_BY_MAXTS, -1}, + /* VISIT_TIMES */ + {SORT_BY_HITS, SORT_BY_VISITORS, SORT_BY_DATA, SORT_BY_BW, SORT_BY_AVGTS, SORT_BY_CUMTS, SORT_BY_MAXTS, -1}, + /* VIRTUAL_HOSTS */ + {SORT_BY_HITS, SORT_BY_VISITORS, SORT_BY_DATA, SORT_BY_BW, SORT_BY_AVGTS, SORT_BY_CUMTS, SORT_BY_MAXTS, -1}, + /* REFERRERS */ + {SORT_BY_HITS, SORT_BY_VISITORS, SORT_BY_DATA, SORT_BY_BW, SORT_BY_AVGTS, SORT_BY_CUMTS, SORT_BY_MAXTS, -1}, + /* REFERRING_SITES */ + {SORT_BY_HITS, SORT_BY_VISITORS, SORT_BY_DATA, SORT_BY_BW, SORT_BY_AVGTS, SORT_BY_CUMTS, SORT_BY_MAXTS, -1}, + /* KEYPHRASES */ + {SORT_BY_HITS, SORT_BY_VISITORS, SORT_BY_DATA, SORT_BY_BW, SORT_BY_AVGTS, SORT_BY_CUMTS, SORT_BY_MAXTS, -1}, + /* STATUS_CODES */ + {SORT_BY_HITS, SORT_BY_VISITORS, SORT_BY_DATA, SORT_BY_BW, SORT_BY_AVGTS, SORT_BY_CUMTS, SORT_BY_MAXTS, -1}, + /* REMOTE_USER */ + {SORT_BY_HITS, SORT_BY_VISITORS, SORT_BY_DATA, SORT_BY_BW, SORT_BY_AVGTS, SORT_BY_CUMTS, SORT_BY_MAXTS, -1}, +#ifdef HAVE_GEOLOCATION + /* GEO_LOCATION */ + {SORT_BY_HITS, SORT_BY_VISITORS, SORT_BY_DATA, SORT_BY_BW, SORT_BY_AVGTS, SORT_BY_CUMTS, SORT_BY_MAXTS, -1}, +#endif +}; + +static GEnum FIELD[] = { + {"BY_HITS" , SORT_BY_HITS } , + {"BY_VISITORS" , SORT_BY_VISITORS } , + {"BY_DATA" , SORT_BY_DATA } , + {"BY_BW" , SORT_BY_BW } , + {"BY_AVGTS" , SORT_BY_AVGTS } , + {"BY_CUMTS" , SORT_BY_CUMTS } , + {"BY_MAXTS" , SORT_BY_MAXTS } , + {"BY_PROT" , SORT_BY_PROT } , + {"BY_MTHD" , SORT_BY_MTHD } , +}; + +static GEnum ORDER[] = { + {"ASC" , SORT_ASC } , + {"DESC" , SORT_DESC } , +}; + +GSort module_sort[TOTAL_MODULES] = { + {VISITORS , SORT_BY_DATA , SORT_DESC } , + {REQUESTS , SORT_BY_HITS , SORT_DESC } , + {REQUESTS_STATIC , SORT_BY_HITS , SORT_DESC } , + {NOT_FOUND , SORT_BY_HITS , SORT_DESC } , + {HOSTS , SORT_BY_HITS , SORT_DESC } , + {OS , SORT_BY_HITS , SORT_DESC } , + {BROWSERS , SORT_BY_HITS , SORT_DESC } , + {VISIT_TIMES , SORT_BY_DATA , SORT_ASC } , + {VIRTUAL_HOSTS , SORT_BY_HITS , SORT_DESC } , + {REFERRERS , SORT_BY_HITS , SORT_DESC } , + {REFERRING_SITES , SORT_BY_HITS , SORT_DESC } , + {KEYPHRASES , SORT_BY_HITS , SORT_DESC } , + {STATUS_CODES , SORT_BY_HITS , SORT_DESC } , + {REMOTE_USER , SORT_BY_HITS , SORT_DESC } , +#ifdef HAVE_GEOLOCATION + {GEO_LOCATION , SORT_BY_HITS , SORT_DESC } , +#endif +}; +/* *INDENT-ON* */ + +/* Sort an array of strings ascending */ +int +strcmp_asc (const void *a, const void *b) +{ + return strcmp (*((char **) a), *((char **) b)); +} + +/* Sort 'data' metric ascending */ +static int +cmp_data_asc (const void *a, const void *b) +{ + const GHolderItem *ia = a; + const GHolderItem *ib = b; + return strcmp (ia->metrics->data, ib->metrics->data); +} + +/* Sort 'data' metric descending */ +static int +cmp_data_desc (const void *a, const void *b) +{ + const GHolderItem *ia = a; + const GHolderItem *ib = b; + return strcmp (ib->metrics->data, ia->metrics->data); +} + +/* Sort 'hits' metric descending */ +static int +cmp_num_desc (const void *a, const void *b) +{ + const GHolderItem *ia = a; + const GHolderItem *ib = b; + + int va = ia->metrics->hits; + int vb = ib->metrics->hits; + + return (va < vb) - (va > vb); +} + +/* Sort 'hits' metric ascending */ +static int +cmp_num_asc (const void *a, const void *b) +{ + const GHolderItem *ia = a; + const GHolderItem *ib = b; + + int va = ia->metrics->hits; + int vb = ib->metrics->hits; + + return (va > vb) - (va < vb); +} + +/* Sort 'visitors' metric descending */ +static int +cmp_vis_desc (const void *a, const void *b) +{ + const GHolderItem *ia = a; + const GHolderItem *ib = b; + + int va = ia->metrics->visitors; + int vb = ib->metrics->visitors; + + return (va < vb) - (va > vb); +} + +/* Sort 'visitors' metric ascending */ +static int +cmp_vis_asc (const void *a, const void *b) +{ + const GHolderItem *ia = a; + const GHolderItem *ib = b; + + int va = ia->metrics->visitors; + int vb = ib->metrics->visitors; + + return (va > vb) - (va < vb); +} + +/* Sort GRawDataItem value descending */ +static int +cmp_raw_num_desc (const void *a, const void *b) +{ + const GRawDataItem *ia = a; + const GRawDataItem *ib = b; + + int va = ia->value.ivalue; + int vb = ib->value.ivalue; + + return (va < vb) - (va > vb); +} + +/* Sort GRawDataItem value descending */ +static int +cmp_raw_str_desc (const void *a, const void *b) +{ + const GRawDataItem *ia = a; + const GRawDataItem *ib = b; + + return strcmp (ib->value.svalue, ia->value.svalue); +} + +/* Sort 'bandwidth' metric descending */ +static int +cmp_bw_desc (const void *a, const void *b) +{ + const GHolderItem *ia = a; + const GHolderItem *ib = b; + + uint64_t va = ia->metrics->bw.nbw; + uint64_t vb = ib->metrics->bw.nbw; + + return (va < vb) - (va > vb); +} + +/* Sort 'bandwidth' metric ascending */ +static int +cmp_bw_asc (const void *a, const void *b) +{ + const GHolderItem *ia = a; + const GHolderItem *ib = b; + + uint64_t va = ia->metrics->bw.nbw; + uint64_t vb = ib->metrics->bw.nbw; + + return (va > vb) - (va < vb); +} + +/* Sort 'avgts' metric descending */ +static int +cmp_avgts_desc (const void *a, const void *b) +{ + const GHolderItem *ia = a; + const GHolderItem *ib = b; + + uint64_t va = ia->metrics->avgts.nts; + uint64_t vb = ib->metrics->avgts.nts; + + return (va < vb) - (va > vb); +} + +/* Sort 'avgts' metric ascending */ +static int +cmp_avgts_asc (const void *a, const void *b) +{ + const GHolderItem *ia = a; + const GHolderItem *ib = b; + + uint64_t va = ia->metrics->avgts.nts; + uint64_t vb = ib->metrics->avgts.nts; + + return (va > vb) - (va < vb); +} + +/* Sort 'cumts' metric descending */ +static int +cmp_cumts_desc (const void *a, const void *b) +{ + const GHolderItem *ia = a; + const GHolderItem *ib = b; + + uint64_t va = ia->metrics->cumts.nts; + uint64_t vb = ib->metrics->cumts.nts; + + return (va < vb) - (va > vb); +} + +/* Sort 'cumts' metric ascending */ +static int +cmp_cumts_asc (const void *a, const void *b) +{ + const GHolderItem *ia = a; + const GHolderItem *ib = b; + + uint64_t va = ia->metrics->cumts.nts; + uint64_t vb = ib->metrics->cumts.nts; + + return (va > vb) - (va < vb); +} + +/* Sort 'maxts' metric descending */ +static int +cmp_maxts_desc (const void *a, const void *b) +{ + const GHolderItem *ia = a; + const GHolderItem *ib = b; + + uint64_t va = ia->metrics->maxts.nts; + uint64_t vb = ib->metrics->maxts.nts; + + return (va < vb) - (va > vb); +} + +/* Sort 'maxts' metric ascending */ +static int +cmp_maxts_asc (const void *a, const void *b) +{ + const GHolderItem *ia = a; + const GHolderItem *ib = b; + + uint64_t va = ia->metrics->maxts.nts; + uint64_t vb = ib->metrics->maxts.nts; + + return (va > vb) - (va < vb); +} + +/* Sort 'protocol' metric ascending */ +static int +cmp_proto_asc (const void *a, const void *b) +{ + const GHolderItem *ia = a; + const GHolderItem *ib = b; + return strcmp (ia->metrics->protocol, ib->metrics->protocol); +} + +/* Sort 'protocol' metric descending */ +static int +cmp_proto_desc (const void *a, const void *b) +{ + const GHolderItem *ia = a; + const GHolderItem *ib = b; + return strcmp (ib->metrics->protocol, ia->metrics->protocol); +} + +/* Sort 'method' metric ascending */ +static int +cmp_mthd_asc (const void *a, const void *b) +{ + const GHolderItem *ia = a; + const GHolderItem *ib = b; + return strcmp (ia->metrics->method, ib->metrics->method); +} + +/* Sort 'method' metric descending */ +static int +cmp_mthd_desc (const void *a, const void *b) +{ + const GHolderItem *ia = a; + const GHolderItem *ib = b; + return strcmp (ib->metrics->method, ia->metrics->method); +} + +/* Given a string sort field, get the enum field value. + * + * On error, -1 is returned. + * On success, the enumerated field value is returned. */ +int +get_sort_field_enum (const char *str) +{ + return str2enum (FIELD, ARRAY_SIZE (FIELD), str); +} + +/* Given a string sort order, get the enum order value. + * + * On error, -1 is returned. + * On success, the enumerated order value is returned. */ +int +get_sort_order_enum (const char *str) +{ + return str2enum (ORDER, ARRAY_SIZE (ORDER), str); +} + +/* Given a GSortOrder enum value, return the corresponding string. + * + * The string corresponding to the enumerated order value is returned. */ +const char * +get_sort_order_str (GSortOrder order) +{ + return ORDER[order].str; +} + +/* Given a GSortField enum value, return the corresponding string. + * + * The string corresponding to the enumerated field value is returned. */ +const char * +get_sort_field_str (GSortField field) +{ + return FIELD[field].str; +} + +/* Given a GSortField enum value, return the corresponding key. + * + * The key corresponding to the enumerated field value is returned. */ +const char * +get_sort_field_key (GSortField field) +{ + static const char *field2key[][2] = { + {"BY_HITS", "hits"}, + {"BY_VISITORS", "visitors"}, + {"BY_DATA", "data"}, + {"BY_BW", "bytes"}, + {"BY_AVGTS", "avgts"}, + {"BY_CUMTS", "cumts"}, + {"BY_MAXTS", "maxts"}, + {"BY_PROT", "protocol"}, + {"BY_MTHD", "method"}, + }; + + return field2key[field][1]; +} + +/* Set the initial metric sort per module/panel. + * + * On error, function returns. + * On success, panel metrics are sorted. */ +void +set_initial_sort (const char *smod, const char *sfield, const char *ssort) +{ + int module, field, order; + if ((module = get_module_enum (smod)) == -1) + return; + + if ((field = get_sort_field_enum (sfield)) == -1) + return; + if ((order = get_sort_order_enum (ssort)) == -1) + return; + if (!can_sort_module (module, field)) + return; + + module_sort[module].field = field; + module_sort[module].sort = order; +} + +/* Determine if module/panel metric can be sorted. + * + * On error or if metric can't be sorted, 0 is returned. + * On success, 1 is returned. */ +int +can_sort_module (GModule module, int field) +{ + int i, can_sort = 0; + for (i = 0; -1 != sort_choices[module][i]; i++) { + if (sort_choices[module][i] != field) + continue; + if (SORT_BY_AVGTS == field && !conf.serve_usecs) + continue; + if (SORT_BY_CUMTS == field && !conf.serve_usecs) + continue; + if (SORT_BY_MAXTS == field && !conf.serve_usecs) + continue; + else if (SORT_BY_BW == field && !conf.bandwidth) + continue; + else if (SORT_BY_PROT == field && !conf.append_protocol) + continue; + else if (SORT_BY_MTHD == field && !conf.append_method) + continue; + + can_sort = 1; + break; + } + + return can_sort; +} + +/* Parse all initial sort options from the config file. + * + * On error, function returns. + * On success, panel metrics are sorted. */ +void +parse_initial_sort (void) +{ + int i; + char module[SORT_MODULE_LEN], field[SORT_FIELD_LEN], order[SORT_ORDER_LEN]; + for (i = 0; i < conf.sort_panel_idx; ++i) { + if (sscanf + (conf.sort_panels[i], "%15[^','],%11[^','],%4s", module, field, + order) != 3) + continue; + set_initial_sort (module, field, order); + } +} + +/* Apply user defined sort */ +void +sort_holder_items (GHolderItem * items, int size, GSort sort) +{ + switch (sort.field) { + case SORT_BY_HITS: + if (sort.sort == SORT_DESC) + qsort (items, size, sizeof (GHolderItem), cmp_num_desc); + else + qsort (items, size, sizeof (GHolderItem), cmp_num_asc); + break; + case SORT_BY_VISITORS: + if (sort.sort == SORT_DESC) + qsort (items, size, sizeof (GHolderItem), cmp_vis_desc); + else + qsort (items, size, sizeof (GHolderItem), cmp_vis_asc); + break; + case SORT_BY_DATA: + if (sort.sort == SORT_DESC) + qsort (items, size, sizeof (GHolderItem), cmp_data_desc); + else + qsort (items, size, sizeof (GHolderItem), cmp_data_asc); + break; + case SORT_BY_BW: + if (sort.sort == SORT_DESC) + qsort (items, size, sizeof (GHolderItem), cmp_bw_desc); + else + qsort (items, size, sizeof (GHolderItem), cmp_bw_asc); + break; + case SORT_BY_AVGTS: + if (sort.sort == SORT_DESC) + qsort (items, size, sizeof (GHolderItem), cmp_avgts_desc); + else + qsort (items, size, sizeof (GHolderItem), cmp_avgts_asc); + break; + case SORT_BY_CUMTS: + if (sort.sort == SORT_DESC) + qsort (items, size, sizeof (GHolderItem), cmp_cumts_desc); + else + qsort (items, size, sizeof (GHolderItem), cmp_cumts_asc); + break; + case SORT_BY_MAXTS: + if (sort.sort == SORT_DESC) + qsort (items, size, sizeof (GHolderItem), cmp_maxts_desc); + else + qsort (items, size, sizeof (GHolderItem), cmp_maxts_asc); + break; + case SORT_BY_PROT: + if (sort.sort == SORT_DESC) + qsort (items, size, sizeof (GHolderItem), cmp_proto_desc); + else + qsort (items, size, sizeof (GHolderItem), cmp_proto_asc); + break; + case SORT_BY_MTHD: + if (sort.sort == SORT_DESC) + qsort (items, size, sizeof (GHolderItem), cmp_mthd_desc); + else + qsort (items, size, sizeof (GHolderItem), cmp_mthd_asc); + break; + } +} + +/* Sort raw numeric data in a descending order for the first run + * (default sort) + * + * On success, raw data sorted in a descending order. */ +GRawData * +sort_raw_num_data (GRawData * raw_data, int ht_size) +{ + qsort (raw_data->items, ht_size, sizeof *(raw_data->items), cmp_raw_num_desc); + return raw_data; +} + +/* Sort raw string data in a descending order for the first run. + * + * On success, raw data sorted in a descending order. */ +GRawData * +sort_raw_str_data (GRawData * raw_data, int ht_size) +{ + qsort (raw_data->items, ht_size, sizeof *(raw_data->items), cmp_raw_str_desc); + return raw_data; +} diff --git a/goaccess++/src/sort.h b/goaccess++/src/sort.h new file mode 100644 index 0000000..8b63071 --- /dev/null +++ b/goaccess++/src/sort.h @@ -0,0 +1,92 @@ +/** + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana + * + * 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. + */ + +#if HAVE_CONFIG_H +#include +#endif + +#ifndef SORT_H_INCLUDED +#define SORT_H_INCLUDED + +#include "commons.h" +#include "parser.h" + +#define SORT_MAX_OPTS 11 + +/* See GEnum for mapping */ +#define SORT_FIELD_LEN 11 + 1 /* longest metric name */ +#define SORT_MODULE_LEN 15 + 1 /* longest module name */ +#define SORT_ORDER_LEN 4 + 1 /* length of ASC or DESC */ + +/* Enumerated sorting metrics */ +typedef enum GSortField_ +{ + SORT_BY_HITS, + SORT_BY_VISITORS, + SORT_BY_DATA, + SORT_BY_BW, + SORT_BY_AVGTS, + SORT_BY_CUMTS, + SORT_BY_MAXTS, + SORT_BY_PROT, + SORT_BY_MTHD, +} GSortField; + +/* Enumerated sorting order */ +typedef enum GSortOrder_ +{ + SORT_ASC, + SORT_DESC +} GSortOrder; + +/* Sorting of each panel, metric and order */ +typedef struct GSort_ +{ + GModule module; + GSortField field; + GSortOrder sort; +} GSort; + +extern GSort module_sort[TOTAL_MODULES]; +extern const int sort_choices[][SORT_MAX_OPTS];; + +GRawData *sort_raw_num_data (GRawData * raw_data, int ht_size); +GRawData *sort_raw_str_data (GRawData * raw_data, int ht_size); +const char *get_sort_field_key (GSortField field); +const char *get_sort_field_str (GSortField field); +const char *get_sort_order_str (GSortOrder order); +int can_sort_module (GModule module, int field); +int get_sort_field_enum (const char *str); +int get_sort_order_enum (const char *str); +int strcmp_asc (const void *a, const void *b); +void parse_initial_sort (void); +void set_initial_sort (const char *smod, const char *sfield, const char *ssort); +void sort_holder_items (GHolderItem * items, int size, GSort sort); + +#endif diff --git a/goaccess++/src/sort.o b/goaccess++/src/sort.o new file mode 100644 index 0000000000000000000000000000000000000000..fcdf46be066f25236060c7952e9403617b7155d1 GIT binary patch literal 10976 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 wumPk)bpNh^as&M7?QxmwYY&idf + * + * 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 +#include + +#include "tcabdb.h" +#include "tcbtdb.h" + +#ifdef HAVE_GEOLOCATION +#include "geoip1.h" +#endif + +#include "error.h" +#include "sort.h" +#include "util.h" +#include "xmalloc.h" + +/* Hash tables storage */ +static GTCStorage *tc_storage; + +/* tables for the whole app */ +static TCADB *ht_agent_keys = NULL; +static TCADB *ht_agent_vals = NULL; +static TCADB *ht_general_stats = NULL; +static TCADB *ht_hostnames = NULL; +static TCADB *ht_unique_keys = NULL; + +/* db paths for whole app hashes */ +static char *dbpath_agent_keys = NULL; +static char *dbpath_agent_vals = NULL; +static char *dbpath_general_stats = NULL; +static char *dbpath_hostnames = NULL; +static char *dbpath_unique_keys = NULL; + +/* Instantiate a new store */ +static GTCStorage * +new_tcstorage (uint32_t size) +{ + GTCStorage *storage = xcalloc (size, sizeof (GTCStorage)); + return storage; +} + +/* Open a concrete database */ +static int +tc_adb_open (TCADB * adb, const char *params) +{ + /* attempt to open the database */ + if (!tcadbopen (adb, params)) + return 1; + return 0; +} + +/* Close the database handle */ +static int +tc_db_close (TCADB * adb, char *dbname) +{ + if (adb == NULL) + return 1; + + /* close the database */ + if (!tcadbclose (adb)) + FATAL ("Unable to close DB: %s", dbname); + + /* delete the object */ + tcadbdel (adb); + +#ifdef TCB_BTREE + /* remove database file */ + if (!conf.keep_db_files && !tcremovelink (dbname)) + LOG_DEBUG (("Unable to remove DB: %s\n", dbname)); +#endif + free (dbname); + + return 0; +} + +/* Setup a database given the file path and open it up */ +static TCADB * +tc_adb_create (char *path) +{ + char params[DB_PARAMS] = ""; + TCADB *adb = tcadbnew (); + +#ifdef TCB_MEMHASH + xstrncpy (params, path, DB_PARAMS); +#endif +#ifdef TCB_BTREE + tc_db_get_params (params, path); +#endif + + if (tc_adb_open (adb, params)) { + free (path); + LOG_DEBUG (("params: %s", params)); + FATAL ("Unable to open an abstract database: %s", params); + } + + return adb; +} + +/* Get the file path for the given a database name */ +static char * +get_dbname (const char *dbname, int module) +{ + char *path = NULL; +#ifdef TCB_MEMHASH + (void) dbname; + (void) module; + path = alloc_string ("*"); +#endif + +#ifdef TCB_BTREE + path = tc_db_set_path (dbname, module); +#endif + + return path; +} + +/* Create hashes used across the whole app (not per module) */ +static void +create_prog_tables (void) +{ + ht_agent_keys = tc_adb_create (dbpath_agent_keys); + ht_agent_vals = tc_adb_create (dbpath_agent_vals); + ht_general_stats = tc_adb_create (dbpath_general_stats); + ht_hostnames = tc_adb_create (dbpath_hostnames); + ht_unique_keys = tc_adb_create (dbpath_unique_keys); +} + +/* Set db paths for hashes used across the whole app (not per module) */ +static void +set_prog_tables_dbpaths (void) +{ + dbpath_agent_keys = get_dbname (DB_AGENT_KEYS, -1); + dbpath_agent_vals = get_dbname (DB_AGENT_VALS, -1); + dbpath_general_stats = get_dbname (DB_GEN_STATS, -1); + dbpath_hostnames = get_dbname (DB_HOSTNAMES, -1); + dbpath_unique_keys = get_dbname (DB_UNIQUE_KEYS, -1); +} + +/* Free hashes used across the whole app (not per module) */ +static void +free_prog_tables (void) +{ + tc_db_close (ht_agent_keys, dbpath_agent_keys); + tc_db_close (ht_agent_vals, dbpath_agent_vals); + tc_db_close (ht_general_stats, dbpath_general_stats); + tc_db_close (ht_hostnames, dbpath_hostnames); + tc_db_close (ht_unique_keys, dbpath_unique_keys); +} + +/* Initialize map & metric hashes */ +static void +init_tables (GModule module) +{ + GTCStorageMetric mtrc; + int n = 0, i; + + /* *INDENT-OFF* */ + GTCStorageMetric metrics[] = { + {MTRC_KEYMAP , DB_KEYMAP , NULL, NULL} , + {MTRC_ROOTMAP , DB_ROOTMAP , NULL, NULL} , + {MTRC_DATAMAP , DB_DATAMAP , NULL, NULL} , + {MTRC_UNIQMAP , DB_UNIQMAP , NULL, NULL} , + {MTRC_ROOT , DB_ROOT , NULL, NULL} , + {MTRC_HITS , DB_HITS , NULL, NULL} , + {MTRC_VISITORS , DB_VISITORS , NULL, NULL} , + {MTRC_BW , DB_BW , NULL, NULL} , + {MTRC_CUMTS , DB_CUMTS , NULL, NULL} , + {MTRC_MAXTS , DB_MAXTS , NULL, NULL} , + {MTRC_METHODS , DB_METHODS , NULL, NULL} , + {MTRC_PROTOCOLS , DB_PROTOCOLS , NULL, NULL} , + {MTRC_AGENTS , DB_AGENTS , NULL, NULL} , + {MTRC_METADATA , DB_METADATA , NULL, NULL} , + }; + /* *INDENT-ON* */ + + n = ARRAY_SIZE (metrics); + for (i = 0; i < n; i++) { + mtrc = metrics[i]; +#ifdef TCB_MEMHASH + mtrc.dbpath = get_dbname (mtrc.dbname, module); + mtrc.store = tc_adb_create (mtrc.dbpath); +#endif +#ifdef TCB_BTREE + /* allow for duplicate keys */ + if (mtrc.metric == MTRC_AGENTS) { + mtrc.dbpath = tc_db_set_path (DB_AGENTS, module); + mtrc.store = tc_bdb_create (mtrc.dbpath); + } else { + mtrc.dbpath = get_dbname (mtrc.dbname, module); + mtrc.store = tc_adb_create (mtrc.dbpath); + } +#endif + tc_storage[module].metrics[i] = mtrc; + } +} + +/* Initialize hash tables */ +void +init_storage (void) +{ + GModule module; + size_t idx = 0; + + set_prog_tables_dbpaths (); + create_prog_tables (); + + tc_storage = new_tcstorage (TOTAL_MODULES); + + FOREACH_MODULE (idx, module_list) { + module = module_list[idx]; + + tc_storage[module].module = module; + init_tables (module); + } +} + +/* Destroys the hash structure allocated metrics */ +static void +free_metrics (GModule module) +{ + int i; + GTCStorageMetric mtrc; + + for (i = 0; i < GSMTRC_TOTAL; i++) { + mtrc = tc_storage[module].metrics[i]; +#ifdef TCB_MEMHASH + tc_db_close (mtrc.store, mtrc.dbpath); +#endif +#ifdef TCB_BTREE + if (mtrc.metric == MTRC_AGENTS) + tc_bdb_close (mtrc.store, mtrc.dbpath); + else + tc_db_close (mtrc.store, mtrc.dbpath); +#endif + } +} + +/* Destroys the hash structure and its content */ +void +free_storage (void) +{ + size_t idx = 0; + + if (!tc_storage) + return; + + free_prog_tables (); + FOREACH_MODULE (idx, module_list) { + free_metrics (module_list[idx]); + } + free (tc_storage); + +#ifdef TCB_BTREE + tc_db_rmdir (); +#endif + +} + +static uint32_t +ht_get_size (TCADB * adb) +{ + return tcadbrnum (adb); +} + +/* Given a module and a metric, get the hash table + * + * On error, or if table is not found, NULL is returned. + * On success the hash structure pointer is returned. */ +static void * +get_hash (GModule module, GSMetric metric) +{ + void *hash = NULL; + int i; + GTCStorageMetric mtrc; + + if (!tc_storage) + return NULL; + + for (i = 0; i < GSMTRC_TOTAL; i++) { + mtrc = tc_storage[module].metrics[i]; + if (mtrc.metric != metric) + continue; + hash = mtrc.store; + break; + } + + return hash; +} + +/* Insert a string key and the corresponding int value. + * Note: If the key exists, the value is not replaced. + * + * On error, or if key exists, -1 is returned. + * On success 0 is returned */ +static int +ins_si32 (void *hash, const char *key, int value) +{ + if (!hash) + return -1; + + /* if key exists in the database, it is overwritten */ + if (!tcadbput (hash, key, strlen (key), &value, sizeof (int))) + LOG_DEBUG (("Unable to tcadbput\n")); + + return 0; +} + +/* Insert an int key and the corresponding string value. + * Note: If the key exists, the value is not replaced. + * + * On error, or if key exists, -1 is returned. + * On success 0 is returned */ +static int +ins_is32 (void *hash, int key, const char *value) +{ + if (!hash) + return -1; + + /* if key exists in the database, it is overwritten */ + if (!tcadbput (hash, &key, sizeof (int), value, strlen (value))) + LOG_DEBUG (("Unable to tcadbput\n")); + + return 0; +} + +/* Insert a string key and the corresponding string value. + * Note: If the key exists, the value is not replaced. + * + * On error, or if key exists, -1 is returned. + * On success 0 is returned */ +static int +ins_ss32 (void *hash, const char *key, const char *value) +{ + if (!hash) + return -1; + + /* if key exists in the database, it is overwritten */ + if (!tcadbput2 (hash, key, value)) + LOG_DEBUG (("Unable to tcadbput\n")); + + return 0; +} + +/* Insert an int key and an int value + * Note: If the key exists, its value is replaced by the given value. + * + * On error, -1 is returned. + * On success 0 is returned */ +static int +ins_ii32 (void *hash, int key, int value) +{ + if (!hash) + return -1; + + /* if key exists in the database, it is overwritten */ + if (!tcadbput (hash, &key, sizeof (int), &value, sizeof (int))) + LOG_DEBUG (("Unable to tcadbput\n")); + + return 0; +} + +/* Insert an int key and a uint64_t value + * Note: If the key exists, its value is replaced by the given value. + * + * On error, -1 is returned. + * On success 0 is returned */ +static int +ins_iu64 (void *hash, int key, uint64_t value) +{ + if (!hash) + return -1; + + /* if key exists in the database, it is overwritten */ + if (!tcadbput (hash, &key, sizeof (int), &value, sizeof (uint64_t))) + LOG_DEBUG (("Unable to tcadbput\n")); + + return 0; +} + +/* Increase an int value given an int key. + * Note: If the key exists, its value is increased by the given inc. + * + * On error, -1 is returned. + * On success 0 is returned */ +static int +inc_ii32 (void *hash, int key, int inc) +{ + if (!hash) + return -1; + + /* if key exists in the database, it is incremented */ + if (tcadbaddint (hash, &key, sizeof (int), inc) == INT_MIN) + LOG_DEBUG (("Unable to tcadbput\n")); + + return 0; +} + +/* Increase a uint64_t value given an int key. + * Note: If the key exists, its value is increased by the given inc. + * + * On error, -1 is returned. + * On success 0 is returned */ +static int +inc_iu64 (void *hash, int key, uint64_t inc) +{ + int sp; + uint64_t value = inc; + void *ptr; + + if (!hash) + return -1; + + if ((ptr = tcadbget (hash, &key, sizeof (int), &sp)) != NULL) { + value = (*(uint64_t *) ptr) + inc; + free (ptr); + } + + /* if key exists in the database, it is overwritten */ + if (!tcadbput (hash, &key, sizeof (int), &value, sizeof (uint64_t))) + LOG_DEBUG (("Unable to tcadbput\n")); + + return 0; +} + +/* Insert a string key and auto increment its value. + * + * On error, -1 is returned. + * On success the value of the key inserted is returned */ +static int +inc_si32 (void *hash, const char *key, int inc) +{ + int value = inc, sp; + void *ptr; + + if (!hash) + return -1; + + if ((ptr = tcadbget (hash, key, strlen (key), &sp)) != NULL) { + value = (*(int *) ptr) + inc; + free (ptr); + } + + /* if key exists in the database, it is overwritten */ + if (!tcadbput (hash, key, strlen (key), &value, sizeof (int))) + LOG_DEBUG (("Unable to tcadbput\n")); + + return 0; +} + +/* Insert a string key and auto increment by uint64_t value. + * + * On error, -1 is returned. + * On success the value of the key is inserted and 0 is returned */ +static int +inc_su64 (void *hash, const char *key, uint64_t inc) +{ + int sp; + uint64_t value = inc; + void *ptr; + + if (!hash) + return -1; + + if ((ptr = tcadbget (hash, key, strlen (key), &sp)) != NULL) { + value = (*(uint64_t *) ptr) + inc; + free (ptr); + } + + /* if key exists in the database, it is overwritten */ + if (!tcadbput (hash, key, strlen (key), &value, sizeof (uint64_t))) + LOG_DEBUG (("Unable to tcadbput\n")); + + return 0; +} + +/* Insert a string key and auto increment int value. + * + * On error, -1 is returned. + * On success the value of the key inserted is returned */ +static int +ins_si32_ai (void *hash, const char *key) +{ + int size = 0, value = 0; + + if (!hash) + return -1; + + size = ht_get_size (hash); + /* the auto increment value starts at SIZE (hash table) + 1 */ + value = size > 0 ? size + 1 : 1; + + if (ins_si32 (hash, key, value) == -1) + return -1; + + return value; +} + +#ifdef TCB_MEMHASH + +/* Compare if the given needle is in the haystack + * + * if equal, 1 is returned, else 0 */ +static int +find_int_key_in_list (void *data, void *needle) +{ + return (*(int *) data) == (*(int *) needle) ? 1 : 0; +} + +/* Insert an int key and the corresponding GSLList (Single linked-list) value. + * Note: If the key exists within the list, the value is not appended. + * + * On error, -1 is returned. + * On success 0 is returned */ +static int +ins_igsl (void *hash, int key, int value) +{ + GSLList *list, *match; + int sp; + + if (!hash) + return -1; + + /* key found, check if key exists within the list */ + if ((list = tcadbget (hash, &key, sizeof (int), &sp)) != NULL) { + if ((match = list_find (list, find_int_key_in_list, &value))) + goto out; + list = list_insert_prepend (list, int2ptr (value)); + } else { + list = list_create (int2ptr (value)); + } + + if (!tcadbput (hash, &key, sizeof (int), list, sizeof (GSLList))) + LOG_DEBUG (("Unable to tcadbput\n")); +out: + free (list); + + return 0; +} + +#endif + +/* Get the int value of a given string key. + * + * On error, or if key is not found, -1 is returned. + * On success the int value for the given key is returned */ +static int +get_si32 (void *hash, const char *key) +{ + int ret = 0, sp; + void *ptr; + + if (!hash) + return -1; + + /* key found, return current value */ + if ((ptr = tcadbget (hash, key, strlen (key), &sp)) != NULL) { + ret = (*(int *) ptr); + free (ptr); + return ret; + } + + return -1; +} + +/* Get the unsigned int value of a given string key. + * + * On error, or if key is not found, 0 is returned. + * On success the uint32_t value for the given key is returned */ +static uint32_t +get_sui32 (void *hash, const char *key) +{ + int ret = 0, sp; + void *ptr; + if (!hash) + return 0; + + /* key found, return current value */ + if ((ptr = tcadbget (hash, key, strlen (key), &sp)) != NULL) { + ret = (*(uint32_t *) ptr); + free (ptr); + return ret; + } + + return 0; +} + +/* Get the uint64_t value of a given string key. + * + * On error, or if key is not found, 0 is returned. + * On success the uint64_t value for the given key is returned */ +static uint64_t +get_su64 (void *hash, const char *key) +{ + int sp; + uint64_t ret = 0; + void *ptr; + if (!hash) + return 0; + + /* key found, return current value */ + if ((ptr = tcadbget (hash, key, strlen (key), &sp)) != NULL) { + ret = (*(uint64_t *) ptr); + free (ptr); + return ret; + } + + return 0; +} + +/* Iterate over all the key/value pairs for the given hash structure + * and set the maximum and minimum values found on an integer key and + * integer value. + * + * Note: This are expensive calls since it has to iterate over all + * key-value pairs + * + * If the hash structure is empty, no values are set. + * On success the minimum and maximum values are set. */ +static void +get_ii32_min_max (void *hash, int *min, int *max) +{ + int curvalue = 0, i = 0, ksize = 0, sp = 0; + void *key, *ptr; + + tcadbiterinit (hash); + while ((key = tcadbiternext (hash, &ksize)) != NULL) { + if ((ptr = tcadbget (hash, key, ksize, &sp)) == NULL) { + free (key); + continue; + } + + curvalue = (*(int *) ptr); + if (i++ == 0) + *min = curvalue; + if (curvalue > *max) + *max = curvalue; + if (curvalue < *min) + *min = curvalue; + free (key); + free (ptr); + } +} + +/* Iterate over all the key/value pairs for the given hash structure + * and set the maximum and minimum values found on an integer key and + * a uint64_t value. + * + * Note: This are expensive calls since it has to iterate over all + * key-value pairs + * + * If the hash structure is empty, no values are set. + * On success the minimum and maximum values are set. */ +static void +get_iu64_min_max (void *hash, uint64_t * min, uint64_t * max) +{ + int i = 0, ksize = 0, sp = 0; + uint64_t curvalue = 0; + void *key, *ptr; + + tcadbiterinit (hash); + while ((key = tcadbiternext (hash, &ksize)) != NULL) { + if ((ptr = tcadbget (hash, key, ksize, &sp)) == NULL) { + free (key); + continue; + } + + curvalue = (*(uint64_t *) ptr); + if (i++ == 0) + *min = curvalue; + if (curvalue > *max) + *max = curvalue; + if (curvalue < *min) + *min = curvalue; + free (key); + free (ptr); + } +} + +/* Get the string value of a given int key. + * + * On error, or if key is not found, NULL is returned. + * On success the string value for the given key is returned */ +static char * +get_is32 (void *hash, int key) +{ + int sp; + char *value = NULL; + + if (!hash) + return NULL; + + if ((value = tcadbget (hash, &key, sizeof (int), &sp)) != NULL) + return value; + + return NULL; +} + +/* Get the string value of a given string key. + * + * On error, or if key is not found, NULL is returned. + * On success the string value for the given key is returned */ +static char * +get_ss32 (void *hash, const char *key) +{ + char *value = NULL; + + if (!hash) + return NULL; + + if ((value = tcadbget2 (hash, key)) != NULL) + return value; + + return NULL; +} + +/* Get the int value of a given int key. + * + * If key is not found, 0 is returned. + * On error, -1 is returned. + * On success the int value for the given key is returned */ +static int +get_ii32 (void *hash, int key) +{ + int sp, ret = 0; + void *ptr = 0; + + if (!hash) + return -1; + + /* key found, return current value */ + if ((ptr = tcadbget (hash, &key, sizeof (int), &sp)) != NULL) { + ret = (*(int *) ptr); + free (ptr); + return ret; + } + + return 0; +} + +/* Get the uint64_t value of a given int key. + * + * On error, or if key is not found, 0 is returned. + * On success the uint64_t value for the given key is returned */ +static uint64_t +get_iu64 (void *hash, int key) +{ + int sp; + uint64_t ret = 0; + void *ptr = 0; + + if (!hash) + return 0; + + /* key found, return current value */ + if ((ptr = tcadbget (hash, &key, sizeof (int), &sp)) != NULL) { + ret = (*(uint64_t *) ptr); + free (ptr); + return ret; + } + + return 0; +} + +/* Get the GSLList value of a given int key. + * + * On error, or if key is not found, NULL is returned. + * On success the GSLList value for the given key is returned */ +static GSLList * +get_igsl (void *hash, int key) +{ + int sp; + GSLList *list = NULL; + + if (!hash) + return NULL; + + /* key found, return current value */ + if ((list = tcadbget (hash, &key, sizeof (int), &sp)) != NULL) + return list; + + return NULL; +} + +/* Get the TCLIST value of a given int key. + * + * On error, or if key is not found, NULL is returned. + * On success the GSLList value for the given key is returned */ +static TCLIST * +get_itcli (void *hash, int key) +{ + TCLIST *list = NULL; + + if (!hash) + return NULL; + + /* key found, return current value */ + if ((list = tcbdbget4 (hash, &key, sizeof (int))) != NULL) + return list; + + return NULL; +} + +/* Insert a unique visitor key string (IP/DATE/UA), mapped to an auto + * incremented value. + * + * If the given key exists, its value is returned. + * On error, -1 is returned. + * On success the value of the key inserted is returned */ +int +ht_insert_unique_key (const char *key) +{ + int value = -1; + void *hash = ht_unique_keys; + + if (!hash) + return -1; + + if ((value = get_si32 (hash, key)) != -1) + return value; + + return ins_si32_ai (hash, key); +} + +/* Set the maximum and minimum values found on an integer key and + * integer value found on the MTRC_VISITORS hash structure. + * + * If the hash structure is empty, no values are set. + * On success the minimum and maximum values are set. */ +void +ht_get_hits_min_max (GModule module, int *min, int *max) +{ + void *hash = get_hash (module, MTRC_HITS); + + if (!hash) + return; + + get_ii32_min_max (hash, min, max); +} + +/* Set the maximum and minimum values found on an integer key and + * integer value found on the MTRC_VISITORS hash structure. + * + * If the hash structure is empty, no values are set. + * On success the minimum and maximum values are set. */ +void +ht_get_visitors_min_max (GModule module, int *min, int *max) +{ + void *hash = get_hash (module, MTRC_VISITORS); + + if (!hash) + return; + + get_ii32_min_max (hash, min, max); +} + +/* Set the maximum and minimum values found on an integer key and + * a uint64_t value found on the MTRC_BW hash structure. + * + * If the hash structure is empty, no values are set. + * On success the minimum and maximum values are set. */ +void +ht_get_bw_min_max (GModule module, uint64_t * min, uint64_t * max) +{ + void *hash = get_hash (module, MTRC_BW); + + if (!hash) + return; + + get_iu64_min_max (hash, min, max); +} + +/* Set the maximum and minimum values found on an integer key and + * a uint64_t value found on the MTRC_CUMTS hash structure. + * + * If the hash structure is empty, no values are set. + * On success the minimum and maximum values are set. */ +void +ht_get_cumts_min_max (GModule module, uint64_t * min, uint64_t * max) +{ + void *hash = get_hash (module, MTRC_CUMTS); + + if (!hash) + return; + + get_iu64_min_max (hash, min, max); +} + +/* Set the maximum and minimum values found on an integer key and + * a uint64_t value found on the MTRC_MAXTS hash structure. + * + * If the hash structure is empty, no values are set. + * On success the minimum and maximum values are set. */ +void +ht_get_maxts_min_max (GModule module, uint64_t * min, uint64_t * max) +{ + void *hash = get_hash (module, MTRC_MAXTS); + + if (!hash) + return; + + get_iu64_min_max (hash, min, max); +} + +/* Insert a user agent key string, mapped to an auto incremented value. + * + * If the given key exists, its value is returned. + * On error, -1 is returned. + * On success the value of the key inserted is returned */ +int +ht_insert_agent_key (const char *key) +{ + int value = -1; + void *hash = ht_agent_keys; + + if (!hash) + return -1; + + if ((value = get_si32 (hash, key)) != -1) + return value; + + return ins_si32_ai (hash, key); +} + +/* Insert a user agent int key, mapped to a user agent string value. + * + * On error, -1 is returned. + * On success 0 is returned */ +int +ht_insert_agent_value (int key, const char *value) +{ + void *hash = ht_agent_vals; + + if (!hash) + return -1; + + return ins_is32 (hash, key, value); +} + +/* Insert a keymap string key. + * + * If the given key exists, its value is returned. + * On error, -1 is returned. + * On success the value of the key inserted is returned */ +int +ht_insert_keymap (GModule module, const char *key) +{ + int value = -1; + void *hash = get_hash (module, MTRC_KEYMAP); + + if (!hash) + return -1; + + if ((value = get_si32 (hash, key)) != -1) + return value; + + return ins_si32_ai (hash, key); +} + +/* Insert a datamap int key and string value. + * + * On error, -1 is returned. + * On success 0 is returned */ +int +ht_insert_datamap (GModule module, int key, const char *value) +{ + void *hash = get_hash (module, MTRC_DATAMAP); + + if (!hash) + return -1; + + return ins_is32 (hash, key, value); +} + +/* Insert a rootmap int key from the keymap store mapped to its string value. + * + * On error, -1 is returned. + * On success 0 is returned */ +int +ht_insert_rootmap (GModule module, int key, const char *value) +{ + void *hash = get_hash (module, MTRC_ROOTMAP); + + if (!hash) + return -1; + + return ins_is32 (hash, key, value); +} + +/* Insert a uniqmap string key. + * + * If the given key exists, 0 is returned. + * On error, -1 is returned. + * On success the value of the key inserted is returned */ +int +ht_insert_uniqmap (GModule module, const char *key) +{ + int value = -1; + void *hash = get_hash (module, MTRC_UNIQMAP); + + if (!hash) + return -1; + + if ((value = get_si32 (hash, key)) != -1) + return 0; + + return ins_si32_ai (hash, key); +} + +/* Insert a data int key mapped to the corresponding int root key. + * + * On error, -1 is returned. + * On success 0 is returned */ +int +ht_insert_root (GModule module, int key, int value) +{ + void *hash = get_hash (module, MTRC_ROOT); + + if (!hash) + return -1; + + return ins_ii32 (hash, key, value); +} + +/* Increases hits counter from an int key. + * + * On error, -1 is returned. + * On success 0 is returned */ +int +ht_insert_hits (GModule module, int key, int inc) +{ + void *hash = get_hash (module, MTRC_HITS); + + if (!hash) + return -1; + + return inc_ii32 (hash, key, inc); +} + +/* Increases visitors counter from an int key. + * + * On error, -1 is returned. + * On success 0 is returned */ +int +ht_insert_visitor (GModule module, int key, int inc) +{ + void *hash = get_hash (module, MTRC_VISITORS); + + if (!hash) + return -1; + + return inc_ii32 (hash, key, inc); +} + +/* Increases bandwidth counter from an int key. + * + * On error, -1 is returned. + * On success 0 is returned */ +int +ht_insert_bw (GModule module, int key, uint64_t inc) +{ + void *hash = get_hash (module, MTRC_BW); + + if (!hash) + return -1; + + return inc_iu64 (hash, key, inc); +} + +/* Increases cumulative time served counter from an int key. + * + * On error, -1 is returned. + * On success 0 is returned */ +int +ht_insert_cumts (GModule module, int key, uint64_t inc) +{ + void *hash = get_hash (module, MTRC_CUMTS); + + if (!hash) + return -1; + + return inc_iu64 (hash, key, inc); +} + +/* Insert the maximum time served counter from an int key. + * Note: it compares the current value with the given value. + * + * On error, -1 is returned. + * On success 0 is returned */ +int +ht_insert_maxts (GModule module, int key, uint64_t value) +{ + uint64_t curvalue = 0; + void *hash = get_hash (module, MTRC_MAXTS); + + if (!hash) + return -1; + + if ((curvalue = get_iu64 (hash, key)) < value) + ins_iu64 (hash, key, value); + + return 0; +} + +/* Insert a method given an int key and string value. + * + * On error, or if key exists, -1 is returned. + * On success 0 is returned */ +int +ht_insert_method (GModule module, int key, const char *value) +{ + void *hash = get_hash (module, MTRC_METHODS); + + if (!hash) + return -1; + + return ins_is32 (hash, key, value); +} + +/* Insert a protocol given an int key and string value. + * + * On error, or if key exists, -1 is returned. + * On success 0 is returned */ +int +ht_insert_protocol (GModule module, int key, const char *value) +{ + void *hash = get_hash (module, MTRC_PROTOCOLS); + + if (!hash) + return -1; + + return ins_is32 (hash, key, value); +} + +/* Insert an agent for a hostname given an int key and int value. + * + * On error, -1 is returned. + * On success 0 is returned */ +int +ht_insert_agent (GModule module, int key, int value) +{ + void *hash = get_hash (module, MTRC_AGENTS); + + if (!hash) + return -1; + + return ins_igsl (hash, key, value); +} + +/* Insert an IP hostname mapped to the corresponding hostname. + * + * On error, or if key exists, -1 is returned. + * On success 0 is returned */ +int +ht_insert_hostname (const char *ip, const char *host) +{ + void *hash = ht_hostnames; + + if (!hash) + return -1; + + return ins_ss32 (hash, ip, host); +} + +/* Increases a general stats counter int from a string key. + * + * On error, -1 is returned. + * On success the value of the key inserted is returned */ +int +ht_insert_genstats (const char *key, int inc) +{ + void *hash = ht_general_stats; + + if (!hash) + return -1; + + return inc_si32 (hash, key, inc); +} + +/* Replaces a general stats counter int from a string key. + * + * On error, -1 is returned. + * On success the value of the key inserted is returned */ +int +ht_replace_genstats (const char *key, int value) +{ + void *hash = ht_general_stats; + + if (!hash) + return -1; + + return ins_si32 (hash, key, value); +} + +/* Increases the general stats counter accumulated_time. + * + * On error, 0 is returned + * On success 1 is returned */ +int +ht_insert_genstats_accumulated_time (time_t elapsed) +{ + void *hash = ht_general_stats; + + if (!hash) + return 0; + + return inc_si32 (hash, "accumulated_time", (int) elapsed) != -1; +} + +/* Increases a general stats counter uint64_t from a string key. + * + * On error, -1 is returned. + * On success the value of the key inserted is returned */ +int +ht_insert_genstats_bw (const char *key, uint64_t inc) +{ + void *hash = ht_general_stats; + + if (!hash) + return -1; + + return inc_su64 (hash, key, inc); +} + +/* Insert meta data counters from a string key. + * + * On error, -1 is returned. + * On success 0 is returned */ +int +ht_insert_meta_data (GModule module, const char *key, uint64_t value) +{ + void *hash = get_hash (module, MTRC_METADATA); + + if (!hash) + return -1; + + return inc_su64 (hash, key, value); +} + + +/* Get the number of elements in a datamap. + * + * Return -1 if the operation fails, else number of elements. */ +uint32_t +ht_get_size_datamap (GModule module) +{ + void *hash = get_hash (module, MTRC_DATAMAP); + + if (!hash) + return 0; + + return ht_get_size (hash); +} + +/* Get the number of elements in a uniqmap. + * + * On error, 0 is returned. + * On success the number of elements in MTRC_UNIQMAP is returned */ +uint32_t +ht_get_size_uniqmap (GModule module) +{ + void *hash = get_hash (module, MTRC_UNIQMAP); + + if (!hash) + return 0; + + return ht_get_size (hash); +} + +/* Get the string data value of a given int key. + * + * On error, NULL is returned. + * On success the string value for the given key is returned */ +char * +ht_get_datamap (GModule module, int key) +{ + void *hash = get_hash (module, MTRC_DATAMAP); + + if (!hash) + return NULL; + + return get_is32 (hash, key); +} + +/* Get the int value from MTRC_KEYMAP given a string key. + * + * On error, -1 is returned. + * On success the int value for the given key is returned */ +int +ht_get_keymap (GModule module, const char *key) +{ + void *hash = get_hash (module, MTRC_KEYMAP); + + if (!hash) + return -1; + + return get_si32 (hash, key); +} + +/* Get the int value from MTRC_UNIQMAP given a string key. + * + * On error, -1 is returned. + * On success the int value for the given key is returned */ +int +ht_get_uniqmap (GModule module, const char *key) +{ + void *hash = get_hash (module, MTRC_UNIQMAP); + + if (!hash) + return -1; + + return get_si32 (hash, key); +} + +/* Get the uint32_t value from ht_general_stats given a string key. + * + * On error, 0 is returned. + * On success the uint32_t value for the given key is returned */ +uint32_t +ht_get_genstats (const char *key) +{ + void *hash = ht_general_stats; + + if (!hash) + return 0; + + return get_sui32 (hash, key); +} + +/* Get the uint64_t value from ht_general_stats given a string key. + * + * On error, 0 is returned. + * On success the uint64_t value for the given key is returned */ +uint64_t +ht_get_genstats_bw (const char *key) +{ + void *hash = ht_general_stats; + + if (!hash) + return 0; + + return get_su64 (hash, key); +} + +/* Get the string root from MTRC_ROOTMAP given an int data key. + * + * On error, NULL is returned. + * On success the string value for the given key is returned */ +char * +ht_get_root (GModule module, int key) +{ + int root_key = 0; + void *hashroot = get_hash (module, MTRC_ROOT); + void *hashrootmap = get_hash (module, MTRC_ROOTMAP); + + if (!hashroot || !hashrootmap) + return NULL; + + /* not found */ + if ((root_key = get_ii32 (hashroot, key)) == 0) + return NULL; + + return get_is32 (hashrootmap, root_key); +} + +/* Get the int visitors value from MTRC_HITS given an int key. + * + * If key is not found, 0 is returned. + * On error, -1 is returned. + * On success the int value for the given key is returned */ +int +ht_get_hits (GModule module, int key) +{ + void *hash = get_hash (module, MTRC_HITS); + + if (!hash) + return -1; + + return get_ii32 (hash, key); +} + +/* Get the int visitors value from MTRC_VISITORS given an int key. + * + * If key is not found, 0 is returned. + * On error, -1 is returned. + * On success the int value for the given key is returned */ +int +ht_get_visitors (GModule module, int key) +{ + void *hash = get_hash (module, MTRC_VISITORS); + + if (!hash) + return -1; + + return get_ii32 (hash, key); +} + +/* Get the uint64_t value from MTRC_BW given an int key. + * + * On error, or if key is not found, 0 is returned. + * On success the uint64_t value for the given key is returned */ +uint64_t +ht_get_bw (GModule module, int key) +{ + void *hash = get_hash (module, MTRC_BW); + + if (!hash) + return 0; + + return get_iu64 (hash, key); +} + +/* Get the uint64_t value from MTRC_CUMTS given an int key. + * + * On error, or if key is not found, 0 is returned. + * On success the uint64_t value for the given key is returned */ +uint64_t +ht_get_cumts (GModule module, int key) +{ + void *hash = get_hash (module, MTRC_CUMTS); + + if (!hash) + return 0; + + return get_iu64 (hash, key); +} + +/* Get the uint64_t value from MTRC_MAXTS given an int key. + * + * On error, or if key is not found, 0 is returned. + * On success the uint64_t value for the given key is returned */ +uint64_t +ht_get_maxts (GModule module, int key) +{ + void *hash = get_hash (module, MTRC_MAXTS); + + if (!hash) + return 0; + + return get_iu64 (hash, key); +} + +/* Get the string value from MTRC_METHODS given an int key. + * + * On error, NULL is returned. + * On success the string value for the given key is returned */ +char * +ht_get_method (GModule module, int key) +{ + void *hash = get_hash (module, MTRC_METHODS); + + if (!hash) + return NULL; + + return get_is32 (hash, key); +} + +char * +ht_get_protocol (GModule module, int key) +{ + void *hash = get_hash (module, MTRC_PROTOCOLS); + + if (!hash) + return NULL; + + return get_is32 (hash, key); +} + +/* Get the string value from MTRC_PROTOCOLS given an int key. + * + * On error, NULL is returned. + * On success the string value for the given key is returned */ +char * +ht_get_hostname (const char *host) +{ + void *hash = ht_hostnames; + + if (!hash) + return NULL; + + return get_ss32 (hash, host); +} + +/* Get the string value from ht_agent_vals (user agent) given an int key. + * + * On error, NULL is returned. + * On success the string value for the given key is returned */ +char * +ht_get_host_agent_val (int key) +{ + void *hash = ht_agent_vals; + + if (!hash) + return NULL; + + return get_is32 (hash, key); +} + +/* Get the list value from MTRC_AGENTS given an int key. + * + * On error, or if key is not found, NULL is returned. + * On success the GSLList value for the given key is returned */ +GSLList * +ht_get_host_agent_list (GModule module, int key) +{ + void *hash = get_hash (module, MTRC_AGENTS); + GSLList *list; + + if ((list = get_igsl (hash, key))) + return list; + return NULL; +} + +/* Get the meta data uint64_t from MTRC_METADATA given a string key. + * + * On error, or if key is not found, 0 is returned. + * On success the uint64_t value for the given key is returned */ +uint64_t +ht_get_meta_data (GModule module, const char *key) +{ + void *hash = get_hash (module, MTRC_METADATA); + if (!hash) + return 0; + + return get_su64 (hash, key); +} + +/* Get the list value from MTRC_AGENTS given an int key. + * + * On error, or if key is not found, NULL is returned. + * On success the TCLIST value for the given key is returned */ +TCLIST * +ht_get_host_agent_tclist (GModule module, int key) +{ + void *hash = get_hash (module, MTRC_AGENTS); + TCLIST *list; + + if ((list = get_itcli (hash, key))) + return list; + return NULL; +} + +/* Insert the values from a TCLIST into a GSLList. + * + * On success the GSLList is returned */ +GSLList * +tclist_to_gsllist (TCLIST * tclist) +{ + GSLList *list = NULL; + int i, sz; + int *val; + + for (i = 0; i < tclistnum (tclist); ++i) { + val = (int *) tclistval (tclist, i, &sz); + if (list == NULL) + list = list_create (int2ptr (*val)); + else + list = list_insert_prepend (list, int2ptr (*val)); + } + + return list; +} + +/* Calls the given function for each of the key/value pairs */ +static void +tc_db_foreach (void *db, void (*fp) (TCADB * m, void *k, int s, void *u), + void *user_data) +{ + TCADB *adb = db; + int ksize = 0; + void *key; + + tcadbiterinit (adb); + while ((key = tcadbiternext (adb, &ksize)) != NULL) { + (*fp) (adb, key, ksize, user_data); + free (key); + } +} + +/* Free the key/value pair */ +static void +free_agent_values (TCADB * adb, void *key, int ksize, GO_UNUSED void *user_data) +{ + void *list; + int sp = 0; + + list = tcadbget (adb, key, ksize, &sp); + if (list) + list_remove_nodes (list); +} + +/* Iterate over the each key/value pair under MTRC_AGENTS and free the and the + * list of values */ +void +free_agent_list (void) +{ + void *hash = get_hash (HOSTS, MTRC_AGENTS); + if (!hash) + return; + + tc_db_foreach (hash, free_agent_values, NULL); +} + +/* A wrapper to initialize a raw data structure. + * + * On success a GRawData structure is returned. */ +static GRawData * +init_new_raw_data (GModule module, uint32_t ht_size) +{ + GRawData *raw_data; + + raw_data = new_grawdata (); + raw_data->idx = 0; + raw_data->module = module; + raw_data->size = ht_size; + raw_data->items = new_grawdata_item (ht_size); + + return raw_data; +} + +/* For each key/value pair stored in MTRC_HITS/MTRC_DATAMAP, assign the + * key/value to a GRawDataItem */ +static void +set_raw_data (void *key, void *value, GRawData * raw_data) +{ + raw_data->items[raw_data->idx].key = (*(int *) key); + if (raw_data->type == STRING) + raw_data->items[raw_data->idx].value.svalue = (char *) value; + else + raw_data->items[raw_data->idx].value.ivalue = (*(int *) value); + raw_data->idx++; +} + +/* Get the value stored in MTRC_HITS */ +static void +data_iter_generic (TCADB * adb, void *key, int ksize, void *user_data) +{ + GRawData *raw_data = user_data; + void *value; + int sp = 0; + + value = tcadbget (adb, key, ksize, &sp); + if (value) { + set_raw_data (key, value, raw_data); + if (raw_data->type != STRING) + free (value); + } +} + +/* Entry point to load the raw data from the data store into our + * GRawData structure. + * + * On error, NULL is returned. + * On success the GRawData sorted is returned */ +GRawData * +parse_raw_data (GModule module) +{ + GRawData *raw_data; + GRawDataType type; + uint32_t ht_size = 0; + void *hash = NULL; + + switch (module) { + case VISITORS: + hash = get_hash (module, MTRC_DATAMAP); + type = STRING; + break; + default: + hash = get_hash (module, MTRC_HITS); + type = INTEGER; + } + + if (!hash) + return NULL; + + ht_size = ht_get_size (hash); + raw_data = init_new_raw_data (module, ht_size); + raw_data->type = type; + + tc_db_foreach (hash, data_iter_generic, raw_data); + sort_raw_num_data (raw_data, raw_data->idx); + + return raw_data; +} diff --git a/goaccess++/src/tcabdb.h b/goaccess++/src/tcabdb.h new file mode 100644 index 0000000..caa9ee8 --- /dev/null +++ b/goaccess++/src/tcabdb.h @@ -0,0 +1,226 @@ +/** + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana + * + * 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. + */ + +#if HAVE_CONFIG_H +#include +#endif + +#ifndef TCABDB_H_INCLUDED +#define TCABDB_H_INCLUDED + +#include + +#include "gslist.h" +#include "gstorage.h" +#include "parser.h" + +#define DB_PARAMS 256 + +/* Metrics Storage */ + +/* Maps keys (string) to numeric values (integer). + * This mitigates the issue of having multiple stores + * with the same string key, and therefore, avoids unnecessary + * memory usage (in most cases). + * + * HEAD|/index.php -> 1 + * POST|/index.php -> 2 + * Windows XP -> 3 + * Ubuntu 10.10 -> 4 + * GET|Ubuntu 10.10 -> 5 + * Linux -> 6 + * 26/Dec/2014 -> 7 + * Windows -> 8 + */ +/* MTRC_KEYMAP */ + +/* Maps integer keys of root elements from the keymap hash + * to actual string values. + * + * 6 -> Linux + * 8 -> Windows + */ +/* MTRC_ROOTMAP */ + +/* Maps integer keys of data elements from the keymap hash + * to actual string values. + * + * 1 -> /index.php + * 2 -> /index.php + * 3 -> Windows XP + * 4 -> Ubuntu 10.10 + * 5 -> Ubuntu 10.10 + * 7 -> 26/Dec/2014 + */ +/* MTRC_DATAMAP */ + +/* Maps a string key made from the integer key of the + * IP/date/UA and the integer key from the data field of + * each module to numeric autoincremented values. e.g., "1|4" + * => 1 -> unique visitor key (concatenated) with 4 -> data + * key. + * + * "1|4" -> 1 + * "1|5" -> 2 + */ +/* MTRC_UNIQMAP */ + +/* Maps integer key from the keymap hash to the number of + * hits. + * + * 1 -> 10934 + * 2 -> 3231 + * 3 -> 500 + * 4 -> 201 + * 5 -> 206 + */ +/* MTRC_HITS */ + +/* Maps numeric keys made from the uniqmap store to autoincremented values + * (counter). + * 10 -> 100 + * 40 -> 56 + */ +/* MTRC_VISITORS */ + +/* Maps numeric data keys to bandwidth (in bytes). + * 1 -> 1024 + * 2 -> 2048 + */ +/* MTRC_BW */ + +/* Maps numeric data keys to cumulative time served (in usecs/msecs). + * 1 -> 187 + * 2 -> 208 + */ +/* MTRC_CUMTS */ + +/* Maps numeric data keys to max time served (in usecs/msecs). + * 1 -> 1287 + * 2 -> 2308 + */ +/* MTRC_MAXTS */ + +/* Maps numeric data keys to string values. + * 1 -> GET + * 2 -> POST + */ +/* MTRC_METHODS */ + +/* Maps numeric data keys to string values. + * 1 -> HTTP/1.1 + * 2 -> HTTP/1.0 + */ +/* MTRC_PROTOCOLS */ + +/* Maps numeric unique user-agent keys to the + * corresponding numeric value. + * 1 -> 3 + * 2 -> 4 + */ +/* MTRC_AGENTS */ + +/* Enumerated Storage Metrics */ +typedef struct GTCStorageMetric_ +{ + GSMetric metric; + const char *dbname; + char *dbpath; + void *store; +} GTCStorageMetric; + +/* Data Storage per module */ +typedef struct GTCStorage_ +{ + GModule module; + GTCStorageMetric metrics[GSMTRC_TOTAL]; +} GTCStorage; + +void free_agent_list (void); +void free_storage (void); +void init_storage (void); + +int ht_insert_agent_key (const char *key); +int ht_insert_agent_value (int key, const char *value); +int ht_insert_unique_key (const char *key); + +int ht_insert_agent (GModule module, int key, int value); +int ht_insert_bw (GModule module, int key, uint64_t inc); +int ht_insert_cumts (GModule module, int key, uint64_t inc); +int ht_insert_datamap (GModule module, int key, const char *value); +int ht_insert_genstats_accumulated_time (time_t elapsed); +int ht_insert_genstats_bw (const char *key, uint64_t inc); +int ht_insert_genstats (const char *key, int inc); +int ht_insert_hits (GModule module, int key, int inc); +int ht_insert_hostname (const char *ip, const char *host); +int ht_insert_keymap (GModule module, const char *key); +int ht_insert_maxts (GModule module, int key, uint64_t value); +int ht_insert_meta_data (GModule module, const char *key, uint64_t value); +int ht_insert_method (GModule module, int key, const char *value); +int ht_insert_protocol (GModule module, int key, const char *value); +int ht_insert_root (GModule module, int key, int value); +int ht_insert_rootmap (GModule module, int key, const char *value); +int ht_insert_uniqmap (GModule module, const char *key); +int ht_insert_visitor (GModule module, int key, int inc); +int ht_replace_genstats (const char *key, int value); + +uint32_t ht_get_size_datamap (GModule module); +uint32_t ht_get_size_uniqmap (GModule module); + +char *ht_get_datamap (GModule module, int key); +char *ht_get_host_agent_val (int key); +char *ht_get_hostname (const char *host); +char *ht_get_method (GModule module, int key); +char *ht_get_protocol (GModule module, int key); +char *ht_get_root (GModule module, int key); +int ht_get_hits (GModule module, int key); +int ht_get_keymap (GModule module, const char *key); +int ht_get_uniqmap (GModule module, const char *key); +int ht_get_visitors (GModule module, int key); +uint32_t ht_get_genstats (const char *key); +uint64_t ht_get_bw (GModule module, int key); +uint64_t ht_get_cumts (GModule module, int key); +uint64_t ht_get_genstats_bw (const char *key); +uint64_t ht_get_maxts (GModule module, int key); +uint64_t ht_get_meta_data (GModule module, const char *key); +void ht_get_bw_min_max (GModule module, uint64_t * min, uint64_t * max); +void ht_get_cumts_min_max (GModule module, uint64_t * min, uint64_t * max); +void ht_get_hits_min_max (GModule module, int *min, int *max); +void ht_get_maxts_min_max (GModule module, uint64_t * min, uint64_t * max); +void ht_get_visitors_min_max (GModule module, int *min, int *max); + +GSLList *tclist_to_gsllist (TCLIST * tclist); +GSLList *ht_get_host_agent_list (GModule module, int key); +TCLIST *ht_get_host_agent_tclist (GModule module, int key); + +GRawData *parse_raw_data (GModule module); + +/* *INDENT-ON* */ + +#endif diff --git a/goaccess++/src/tcbtdb.c b/goaccess++/src/tcbtdb.c new file mode 100644 index 0000000..a509038 --- /dev/null +++ b/goaccess++/src/tcbtdb.c @@ -0,0 +1,333 @@ +/** + * tcbtdb.c -- Tokyo Cabinet database functions + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana + * + * 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 +#include +#include +#include +#include +#include + +#include "tcbtdb.h" +#include "tcabdb.h" + +#ifdef HAVE_GEOLOCATION +#include "geoip1.h" +#endif + +#include "error.h" +#include "util.h" +#include "xmalloc.h" + +#ifdef TCB_BTREE + +/* Get the on-disk databases path. + * + * On success, the databases path string is returned. */ +char * +tc_db_set_path (const char *dbname, int module) +{ + struct stat info; + static char default_path[sizeof (TC_DBPATH "01234567890/")]; + static char *db_path; + char *path; + char fname[RAND_FN]; + int cx; + + /* db_path is either specified explicitly, or gets the default (pid appended) */ + if (conf.db_path != NULL) + db_path = (char *) conf.db_path; + else { + sprintf (default_path, "%s%d", TC_DBPATH, getpid ()); + db_path = default_path; + mkdir (db_path, TC_DBPMODE); + } + + /* sanity check: Is db_path accessible and a directory? */ + if (stat (db_path, &info) != 0) + FATAL ("Unable to access database path: %s", strerror (errno)); + if (!(info.st_mode & S_IFDIR)) + FATAL ("Database path is not a directory."); + + /* for tc_db_rmdir(), return the pure folder path (or NULL to keep) */ + if (dbname == NULL) + return conf.db_path == NULL ? db_path : NULL; + + memset (fname, 0, sizeof (fname)); + /* tcadbopen requires the db name suffix to be ".tcb" and thus we + * don't use mkstemp(3) */ + genstr (fname, RAND_FN - 1); + + cx = snprintf (NULL, 0, "%s/%dm%s%s", db_path, module, fname, dbname) + 1; + path = xmalloc (cx); + sprintf (path, "%s/%dm%s%s", db_path, module, fname, dbname); + + return path; +} + +/* delete db folder if we used the customized (pid appended) default */ +void +tc_db_rmdir () +{ + const char *db_path = NULL; + + db_path = tc_db_set_path (NULL, 0); + if (db_path != NULL) + if (rmdir (db_path)) + LOG_DEBUG (("Unable to remove custom db folder: %s\n", db_path)); +} + + +/* Set the given database parameter into the parameters buffer. + * + * On error, a negative number is returned. + * On success, the number of characters that would have been written is + * returned. */ +static int +set_dbparam (char *params, int len, const char *fmt, ...) +{ + int n; + va_list args; + + va_start (args, fmt); + n = vsnprintf (params + len, DB_PARAMS - len, fmt, args); + va_end (args); + + if (n < 0) { + n = 0; + LOG_DEBUG (("Output error is encountered on set_dbparam\n")); + } else if (n >= DB_PARAMS - len) { + LOG_DEBUG (("Output truncated on set_dbparam\n")); + n = DB_PARAMS - len; + } + + return n; +} + +/* Set the on-disk database parameters from enabled options in the config file. */ +void +tc_db_get_params (char *params, const char *path) +{ + int len = 0; + long xmmap = conf.xmmap; + uint32_t lcnum, ncnum, lmemb, nmemb, bnum; + + /* copy path name to buffer */ + len += set_dbparam (params, len, "%s", path); + + /* caching parameters of a B+ tree database object */ + lcnum = conf.cache_lcnum > 0 ? conf.cache_lcnum : TC_LCNUM; + len += set_dbparam (params, len, "#%s=%d", "lcnum", lcnum); + + ncnum = conf.cache_ncnum > 0 ? conf.cache_ncnum : TC_NCNUM; + len += set_dbparam (params, len, "#%s=%d", "ncnum", ncnum); + + /* set the size of the extra mapped memory */ + if (xmmap > 0) + len += set_dbparam (params, len, "#%s=%ld", "xmsiz", xmmap); + + lmemb = conf.tune_lmemb > 0 ? conf.tune_lmemb : TC_LMEMB; + len += set_dbparam (params, len, "#%s=%d", "lmemb", lmemb); + + nmemb = conf.tune_nmemb > 0 ? conf.tune_nmemb : TC_NMEMB; + len += set_dbparam (params, len, "#%s=%d", "nmemb", nmemb); + + bnum = conf.tune_bnum > 0 ? conf.tune_bnum : TC_BNUM; + len += set_dbparam (params, len, "#%s=%d", "bnum", bnum); + + /* compression */ + len += set_dbparam (params, len, "#%s=%c", "opts", 'l'); + + if (conf.compression == TC_BZ2) { + len += set_dbparam (params, len, "%c", 'b'); + } else if (conf.compression == TC_ZLIB) { + len += set_dbparam (params, len, "%c", 'd'); + } + + /* open flags. create a new database if not exist, otherwise read it */ + len += set_dbparam (params, len, "#%s=%s", "mode", "wc"); + /* if not loading from disk, truncate regardless if a db file exists */ + if (!conf.load_from_disk) + len += set_dbparam (params, len, "%c", 't'); + + LOG_DEBUG (("%s\n", path)); + LOG_DEBUG (("params: %s\n", params)); +} + +/* Open the database handle. + * + * On error, the program will exit. + * On success, the opened on-disk database is returned. */ +TCBDB * +tc_bdb_create (char *dbpath) +{ + TCBDB *bdb; + int ecode; + uint32_t lcnum, ncnum, lmemb, nmemb, bnum, flags; + + bdb = tcbdbnew (); + + lcnum = conf.cache_lcnum > 0 ? conf.cache_lcnum : TC_LCNUM; + ncnum = conf.cache_ncnum > 0 ? conf.cache_ncnum : TC_NCNUM; + + /* set the caching parameters of a B+ tree database object */ + if (!tcbdbsetcache (bdb, lcnum, ncnum)) { + free (dbpath); + FATAL ("Unable to set TCB cache"); + } + + /* set the size of the extra mapped memory */ + if (conf.xmmap > 0 && !tcbdbsetxmsiz (bdb, conf.xmmap)) { + free (dbpath); + FATAL ("Unable to set TCB xmmap."); + } + + lmemb = conf.tune_lmemb > 0 ? conf.tune_lmemb : TC_LMEMB; + nmemb = conf.tune_nmemb > 0 ? conf.tune_nmemb : TC_NMEMB; + bnum = conf.tune_bnum > 0 ? conf.tune_bnum : TC_BNUM; + + /* compression */ + flags = BDBTLARGE; + if (conf.compression == TC_BZ2) { + flags |= BDBTBZIP; + } else if (conf.compression == TC_ZLIB) { + flags |= BDBTDEFLATE; + } + + /* set the tuning parameters */ + tcbdbtune (bdb, lmemb, nmemb, bnum, 8, 10, flags); + + /* open flags */ + flags = BDBOWRITER | BDBOCREAT; + if (!conf.load_from_disk) + flags |= BDBOTRUNC; + + /* attempt to open the database */ + if (!tcbdbopen (bdb, dbpath, flags)) { + free (dbpath); + ecode = tcbdbecode (bdb); + + FATAL ("%s", tcbdberrmsg (ecode)); + } + + return bdb; +} + +/* Close the database handle. + * + * On error, 1 is returned. + * On success or the database is closed, 0 is returned. */ +int +tc_bdb_close (void *db, char *dbname) +{ + TCBDB *bdb = db; + int ecode; + + if (bdb == NULL) + return 1; + + /* close the database */ + if (!tcbdbclose (bdb)) { + ecode = tcbdbecode (bdb); + FATAL ("%s", tcbdberrmsg (ecode)); + } + /* delete the object */ + tcbdbdel (bdb); + + /* remove database file */ + if (!conf.keep_db_files && !tcremovelink (dbname)) + LOG_DEBUG (("Unable to remove DB: %s\n", dbname)); + free (dbname); + + return 0; +} + +/* Compare the given integer value with one in the list object. + * + * If values are the equal, 1 is returned else 0 is returned. */ +static int +find_int_key_in_list (void *data, void *needle) +{ + return (*(int *) data) == (*(int *) needle) ? 1 : 0; +} + +/* Iterate over the list object and compare the current value with the given + * value. + * + * If the value exists, 1 is returned else 0 is returned. */ +static int +is_value_in_tclist (TCLIST * tclist, void *value) +{ + int i, sz; + int *val; + + if (!tclist) + return 0; + + for (i = 0; i < tclistnum (tclist); ++i) { + val = (int *) tclistval (tclist, i, &sz); + if (find_int_key_in_list (value, val)) + return 1; + } + + return 0; +} + +/* Insert a string key and the corresponding string value. + * Note: If the key exists, the value is not replaced. + * + * On error, or if found, 1 is returned. + * On success, or if not in the list, 0 is returned. */ +int +ins_igsl (void *hash, int key, int value) +{ + TCLIST *list; + int in_list = 0; + + if (!hash) + return -1; + + /* key found, check if key exists within the list */ + if ((list = tcbdbget4 (hash, &key, sizeof (int))) != NULL) { + if (is_value_in_tclist (list, &value)) + in_list = 1; + tclistdel (list); + } + /* if not on the list, add it */ + if (!in_list && tcbdbputdup (hash, &key, sizeof (int), &value, sizeof (int))) + return 0; + + return -1; +} +#endif diff --git a/goaccess++/src/tcbtdb.h b/goaccess++/src/tcbtdb.h new file mode 100644 index 0000000..01a2bf2 --- /dev/null +++ b/goaccess++/src/tcbtdb.h @@ -0,0 +1,91 @@ +/** + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana + * + * 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. + */ + +#if HAVE_CONFIG_H +#include +#endif + +#ifndef TCBTDB_H_INCLUDED +#define TCBTDB_H_INCLUDED + +#include + +#include "commons.h" +#include "gstorage.h" +#include "parser.h" + +#define TC_MMAP 0 +#define TC_LCNUM 1024 +#define TC_NCNUM 512 +#define TC_LMEMB 128 +#define TC_NMEMB 256 +#define TC_BNUM 32749 +#define TC_DBPATH "/tmp/goaccess" +#define TC_DBPMODE 0755 +#define TC_ZLIB 1 +#define TC_BZ2 2 + +#define RAND_FN 7 + 1 + +/* B+ Tree - on-disk databases */ +#define DB_AGENT_KEYS "db_agent_keys.tcb" +#define DB_AGENT_VALS "db_agent_vals.tcb" +#define DB_GEN_STATS "db_gen_stats.tcb" +#define DB_HOSTNAMES "db_hostnames.tcb" +#define DB_UNIQUE_KEYS "db_unique_keys.tcb" + +#define DB_KEYMAP "db_keymap.tcb" +#define DB_DATAMAP "db_datamap.tcb" +#define DB_ROOTMAP "db_rootmap.tcb" +#define DB_UNIQMAP "db_uniqmap.tcb" +#define DB_VISITORS "db_visitors.tcb" +#define DB_ROOT "db_root.tcb" +#define DB_HITS "db_hits.tcb" +#define DB_BW "db_bw.tcb" +#define DB_CUMTS "db_cumts.tcb" +#define DB_MAXTS "db_maxts.tcb" +#define DB_METHODS "db_methods.tcb" +#define DB_PROTOCOLS "db_protocols.tcb" +#define DB_AGENTS "db_agents.tcb" +#define DB_METADATA "db_metadata.tcb" + +/* *INDENT-OFF* */ +TCBDB *tc_bdb_create (char *dbpath); + +char *tc_db_set_path (const char *dbname, int module); +void tc_db_rmdir(void); +int tc_bdb_close (void *db, char *dbname); +void tc_db_get_params (char *params, const char *path); + +#ifdef TCB_BTREE +int ins_igsl (void *hash, int key, int value); +#endif +/* *INDENT-ON* */ + +#endif diff --git a/goaccess++/src/tpls.h b/goaccess++/src/tpls.h new file mode 100644 index 0000000..e6d723b --- /dev/null +++ b/goaccess++/src/tpls.h @@ -0,0 +1,941 @@ +const char tpls[10299] = { + 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x54, 0x50, 0x4c, 0x20, 0x47, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x20, 0x2d, 0x2d, 0x3e, 0x3c, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x69, 0x64, 0x3d, 0x22, + 0x74, 0x70, 0x6c, 0x2d, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, + 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, + 0x74, 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, + 0x3e, 0x3c, 0x68, 0x34, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x2d, 0x78, 0x73, 0x20, + 0x67, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x3e, 0x7b, 0x7b, + 0x68, 0x65, 0x61, 0x64, 0x7d, 0x7d, 0x3c, 0x73, 0x70, 0x61, 0x6e, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x70, 0x75, 0x6c, + 0x6c, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e, 0x7b, 0x7b, + 0x23, 0x66, 0x72, 0x6f, 0x6d, 0x7d, 0x7d, 0x3c, 0x73, 0x70, 0x61, + 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, 0x72, + 0x6f, 0x6d, 0x22, 0x3e, 0x7b, 0x7b, 0x66, 0x72, 0x6f, 0x6d, 0x7d, + 0x7d, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x7b, 0x7b, 0x2f, + 0x66, 0x72, 0x6f, 0x6d, 0x7d, 0x7d, 0x7b, 0x7b, 0x23, 0x74, 0x6f, + 0x7d, 0x7d, 0x20, 0x26, 0x23, 0x38, 0x32, 0x31, 0x32, 0x3b, 0x20, + 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x74, 0x6f, 0x22, 0x3e, 0x7b, 0x7b, 0x74, 0x6f, 0x7d, + 0x7d, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x7b, 0x7b, 0x2f, + 0x74, 0x6f, 0x7d, 0x7d, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, + 0x3c, 0x2f, 0x68, 0x34, 0x3e, 0x3c, 0x68, 0x35, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, + 0x65, 0x2d, 0x78, 0x73, 0x20, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, + 0x2d, 0x73, 0x6d, 0x20, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x2d, + 0x6d, 0x64, 0x20, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x2d, 0x6c, + 0x67, 0x20, 0x67, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x3e, + 0x7b, 0x7b, 0x68, 0x65, 0x61, 0x64, 0x7d, 0x7d, 0x26, 0x6e, 0x62, + 0x73, 0x70, 0x3b, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x7b, 0x7b, + 0x23, 0x66, 0x72, 0x6f, 0x6d, 0x7d, 0x7d, 0x3c, 0x73, 0x70, 0x61, + 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, 0x72, + 0x6f, 0x6d, 0x22, 0x3e, 0x7b, 0x7b, 0x66, 0x72, 0x6f, 0x6d, 0x7d, + 0x7d, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x7b, 0x7b, 0x2f, + 0x66, 0x72, 0x6f, 0x6d, 0x7d, 0x7d, 0x7b, 0x7b, 0x23, 0x74, 0x6f, + 0x7d, 0x7d, 0x20, 0x26, 0x23, 0x38, 0x32, 0x31, 0x32, 0x3b, 0x20, + 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x74, 0x6f, 0x22, 0x3e, 0x7b, 0x7b, 0x74, 0x6f, 0x7d, + 0x7d, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x7b, 0x7b, 0x2f, + 0x74, 0x6f, 0x7d, 0x7d, 0x3c, 0x2f, 0x68, 0x35, 0x3e, 0x3c, 0x64, + 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x77, + 0x72, 0x61, 0x70, 0x2d, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, + 0x2d, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3e, 0x3c, 0x2f, 0x64, + 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x54, 0x50, 0x4c, 0x20, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x49, 0x74, 0x65, 0x6d, + 0x73, 0x20, 0x2d, 0x2d, 0x3e, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x74, 0x70, 0x6c, 0x2d, 0x67, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x2d, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, + 0x78, 0x74, 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x22, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x32, + 0x22, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x67, 0x72, 0x69, 0x64, 0x2d, 0x6d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x20, 0x7b, 0x7b, 0x23, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x7d, 0x7b, 0x7b, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x7d, 0x7b, 0x7b, + 0x2f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x7d, + 0x7d, 0x7b, 0x7b, 0x5e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, + 0x6d, 0x65, 0x7d, 0x7d, 0x67, 0x72, 0x61, 0x79, 0x7b, 0x7b, 0x2f, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x7d, + 0x22, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x63, 0x6f, 0x6c, 0x2d, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x22, 0x3e, 0x3c, 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x66, 0x61, 0x20, 0x66, 0x61, 0x2d, 0x62, 0x61, 0x72, + 0x2d, 0x63, 0x68, 0x61, 0x72, 0x74, 0x22, 0x3e, 0x3c, 0x2f, 0x69, + 0x3e, 0x20, 0x7b, 0x7b, 0x23, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x7d, + 0x7d, 0x7b, 0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x7d, 0x7d, 0x7b, + 0x7b, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x7d, 0x7d, 0x3c, 0x2f, + 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x68, 0x33, 0x20, 0x69, 0x64, 0x3d, + 0x22, 0x7b, 0x7b, 0x69, 0x64, 0x7d, 0x7d, 0x22, 0x20, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, + 0x67, 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x20, 0x30, 0x3b, 0x22, 0x3e, + 0x7b, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x7d, 0x7d, 0x3c, 0x2f, + 0x68, 0x33, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, + 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x54, 0x50, 0x4c, 0x20, + 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x2d, 0x2d, 0x3e, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x20, 0x69, 0x64, 0x3d, 0x22, 0x74, 0x70, 0x6c, 0x2d, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2d, 0x72, 0x6f, 0x77, 0x22, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x74, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x3e, 0x7b, 0x7b, 0x23, + 0x72, 0x6f, 0x77, 0x73, 0x7d, 0x7d, 0x3c, 0x74, 0x72, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x7b, 0x7b, 0x23, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x7d, 0x7b, 0x7b, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x7d, + 0x7b, 0x7b, 0x2f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, + 0x65, 0x7d, 0x7d, 0x20, 0x7b, 0x7b, 0x23, 0x68, 0x61, 0x73, 0x53, + 0x75, 0x62, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x7d, 0x7d, 0x7b, 0x7b, + 0x23, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x7d, 0x7d, 0x65, 0x78, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x7b, 0x7b, 0x2f, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x7d, 0x7d, 0x7b, 0x7b, 0x2f, 0x68, 0x61, + 0x73, 0x53, 0x75, 0x62, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x7d, 0x7d, + 0x22, 0x20, 0x7b, 0x7b, 0x23, 0x69, 0x64, 0x78, 0x7d, 0x7d, 0x64, + 0x61, 0x74, 0x61, 0x2d, 0x70, 0x69, 0x64, 0x3d, 0x22, 0x7b, 0x7b, + 0x69, 0x64, 0x78, 0x7d, 0x7d, 0x22, 0x7b, 0x7b, 0x2f, 0x69, 0x64, + 0x78, 0x7d, 0x7d, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x3d, 0x22, 0x7b, 0x7b, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x7d, 0x7d, 0x22, 0x20, 0x7b, 0x7b, 0x23, 0x6b, 0x65, 0x79, + 0x7d, 0x7d, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x6b, 0x65, 0x79, 0x3d, + 0x22, 0x7b, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x7d, 0x22, 0x7b, 0x7b, + 0x2f, 0x6b, 0x65, 0x79, 0x7d, 0x7d, 0x3e, 0x7b, 0x7b, 0x23, 0x68, + 0x61, 0x73, 0x53, 0x75, 0x62, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x7d, + 0x7d, 0x3c, 0x74, 0x64, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x72, 0x6f, 0x77, 0x2d, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x63, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x7b, 0x7b, 0x23, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x7d, 0x7d, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x61, + 0x62, 0x6c, 0x65, 0x7b, 0x7b, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x7d, 0x7d, 0x22, 0x3e, 0x7b, 0x7b, 0x23, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x7d, 0x7d, 0x3c, 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x66, 0x61, 0x20, 0x7b, 0x7b, 0x23, 0x65, 0x78, 0x70, + 0x61, 0x6e, 0x64, 0x65, 0x64, 0x7d, 0x7d, 0x66, 0x61, 0x2d, 0x63, + 0x61, 0x72, 0x65, 0x74, 0x2d, 0x64, 0x6f, 0x77, 0x6e, 0x7b, 0x7b, + 0x2f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x65, 0x64, 0x7d, 0x7d, + 0x7b, 0x7b, 0x5e, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x65, 0x64, + 0x7d, 0x7d, 0x66, 0x61, 0x20, 0x66, 0x61, 0x2d, 0x63, 0x61, 0x72, + 0x65, 0x74, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x7b, 0x7b, 0x2f, + 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x65, 0x64, 0x7d, 0x7d, 0x22, + 0x3e, 0x3c, 0x2f, 0x69, 0x3e, 0x7b, 0x7b, 0x2f, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x7d, 0x7d, 0x7b, 0x7b, 0x5e, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x7d, 0x7d, 0x3c, 0x69, 0x3e, 0x3c, 0x2f, 0x69, 0x3e, 0x7b, + 0x7b, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x7d, 0x7d, 0x3c, 0x2f, + 0x74, 0x64, 0x3e, 0x7b, 0x7b, 0x2f, 0x68, 0x61, 0x73, 0x53, 0x75, + 0x62, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x7d, 0x7d, 0x3c, 0x74, 0x64, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x72, 0x6f, 0x77, + 0x2d, 0x69, 0x64, 0x78, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e, 0x7b, 0x7b, 0x23, 0x69, 0x64, + 0x78, 0x7d, 0x7d, 0x7b, 0x7b, 0x69, 0x64, 0x78, 0x7d, 0x7d, 0x7b, + 0x7b, 0x2f, 0x69, 0x64, 0x78, 0x7d, 0x7d, 0x3c, 0x2f, 0x74, 0x64, + 0x3e, 0x7b, 0x7b, 0x23, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x7d, 0x7d, + 0x3c, 0x74, 0x64, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x7b, 0x7b, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, + 0x7d, 0x7d, 0x22, 0x20, 0x7b, 0x7b, 0x23, 0x63, 0x6f, 0x6c, 0x73, + 0x70, 0x61, 0x6e, 0x7d, 0x7d, 0x63, 0x6f, 0x6c, 0x73, 0x70, 0x61, + 0x6e, 0x3d, 0x22, 0x7b, 0x7b, 0x63, 0x6f, 0x6c, 0x73, 0x70, 0x61, + 0x6e, 0x7d, 0x7d, 0x22, 0x7b, 0x7b, 0x2f, 0x63, 0x6f, 0x6c, 0x73, + 0x70, 0x61, 0x6e, 0x7d, 0x7d, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x22, 0x3e, 0x7b, 0x7b, 0x7b, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x7d, 0x7d, 0x7d, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, + 0x7b, 0x7b, 0x23, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x7d, + 0x7d, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x22, + 0x3e, 0x20, 0x28, 0x7b, 0x7b, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x7d, 0x7d, 0x29, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, + 0x7b, 0x7b, 0x2f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x7d, + 0x7d, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x7b, 0x7b, 0x2f, 0x63, 0x65, + 0x6c, 0x6c, 0x73, 0x7d, 0x7d, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x7b, + 0x7b, 0x2f, 0x72, 0x6f, 0x77, 0x73, 0x7d, 0x7d, 0x3c, 0x2f, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x20, + 0x54, 0x50, 0x4c, 0x20, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x4d, 0x65, 0x74, 0x61, 0x20, 0x2d, + 0x2d, 0x3e, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x69, + 0x64, 0x3d, 0x22, 0x74, 0x70, 0x6c, 0x2d, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2d, 0x72, 0x6f, 0x77, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x22, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, + 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x3e, + 0x7b, 0x7b, 0x23, 0x72, 0x6f, 0x77, 0x7d, 0x7d, 0x3c, 0x74, 0x72, + 0x3e, 0x7b, 0x7b, 0x23, 0x68, 0x61, 0x73, 0x53, 0x75, 0x62, 0x49, + 0x74, 0x65, 0x6d, 0x73, 0x7d, 0x7d, 0x3c, 0x74, 0x64, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x22, 0x3e, 0x3c, 0x2f, 0x74, + 0x64, 0x3e, 0x7b, 0x7b, 0x2f, 0x68, 0x61, 0x73, 0x53, 0x75, 0x62, + 0x49, 0x74, 0x65, 0x6d, 0x73, 0x7d, 0x7d, 0x3c, 0x74, 0x64, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x22, 0x3e, 0x3c, 0x2f, + 0x74, 0x64, 0x3e, 0x7b, 0x7b, 0x23, 0x63, 0x65, 0x6c, 0x6c, 0x73, + 0x7d, 0x7d, 0x3c, 0x74, 0x64, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x7b, 0x7b, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, + 0x6d, 0x65, 0x7d, 0x7d, 0x22, 0x20, 0x7b, 0x7b, 0x23, 0x63, 0x6f, + 0x6c, 0x73, 0x70, 0x61, 0x6e, 0x7d, 0x7d, 0x63, 0x6f, 0x6c, 0x73, + 0x70, 0x61, 0x6e, 0x3d, 0x22, 0x7b, 0x7b, 0x63, 0x6f, 0x6c, 0x73, + 0x70, 0x61, 0x6e, 0x7d, 0x7d, 0x22, 0x7b, 0x7b, 0x2f, 0x63, 0x6f, + 0x6c, 0x73, 0x70, 0x61, 0x6e, 0x7d, 0x7d, 0x3e, 0x7b, 0x7b, 0x23, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x7d, 0x7d, 0x3c, 0x68, 0x34, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x22, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x7b, 0x7b, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x7d, 0x7d, 0x22, 0x3e, 0x7b, 0x7b, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x7d, 0x7d, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x7b, + 0x7b, 0x23, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x7d, 0x7d, 0x3c, 0x73, + 0x6d, 0x61, 0x6c, 0x6c, 0x3e, 0x20, 0x7b, 0x7b, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x7d, 0x7d, 0x3c, 0x2f, 0x73, 0x6d, 0x61, 0x6c, 0x6c, + 0x3e, 0x7b, 0x7b, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x7d, 0x7d, + 0x7b, 0x7b, 0x23, 0x6d, 0x61, 0x78, 0x7d, 0x7d, 0x3c, 0x62, 0x72, + 0x3e, 0x3c, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x3e, 0x4d, 0x61, 0x78, + 0x3a, 0x20, 0x7b, 0x7b, 0x6d, 0x61, 0x78, 0x7d, 0x7d, 0x3c, 0x2f, + 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x3e, 0x7b, 0x7b, 0x2f, 0x6d, 0x61, + 0x78, 0x7d, 0x7d, 0x7b, 0x7b, 0x23, 0x6d, 0x69, 0x6e, 0x7d, 0x7d, + 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x3e, + 0x4d, 0x69, 0x6e, 0x3a, 0x20, 0x7b, 0x7b, 0x6d, 0x69, 0x6e, 0x7d, + 0x7d, 0x3c, 0x2f, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x3e, 0x7b, 0x7b, + 0x2f, 0x6d, 0x69, 0x6e, 0x7d, 0x7d, 0x3c, 0x2f, 0x68, 0x34, 0x3e, + 0x7b, 0x7b, 0x2f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x7d, 0x7d, 0x3c, + 0x2f, 0x74, 0x64, 0x3e, 0x7b, 0x7b, 0x2f, 0x63, 0x65, 0x6c, 0x6c, + 0x73, 0x7d, 0x7d, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x7b, 0x7b, 0x2f, + 0x72, 0x6f, 0x77, 0x7d, 0x7d, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x54, 0x50, 0x4c, + 0x20, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x65, 0x61, + 0x64, 0x20, 0x2d, 0x2d, 0x3e, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x74, 0x70, 0x6c, 0x2d, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x74, 0x68, 0x65, 0x61, 0x64, 0x22, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, + 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x3e, + 0x3c, 0x74, 0x72, 0x3e, 0x7b, 0x7b, 0x23, 0x68, 0x61, 0x73, 0x53, + 0x75, 0x62, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x7d, 0x7d, 0x3c, 0x74, + 0x68, 0x3e, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x7b, 0x7b, 0x2f, 0x68, + 0x61, 0x73, 0x53, 0x75, 0x62, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x7d, + 0x7d, 0x3c, 0x74, 0x68, 0x3e, 0x23, 0x3c, 0x2f, 0x74, 0x68, 0x3e, + 0x7b, 0x7b, 0x23, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x7d, 0x7d, 0x3c, + 0x74, 0x68, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x7b, + 0x7b, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x7d, + 0x20, 0x7b, 0x7b, 0x23, 0x6b, 0x65, 0x79, 0x7d, 0x7d, 0x73, 0x6f, + 0x72, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x7b, 0x7b, 0x2f, 0x6b, 0x65, + 0x79, 0x7d, 0x7d, 0x22, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x6b, + 0x65, 0x79, 0x3d, 0x22, 0x7b, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x7d, + 0x22, 0x20, 0x7b, 0x7b, 0x23, 0x73, 0x6f, 0x72, 0x74, 0x7d, 0x7d, + 0x64, 0x61, 0x74, 0x61, 0x2d, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3d, + 0x22, 0x7b, 0x7b, 0x23, 0x61, 0x73, 0x63, 0x7d, 0x7d, 0x61, 0x73, + 0x63, 0x7b, 0x7b, 0x2f, 0x61, 0x73, 0x63, 0x7d, 0x7d, 0x7b, 0x7b, + 0x5e, 0x61, 0x73, 0x63, 0x7d, 0x7d, 0x64, 0x65, 0x73, 0x63, 0x7b, + 0x7b, 0x2f, 0x61, 0x73, 0x63, 0x7d, 0x7d, 0x22, 0x7b, 0x7b, 0x2f, + 0x73, 0x6f, 0x72, 0x74, 0x7d, 0x7d, 0x3e, 0x7b, 0x7b, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x7d, 0x7d, 0x20, 0x3c, 0x69, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, 0x61, 0x20, 0x66, 0x61, 0x2d, + 0x7b, 0x7b, 0x5e, 0x73, 0x6f, 0x72, 0x74, 0x7d, 0x7d, 0x73, 0x6f, + 0x72, 0x74, 0x7b, 0x7b, 0x2f, 0x73, 0x6f, 0x72, 0x74, 0x7d, 0x7d, + 0x7b, 0x7b, 0x23, 0x73, 0x6f, 0x72, 0x74, 0x7d, 0x7d, 0x7b, 0x7b, + 0x23, 0x61, 0x73, 0x63, 0x7d, 0x7d, 0x63, 0x61, 0x72, 0x65, 0x74, + 0x2d, 0x75, 0x70, 0x7b, 0x7b, 0x2f, 0x61, 0x73, 0x63, 0x7d, 0x7d, + 0x7b, 0x7b, 0x5e, 0x61, 0x73, 0x63, 0x7d, 0x7d, 0x63, 0x61, 0x72, + 0x65, 0x74, 0x2d, 0x64, 0x6f, 0x77, 0x6e, 0x7b, 0x7b, 0x2f, 0x61, + 0x73, 0x63, 0x7d, 0x7d, 0x7b, 0x7b, 0x2f, 0x73, 0x6f, 0x72, 0x74, + 0x7d, 0x7d, 0x22, 0x3e, 0x3c, 0x2f, 0x69, 0x3e, 0x3c, 0x2f, 0x74, + 0x68, 0x3e, 0x7b, 0x7b, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x7d, + 0x7d, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x54, 0x50, + 0x4c, 0x20, 0x50, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x44, 0x72, 0x6f, 0x70, 0x44, 0x6f, + 0x77, 0x6e, 0x20, 0x2d, 0x2d, 0x3e, 0x3c, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x74, 0x70, 0x6c, 0x2d, + 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2d, 0x6f, 0x70, 0x74, 0x73, 0x22, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, + 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x3e, + 0x3c, 0x6c, 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x68, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x22, 0x3e, 0x7b, 0x7b, 0x20, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x74, 0x5f, + 0x6f, 0x70, 0x74, 0x73, 0x20, 0x7d, 0x7d, 0x3c, 0x2f, 0x6c, 0x69, + 0x3e, 0x3c, 0x6c, 0x69, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, + 0x66, 0x3d, 0x22, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x3a, 0x76, 0x6f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x3b, + 0x22, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x3d, 0x22, 0x7b, 0x7b, 0x69, 0x64, 0x7d, 0x7d, 0x22, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x74, 0x3d, + 0x22, 0x7b, 0x7b, 0x73, 0x68, 0x6f, 0x77, 0x43, 0x68, 0x61, 0x72, + 0x74, 0x7d, 0x7d, 0x22, 0x3e, 0x3c, 0x69, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x66, 0x61, 0x20, 0x66, 0x61, 0x2d, 0x7b, + 0x7b, 0x23, 0x73, 0x68, 0x6f, 0x77, 0x43, 0x68, 0x61, 0x72, 0x74, + 0x7d, 0x7d, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x2d, 0x7b, 0x7b, 0x2f, + 0x73, 0x68, 0x6f, 0x77, 0x43, 0x68, 0x61, 0x72, 0x74, 0x7d, 0x7d, + 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, 0x2d, 0x6f, 0x22, 0x3e, 0x3c, + 0x2f, 0x69, 0x3e, 0x20, 0x7b, 0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x74, 0x7d, 0x7d, 0x3c, 0x2f, + 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x7b, 0x7b, 0x23, 0x70, + 0x6c, 0x6f, 0x74, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x7d, + 0x7d, 0x3c, 0x6c, 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x68, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x3e, 0x7b, 0x7b, 0x20, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x7d, 0x7d, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x3c, 0x6c, 0x69, 0x3e, + 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x6a, 0x61, + 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3a, 0x76, 0x6f, + 0x69, 0x64, 0x28, 0x30, 0x29, 0x3b, 0x22, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x3d, 0x22, 0x7b, 0x7b, + 0x69, 0x64, 0x7d, 0x7d, 0x22, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2d, + 0x63, 0x68, 0x61, 0x72, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3d, + 0x22, 0x61, 0x72, 0x65, 0x61, 0x2d, 0x73, 0x70, 0x6c, 0x69, 0x6e, + 0x65, 0x22, 0x3e, 0x3c, 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x66, 0x61, 0x20, 0x66, 0x61, 0x2d, 0x63, 0x69, 0x72, + 0x63, 0x6c, 0x65, 0x7b, 0x7b, 0x5e, 0x61, 0x72, 0x65, 0x61, 0x2d, + 0x73, 0x70, 0x6c, 0x69, 0x6e, 0x65, 0x7d, 0x7d, 0x2d, 0x6f, 0x7b, + 0x7b, 0x2f, 0x61, 0x72, 0x65, 0x61, 0x2d, 0x73, 0x70, 0x6c, 0x69, + 0x6e, 0x65, 0x7d, 0x7d, 0x22, 0x3e, 0x3c, 0x2f, 0x69, 0x3e, 0x20, + 0x7b, 0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2e, 0x61, 0x72, + 0x65, 0x61, 0x5f, 0x73, 0x70, 0x6c, 0x69, 0x6e, 0x65, 0x7d, 0x7d, + 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x3c, 0x6c, + 0x69, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3a, + 0x76, 0x6f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x3b, 0x22, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x3d, 0x22, + 0x7b, 0x7b, 0x69, 0x64, 0x7d, 0x7d, 0x22, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x74, 0x2d, 0x74, 0x79, 0x70, + 0x65, 0x3d, 0x22, 0x62, 0x61, 0x72, 0x22, 0x3e, 0x3c, 0x69, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, 0x61, 0x20, 0x66, + 0x61, 0x2d, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x7b, 0x7b, 0x5e, + 0x62, 0x61, 0x72, 0x7d, 0x7d, 0x2d, 0x6f, 0x7b, 0x7b, 0x2f, 0x62, + 0x61, 0x72, 0x7d, 0x7d, 0x22, 0x3e, 0x3c, 0x2f, 0x69, 0x3e, 0x20, + 0x7b, 0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2e, 0x62, 0x61, + 0x72, 0x7d, 0x7d, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, + 0x3e, 0x3c, 0x6c, 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x68, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x3e, 0x7b, 0x7b, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x2e, 0x70, 0x6c, 0x6f, 0x74, 0x5f, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x7d, 0x7d, 0x3c, 0x2f, 0x6c, 0x69, + 0x3e, 0x7b, 0x7b, 0x23, 0x70, 0x6c, 0x6f, 0x74, 0x7d, 0x7d, 0x3c, + 0x6c, 0x69, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x22, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x3a, 0x76, 0x6f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x3b, 0x22, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x3d, + 0x22, 0x7b, 0x7b, 0x69, 0x64, 0x7d, 0x7d, 0x22, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x2d, 0x70, 0x6c, 0x6f, 0x74, 0x3d, 0x22, 0x7b, 0x7b, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x7d, + 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x2d, 0x70, 0x6c, 0x6f, 0x74, 0x2d, 0x7b, 0x7b, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x7d, + 0x22, 0x3e, 0x3c, 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x66, 0x61, 0x20, 0x66, 0x61, 0x2d, 0x63, 0x69, 0x72, 0x63, + 0x6c, 0x65, 0x7b, 0x7b, 0x5e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x7d, 0x7d, 0x2d, 0x6f, 0x7b, 0x7b, 0x2f, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x7d, 0x7d, 0x22, 0x3e, 0x3c, + 0x2f, 0x69, 0x3e, 0x20, 0x7b, 0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x7d, 0x7d, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, + 0x7b, 0x7b, 0x2f, 0x70, 0x6c, 0x6f, 0x74, 0x7d, 0x7d, 0x7b, 0x7b, + 0x2f, 0x70, 0x6c, 0x6f, 0x74, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x7d, 0x7d, 0x3c, 0x6c, 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, + 0x2d, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x3e, 0x7b, 0x7b, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2e, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x7d, 0x7d, + 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x7b, 0x7b, 0x23, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x7d, 0x7d, 0x3c, 0x6c, 0x69, 0x3e, 0x3c, 0x61, 0x20, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x6a, 0x61, 0x76, 0x61, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x3a, 0x76, 0x6f, 0x69, 0x64, 0x28, + 0x30, 0x29, 0x3b, 0x22, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x3d, 0x22, 0x7b, 0x7b, 0x69, 0x64, 0x7d, + 0x7d, 0x22, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x3d, 0x22, 0x7b, 0x7b, 0x6b, 0x65, 0x79, 0x7d, + 0x7d, 0x22, 0x3e, 0x3c, 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x66, 0x61, 0x20, 0x66, 0x61, 0x2d, 0x7b, 0x7b, 0x5e, + 0x68, 0x69, 0x64, 0x65, 0x7d, 0x7d, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x2d, 0x7b, 0x7b, 0x2f, 0x68, 0x69, 0x64, 0x65, 0x7d, 0x7d, 0x73, + 0x71, 0x75, 0x61, 0x72, 0x65, 0x2d, 0x6f, 0x22, 0x3e, 0x3c, 0x2f, + 0x69, 0x3e, 0x20, 0x7b, 0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x7d, + 0x7d, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x7b, + 0x7b, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x7d, 0x7d, 0x3c, 0x2f, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, + 0x20, 0x54, 0x50, 0x4c, 0x20, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x20, + 0x63, 0x6f, 0x6c, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x2d, 0x2d, + 0x3e, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x69, 0x64, + 0x3d, 0x22, 0x74, 0x70, 0x6c, 0x2d, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2d, 0x63, 0x6f, 0x6c, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, + 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x3e, 0x7b, + 0x7b, 0x23, 0x68, 0x61, 0x73, 0x53, 0x75, 0x62, 0x49, 0x74, 0x65, + 0x6d, 0x73, 0x7d, 0x7d, 0x3c, 0x63, 0x6f, 0x6c, 0x20, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, + 0x20, 0x32, 0x25, 0x3b, 0x22, 0x3e, 0x20, 0x3c, 0x21, 0x2d, 0x2d, + 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x63, 0x61, 0x72, 0x65, + 0x74, 0x20, 0x2d, 0x2d, 0x3e, 0x7b, 0x7b, 0x2f, 0x68, 0x61, 0x73, + 0x53, 0x75, 0x62, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x7d, 0x7d, 0x3c, + 0x63, 0x6f, 0x6c, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x33, 0x25, 0x3b, 0x22, + 0x3e, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x72, 0x6f, 0x77, 0x20, + 0x23, 0x20, 0x2d, 0x2d, 0x3e, 0x7b, 0x7b, 0x23, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x7d, 0x7d, 0x3c, 0x63, 0x6f, 0x6c, 0x20, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, + 0x7b, 0x7b, 0x63, 0x6f, 0x6c, 0x57, 0x69, 0x64, 0x74, 0x68, 0x7d, + 0x7d, 0x22, 0x3e, 0x7b, 0x7b, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x7d, 0x7d, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, + 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x54, 0x50, 0x4c, 0x20, 0x50, 0x61, + 0x6e, 0x65, 0x6c, 0x20, 0x2d, 0x2d, 0x3e, 0x3c, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x74, 0x70, 0x6c, + 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x22, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x74, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x3e, 0x3c, 0x64, 0x69, 0x76, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x72, 0x6f, 0x77, + 0x22, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x31, + 0x32, 0x22, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x66, 0x69, + 0x78, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2d, 0x68, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x68, 0x34, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x70, 0x75, 0x6c, 0x6c, 0x2d, 0x6c, + 0x65, 0x66, 0x74, 0x20, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x2d, + 0x78, 0x73, 0x20, 0x67, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, + 0x20, 0x69, 0x64, 0x3d, 0x22, 0x7b, 0x7b, 0x69, 0x64, 0x7d, 0x7d, + 0x22, 0x3e, 0x7b, 0x7b, 0x68, 0x65, 0x61, 0x64, 0x7d, 0x7d, 0x3c, + 0x62, 0x72, 0x3e, 0x3c, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x3e, 0x7b, + 0x7b, 0x64, 0x65, 0x73, 0x63, 0x7d, 0x7d, 0x3c, 0x2f, 0x73, 0x6d, + 0x61, 0x6c, 0x6c, 0x3e, 0x3c, 0x2f, 0x68, 0x34, 0x3e, 0x3c, 0x68, + 0x35, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x70, 0x75, + 0x6c, 0x6c, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x76, 0x69, 0x73, + 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x78, 0x73, 0x20, 0x68, 0x69, 0x64, + 0x64, 0x65, 0x6e, 0x2d, 0x73, 0x6d, 0x20, 0x68, 0x69, 0x64, 0x64, + 0x65, 0x6e, 0x2d, 0x6d, 0x64, 0x20, 0x68, 0x69, 0x64, 0x64, 0x65, + 0x6e, 0x2d, 0x6c, 0x67, 0x20, 0x67, 0x68, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x7b, 0x7b, 0x69, 0x64, + 0x7d, 0x7d, 0x22, 0x3e, 0x7b, 0x7b, 0x68, 0x65, 0x61, 0x64, 0x7d, + 0x7d, 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x73, 0x6d, 0x61, 0x6c, 0x6c, + 0x3e, 0x7b, 0x7b, 0x64, 0x65, 0x73, 0x63, 0x7d, 0x7d, 0x3c, 0x2f, + 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x3e, 0x3c, 0x2f, 0x68, 0x35, 0x3e, + 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2d, 0x70, 0x6c, 0x6f, 0x74, + 0x2d, 0x77, 0x72, 0x61, 0x70, 0x22, 0x3e, 0x3c, 0x64, 0x69, 0x76, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x64, 0x72, 0x6f, + 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x22, 0x3e, 0x3c, 0x62, 0x75, 0x74, + 0x74, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x62, 0x74, 0x6e, 0x20, 0x62, 0x74, 0x6e, 0x2d, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x20, 0x62, 0x74, 0x6e, 0x2d, 0x73, 0x6d, + 0x20, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x74, + 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x3d, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x2d, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x3d, + 0x22, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x22, 0x20, + 0x61, 0x72, 0x69, 0x61, 0x2d, 0x68, 0x61, 0x73, 0x70, 0x6f, 0x70, + 0x75, 0x70, 0x3d, 0x22, 0x74, 0x72, 0x75, 0x65, 0x22, 0x20, 0x61, + 0x72, 0x69, 0x61, 0x2d, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x65, + 0x64, 0x3d, 0x22, 0x74, 0x72, 0x75, 0x65, 0x22, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x3d, 0x22, 0x7b, + 0x7b, 0x69, 0x64, 0x7d, 0x7d, 0x22, 0x3e, 0x3c, 0x69, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, 0x61, 0x20, 0x66, 0x61, + 0x2d, 0x67, 0x65, 0x61, 0x72, 0x22, 0x3e, 0x3c, 0x2f, 0x69, 0x3e, + 0x20, 0x7b, 0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2e, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x7d, 0x7d, + 0x20, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x66, 0x61, 0x20, 0x66, 0x61, 0x2d, 0x63, 0x61, + 0x72, 0x65, 0x74, 0x2d, 0x64, 0x6f, 0x77, 0x6e, 0x22, 0x3e, 0x3c, + 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x62, 0x75, 0x74, + 0x74, 0x6f, 0x6e, 0x3e, 0x3c, 0x75, 0x6c, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, + 0x6e, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x20, 0x64, 0x72, 0x6f, 0x70, + 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x2d, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2d, + 0x6f, 0x70, 0x74, 0x73, 0x2d, 0x7b, 0x7b, 0x69, 0x64, 0x7d, 0x7d, + 0x22, 0x3e, 0x3c, 0x2f, 0x75, 0x6c, 0x3e, 0x3c, 0x2f, 0x64, 0x69, + 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, + 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, + 0x64, 0x69, 0x76, 0x3e, 0x7b, 0x7b, 0x23, 0x63, 0x68, 0x61, 0x72, + 0x74, 0x7d, 0x7d, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x72, 0x6f, 0x77, 0x22, 0x3e, 0x3c, 0x64, + 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x63, + 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x31, 0x32, 0x22, 0x3e, 0x3c, + 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x63, 0x68, 0x61, + 0x72, 0x74, 0x2d, 0x7b, 0x7b, 0x69, 0x64, 0x7d, 0x7d, 0x22, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x63, 0x68, 0x61, 0x72, + 0x74, 0x2d, 0x77, 0x72, 0x61, 0x70, 0x22, 0x3e, 0x3c, 0x2f, 0x64, + 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, + 0x64, 0x69, 0x76, 0x3e, 0x7b, 0x7b, 0x2f, 0x63, 0x68, 0x61, 0x72, + 0x74, 0x7d, 0x7d, 0x7b, 0x7b, 0x23, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x7d, 0x7d, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x72, 0x6f, 0x77, 0x20, 0x63, 0x6c, 0x65, 0x61, + 0x72, 0x66, 0x69, 0x78, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, + 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x20, 0x7b, 0x7b, 0x23, + 0x61, 0x75, 0x74, 0x6f, 0x48, 0x69, 0x64, 0x65, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x7d, 0x7d, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, + 0x2d, 0x78, 0x73, 0x7b, 0x7b, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x48, + 0x69, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x7d, 0x7d, + 0x22, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x63, 0x6f, 0x6c, 0x2d, 0x6d, 0x64, 0x2d, 0x31, + 0x32, 0x22, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x22, 0x3e, + 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x3d, 0x22, 0x7b, 0x7b, 0x69, + 0x64, 0x7d, 0x7d, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2d, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x6c, 0x65, 0x73, + 0x73, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x68, 0x6f, 0x76, + 0x65, 0x72, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x7b, 0x7b, + 0x69, 0x64, 0x7d, 0x7d, 0x22, 0x3e, 0x3c, 0x63, 0x6f, 0x6c, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x3e, 0x3c, 0x2f, 0x63, 0x6f, 0x6c, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x3e, 0x3c, 0x74, 0x68, 0x65, 0x61, 0x64, + 0x3e, 0x3c, 0x2f, 0x74, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x74, + 0x62, 0x6f, 0x64, 0x79, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x2d, 0x6d, 0x65, 0x74, 0x61, + 0x22, 0x3e, 0x3c, 0x2f, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, + 0x74, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x2d, 0x64, 0x61, 0x74, + 0x61, 0x22, 0x3e, 0x3c, 0x2f, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, + 0x3c, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x3c, 0x2f, 0x64, + 0x69, 0x76, 0x3e, 0x3c, 0x75, 0x6c, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2d, 0x73, 0x6d, 0x20, 0x70, 0x75, 0x6c, 0x6c, 0x2d, + 0x6c, 0x65, 0x66, 0x74, 0x22, 0x3e, 0x3c, 0x6c, 0x69, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x22, 0x3e, 0x3c, 0x61, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2d, 0x66, + 0x69, 0x72, 0x73, 0x74, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x22, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x3a, 0x76, 0x6f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x3b, 0x22, 0x20, + 0x61, 0x72, 0x69, 0x61, 0x2d, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3d, + 0x22, 0x7b, 0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2e, 0x66, + 0x69, 0x72, 0x73, 0x74, 0x7d, 0x7d, 0x22, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x3d, 0x22, 0x7b, 0x7b, + 0x69, 0x64, 0x7d, 0x7d, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x7b, 0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2e, + 0x66, 0x69, 0x72, 0x73, 0x74, 0x7d, 0x7d, 0x22, 0x3e, 0x3c, 0x69, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, 0x61, 0x20, + 0x66, 0x61, 0x2d, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x2d, 0x64, 0x6f, + 0x75, 0x62, 0x6c, 0x65, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x22, 0x3e, + 0x3c, 0x2f, 0x69, 0x3e, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, + 0x69, 0x3e, 0x3c, 0x6c, 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, + 0x3e, 0x3c, 0x61, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2d, 0x70, 0x72, 0x65, 0x76, 0x22, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x6a, 0x61, 0x76, 0x61, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3a, 0x76, 0x6f, 0x69, 0x64, + 0x28, 0x30, 0x29, 0x3b, 0x22, 0x20, 0x61, 0x72, 0x69, 0x61, 0x2d, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3d, 0x22, 0x7b, 0x7b, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x2e, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, + 0x75, 0x73, 0x7d, 0x7d, 0x22, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2d, + 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x3d, 0x22, 0x7b, 0x7b, 0x69, 0x64, + 0x7d, 0x7d, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x7b, 0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2e, 0x70, 0x72, + 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x7d, 0x7d, 0x22, 0x3e, 0x3c, + 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, 0x61, + 0x20, 0x66, 0x61, 0x2d, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x2d, 0x6c, + 0x65, 0x66, 0x74, 0x22, 0x3e, 0x3c, 0x2f, 0x69, 0x3e, 0x3c, 0x2f, + 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x3c, 0x6c, 0x69, 0x3e, + 0x3c, 0x61, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x2d, 0x6e, 0x65, 0x78, 0x74, 0x22, 0x20, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x6a, 0x61, 0x76, 0x61, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x3a, 0x76, 0x6f, 0x69, 0x64, 0x28, + 0x30, 0x29, 0x3b, 0x22, 0x20, 0x61, 0x72, 0x69, 0x61, 0x2d, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x3d, 0x22, 0x7b, 0x7b, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x2e, 0x6e, 0x65, 0x78, 0x74, 0x7d, 0x7d, 0x22, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x3d, 0x22, 0x7b, 0x7b, 0x69, 0x64, 0x7d, 0x7d, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x7b, 0x7b, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x2e, 0x6e, 0x65, 0x78, 0x74, 0x7d, 0x7d, 0x22, + 0x3e, 0x3c, 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x66, 0x61, 0x20, 0x66, 0x61, 0x2d, 0x61, 0x6e, 0x67, 0x6c, 0x65, + 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e, 0x3c, 0x2f, 0x69, + 0x3e, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x3c, + 0x6c, 0x69, 0x3e, 0x3c, 0x61, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x2d, 0x6c, 0x61, 0x73, + 0x74, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x6a, 0x61, + 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3a, 0x76, 0x6f, + 0x69, 0x64, 0x28, 0x30, 0x29, 0x3b, 0x22, 0x20, 0x61, 0x72, 0x69, + 0x61, 0x2d, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3d, 0x22, 0x7b, 0x7b, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2e, 0x6c, 0x61, 0x73, 0x74, + 0x7d, 0x7d, 0x22, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x3d, 0x22, 0x7b, 0x7b, 0x69, 0x64, 0x7d, 0x7d, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x7b, 0x7b, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2e, 0x6c, 0x61, 0x73, 0x74, + 0x7d, 0x7d, 0x22, 0x3e, 0x3c, 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x66, 0x61, 0x20, 0x66, 0x61, 0x2d, 0x61, 0x6e, + 0x67, 0x6c, 0x65, 0x2d, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2d, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e, 0x3c, 0x2f, 0x69, 0x3e, + 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x3c, 0x2f, + 0x75, 0x6c, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, + 0x64, 0x69, 0x76, 0x3e, 0x7b, 0x7b, 0x2f, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x7d, 0x7d, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x54, 0x50, 0x4c, 0x20, 0x4e, + 0x61, 0x76, 0x20, 0x42, 0x61, 0x72, 0x20, 0x77, 0x72, 0x61, 0x70, + 0x70, 0x65, 0x72, 0x20, 0x2d, 0x2d, 0x3e, 0x3c, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x74, 0x70, 0x6c, + 0x2d, 0x6e, 0x61, 0x76, 0x2d, 0x77, 0x72, 0x61, 0x70, 0x22, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, + 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x3e, 0x3c, + 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x6e, 0x61, 0x76, 0x2d, 0x62, 0x61, 0x72, 0x73, 0x20, 0x66, 0x61, + 0x20, 0x66, 0x61, 0x2d, 0x62, 0x61, 0x72, 0x73, 0x22, 0x3e, 0x3c, + 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6e, 0x61, 0x76, 0x2d, 0x67, + 0x65, 0x61, 0x72, 0x73, 0x20, 0x66, 0x61, 0x20, 0x66, 0x61, 0x2d, + 0x63, 0x6f, 0x67, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, + 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x6e, 0x61, 0x76, 0x2d, 0x77, 0x73, 0x2d, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x20, 0x66, 0x61, 0x20, 0x66, 0x61, 0x2d, 0x63, + 0x69, 0x72, 0x63, 0x6c, 0x65, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, + 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x6e, 0x61, 0x76, 0x2d, 0x6c, 0x69, 0x73, 0x74, + 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, + 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x70, 0x6f, + 0x77, 0x65, 0x72, 0x65, 0x64, 0x20, 0x68, 0x69, 0x64, 0x64, 0x65, + 0x6e, 0x2d, 0x78, 0x73, 0x20, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, + 0x2d, 0x73, 0x6d, 0x22, 0x3e, 0x62, 0x79, 0x20, 0x3c, 0x61, 0x20, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, + 0x3a, 0x2f, 0x2f, 0x67, 0x6f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x69, 0x6f, 0x2f, 0x22, 0x3e, 0x47, 0x6f, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x73, 0x70, + 0x61, 0x6e, 0x3e, 0x76, 0x7b, 0x7b, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x7d, 0x7d, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, + 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x67, + 0x77, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x69, 0x6f, 0x2f, + 0x22, 0x3e, 0x47, 0x57, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x3c, + 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, + 0x20, 0x54, 0x50, 0x4c, 0x20, 0x4e, 0x61, 0x76, 0x20, 0x42, 0x61, + 0x72, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x2d, 0x2d, 0x3e, + 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x69, 0x64, 0x3d, + 0x22, 0x74, 0x70, 0x6c, 0x2d, 0x6e, 0x61, 0x76, 0x2d, 0x6d, 0x65, + 0x6e, 0x75, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, + 0x65, 0x78, 0x74, 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x22, 0x3e, 0x3c, 0x68, 0x33, 0x3e, 0x7b, 0x7b, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x2e, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x73, + 0x7d, 0x7d, 0x3c, 0x2f, 0x68, 0x33, 0x3e, 0x3c, 0x75, 0x6c, 0x3e, + 0x3c, 0x6c, 0x69, 0x20, 0x7b, 0x7b, 0x23, 0x6f, 0x76, 0x65, 0x72, + 0x61, 0x6c, 0x6c, 0x7d, 0x7d, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x7b, 0x7b, 0x2f, + 0x6f, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x6c, 0x7d, 0x7d, 0x3e, 0x3c, + 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23, 0x22, 0x3e, + 0x3c, 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, + 0x61, 0x20, 0x66, 0x61, 0x2d, 0x62, 0x61, 0x72, 0x2d, 0x63, 0x68, + 0x61, 0x72, 0x74, 0x22, 0x3e, 0x3c, 0x2f, 0x69, 0x3e, 0x20, 0x7b, + 0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2e, 0x74, 0x68, 0x65, + 0x61, 0x64, 0x7d, 0x7d, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, + 0x69, 0x3e, 0x7b, 0x7b, 0x23, 0x6e, 0x61, 0x76, 0x7d, 0x7d, 0x3c, + 0x6c, 0x69, 0x20, 0x7b, 0x7b, 0x23, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x7d, 0x7d, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x7b, 0x7b, 0x2f, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x7d, 0x7d, 0x3e, 0x3c, 0x61, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23, 0x7b, 0x7b, 0x6b, + 0x65, 0x79, 0x7d, 0x7d, 0x22, 0x3e, 0x3c, 0x69, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, 0x61, 0x20, 0x66, 0x61, 0x2d, + 0x7b, 0x7b, 0x69, 0x63, 0x6f, 0x6e, 0x7d, 0x7d, 0x22, 0x3e, 0x3c, + 0x2f, 0x69, 0x3e, 0x20, 0x7b, 0x7b, 0x68, 0x65, 0x61, 0x64, 0x7d, + 0x7d, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x7b, + 0x7b, 0x2f, 0x6e, 0x61, 0x76, 0x7d, 0x7d, 0x3c, 0x2f, 0x75, 0x6c, + 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x3c, + 0x21, 0x2d, 0x2d, 0x20, 0x54, 0x50, 0x4c, 0x20, 0x4e, 0x61, 0x76, + 0x20, 0x42, 0x61, 0x72, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x20, 0x2d, 0x2d, 0x3e, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x74, 0x70, 0x6c, 0x2d, 0x6e, + 0x61, 0x76, 0x2d, 0x6f, 0x70, 0x74, 0x73, 0x22, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x74, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x3e, 0x3c, 0x68, 0x33, + 0x3e, 0x3c, 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x66, 0x61, 0x20, 0x66, 0x61, 0x2d, 0x68, 0x61, 0x73, 0x68, 0x74, + 0x61, 0x67, 0x22, 0x3e, 0x3c, 0x2f, 0x69, 0x3e, 0x20, 0x7b, 0x7b, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2e, 0x74, 0x68, 0x65, 0x6d, + 0x65, 0x7d, 0x7d, 0x3c, 0x2f, 0x68, 0x33, 0x3e, 0x3c, 0x75, 0x6c, + 0x3e, 0x3c, 0x6c, 0x69, 0x20, 0x7b, 0x7b, 0x23, 0x64, 0x61, 0x72, + 0x6b, 0x47, 0x72, 0x61, 0x79, 0x7d, 0x7d, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x7b, + 0x7b, 0x2f, 0x64, 0x61, 0x72, 0x6b, 0x47, 0x72, 0x61, 0x79, 0x7d, + 0x7d, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3a, + 0x76, 0x6f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x3b, 0x22, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, 0x68, 0x65, 0x6d, 0x65, + 0x2d, 0x64, 0x61, 0x72, 0x6b, 0x2d, 0x67, 0x72, 0x61, 0x79, 0x22, + 0x3e, 0x3c, 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x66, 0x61, 0x20, 0x66, 0x61, 0x2d, 0x63, 0x69, 0x72, 0x63, 0x6c, + 0x65, 0x7b, 0x7b, 0x5e, 0x64, 0x61, 0x72, 0x6b, 0x47, 0x72, 0x61, + 0x79, 0x7d, 0x7d, 0x2d, 0x6f, 0x7b, 0x7b, 0x2f, 0x64, 0x61, 0x72, + 0x6b, 0x47, 0x72, 0x61, 0x79, 0x7d, 0x7d, 0x22, 0x3e, 0x3c, 0x2f, + 0x69, 0x3e, 0x20, 0x7b, 0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x5f, 0x67, 0x72, 0x61, 0x79, 0x7d, + 0x7d, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x3c, + 0x6c, 0x69, 0x20, 0x7b, 0x7b, 0x23, 0x62, 0x72, 0x69, 0x67, 0x68, + 0x74, 0x7d, 0x7d, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x7b, 0x7b, 0x2f, 0x62, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x7d, 0x7d, 0x3e, 0x3c, 0x61, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x3a, 0x76, 0x6f, 0x69, 0x64, 0x28, 0x30, + 0x29, 0x3b, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x74, 0x68, 0x65, 0x6d, 0x65, 0x2d, 0x62, 0x72, 0x69, 0x67, 0x68, + 0x74, 0x22, 0x3e, 0x3c, 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x66, 0x61, 0x20, 0x66, 0x61, 0x2d, 0x63, 0x69, 0x72, + 0x63, 0x6c, 0x65, 0x7b, 0x7b, 0x5e, 0x62, 0x72, 0x69, 0x67, 0x68, + 0x74, 0x7d, 0x7d, 0x2d, 0x6f, 0x7b, 0x7b, 0x2f, 0x62, 0x72, 0x69, + 0x67, 0x68, 0x74, 0x7d, 0x7d, 0x22, 0x3e, 0x3c, 0x2f, 0x69, 0x3e, + 0x20, 0x7b, 0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2e, 0x62, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x7d, 0x7d, 0x3c, 0x2f, 0x61, 0x3e, + 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x3c, 0x6c, 0x69, 0x20, 0x7b, 0x7b, + 0x23, 0x64, 0x61, 0x72, 0x6b, 0x42, 0x6c, 0x75, 0x65, 0x7d, 0x7d, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x22, 0x7b, 0x7b, 0x2f, 0x64, 0x61, 0x72, 0x6b, 0x42, + 0x6c, 0x75, 0x65, 0x7d, 0x7d, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x3a, 0x76, 0x6f, 0x69, 0x64, 0x28, 0x30, 0x29, + 0x3b, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, + 0x68, 0x65, 0x6d, 0x65, 0x2d, 0x64, 0x61, 0x72, 0x6b, 0x2d, 0x62, + 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x3c, 0x69, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x66, 0x61, 0x20, 0x66, 0x61, 0x2d, 0x63, + 0x69, 0x72, 0x63, 0x6c, 0x65, 0x7b, 0x7b, 0x5e, 0x64, 0x61, 0x72, + 0x6b, 0x42, 0x6c, 0x75, 0x65, 0x7d, 0x7d, 0x2d, 0x6f, 0x7b, 0x7b, + 0x2f, 0x64, 0x61, 0x72, 0x6b, 0x42, 0x6c, 0x75, 0x65, 0x7d, 0x7d, + 0x22, 0x3e, 0x3c, 0x2f, 0x69, 0x3e, 0x20, 0x7b, 0x7b, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x5f, 0x62, + 0x6c, 0x75, 0x65, 0x7d, 0x7d, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, + 0x6c, 0x69, 0x3e, 0x3c, 0x6c, 0x69, 0x20, 0x7b, 0x7b, 0x23, 0x64, + 0x61, 0x72, 0x6b, 0x50, 0x75, 0x72, 0x70, 0x6c, 0x65, 0x7d, 0x7d, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x22, 0x7b, 0x7b, 0x2f, 0x64, 0x61, 0x72, 0x6b, 0x50, + 0x75, 0x72, 0x70, 0x6c, 0x65, 0x7d, 0x7d, 0x3e, 0x3c, 0x61, 0x20, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x6a, 0x61, 0x76, 0x61, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x3a, 0x76, 0x6f, 0x69, 0x64, 0x28, + 0x30, 0x29, 0x3b, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x74, 0x68, 0x65, 0x6d, 0x65, 0x2d, 0x64, 0x61, 0x72, 0x6b, + 0x2d, 0x70, 0x75, 0x72, 0x70, 0x6c, 0x65, 0x22, 0x3e, 0x3c, 0x69, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, 0x61, 0x20, + 0x66, 0x61, 0x2d, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x7b, 0x7b, + 0x5e, 0x64, 0x61, 0x72, 0x6b, 0x50, 0x75, 0x72, 0x70, 0x6c, 0x65, + 0x7d, 0x7d, 0x2d, 0x6f, 0x7b, 0x7b, 0x2f, 0x64, 0x61, 0x72, 0x6b, + 0x50, 0x75, 0x72, 0x70, 0x6c, 0x65, 0x7d, 0x7d, 0x22, 0x3e, 0x3c, + 0x2f, 0x69, 0x3e, 0x20, 0x7b, 0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x2e, 0x64, 0x61, 0x72, 0x6b, 0x5f, 0x70, 0x75, 0x72, 0x70, + 0x6c, 0x65, 0x7d, 0x7d, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, + 0x69, 0x3e, 0x3c, 0x2f, 0x75, 0x6c, 0x3e, 0x3c, 0x68, 0x33, 0x3e, + 0x3c, 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, + 0x61, 0x20, 0x66, 0x61, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x2d, 0x61, + 0x6c, 0x74, 0x22, 0x3e, 0x3c, 0x2f, 0x69, 0x3e, 0x20, 0x7b, 0x7b, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2e, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x73, 0x7d, 0x7d, 0x3c, 0x2f, 0x68, 0x33, 0x3e, 0x3c, 0x75, + 0x6c, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x70, 0x65, + 0x72, 0x70, 0x61, 0x67, 0x65, 0x2d, 0x77, 0x72, 0x61, 0x70, 0x22, + 0x3e, 0x3c, 0x6c, 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x68, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x69, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, 0x61, 0x20, 0x66, 0x61, + 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x3e, 0x3c, 0x2f, 0x69, 0x3e, + 0x20, 0x7b, 0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2e, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x70, 0x61, + 0x67, 0x65, 0x7d, 0x7d, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x3c, 0x6c, + 0x69, 0x20, 0x7b, 0x7b, 0x23, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, + 0x65, 0x35, 0x7d, 0x7d, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x7b, 0x7b, 0x2f, 0x70, + 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x35, 0x7d, 0x7d, 0x3e, 0x3c, + 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x6a, 0x61, 0x76, + 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3a, 0x76, 0x6f, 0x69, + 0x64, 0x28, 0x30, 0x29, 0x3b, 0x22, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x2d, 0x70, 0x65, 0x72, 0x70, 0x61, 0x67, 0x65, 0x3d, 0x22, 0x35, + 0x22, 0x3e, 0x3c, 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x66, 0x61, 0x20, 0x66, 0x61, 0x2d, 0x63, 0x69, 0x72, 0x63, + 0x6c, 0x65, 0x7b, 0x7b, 0x5e, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, + 0x65, 0x35, 0x7d, 0x7d, 0x2d, 0x6f, 0x7b, 0x7b, 0x2f, 0x70, 0x65, + 0x72, 0x50, 0x61, 0x67, 0x65, 0x35, 0x7d, 0x7d, 0x22, 0x3e, 0x3c, + 0x2f, 0x69, 0x3e, 0x20, 0x35, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, + 0x6c, 0x69, 0x3e, 0x3c, 0x6c, 0x69, 0x20, 0x7b, 0x7b, 0x23, 0x70, + 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x37, 0x7d, 0x7d, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x22, 0x7b, 0x7b, 0x2f, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, + 0x37, 0x7d, 0x7d, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x3a, 0x76, 0x6f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x3b, 0x22, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x70, 0x65, 0x72, 0x70, 0x61, + 0x67, 0x65, 0x3d, 0x22, 0x37, 0x22, 0x3e, 0x3c, 0x69, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, 0x61, 0x20, 0x66, 0x61, + 0x2d, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x7b, 0x7b, 0x5e, 0x70, + 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x37, 0x7d, 0x7d, 0x2d, 0x6f, + 0x7b, 0x7b, 0x2f, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x37, + 0x7d, 0x7d, 0x22, 0x3e, 0x3c, 0x2f, 0x69, 0x3e, 0x20, 0x37, 0x3c, + 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x3c, 0x6c, 0x69, + 0x20, 0x7b, 0x7b, 0x23, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, + 0x31, 0x30, 0x7d, 0x7d, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x7b, 0x7b, 0x2f, 0x70, + 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x31, 0x30, 0x7d, 0x7d, 0x3e, + 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x6a, 0x61, + 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3a, 0x76, 0x6f, + 0x69, 0x64, 0x28, 0x30, 0x29, 0x3b, 0x22, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x2d, 0x70, 0x65, 0x72, 0x70, 0x61, 0x67, 0x65, 0x3d, 0x22, + 0x31, 0x30, 0x22, 0x3e, 0x3c, 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x66, 0x61, 0x20, 0x66, 0x61, 0x2d, 0x63, 0x69, + 0x72, 0x63, 0x6c, 0x65, 0x7b, 0x7b, 0x5e, 0x70, 0x65, 0x72, 0x50, + 0x61, 0x67, 0x65, 0x31, 0x30, 0x7d, 0x7d, 0x2d, 0x6f, 0x7b, 0x7b, + 0x2f, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x31, 0x30, 0x7d, + 0x7d, 0x22, 0x3e, 0x3c, 0x2f, 0x69, 0x3e, 0x20, 0x31, 0x30, 0x3c, + 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x3c, 0x6c, 0x69, + 0x20, 0x7b, 0x7b, 0x23, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, + 0x31, 0x35, 0x7d, 0x7d, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x7b, 0x7b, 0x2f, 0x70, + 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x31, 0x35, 0x7d, 0x7d, 0x3e, + 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x6a, 0x61, + 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3a, 0x76, 0x6f, + 0x69, 0x64, 0x28, 0x30, 0x29, 0x3b, 0x22, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x2d, 0x70, 0x65, 0x72, 0x70, 0x61, 0x67, 0x65, 0x3d, 0x22, + 0x31, 0x35, 0x22, 0x3e, 0x3c, 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x66, 0x61, 0x20, 0x66, 0x61, 0x2d, 0x63, 0x69, + 0x72, 0x63, 0x6c, 0x65, 0x7b, 0x7b, 0x5e, 0x70, 0x65, 0x72, 0x50, + 0x61, 0x67, 0x65, 0x31, 0x35, 0x7d, 0x7d, 0x2d, 0x6f, 0x7b, 0x7b, + 0x2f, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x31, 0x35, 0x7d, + 0x7d, 0x22, 0x3e, 0x3c, 0x2f, 0x69, 0x3e, 0x20, 0x31, 0x35, 0x3c, + 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x3c, 0x6c, 0x69, + 0x20, 0x7b, 0x7b, 0x23, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, + 0x32, 0x30, 0x7d, 0x7d, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x7b, 0x7b, 0x2f, 0x70, + 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x32, 0x30, 0x7d, 0x7d, 0x3e, + 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x6a, 0x61, + 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3a, 0x76, 0x6f, + 0x69, 0x64, 0x28, 0x30, 0x29, 0x3b, 0x22, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x2d, 0x70, 0x65, 0x72, 0x70, 0x61, 0x67, 0x65, 0x3d, 0x22, + 0x32, 0x30, 0x22, 0x3e, 0x3c, 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x66, 0x61, 0x20, 0x66, 0x61, 0x2d, 0x63, 0x69, + 0x72, 0x63, 0x6c, 0x65, 0x7b, 0x7b, 0x5e, 0x70, 0x65, 0x72, 0x50, + 0x61, 0x67, 0x65, 0x32, 0x30, 0x7d, 0x7d, 0x2d, 0x6f, 0x7b, 0x7b, + 0x2f, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x32, 0x30, 0x7d, + 0x7d, 0x22, 0x3e, 0x3c, 0x2f, 0x69, 0x3e, 0x20, 0x32, 0x30, 0x3c, + 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x3c, 0x6c, 0x69, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x64, 0x72, 0x6f, + 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x68, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x22, 0x3e, 0x3c, 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x66, 0x61, 0x20, 0x66, 0x61, 0x2d, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x22, 0x3e, 0x3c, 0x2f, 0x69, 0x3e, 0x20, 0x7b, 0x7b, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2e, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x7d, 0x7d, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x3c, 0x6c, + 0x69, 0x20, 0x7b, 0x7b, 0x23, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x73, 0x7d, 0x7d, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x7b, 0x7b, + 0x2f, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x7d, 0x7d, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x22, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x3a, 0x76, 0x6f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x3b, 0x22, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x68, 0x6f, 0x77, 0x2d, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x73, 0x3d, 0x22, 0x31, 0x22, 0x3e, 0x3c, + 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, 0x61, + 0x20, 0x66, 0x61, 0x2d, 0x7b, 0x7b, 0x23, 0x73, 0x68, 0x6f, 0x77, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x7d, 0x7d, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x2d, 0x7b, 0x7b, 0x2f, 0x73, 0x68, 0x6f, 0x77, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x73, 0x7d, 0x7d, 0x73, 0x71, 0x75, 0x61, + 0x72, 0x65, 0x2d, 0x6f, 0x22, 0x3e, 0x3c, 0x2f, 0x69, 0x3e, 0x20, + 0x7b, 0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2e, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x73, 0x7d, 0x7d, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, + 0x3e, 0x3c, 0x6c, 0x69, 0x20, 0x7b, 0x7b, 0x23, 0x61, 0x75, 0x74, + 0x6f, 0x48, 0x69, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x7d, 0x7d, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x22, 0x7b, 0x7b, 0x2f, 0x61, 0x75, 0x74, + 0x6f, 0x48, 0x69, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x7d, 0x7d, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x22, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x3a, 0x76, 0x6f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x3b, 0x22, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x2d, 0x61, 0x75, 0x74, 0x6f, 0x68, 0x69, + 0x64, 0x65, 0x2d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x3d, 0x22, + 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x7b, + 0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2e, 0x61, 0x68, 0x5f, + 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x7d, 0x7d, 0x22, 0x3e, 0x3c, 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x66, 0x61, 0x20, 0x66, 0x61, 0x2d, 0x7b, 0x7b, + 0x23, 0x61, 0x75, 0x74, 0x6f, 0x48, 0x69, 0x64, 0x65, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x73, 0x7d, 0x7d, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x2d, 0x7b, 0x7b, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x48, 0x69, 0x64, + 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x7d, 0x7d, 0x73, 0x71, + 0x75, 0x61, 0x72, 0x65, 0x2d, 0x6f, 0x22, 0x3e, 0x3c, 0x2f, 0x69, + 0x3e, 0x20, 0x7b, 0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2e, + 0x61, 0x68, 0x5f, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x7d, 0x7d, 0x3c, + 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x3c, 0x2f, 0x75, + 0x6c, 0x3e, 0x3c, 0x68, 0x33, 0x3e, 0x3c, 0x69, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, 0x61, 0x20, 0x66, 0x61, 0x2d, + 0x74, 0x68, 0x2d, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x22, 0x3e, 0x3c, + 0x2f, 0x69, 0x3e, 0x20, 0x7b, 0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x2e, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x7d, 0x7d, 0x3c, + 0x2f, 0x68, 0x33, 0x3e, 0x3c, 0x75, 0x6c, 0x3e, 0x3c, 0x6c, 0x69, + 0x20, 0x7b, 0x7b, 0x23, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, + 0x74, 0x61, 0x6c, 0x7d, 0x7d, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x7b, 0x7b, 0x2f, + 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x7d, + 0x7d, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3a, + 0x76, 0x6f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x3b, 0x22, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6c, 0x61, 0x79, 0x6f, 0x75, + 0x74, 0x2d, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, + 0x6c, 0x22, 0x3e, 0x3c, 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x66, 0x61, 0x20, 0x66, 0x61, 0x2d, 0x63, 0x69, 0x72, + 0x63, 0x6c, 0x65, 0x7b, 0x7b, 0x5e, 0x68, 0x6f, 0x72, 0x69, 0x7a, + 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x7d, 0x7d, 0x2d, 0x6f, 0x7b, 0x7b, + 0x2f, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, + 0x7d, 0x7d, 0x22, 0x3e, 0x3c, 0x2f, 0x69, 0x3e, 0x20, 0x7b, 0x7b, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2e, 0x68, 0x6f, 0x72, 0x69, + 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x7d, 0x7d, 0x3c, 0x2f, 0x61, + 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x3c, 0x6c, 0x69, 0x20, 0x7b, + 0x7b, 0x23, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x7d, + 0x7d, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x22, 0x7b, 0x7b, 0x2f, 0x76, 0x65, 0x72, 0x74, + 0x69, 0x63, 0x61, 0x6c, 0x7d, 0x7d, 0x3e, 0x3c, 0x61, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x3a, 0x76, 0x6f, 0x69, 0x64, 0x28, 0x30, + 0x29, 0x3b, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x2d, 0x76, 0x65, 0x72, 0x74, + 0x69, 0x63, 0x61, 0x6c, 0x22, 0x3e, 0x3c, 0x69, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, 0x61, 0x20, 0x66, 0x61, 0x2d, + 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x7b, 0x7b, 0x5e, 0x76, 0x65, + 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x7d, 0x7d, 0x2d, 0x6f, 0x7b, + 0x7b, 0x2f, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x7d, + 0x7d, 0x22, 0x3e, 0x3c, 0x2f, 0x69, 0x3e, 0x20, 0x7b, 0x7b, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x69, + 0x63, 0x61, 0x6c, 0x7d, 0x7d, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, + 0x6c, 0x69, 0x3e, 0x3c, 0x2f, 0x75, 0x6c, 0x3e, 0x3c, 0x68, 0x33, + 0x3e, 0x3c, 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x66, 0x61, 0x20, 0x66, 0x61, 0x2d, 0x63, 0x6f, 0x67, 0x22, 0x3e, + 0x3c, 0x2f, 0x69, 0x3e, 0x20, 0x7b, 0x7b, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6f, 0x70, 0x74, + 0x73, 0x7d, 0x7d, 0x3c, 0x2f, 0x68, 0x33, 0x3e, 0x3c, 0x75, 0x6c, + 0x3e, 0x3c, 0x6c, 0x69, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, + 0x66, 0x3d, 0x22, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x3a, 0x76, 0x6f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x3b, + 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x65, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x2d, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3e, + 0x3c, 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, + 0x61, 0x20, 0x66, 0x61, 0x2d, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3e, + 0x3c, 0x2f, 0x69, 0x3e, 0x20, 0x7b, 0x7b, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6a, + 0x73, 0x6f, 0x6e, 0x7d, 0x7d, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, + 0x6c, 0x69, 0x3e, 0x3c, 0x2f, 0x75, 0x6c, 0x3e, 0x3c, 0x2f, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x20, + 0x54, 0x50, 0x4c, 0x20, 0x43, 0x68, 0x61, 0x72, 0x74, 0x20, 0x74, + 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x20, 0x2d, 0x2d, 0x3e, 0x3c, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x69, 0x64, 0x3d, 0x22, + 0x74, 0x70, 0x6c, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x74, 0x2d, 0x74, + 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x22, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x74, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x3e, 0x3c, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x63, + 0x68, 0x61, 0x72, 0x74, 0x2d, 0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69, + 0x70, 0x22, 0x3e, 0x3c, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, + 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x68, 0x20, 0x63, 0x6f, 0x6c, 0x73, + 0x70, 0x61, 0x6e, 0x3d, 0x22, 0x32, 0x22, 0x3e, 0x7b, 0x7b, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x30, 0x7d, 0x7d, 0x3c, 0x2f, 0x74, 0x68, + 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x72, 0x3e, 0x3c, + 0x74, 0x64, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x62, 0x6c, 0x75, 0x65, + 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x68, 0x69, + 0x74, 0x73, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x22, 0x3e, 0x7b, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x31, + 0x7d, 0x7d, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72, + 0x3e, 0x7b, 0x7b, 0x23, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x32, 0x7d, + 0x7d, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x64, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3e, + 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x72, 0x65, 0x64, 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x70, + 0x61, 0x6e, 0x3e, 0x76, 0x69, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x73, + 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, + 0x3e, 0x7b, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x32, 0x7d, 0x7d, + 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x7b, + 0x7b, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x32, 0x7d, 0x7d, 0x3c, + 0x2f, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x3e, 0x00 +}; + +const int tpls_length = 10299; diff --git a/goaccess++/src/ui.c b/goaccess++/src/ui.c new file mode 100644 index 0000000..e0e9565 --- /dev/null +++ b/goaccess++/src/ui.c @@ -0,0 +1,1965 @@ +/** + * ui.c -- various curses interfaces + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana + * + * 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. + */ + +#define _LARGEFILE_SOURCE +#define _LARGEFILE64_SOURCE +#define _FILE_OFFSET_BITS 64 + +#define STDIN_FILENO 0 +#ifndef _BSD_SOURCE +#define _BSD_SOURCE /* include stuff from 4.3 BSD */ +#endif +#ifndef _DEFAULT_SOURCE +#define _DEFAULT_SOURCE +#endif + +#if HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ui.h" + +#ifdef HAVE_LIBTOKYOCABINET +#include "tcabdb.h" +#else +#include "gkhash.h" +#endif + +#include "color.h" +#include "error.h" +#include "gmenu.h" +#include "goaccess.h" +#include "util.h" +#include "xmalloc.h" + +/* *INDENT-OFF* */ +/* Determine which metrics should be displayed per module/panel */ +static GOutput outputting[] = { + {VISITORS , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 1 , 1 , 1} , + {REQUESTS , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0} , + {REQUESTS_STATIC , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0} , + {NOT_FOUND , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0} , + {HOSTS , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 1 , 1 , 0} , + {OS , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 1 , 1 , 1} , + {BROWSERS , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 1 , 1 , 1} , + {VISIT_TIMES , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 1 , 1 , 1} , + {VIRTUAL_HOSTS , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 1 , 0 , 0} , + {REFERRERS , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 1 , 0 , 0} , + {REFERRING_SITES , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 1 , 0 , 0} , + {KEYPHRASES , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 1 , 0 , 0} , + {STATUS_CODES , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 1 , 0 , 0} , + {REMOTE_USER , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 1 , 0 , 0} , +#ifdef HAVE_GEOLOCATION + {GEO_LOCATION , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 1 , 0 , 0} , +#endif +}; +/* *INDENT-ON* */ + +/* Structure to display overall statistics */ +typedef struct Field_ +{ + const char *field; + /* char due to log, bw, log_file */ + char *value; + GColors *(*colorlbl) (void); + GColors *(*colorval) (void); + short oneliner; +} Field; + +/* Determine which metrics to output given a module + * + * On error, or if not found, NULL is returned. + * On success, the panel value is returned. */ +GOutput * +output_lookup (GModule module) +{ + int i, num_panels = ARRAY_SIZE (outputting); + + for (i = 0; i < num_panels; i++) { + if (outputting[i].module == module) + return &outputting[i]; + } + return NULL; +} + +/* Initialize curses colors */ +void +init_colors (int force) +{ + /* use default foreground/background colors */ + use_default_colors (); + /* first set a default normal color */ + set_normal_color (); + /* then parse custom colors and initialize them */ + set_colors (force); +} + +/* Ncurses' window handling */ +void +set_input_opts (void) +{ + initscr (); + clear (); + noecho (); + halfdelay (10); + nonl (); + intrflush (stdscr, FALSE); + keypad (stdscr, TRUE); + if (curs_set (0) == ERR) + LOG_DEBUG (("Unable to change cursor: %s\n", strerror (errno))); + + if (conf.mouse_support) + mousemask (BUTTON1_CLICKED, NULL); +} + +/* Deletes the given window, freeing all memory associated with it. */ +void +close_win (WINDOW * w) +{ + if (w == NULL) + return; + wclear (w); + wrefresh (w); + delwin (w); +} + +/* Get the current calendar time as a value of type time_t and convert + * time_t to tm as local time */ +void +generate_time (void) +{ + timestamp = time (NULL); + now_tm = localtime (×tamp); +} + +/* Set the loading spinner as ended and manage the mutex locking. */ +void +end_spinner (void) +{ + if (conf.no_parsing_spinner) + return; + + pthread_mutex_lock (&parsing_spinner->mutex); + parsing_spinner->state = SPN_END; + pthread_mutex_unlock (&parsing_spinner->mutex); +} + +/* Set background colors to all windows. */ +void +set_wbkgd (WINDOW * main_win, WINDOW * header_win) +{ + GColors *color = get_color (COLOR_BG); + + /* background colors */ + wbkgd (main_win, COLOR_PAIR (color->pair->idx)); + wbkgd (header_win, COLOR_PAIR (color->pair->idx)); + wbkgd (stdscr, COLOR_PAIR (color->pair->idx)); + wrefresh (main_win); +} + +/* Creates and the new terminal windows and set basic properties to + * each of them. e.g., background color, enable the reading of + * function keys. */ +void +init_windows (WINDOW ** header_win, WINDOW ** main_win) +{ + int row = 0, col = 0; + + /* init standard screen */ + getmaxyx (stdscr, row, col); + if (row < MIN_HEIGHT || col < MIN_WIDTH) + FATAL ("Minimum screen size - 0 columns by 7 lines"); + + /* init header screen */ + *header_win = newwin (6, col, 0, 0); + keypad (*header_win, TRUE); + if (*header_win == NULL) + FATAL ("Unable to allocate memory for header_win."); + + /* init main screen */ + *main_win = newwin (row - 8, col, 7, 0); + keypad (*main_win, TRUE); + if (*main_win == NULL) + FATAL ("Unable to allocate memory for main_win."); + set_wbkgd (*main_win, *header_win); +} + +#pragma GCC diagnostic ignored "-Wformat-nonliteral" +/* Draw a generic header with the ability to set a custom text to it. */ +void +draw_header (WINDOW * win, const char *s, const char *fmt, int y, int x, int w, + GColors * (*func) (void)) +{ + GColors *color = (*func) (); + char *buf; + + buf = xmalloc (snprintf (NULL, 0, fmt, s) + 1); + sprintf (buf, fmt, s); + + wattron (win, color->attr | COLOR_PAIR (color->pair->idx)); + mvwhline (win, y, x, ' ', w); + mvwaddnstr (win, y, x, buf, w); + wattroff (win, color->attr | COLOR_PAIR (color->pair->idx)); + + free (buf); +} + +#pragma GCC diagnostic warning "-Wformat-nonliteral" + +/* Determine the actual size of the main window. */ +void +term_size (WINDOW * main_win, int *main_win_height) +{ + int term_h = 0, term_w = 0; + + getmaxyx (stdscr, term_h, term_w); + + *main_win_height = term_h - (MAX_HEIGHT_HEADER + MAX_HEIGHT_FOOTER); + wresize (main_win, *main_win_height, term_w); + wmove (main_win, *main_win_height, 0); +} + +/* Get the module/panel label name for the given module enum value. + * + * On success, a string containing the label name is returned. */ +const char * +module_to_label (GModule module) +{ + static const char *modules[] = { + VISITORS_LABEL, + REQUESTS_LABEL, + REQUESTS_STATIC_LABEL, + NOT_FOUND_LABEL, + HOSTS_LABEL, + OS_LABEL, + BROWSERS_LABEL, + VISIT_TIMES_LABEL, + VIRTUAL_HOSTS_LABEL, + REFERRERS_LABEL, + REFERRING_SITES_LABEL, + KEYPHRASES_LABEL, + STATUS_CODES_LABEL, + REMOTE_USER_LABEL, +#ifdef HAVE_GEOLOCATION + GEO_LOCATION_LABEL, +#endif + }; + + return _(modules[module]); +} + +/* Get the module/panel label id for the given module enum value. + * + * On success, a string containing the label id is returned. */ +const char * +module_to_id (GModule module) +{ + static const char *modules[] = { + VISITORS_ID, + REQUESTS_ID, + REQUESTS_STATIC_ID, + NOT_FOUND_ID, + HOSTS_ID, + OS_ID, + BROWSERS_ID, + VISIT_TIMES_ID, + VIRTUAL_HOSTS_ID, + REFERRERS_ID, + REFERRING_SITES_ID, + KEYPHRASES_ID, + STATUS_CODES_ID, + REMOTE_USER_ID, +#ifdef HAVE_GEOLOCATION + GEO_LOCATION_ID, +#endif + }; + + return _(modules[module]); +} + +/* Get the module/panel label header for the given module enum value. + * + * On success, a string containing the label header is returned. */ +const char * +module_to_head (GModule module) +{ + static const char *modules[] = { + VISITORS_HEAD, + REQUESTS_HEAD, + REQUESTS_STATIC_HEAD, + NOT_FOUND_HEAD, + HOSTS_HEAD, + OS_HEAD, + BROWSERS_HEAD, + VISIT_TIMES_HEAD, + VIRTUAL_HOSTS_HEAD, + REFERRERS_HEAD, + REFERRING_SITES_HEAD, + KEYPHRASES_HEAD, + STATUS_CODES_HEAD, + REMOTE_USER_HEAD, +#ifdef HAVE_GEOLOCATION + GEO_LOCATION_HEAD, +#endif + }; + + if (!conf.ignore_crawlers) + modules[VISITORS] = VISITORS_HEAD_BOTS; + + return _(modules[module]); +} + +/* Get the module/panel label description for the given module enum + * value. + * + * On success, a string containing the label description is returned. */ +const char * +module_to_desc (GModule module) +{ + static const char *modules[] = { + VISITORS_DESC, + REQUESTS_DESC, + REQUESTS_STATIC_DESC, + NOT_FOUND_DESC, + HOSTS_DESC, + OS_DESC, + BROWSERS_DESC, + VISIT_TIMES_DESC, + VIRTUAL_HOSTS_DESC, + REFERRERS_DESC, + REFERRING_SITES_DESC, + KEYPHRASES_DESC, + STATUS_CODES_DESC, + REMOTE_USER_DESC, +#ifdef HAVE_GEOLOCATION + GEO_LOCATION_DESC, +#endif + }; + + return _(modules[module]); +} + +/* Rerender the header window to reflect active module. */ +void +update_active_module (WINDOW * header_win, GModule current) +{ + GColors *color = get_color (COLOR_ACTIVE_LABEL); + const char *module = module_to_label (current); + int col = getmaxx (stdscr); + + char *lbl = xmalloc (snprintf (NULL, 0, T_ACTIVE_PANEL, module) + 1); + sprintf (lbl, T_ACTIVE_PANEL, module); + + wmove (header_win, 0, 30); + + wattron (header_win, color->attr | COLOR_PAIR (color->pair->idx)); + mvwprintw (header_win, 0, col - strlen (lbl) - 1, "%s", lbl); + wattroff (header_win, color->attr | COLOR_PAIR (color->pair->idx)); + + wrefresh (header_win); + + free (lbl); +} + +/* Print out (terminal) an overall field label. e.g., 'Processed Time' */ +static void +render_overall_field (WINDOW * win, const char *s, int y, int x, + GColors * color) +{ + wattron (win, color->attr | COLOR_PAIR (color->pair->idx)); + mvwprintw (win, y, x, "%s", s); + wattroff (win, color->attr | COLOR_PAIR (color->pair->idx)); +} + +/* Print out (terminal) an overall field value. e.g., '120 secs' */ +static void +render_overall_value (WINDOW * win, const char *s, int y, int x, + GColors * color) +{ + wattron (win, color->attr | COLOR_PAIR (color->pair->idx)); + mvwprintw (win, y, x, "%s", s); + wattroff (win, color->attr | COLOR_PAIR (color->pair->idx)); +} + +/* Convert the number of excluded ips to a string. + * + * On success, the number of excluded ips as a string is returned. */ +static char * +get_str_excluded_ips (GLog * glog) +{ + return int2str (glog->excluded_ip, 0); +} + +/* Convert the number of failed requests to a string. + * + * On success, the number of failed requests as a string is returned. */ +static char * +get_str_failed_reqs (GLog * glog) +{ + return int2str (glog->invalid, 0); +} + +/* Convert the number of processed requests to a string. + * + * On success, the number of processed requests as a string is returned. */ +static char * +get_str_processed_reqs (GLog * glog) +{ + return int2str (glog->processed, 0); +} + +/* Convert the number of valid requests to a string. + * + * On success, the number of valid requests as a string is returned. */ +static char * +get_str_valid_reqs (GLog * glog) +{ + return int2str (glog->valid, 0); +} + +/* Convert the number of not found requests to a string. + * + * On success, the number of not found requests as a string is + * returned. */ +static char * +get_str_notfound_reqs (void) +{ + return int2str (ht_get_size_datamap (NOT_FOUND), 0); +} + +/* Convert the number of referrers to a string. + * + * On success, the number of referrers as a string is returned. */ +static char * +get_str_ref_reqs (void) +{ + return int2str (ht_get_size_datamap (REFERRERS), 0); +} + +/* Convert the number of requests to a string. + * + * On success, the number of requests as a string is returned. */ +static char * +get_str_reqs (void) +{ + return int2str (ht_get_size_datamap (REQUESTS), 0); +} + +/* Convert the number of static requests to a string. + * + * On success, the number of static requests as a string is returned. */ +static char * +get_str_static_reqs (void) +{ + return int2str (ht_get_size_datamap (REQUESTS_STATIC), 0); +} + +/* Convert the number of unique visitors to a string. + * + * On success, the number of unique visitors as a string is returned. */ +static char * +get_str_visitors (void) +{ + return int2str (ht_get_size_uniqmap (VISITORS), 0); +} + +/* Convert the time taken to process the log to a string. + * + * On success, the time taken to process the log as a string is + * returned. */ +static char * +get_str_proctime (void) +{ + char *s = NULL; + uint64_t secs = (long long) end_proc - start_proc; + +#ifdef TCB_BTREE + if (conf.store_accumulated_time) + secs = (uint64_t) ht_get_genstats ("accumulated_time"); +#endif + + s = xmalloc (snprintf (NULL, 0, "%" PRIu64 "s", secs) + 1); + sprintf (s, "%" PRIu64 "s", secs); + + return s; +} + +/* Get the log file size in a human readable format. + * + * On success, the log file size as a string is returned. */ +static char * +get_str_filesize (void) +{ + return filesize_str (get_log_sizes ()); +} + +/* Get the log file path. + * + * On success, the log file path as a string is returned. */ +static char * +get_str_logfile (void) +{ + int col = getmaxx (stdscr), left_padding = 20; + return get_log_source_str (col - left_padding); +} + +/* Get the bandwidth in a human readable format. + * + * On success, the bandwidth as a string is returned. */ +static char * +get_str_bandwidth (GLog * glog) +{ + return filesize_str ((float) glog->resp_size); +} + +/* Iterate over the visitors module and sort date in an ascending + * order. + * + * On success, an array of sorted dates is returned. */ +static char ** +get_visitors_dates (GHolder * h) +{ + char **dates = malloc (sizeof (char *) * h->holder_size); + int i; + + for (i = 0; i < h->idx; i++) { + dates[i] = h->items[i].metrics->data; + } + qsort (dates, h->holder_size, sizeof (char *), strcmp_asc); + + return dates; +} + +/* Get the overall statistics start and end dates. + * + * On failure, 1 is returned + * On success, 0 is returned and an string containing the overall + * header is returned. */ +int +get_start_end_parsing_dates (GHolder * h, char **start, char **end, + const char *f) +{ + char **dates = NULL; + const char *sndfmt = conf.spec_date_time_num_format; + + if (h->idx == 0) + return 1; + + dates = get_visitors_dates (h + VISITORS); + + /* just display the actual dates - no specificity */ + *start = get_visitors_date (dates[0], sndfmt, f); + *end = get_visitors_date (dates[h->idx - 1], sndfmt, f); + + free (dates); + + return 0; +} + +/* Get the overall statistics header (label). + * + * On success, an string containing the overall header is returned. */ +char * +get_overall_header (GHolder * h) +{ + const char *head = T_DASH_HEAD; + char *hd = NULL, *start = NULL, *end = NULL; + + if (h->idx == 0 || get_start_end_parsing_dates (h, &start, &end, "%d/%b/%Y")) + return xstrdup (head); + + hd = xmalloc (snprintf (NULL, 0, "%s (%s - %s)", head, start, end) + 1); + sprintf (hd, "%s (%s - %s)", head, start, end); + + free (end); + free (start); + + return hd; +} + +/* Print out (terminal dashboard) the overall statistics header. */ +static void +render_overall_header (WINDOW * win, GHolder * h) +{ + char *hd = get_overall_header (h); + int col = getmaxx (stdscr); + + draw_header (win, hd, " %s", 0, 0, col, color_panel_header); + free (hd); +} + +/* Render the overall statistics. This will attempt to determine the + * right X and Y position given the current values. */ +static void +render_overall_statistics (WINDOW * win, Field fields[], size_t n) +{ + GColors *color = NULL; + int x_field = 2, x_value = 0; + size_t i, j, k, max_field = 0, max_value = 0, mod_val, y; + + for (i = 0, k = 0, y = 2; i < n; i++) { + /* new line every OVERALL_NUM_COLS */ + mod_val = k % OVERALL_NUM_COLS; + + /* reset position & length and increment row */ + if (k > 0 && mod_val == 0) { + max_value = max_field = 0; + x_value = x_field = 2; + y++; + } + + /* x pos = max length of field */ + x_field += max_field; + + color = (*fields[i].colorlbl) (); + render_overall_field (win, fields[i].field, y, x_field, color); + + /* get max length of field in the same column */ + max_field = 0; + for (j = 0; j < n; j++) { + size_t len = strlen (fields[j].field); + if (j % OVERALL_NUM_COLS == mod_val && len > max_field && + !fields[j].oneliner) + max_field = len; + } + /* get max length of value in the same column */ + max_value = 0; + for (j = 0; j < n; j++) { + size_t len = strlen (fields[j].value); + if (j % OVERALL_NUM_COLS == mod_val && len > max_value && + !fields[j].oneliner) + max_value = len; + } + + /* spacers */ + x_value = max_field + x_field + 1; + max_field += max_value + 2; + + color = (*fields[i].colorval) (); + render_overall_value (win, fields[i].value, y, x_value, color); + k += fields[i].oneliner ? OVERALL_NUM_COLS : 1; + } +} + +/* The entry point to render the overall statistics and free its data. */ +void +display_general (WINDOW * win, GLog * glog, GHolder * h) +{ + GColors *(*colorlbl) (void) = color_overall_lbls; + GColors *(*colorpth) (void) = color_overall_path; + GColors *(*colorval) (void) = color_overall_vals; + + size_t n, i; + + /* *INDENT-OFF* */ + Field fields[] = { + {T_REQUESTS , get_str_processed_reqs (glog), colorlbl, colorval, 0}, + {T_UNIQUE_VISITORS , get_str_visitors () , colorlbl, colorval, 0}, + {T_UNIQUE_FILES , get_str_reqs () , colorlbl, colorval, 0}, + {T_REFERRER , get_str_ref_reqs () , colorlbl, colorval, 0}, + {T_VALID , get_str_valid_reqs (glog) , colorlbl, colorval, 0}, + {T_GEN_TIME , get_str_proctime () , colorlbl, colorval, 0}, + {T_STATIC_FILES , get_str_static_reqs () , colorlbl, colorval, 0}, + {T_LOG , get_str_filesize () , colorlbl, colorval, 0}, + {T_FAILED , get_str_failed_reqs (glog) , colorlbl, colorval, 0}, + {T_EXCLUDE_IP , get_str_excluded_ips (glog) , colorlbl, colorval, 0}, + {T_UNIQUE404 , get_str_notfound_reqs () , colorlbl, colorval, 0}, + {T_BW , get_str_bandwidth (glog) , colorlbl, colorval, 0}, + {T_LOG_PATH , get_str_logfile () , colorlbl, colorpth, 1} + }; + /* *INDENT-ON* */ + + werase (win); + render_overall_header (win, h); + + n = ARRAY_SIZE (fields); + render_overall_statistics (win, fields, n); + + for (i = 0; i < n; i++) { + free (fields[i].value); + } +} + +/* Implement a basic framework to build a field input. + * + * On success, the inputted string is returned. */ +char * +input_string (WINDOW * win, int pos_y, int pos_x, size_t max_width, + const char *str, int enable_case, int *toggle_case) +{ + char *s = xmalloc (max_width + 1), *tmp; + size_t i, c, pos = 0, x = 0, quit = 1, len = 0, size_x = 0, size_y = 0; + + getmaxyx (win, size_y, size_x); + size_x -= 4; + + /* are we setting a default string */ + if (str) { + len = MIN (max_width, strlen (str)); + memcpy (s, str, len); + s[len] = '\0'; + + x = pos = 0; + /* is the default str length greater than input field? */ + if (strlen (s) > size_x) { + tmp = xstrdup (&s[0]); + tmp[size_x] = '\0'; + mvwprintw (win, pos_y, pos_x, "%s", tmp); + free (tmp); + } else { + mvwprintw (win, pos_y, pos_x, "%s", s); + } + } else { + s[0] = '\0'; + } + + if (enable_case) + mvwprintw (win, size_y - 2, 1, " %s", CSENSITIVE); + + wmove (win, pos_y, pos_x + x); + wrefresh (win); + + curs_set (1); + while (quit) { + c = wgetch (stdscr); + switch (c) { + case 1: /* ^a */ + case 262: /* HOME */ + pos = x = 0; + break; + case 5: + case 360: /* END of line */ + if (strlen (s) > size_x) { + x = size_x; + pos = strlen (s) - size_x; + } else { + pos = 0; + x = strlen (s); + } + break; + case 7: /* ^g */ + case 27: /* ESC */ + pos = x = 0; + if (str && *str == '\0') + s[0] = '\0'; + quit = 0; + break; + case 9: /* TAB */ + if (!enable_case) + break; + *toggle_case = *toggle_case == 0 ? 1 : 0; + if (*toggle_case) + mvwprintw (win, size_y - 2, 1, " %s", CISENSITIVE); + else if (!*toggle_case) + mvwprintw (win, size_y - 2, 1, " %s", CSENSITIVE); + break; + case 21: /* ^u */ + s[0] = '\0'; + pos = x = 0; + break; + case 8: /* xterm-256color */ + case 127: + case KEY_BACKSPACE: + if (pos + x > 0) { + memmove (&s[(pos + x) - 1], &s[pos + x], (max_width - (pos + x)) + 1); + if (pos <= 0) + x--; + else + pos--; + } + break; + case KEY_LEFT: + if (x > 0) + x--; + else if (pos > 0) + pos--; + break; + case KEY_RIGHT: + if ((x + pos) < strlen (s)) { + if (x < size_x) + x++; + else + pos++; + } + break; + case 0x0a: + case 0x0d: + case KEY_ENTER: + quit = 0; + break; + default: + if (strlen (s) == max_width) + break; + if (!isprint (c)) + break; + + if (strlen (s) == pos) { + s[pos + x] = c; + s[pos + x + 1] = '\0'; + waddch (win, c); + } else { + memmove (&s[pos + x + 1], &s[pos + x], strlen (&s[pos + x]) + 1); + s[pos + x] = c; + } + if ((x + pos) < max_width) { + if (x < size_x) + x++; + else + pos++; + } + } + tmp = xstrdup (&s[pos > 0 ? pos : 0]); + tmp[MIN (strlen (tmp), size_x)] = '\0'; + for (i = strlen (tmp); i < size_x; i++) + mvwprintw (win, pos_y, pos_x + i, "%s", " "); + mvwprintw (win, pos_y, pos_x, "%s", tmp); + free (tmp); + + wmove (win, pos_y, pos_x + x); + wrefresh (win); + } + curs_set (0); + + return s; +} + +/* Fill the given terminal dashboard menu with user agent data. + * + * On error, the 1 is returned. + * On success, 0 is returned. */ +static int +fill_host_agents_gmenu (void *val, void *user_data) +{ + GMenu *menu = user_data; + char *agent = ht_get_host_agent_val ((*(int *) val)); + + if (agent == NULL) + return 1; + + menu->items[menu->size].name = agent; + menu->items[menu->size].checked = 0; + menu->size++; + + return 0; +} + +/* Iterate over the linked-list of user agents for the given host and + * load its data into the given menu. */ +static void +load_host_agents_gmenu (void *list, void *user_data, int count) +{ + GSLList *lst = list; + GMenu *menu = user_data; + + menu->items = (GItem *) xcalloc (count, sizeof (GItem)); + list_foreach (lst, fill_host_agents_gmenu, menu); +} + +/* Set host data from a linked-list and load its data into a GMenu + * structure. + * + * On error, the 1 is returned. + * On success, 0 is returned. */ +#ifdef TCB_BTREE +int +set_host_agents (const char *addr, void (*func) (void *, void *, int), + void *arr) +{ + TCLIST *tclist; + GSLList *list; + int key, count = 0; + + key = ht_get_keymap (HOSTS, addr); + if (key == 0) + return 1; + + tclist = ht_get_host_agent_tclist (HOSTS, key); + if (!tclist) + return 1; + + list = tclist_to_gsllist (tclist); + if ((count = list_count (list)) == 0) { + free (list); + return 1; + } + + func (list, arr, count); + + list_remove_nodes (list); + tclistdel (tclist); + + return 0; +} +#endif + +/* Set host data from a linked-list and load its data into a GMenu + * structure. + * + * On error, the 1 is returned. + * On success, 0 is returned. */ +#ifndef TCB_BTREE +int +set_host_agents (const char *addr, void (*func) (void *, void *, int), + void *arr) +{ + GSLList *list; + int data_nkey, count = 0; + + data_nkey = ht_get_keymap (HOSTS, addr); + if (data_nkey == 0) + return 1; + + list = ht_get_host_agent_list (HOSTS, data_nkey); + if (!list) + return 1; + + if ((count = list_count (list)) == 0) { + free (list); + return 1; + } + + func (list, arr, count); + +#ifdef TCB_MEMHASH + free (list); +#endif + + return 0; +} +#endif + +/* Render a list of agents if available for the selected host/IP. */ +void +load_agent_list (WINDOW * main_win, char *addr) +{ + GMenu *menu; + WINDOW *win; + + char buf[256]; + int c, quit = 1, i; + int y, x, list_h, list_w, menu_w, menu_h; + + if (!conf.list_agents) + return; + + getmaxyx (stdscr, y, x); + list_h = y / 2; /* list window - height */ + list_w = x - 4; /* list window - width */ + menu_h = list_h - AGENTS_MENU_Y - 1; /* menu window - height */ + menu_w = list_w - AGENTS_MENU_X - AGENTS_MENU_X; /* menu window - width */ + + win = newwin (list_h, list_w, (y - list_h) / 2, (x - list_w) / 2); + keypad (win, TRUE); + wborder (win, '|', '|', '-', '-', '+', '+', '+', '+'); + + /* create a new instance of GMenu and make it selectable */ + menu = new_gmenu (win, menu_h, menu_w, AGENTS_MENU_Y, AGENTS_MENU_X); + if (set_host_agents (addr, load_host_agents_gmenu, menu) == 1) + goto out; + + post_gmenu (menu); + snprintf (buf, sizeof buf, AGENTSDLG_HEAD, addr); + draw_header (win, buf, " %s", 1, 1, list_w - 2, color_panel_header); + mvwprintw (win, 2, 2, AGENTSDLG_DESC); + wrefresh (win); + + while (quit) { + c = wgetch (stdscr); + switch (c) { + case KEY_DOWN: + gmenu_driver (menu, REQ_DOWN); + break; + case KEY_UP: + gmenu_driver (menu, REQ_UP); + break; + case KEY_RESIZE: + case 'q': + quit = 0; + break; + } + wrefresh (win); + } + + touchwin (main_win); + close_win (win); + wrefresh (main_win); + +out: + + /* clean stuff up */ + for (i = 0; i < menu->size; ++i) + free (menu->items[i].name); + if (menu->items) + free (menu->items); + free (menu); +} + +/* Render the processing spinner. This runs within its own thread. */ +static void +ui_spinner (void *ptr_data) +{ + GSpinner *sp = (GSpinner *) ptr_data; + GColors *color = NULL; + + static char const spin_chars[] = "/-\\|"; + char buf[SPIN_LBL]; + int i = 0; + long long tdiff = 0, psec = 0; + time_t begin; + + if (sp->curses) + color = (*sp->color) (); + + time (&begin); + while (1) { + pthread_mutex_lock (&sp->mutex); + if (sp->state == SPN_END) + break; + + setlocale (LC_NUMERIC, ""); + if (conf.no_progress) { + snprintf (buf, sizeof buf, SPIN_FMT, sp->label); + } else { + tdiff = (long long) (time (NULL) - begin); + psec = tdiff >= 1 ? *(sp->processed) / tdiff : 0; + snprintf (buf, sizeof buf, SPIN_FMTM, sp->label, *(sp->processed), psec); + } + setlocale (LC_NUMERIC, "POSIX"); + + if (sp->curses) { + /* CURSES */ + draw_header (sp->win, buf, " %s", sp->y, sp->x, sp->w, sp->color); + /* caret */ + wattron (sp->win, COLOR_PAIR (color->pair->idx)); + mvwaddch (sp->win, sp->y, sp->spin_x, spin_chars[i++ & 3]); + wattroff (sp->win, COLOR_PAIR (color->pair->idx)); + wrefresh (sp->win); + } else if (!conf.no_progress) { + /* STDOUT */ + fprintf (stderr, "%s\r", buf); + } + + pthread_mutex_unlock (&sp->mutex); + usleep (100000); + } +} + +/* Create the processing spinner's thread */ +void +ui_spinner_create (GSpinner * spinner) +{ + if (conf.no_parsing_spinner) + return; + + pthread_create (&(spinner->thread), NULL, (void *) &ui_spinner, spinner); + pthread_detach (spinner->thread); +} + +/* Initialize processing spinner data. */ +void +set_curses_spinner (GSpinner * spinner) +{ + int y, x; + if (spinner == NULL) + return; + + getmaxyx (stdscr, y, x); + + spinner->color = color_progress; + spinner->curses = 1; + spinner->win = stdscr; + spinner->x = 0; + spinner->w = x; + spinner->spin_x = x - 2; + spinner->y = y - 1; +} + +/* Allocate memory for a spinner instance and initialize its data. + * + * On success, the newly allocated GSpinner is returned. */ +GSpinner * +new_gspinner (void) +{ + GSpinner *spinner; + + spinner = xcalloc (1, sizeof (GSpinner)); + spinner->label = "Parsing..."; + spinner->state = SPN_RUN; + spinner->curses = 0; + if (conf.load_from_disk) + conf.no_progress = 1; + + if (pthread_mutex_init (&(spinner->mutex), NULL)) + FATAL ("Failed init thread mutex"); + + return spinner; +} + +/* A wrapper call to clear the status bar on the config dialog + * (terminal output). */ +static void +clear_confdlg_status_bar (WINDOW * win, int y, int x, int w) +{ + draw_header (win, "", "%s", y, x, w + 1, color_default); +} + +/* Escape a date format string. + * + * If no conf.date_format is given, NULL is returned. + * On success, the newly escaped allocated string is returned. */ +static char * +get_input_date_format (void) +{ + char *date_format = NULL; + + if (conf.date_format) + date_format = escape_str (conf.date_format); + return date_format; +} + +/* Escape a time format string. + * + * If no conf.time_format is given, NULL is returned. + * On success, the newly escaped allocated string is returned. */ +static char * +get_input_time_format (void) +{ + char *time_format = NULL; + + if (conf.time_format) + time_format = escape_str (conf.time_format); + return time_format; +} + +/* Escape a log format string. + * + * If no conf.log_format is given, NULL is returned. + * On success, the newly escaped allocated string is returned. */ +static char * +get_input_log_format (void) +{ + char *log_format = NULL; + + if (conf.log_format) + log_format = escape_str (conf.log_format); + return log_format; +} + +static void +draw_formats (WINDOW * win, int w2) +{ + char *date_format = NULL, *log_format = NULL, *time_format = NULL; + + draw_header (win, CONFDLG_HEAD, " %s", 1, 1, w2, color_panel_header); + mvwprintw (win, 2, 2, CONFDLG_KEY_HINTS); + + /* set log format from config file if available */ + draw_header (win, CONFDLG_LOG_FORMAT, " %s", 11, 1, w2, color_panel_header); + if ((log_format = get_input_log_format ())) { + mvwprintw (win, 12, 2, "%.*s", CONF_MENU_W, log_format); + + free (log_format); + } + + /* set log format from config file if available */ + draw_header (win, CONFDLG_DATE_FORMAT, " %s", 14, 1, w2, color_panel_header); + if ((date_format = get_input_date_format ())) { + mvwprintw (win, 15, 2, "%.*s", CONF_MENU_W, date_format); + + free (date_format); + } + + /* set log format from config file if available */ + draw_header (win, CONFDLG_TIME_FORMAT, " %s", 17, 1, w2, color_panel_header); + if ((time_format = get_input_time_format ())) { + mvwprintw (win, 18, 2, "%.*s", CONF_MENU_W, time_format); + + free (time_format); + } +} + +static const char * +set_formats (char *date_format, char *log_format, char *time_format) +{ + /* display status bar error messages */ + if (!time_format && !conf.time_format) + return ERR_FORMAT_NO_TIME_FMT_DLG; + if (!date_format && !conf.date_format) + return ERR_FORMAT_NO_DATE_FMT_DLG; + if (!log_format && !conf.log_format) + return ERR_FORMAT_NO_LOG_FMT_DLG; + + if (time_format) { + free (conf.time_format); + conf.time_format = unescape_str (time_format); + } + + if (date_format) { + free (conf.date_format); + conf.date_format = unescape_str (date_format); + } + + if (log_format) { + free (conf.log_format); + conf.log_format = unescape_str (log_format); + } + + set_spec_date_format (); + + return NULL; +} + +/* Render the help dialog. */ +static void +load_confdlg_error (WINDOW * parent_win, char **errors, int nerrors) +{ + int c, quit = 1, i = 0; + int y, x, h = ERR_WIN_HEIGHT, w = ERR_WIN_WIDTH; + WINDOW *win; + GMenu *menu; + + getmaxyx (stdscr, y, x); + + win = newwin (h, w, (y - h) / 2, (x - w) / 2); + keypad (win, TRUE); + wborder (win, '|', '|', '-', '-', '+', '+', '+', '+'); + + /* create a new instance of GMenu and make it selectable */ + menu = + new_gmenu (win, ERR_MENU_HEIGHT, ERR_MENU_WIDTH, ERR_MENU_Y, ERR_MENU_X); + menu->size = nerrors; + + /* add items to GMenu */ + menu->items = (GItem *) xcalloc (nerrors, sizeof (GItem)); + for (i = 0; i < nerrors; ++i) { + menu->items[i].name = alloc_string (errors[i]); + menu->items[i].checked = 0; + free (errors[i]); + } + free (errors); + post_gmenu (menu); + + draw_header (win, ERR_FORMAT_HEADER, " %s", 1, 1, w - 2, color_error); + mvwprintw (win, 2, 2, CONFDLG_DESC); + + wrefresh (win); + while (quit) { + c = wgetch (stdscr); + switch (c) { + case KEY_DOWN: + gmenu_driver (menu, REQ_DOWN); + break; + case KEY_UP: + gmenu_driver (menu, REQ_UP); + break; + case KEY_RESIZE: + case 'q': + quit = 0; + break; + } + wrefresh (win); + } + /* clean stuff up */ + for (i = 0; i < nerrors; ++i) + free (menu->items[i].name); + free (menu->items); + free (menu); + + touchwin (parent_win); + close_win (win); + wrefresh (parent_win); +} + +/* Render the config log date/format dialog. + * + * On error, or if the selected format is invalid, 1 is returned. + * On success, 0 is returned. */ +int +render_confdlg (GLog * glog, GSpinner * spinner) +{ + GMenu *menu; + WINDOW *win; + + const char *log_err = NULL; + char *date_format = NULL, *log_format = NULL, *time_format = NULL; + char *cstm_log, *cstm_date, *cstm_time; + int c, quit = 1, invalid = 1, y, x, h = CONF_WIN_H, w = CONF_WIN_W; + int w2 = w - 2; + size_t i, n, sel; + + /* conf dialog menu options */ + const char *choices[] = { + "NCSA Combined Log Format", + "NCSA Combined Log Format with Virtual Host", + "Common Log Format (CLF)", + "Common Log Format (CLF) with Virtual Host", + "W3C", + "Squid Native Format", + "CloudFront (Download Distribution)", + "Google Cloud Storage", + "AWS Elastic Load Balancing (HTTP/S)", + "AWS Simple Storage Service (S3)", + }; + n = ARRAY_SIZE (choices); + getmaxyx (stdscr, y, x); + + win = newwin (h, w, (y - h) / 2, (x - w) / 2); + keypad (win, TRUE); + wborder (win, '|', '|', '-', '-', '+', '+', '+', '+'); + + /* create a new instance of GMenu and make it selectable */ + menu = new_gmenu (win, CONF_MENU_H, CONF_MENU_W, CONF_MENU_Y, CONF_MENU_X); + menu->size = n; + menu->selectable = 1; + + /* add items to GMenu */ + menu->items = (GItem *) xcalloc (n, sizeof (GItem)); + for (i = 0; i < n; ++i) { + menu->items[i].name = alloc_string (choices[i]); + sel = get_selected_format_idx (); + menu->items[i].checked = sel == i ? 1 : 0; + } + post_gmenu (menu); + draw_formats (win, w2); + + wrefresh (win); + while (quit) { + c = wgetch (stdscr); + switch (c) { + case KEY_DOWN: + gmenu_driver (menu, REQ_DOWN); + clear_confdlg_status_bar (win, 3, 2, CONF_MENU_W); + break; + case KEY_UP: + gmenu_driver (menu, REQ_UP); + clear_confdlg_status_bar (win, 3, 2, CONF_MENU_W); + break; + case 32: /* space */ + gmenu_driver (menu, REQ_SEL); + clear_confdlg_status_bar (win, 12, 1, CONF_MENU_W); + clear_confdlg_status_bar (win, 15, 1, CONF_MENU_W); + clear_confdlg_status_bar (win, 18, 1, CONF_MENU_W); + + if (time_format) + free (time_format); + if (date_format) + free (date_format); + if (log_format) + free (log_format); + + for (i = 0; i < n; ++i) { + if (menu->items[i].checked != 1) + continue; + + date_format = get_selected_date_str (i); + log_format = get_selected_format_str (i); + time_format = get_selected_time_str (i); + + mvwprintw (win, 12, 1, " %s", log_format); + mvwprintw (win, 15, 1, " %s", date_format); + mvwprintw (win, 18, 1, " %s", time_format); + break; + } + break; + case 99: /* c */ + /* clear top status bar */ + clear_confdlg_status_bar (win, 3, 2, CONF_MENU_W); + wmove (win, 12, 2); + + /* get input string */ + if (!log_format) + log_format = get_input_log_format (); + + cstm_log = input_string (win, 12, 2, 70, log_format, 0, 0); + if (cstm_log != NULL && *cstm_log != '\0') { + if (log_format) + free (log_format); + + log_format = alloc_string (cstm_log); + free (cstm_log); + } + /* did not set an input string */ + else { + if (cstm_log) + free (cstm_log); + if (log_format) { + free (log_format); + log_format = NULL; + } + } + break; + case 100: /* d */ + /* clear top status bar */ + clear_confdlg_status_bar (win, 3, 2, CONF_MENU_W); + wmove (win, 15, 0); + + /* get input string */ + if (!date_format) + date_format = get_input_date_format (); + + cstm_date = input_string (win, 15, 2, 14, date_format, 0, 0); + if (cstm_date != NULL && *cstm_date != '\0') { + if (date_format) + free (date_format); + + date_format = alloc_string (cstm_date); + free (cstm_date); + } + /* did not set an input string */ + else { + if (cstm_date) + free (cstm_date); + if (date_format) { + free (date_format); + date_format = NULL; + } + } + break; + case 116: /* t */ + /* clear top status bar */ + clear_confdlg_status_bar (win, 3, 2, CONF_MENU_W); + wmove (win, 15, 0); + + /* get input string */ + if (!time_format) + time_format = get_input_time_format (); + + cstm_time = input_string (win, 18, 2, 14, time_format, 0, 0); + if (cstm_time != NULL && *cstm_time != '\0') { + if (time_format) + free (time_format); + + time_format = alloc_string (cstm_time); + free (cstm_time); + } + /* did not set an input string */ + else { + if (cstm_time) + free (cstm_time); + if (time_format) { + free (time_format); + time_format = NULL; + } + } + break; + case 274: /* F10 */ + case 0x0a: + case 0x0d: + case KEY_ENTER: + if ((log_err = set_formats (date_format, log_format, time_format))) + draw_header (win, log_err, " %s", 3, 2, CONF_MENU_W, color_error); + + if (!log_err) { + char **errors = NULL; + int nerrors = 0; + + /* test log against selected settings */ + if ((errors = test_format (glog, &nerrors))) { + invalid = 1; + load_confdlg_error (win, errors, nerrors); + } + /* valid data, reset glog & start parsing */ + else { + reset_struct (glog); + /* start spinner thread */ + spinner->win = win; + spinner->y = 3; + spinner->x = 2; + spinner->spin_x = CONF_MENU_W; + spinner->w = CONF_MENU_W; + spinner->color = color_progress; + ui_spinner_create (spinner); + + invalid = 0; + quit = 0; + } + } + break; + case KEY_RESIZE: + case 'q': + quit = 0; + break; + } + + pthread_mutex_lock (&spinner->mutex); + wrefresh (win); + pthread_mutex_unlock (&spinner->mutex); + } + + free (time_format); + free (date_format); + free (log_format); + + /* clean stuff up */ + for (i = 0; i < n; ++i) + free (menu->items[i].name); + free (menu->items); + free (menu); + + return invalid ? 1 : 0; +} + +/* Given the name of the selected scheme, set it under our config + * options. */ +static void +scheme_chosen (const char *name) +{ + int force = 0; + + free_color_lists (); + if (strcmp ("Green", name) == 0) { + conf.color_scheme = STD_GREEN; + force = 1; + } else if (strcmp ("Monochrome", name) == 0) { + conf.color_scheme = MONOCHROME; + force = 1; + } else if (strcmp ("Monokai", name) == 0) { + conf.color_scheme = MONOKAI; + force = 1; + } else if (strcmp ("Custom Scheme", name) == 0) { + force = 0; + } + init_colors (force); +} + +static const char ** +get_color_schemes (size_t * size) +{ + const char *choices[] = { + "Monokai", + "Monochrome", + "Green", + "Custom Scheme" + }; + int i, j, n = ARRAY_SIZE (choices); + const char **opts = xmalloc (sizeof (char *) * n); + + for (i = 0, j = 0; i < n; ++i) { + if (!conf.color_idx && !strcmp ("Custom Scheme", choices[i])) + continue; + if (COLORS < 256 && !strcmp ("Monokai", choices[i])) + continue; + opts[j++] = choices[i]; + } + *size = j; + + return opts; +} + +/* Render the schemes dialog. */ +void +load_schemes_win (WINDOW * main_win) +{ + GMenu *menu; + WINDOW *win; + int c, quit = 1; + size_t i, n = 0; + int y, x, h = SCHEME_WIN_H, w = SCHEME_WIN_W; + int w2 = w - 2; + const char **choices = get_color_schemes (&n); + + getmaxyx (stdscr, y, x); + + win = newwin (h, w, (y - h) / 2, (x - w) / 2); + keypad (win, TRUE); + wborder (win, '|', '|', '-', '-', '+', '+', '+', '+'); + + /* create a new instance of GMenu and make it selectable */ + menu = + new_gmenu (win, SCHEME_MENU_H, SCHEME_MENU_W, SCHEME_MENU_Y, SCHEME_MENU_X); + /* remove custom color option if no custom scheme used */ + menu->size = n; + + /* add items to GMenu */ + menu->items = (GItem *) xcalloc (n, sizeof (GItem)); + for (i = 0; i < n; ++i) { + menu->items[i].name = alloc_string (choices[i]); + menu->items[i].checked = 0; + } + post_gmenu (menu); + + draw_header (win, SCHEMEDLG_HEAD, " %s", 1, 1, w2, color_panel_header); + mvwprintw (win, 2, 2, SCHEMEDLG_DESC); + + wrefresh (win); + while (quit) { + c = wgetch (stdscr); + switch (c) { + case KEY_DOWN: + gmenu_driver (menu, REQ_DOWN); + break; + case KEY_UP: + gmenu_driver (menu, REQ_UP); + break; + case 32: + case 0x0a: + case 0x0d: + case KEY_ENTER: + gmenu_driver (menu, REQ_SEL); + for (i = 0; i < n; ++i) { + if (menu->items[i].checked != 1) + continue; + scheme_chosen (choices[i]); + break; + } + quit = 0; + break; + case KEY_RESIZE: + case 'q': + quit = 0; + break; + } + wrefresh (win); + } + /* clean stuff up */ + for (i = 0; i < n; ++i) + free (menu->items[i].name); + free (menu->items); + free (menu); + free (choices); + + touchwin (main_win); + close_win (win); + wrefresh (main_win); +} + +/* Render the sort dialog. */ +void +load_sort_win (WINDOW * main_win, GModule module, GSort * sort) +{ + GMenu *menu; + WINDOW *win; + GSortField opts[SORT_MAX_OPTS]; + + int c, quit = 1; + int i = 0, k, n = 0; + int y, x, h = SORT_WIN_H, w = SORT_WIN_W; + int w2 = w - 2; + + getmaxyx (stdscr, y, x); + + /* determine amount of sort choices */ + for (i = 0, k = 0; -1 != sort_choices[module][i]; i++) { + GSortField field = sort_choices[module][i]; + if (SORT_BY_CUMTS == field && !conf.serve_usecs) + continue; + else if (SORT_BY_MAXTS == field && !conf.serve_usecs) + continue; + else if (SORT_BY_AVGTS == field && !conf.serve_usecs) + continue; + else if (SORT_BY_BW == field && !conf.bandwidth) + continue; + else if (SORT_BY_PROT == field && !conf.append_protocol) + continue; + else if (SORT_BY_MTHD == field && !conf.append_method) + continue; + opts[k++] = field; + n++; + } + + win = newwin (h, w, (y - h) / 2, (x - w) / 2); + keypad (win, TRUE); + wborder (win, '|', '|', '-', '-', '+', '+', '+', '+'); + + /* create a new instance of GMenu and make it selectable */ + menu = new_gmenu (win, SORT_MENU_H, SORT_MENU_W, SORT_MENU_Y, SORT_MENU_X); + menu->size = n; + menu->selectable = 1; + + /* add items to GMenu */ + menu->items = (GItem *) xcalloc (n, sizeof (GItem)); + + /* set choices, checked option and index */ + for (i = 0; i < n; ++i) { + GSortField field = sort_choices[module][opts[i]]; + if (SORT_BY_HITS == field) { + menu->items[i].name = alloc_string (MTRC_HITS_LBL); + if (sort->field == SORT_BY_HITS) { + menu->items[i].checked = 1; + menu->idx = i; + } + } else if (SORT_BY_VISITORS == field) { + menu->items[i].name = alloc_string (MTRC_VISITORS_LBL); + if (sort->field == SORT_BY_VISITORS) { + menu->items[i].checked = 1; + menu->idx = i; + } + } else if (SORT_BY_DATA == field) { + menu->items[i].name = alloc_string (MTRC_DATA_LBL); + if (sort->field == SORT_BY_DATA) { + menu->items[i].checked = 1; + menu->idx = i; + } + } else if (SORT_BY_BW == field) { + menu->items[i].name = alloc_string (MTRC_BW_LBL); + if (sort->field == SORT_BY_BW) { + menu->items[i].checked = 1; + menu->idx = i; + } + } else if (SORT_BY_AVGTS == field) { + menu->items[i].name = alloc_string (MTRC_AVGTS_LBL); + if (sort->field == SORT_BY_AVGTS) { + menu->items[i].checked = 1; + menu->idx = i; + } + } else if (SORT_BY_CUMTS == field) { + menu->items[i].name = alloc_string (MTRC_CUMTS_LBL); + if (sort->field == SORT_BY_CUMTS) { + menu->items[i].checked = 1; + menu->idx = i; + } + } else if (SORT_BY_MAXTS == field) { + menu->items[i].name = alloc_string (MTRC_MAXTS_LBL); + if (sort->field == SORT_BY_MAXTS) { + menu->items[i].checked = 1; + menu->idx = i; + } + } else if (SORT_BY_PROT == field) { + menu->items[i].name = alloc_string (MTRC_PROTOCOLS_LBL); + if (sort->field == SORT_BY_PROT) { + menu->items[i].checked = 1; + menu->idx = i; + } + } else if (SORT_BY_MTHD == field) { + menu->items[i].name = alloc_string (MTRC_METHODS_LBL); + if (sort->field == SORT_BY_MTHD) { + menu->items[i].checked = 1; + menu->idx = i; + } + } + } + post_gmenu (menu); + + draw_header (win, SORTDLG_HEAD, " %s", 1, 1, w2, color_panel_header); + mvwprintw (win, 2, 2, SORTDLG_DESC); + + if (sort->sort == SORT_ASC) + mvwprintw (win, SORT_WIN_H - 2, 1, " %s", SORT_ASC_SEL); + else + mvwprintw (win, SORT_WIN_H - 2, 1, " %s", SORT_DESC_SEL); + + wrefresh (win); + while (quit) { + c = wgetch (stdscr); + switch (c) { + case KEY_DOWN: + gmenu_driver (menu, REQ_DOWN); + break; + case KEY_UP: + gmenu_driver (menu, REQ_UP); + break; + case 9: /* TAB */ + if (sort->sort == SORT_ASC) { + /* ascending */ + sort->sort = SORT_DESC; + mvwprintw (win, SORT_WIN_H - 2, 1, " %s", SORT_DESC_SEL); + } else { + /* descending */ + sort->sort = SORT_ASC; + mvwprintw (win, SORT_WIN_H - 2, 1, " %s", SORT_ASC_SEL); + } + break; + case 32: + case 0x0a: + case 0x0d: + case KEY_ENTER: + gmenu_driver (menu, REQ_SEL); + for (i = 0; i < n; ++i) { + if (menu->items[i].checked != 1) + continue; + if (strcmp ("Hits", menu->items[i].name) == 0) + sort->field = SORT_BY_HITS; + else if (strcmp ("Visitors", menu->items[i].name) == 0) + sort->field = SORT_BY_VISITORS; + else if (strcmp ("Data", menu->items[i].name) == 0) + sort->field = SORT_BY_DATA; + else if (strcmp ("Tx. Amount", menu->items[i].name) == 0) + sort->field = SORT_BY_BW; + else if (strcmp ("Avg. T.S.", menu->items[i].name) == 0) + sort->field = SORT_BY_AVGTS; + else if (strcmp ("Cum. T.S.", menu->items[i].name) == 0) + sort->field = SORT_BY_CUMTS; + else if (strcmp ("Max. T.S.", menu->items[i].name) == 0) + sort->field = SORT_BY_MAXTS; + else if (strcmp ("Protocol", menu->items[i].name) == 0) + sort->field = SORT_BY_PROT; + else if (strcmp ("Method", menu->items[i].name) == 0) + sort->field = SORT_BY_MTHD; + quit = 0; + break; + } + break; + case KEY_RESIZE: + case 'q': + quit = 0; + break; + } + wrefresh (win); + } + + /* clean stuff up */ + for (i = 0; i < n; ++i) + free (menu->items[i].name); + free (menu->items); + free (menu); + + touchwin (main_win); + close_win (win); + wrefresh (main_win); +} + +/* Help menu data (F1/h). */ +static const char *help_main[] = { + "Copyright (C) 2009-2017 by Gerardo Orellana", + "http://goaccess.io - ", + "Released under the MIT License.", + "", + "See `man` page for more details", + "", + "GoAccess is an open source real-time web log analyzer and", + "interactive viewer that runs in a terminal in *nix systems.", + "It provides fast and valuable HTTP statistics for system", + "administrators that require a visual server report on the", + "fly.", + "", + "The data collected based on the parsing of the log is", + "divided into different modules. Modules are automatically", + "generated and presented to the user.", + "", + "The main dashboard displays general statistics, top", + "visitors, requests, browsers, operating systems,", + "hosts, etc.", + "", + "The user can make use of the following keys:", + " ^F1^ or ^h^ Main help", + " ^F5^ Redraw [main window]", + " ^q^ Quit the program, current window or module", + " ^o^ or ^ENTER^ Expand selected module", + " ^[Shift]0-9^ Set selected module to active", + " ^Up^ arrow Scroll up main dashboard", + " ^Down^ arrow Scroll down main dashboard", + " ^j^ Scroll down within expanded module", + " ^k^ Scroll up within expanded module", + " ^c^ Set or change scheme color", + " ^CTRL^ + ^f^ Scroll forward one screen within", + " active module", + " ^CTRL^ + ^b^ Scroll backward one screen within", + " active module", + " ^TAB^ Iterate modules (forward)", + " ^SHIFT^ + ^TAB^ Iterate modules (backward)", + " ^s^ Sort options for current module", + " ^/^ Search across all modules", + " ^n^ Find position of the next occurrence", + " ^g^ Move to the first item or top of screen", + " ^G^ Move to the last item or bottom of screen", + "", + "Examples can be found by running `man goaccess`.", + "", + "If you believe you have found a bug, please drop me", + "an email with details.", + "", + "Feedback? Just shoot me an email to:", + "hello@goaccess.io", +}; + +/* Render the help dialog. */ +void +load_help_popup (WINDOW * main_win) +{ + int c, quit = 1; + size_t i, n; + int y, x, h = HELP_WIN_HEIGHT, w = HELP_WIN_WIDTH; + int w2 = w - 2; + WINDOW *win; + GMenu *menu; + + n = ARRAY_SIZE (help_main); + getmaxyx (stdscr, y, x); + + win = newwin (h, w, (y - h) / 2, (x - w) / 2); + keypad (win, TRUE); + wborder (win, '|', '|', '-', '-', '+', '+', '+', '+'); + + /* create a new instance of GMenu and make it selectable */ + menu = + new_gmenu (win, HELP_MENU_HEIGHT, HELP_MENU_WIDTH, HELP_MENU_Y, + HELP_MENU_X); + menu->size = n; + + /* add items to GMenu */ + menu->items = (GItem *) xcalloc (n, sizeof (GItem)); + for (i = 0; i < n; ++i) { + menu->items[i].name = alloc_string (help_main[i]); + menu->items[i].checked = 0; + } + post_gmenu (menu); + + draw_header (win, HELPDLG_HEAD, " %s", 1, 1, w2, color_panel_header); + mvwprintw (win, 2, 2, HELPDLG_DESC); + + wrefresh (win); + while (quit) { + c = wgetch (stdscr); + switch (c) { + case KEY_DOWN: + gmenu_driver (menu, REQ_DOWN); + break; + case KEY_UP: + gmenu_driver (menu, REQ_UP); + break; + case KEY_RESIZE: + case 'q': + quit = 0; + break; + } + wrefresh (win); + } + /* clean stuff up */ + for (i = 0; i < n; ++i) + free (menu->items[i].name); + free (menu->items); + free (menu); + + touchwin (main_win); + close_win (win); + wrefresh (main_win); +} diff --git a/goaccess++/src/ui.h b/goaccess++/src/ui.h new file mode 100644 index 0000000..aea69b6 --- /dev/null +++ b/goaccess++/src/ui.h @@ -0,0 +1,257 @@ +/** + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana + * + * 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 UI_H_INCLUDED +#define UI_H_INCLUDED + +#ifdef HAVE_NCURSESW_NCURSES_H +#include +#elif HAVE_NCURSES_NCURSES_H +#include +#elif HAVE_NCURSES_H +#include +#elif HAVE_CURSES_H +#include +#endif + +#ifdef HAVE_LIBPTHREAD +#include +#endif + +/* string literals and translations */ +#include "labels.h" + +/* Global UI defaults */ +#define MIN_HEIGHT 8 /* minimum window height */ +#define MIN_WIDTH 0 /* minimum window width */ +#define MAX_HEIGHT_FOOTER 1 /* height of the footer window */ +#define MAX_HEIGHT_HEADER 7 /* height of the header window */ +#define OVERALL_NUM_COLS 4 /* number of columns on the overall stats win */ + +/* Spinner Label Format */ +#define SPIN_FMT "%s" +#define SPIN_FMTM "%s [%'d] [%'lld/s]" +#define SPIN_LBL 50 /* max length of the progress spinner */ + +/* Module JSON keys */ +#define VISITORS_ID "visitors" +#define REQUESTS_ID "requests" +#define REQUESTS_STATIC_ID "static_requests" +#define VISIT_TIMES_ID "visit_time" +#define VIRTUAL_HOSTS_ID "vhosts" +#define REMOTE_USER_ID "remote_user" +#define NOT_FOUND_ID "not_found" +#define HOSTS_ID "hosts" +#define OS_ID "os" +#define BROWSERS_ID "browsers" +#define REFERRERS_ID "referrers" +#define REFERRING_SITES_ID "referring_sites" +#define KEYPHRASES_ID "keyphrases" +#define GEO_LOCATION_ID "geolocation" +#define STATUS_CODES_ID "status_codes" +#define GENER_ID "general" + +/* Overall Statistics CSV/JSON Keys */ +#define OVERALL_STARTDATE "start_date" +#define OVERALL_ENDDATE "end_date" +#define OVERALL_DATETIME "date_time" +#define OVERALL_REQ "total_requests" +#define OVERALL_VALID "valid_requests" +#define OVERALL_GENTIME "generation_time" +#define OVERALL_FAILED "failed_requests" +#define OVERALL_VISITORS "unique_visitors" +#define OVERALL_FILES "unique_files" +#define OVERALL_EXCL_HITS "excluded_hits" +#define OVERALL_REF "unique_referrers" +#define OVERALL_NOTFOUND "unique_not_found" +#define OVERALL_STATIC "unique_static_files" +#define OVERALL_LOGSIZE "log_size" +#define OVERALL_BANDWIDTH "bandwidth" +#define OVERALL_LOG "log_path" + +/* CONFIG DIALOG */ +#define CONF_MENU_H 6 +#define CONF_MENU_W 57 +#define CONF_MENU_X 2 +#define CONF_MENU_Y 4 +#define CONF_WIN_H 20 +#define CONF_WIN_W 61 + +/* FIND DIALOG */ +#define FIND_DLG_HEIGHT 8 +#define FIND_DLG_WIDTH 50 +#define FIND_MAX_MATCHES 1 + +/* COLOR SCHEME DIALOG */ +#define SCHEME_MENU_H 4 +#define SCHEME_MENU_W 38 +#define SCHEME_MENU_X 2 +#define SCHEME_MENU_Y 4 +#define SCHEME_WIN_H 10 +#define SCHEME_WIN_W 42 + +/* SORT DIALOG */ +#define SORT_MENU_H 6 +#define SORT_MENU_W 38 +#define SORT_MENU_X 2 +#define SORT_MENU_Y 4 +#define SORT_WIN_H 13 +#define SORT_WIN_W 42 + +/* AGENTS DIALOG */ +#define AGENTS_MENU_X 2 +#define AGENTS_MENU_Y 4 + +/* HELP DIALOG */ +#define HELP_MENU_HEIGHT 12 +#define HELP_MENU_WIDTH 60 +#define HELP_MENU_X 2 +#define HELP_MENU_Y 4 +#define HELP_WIN_HEIGHT 17 +#define HELP_WIN_WIDTH 64 + +/* CONF ERROR DIALOG */ +#define ERR_MENU_HEIGHT 10 +#define ERR_MENU_WIDTH 57 +#define ERR_MENU_X 2 +#define ERR_MENU_Y 4 +#define ERR_WIN_HEIGHT 15 +#define ERR_WIN_WIDTH 61 + +/* Convenient macros */ +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) + +#include "color.h" +#include "commons.h" +#include "sort.h" + +/* Curses dashboard find */ +typedef struct GFind_ +{ + GModule module; + char *pattern; + int next_idx; + int next_parent_idx; + int next_sub_idx; + int look_in_sub; + int done; + int icase; +} GFind; + +/* Each panel contains its own scrolling and offset */ +typedef struct GScrollModule_ +{ + int scroll; + int offset; +} GScrollModule; + +/* Curses Scrolling */ +typedef struct GScroll_ +{ + GScrollModule module[TOTAL_MODULES]; + GModule current; + int dash; + int expanded; +} GScroll; + +/* Spinner or Progress Indicator */ +typedef struct GSpinner_ +{ + const char *label; + GColors *(*color) (void); + int curses; + int spin_x; + int w; + int x; + int y; + pthread_mutex_t mutex; + pthread_t thread; + unsigned int *processed; + WINDOW *win; + enum + { + SPN_RUN, + SPN_END + } state; +} GSpinner; + +/* Controls metric output. + * i.e., which metrics it should display */ +typedef struct GOutput_ +{ + GModule module; + int8_t visitors; + int8_t hits; + int8_t percent; + int8_t bw; + int8_t avgts; + int8_t cumts; + int8_t maxts; + int8_t protocol; + int8_t method; + int8_t data; + int8_t graph; /* display bars when collapsed */ + int8_t sub_graph; /* display bars upon expanding it */ +} GOutput; + +/* *INDENT-OFF* */ +GOutput *output_lookup (GModule module); +GSpinner *new_gspinner (void); + +char *get_browser_type (char *line); +char *get_overall_header (GHolder *h); +char *input_string (WINDOW * win, int pos_y, int pos_x, size_t max_width, const char *str, int enable_case, int *toggle_case); +const char *module_to_desc (GModule module); +const char *module_to_head (GModule module); +const char *module_to_id (GModule module); +const char *module_to_label (GModule module); +int get_start_end_parsing_dates (GHolder * h, char **start, char **end, const char *f); +int render_confdlg (GLog * glog, GSpinner * spinner); +int set_host_agents (const char *addr, void (*func) (void *, void *, int), void *arr); +void close_win (WINDOW * w); +void display_general (WINDOW * win, GLog * glog, GHolder *h); +void draw_header (WINDOW * win, const char *s, const char *fmt, int y, int x, int w, GColors * (*func) (void)); +void end_spinner (void); +void generate_time (void); +void init_colors (int force); +void init_windows (WINDOW ** header_win, WINDOW ** main_win); +void load_agent_list (WINDOW * main_win, char *addr); +void load_help_popup (WINDOW * main_win); +void load_schemes_win (WINDOW * main_win); +void load_sort_win (WINDOW * main_win, GModule module, GSort * sort); +void set_curses_spinner (GSpinner *spinner); +void set_input_opts (void); +void set_wbkgd (WINDOW *main_win, WINDOW *header_win); +void term_size (WINDOW * main_win, int *main_win_height); +void ui_spinner_create (GSpinner * spinner); +void update_active_module (WINDOW * header_win, GModule current); +void update_header (WINDOW * header_win, int current); +/* *INDENT-ON* */ + +#endif diff --git a/goaccess++/src/ui.o b/goaccess++/src/ui.o new file mode 100644 index 0000000000000000000000000000000000000000..007bcc3a4144ce269a4d2e015b3fbe1fd16ee1e8 GIT binary patch literal 62104 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 + * + * 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. + */ + +#define _LARGEFILE_SOURCE +#define _LARGEFILE64_SOURCE +#define _FILE_OFFSET_BITS 64 + +#define _XOPEN_SOURCE 700 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "util.h" + +#include "error.h" +#include "labels.h" +#include "xmalloc.h" + +/* HTTP status codes categories */ +static const char *code_type[][2] = { + {"1", STATUS_CODE_1XX}, + {"2", STATUS_CODE_2XX}, + {"3", STATUS_CODE_3XX}, + {"4", STATUS_CODE_4XX}, + {"5", STATUS_CODE_5XX}, +}; + +/* HTTP status codes */ +static const char *codes[][2] = { + {"100", STATUS_CODE_100}, + {"101", STATUS_CODE_101}, + {"200", STATUS_CODE_200}, + {"201", STATUS_CODE_201}, + {"202", STATUS_CODE_202}, + {"203", STATUS_CODE_203}, + {"204", STATUS_CODE_204}, + {"205", STATUS_CODE_205}, + {"206", STATUS_CODE_206}, + {"207", STATUS_CODE_207}, + {"208", STATUS_CODE_208}, + {"300", STATUS_CODE_300}, + {"301", STATUS_CODE_301}, + {"302", STATUS_CODE_302}, + {"303", STATUS_CODE_303}, + {"304", STATUS_CODE_304}, + {"305", STATUS_CODE_305}, + {"307", STATUS_CODE_307}, + {"400", STATUS_CODE_400}, + {"401", STATUS_CODE_401}, + {"402", STATUS_CODE_402}, + {"403", STATUS_CODE_403}, + {"404", STATUS_CODE_404}, + {"405", STATUS_CODE_405}, + {"406", STATUS_CODE_406}, + {"407", STATUS_CODE_407}, + {"408", STATUS_CODE_408}, + {"409", STATUS_CODE_409}, + {"410", STATUS_CODE_410}, + {"411", STATUS_CODE_411}, + {"412", STATUS_CODE_412}, + {"413", STATUS_CODE_413}, + {"414", STATUS_CODE_414}, + {"415", STATUS_CODE_415}, + {"416", STATUS_CODE_416}, + {"417", STATUS_CODE_417}, + {"421", STATUS_CODE_421}, + {"422", STATUS_CODE_422}, + {"423", STATUS_CODE_423}, + {"424", STATUS_CODE_424}, + {"426", STATUS_CODE_426}, + {"428", STATUS_CODE_428}, + {"429", STATUS_CODE_429}, + {"431", STATUS_CODE_431}, + {"444", STATUS_CODE_444}, + {"451", STATUS_CODE_451}, + {"494", STATUS_CODE_494}, + {"495", STATUS_CODE_495}, + {"496", STATUS_CODE_496}, + {"497", STATUS_CODE_497}, + {"499", STATUS_CODE_499}, + {"500", STATUS_CODE_500}, + {"501", STATUS_CODE_501}, + {"502", STATUS_CODE_502}, + {"503", STATUS_CODE_503}, + {"504", STATUS_CODE_504}, + {"505", STATUS_CODE_505}, + {"520", STATUS_CODE_520}, + {"521", STATUS_CODE_521}, + {"522", STATUS_CODE_522}, + {"523", STATUS_CODE_523}, + {"524", STATUS_CODE_524} +}; + +/* Return part of a string + * + * On error NULL is returned. + * On success the extracted part of string is returned */ +char * +substring (const char *str, int begin, int len) +{ + char *buffer; + if (str == NULL) + return NULL; + if (begin < 0) + begin = strlen (str) + begin; + if (begin < 0) + begin = 0; + if (len < 0) + len = 0; + if (((size_t) begin) > strlen (str)) + begin = strlen (str); + if (((size_t) len) > strlen (&str[begin])) + len = strlen (&str[begin]); + if ((buffer = xmalloc (len + 1)) == NULL) + return NULL; + memcpy (buffer, &(str[begin]), len); + buffer[len] = '\0'; + + return buffer; +} + +/* A pointer to the allocated memory of the new string + * + * On success, a pointer to a new string is returned */ +char * +alloc_string (const char *str) +{ + char *new = xmalloc (strlen (str) + 1); + strcpy (new, str); + return new; +} + +/* A wrapper function to copy the first num characters of source to + * destination. */ +void +xstrncpy (char *dest, const char *source, const size_t dest_size) +{ + strncpy (dest, source, dest_size); + if (dest_size > 0) { + dest[dest_size - 1] = '\0'; + } else { + dest[0] = '\0'; + } +} + +/* A random string generator. */ +void +genstr (char *dest, size_t len) +{ + char set[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + while (len-- > 0) + *dest++ = set[rand () % (sizeof (set) - 1)]; + *dest = '\0'; +} + +/* Count the number of matches on the string `s1` given a character `c` + * + * If the character is not found, 0 is returned + * On success, the number of characters found */ +int +count_matches (const char *s1, char c) +{ + const char *ptr = s1; + int n = 0; + do { + if (*ptr == c) + n++; + } while (*(ptr++)); + return n; +} + +/* String matching where one string contains wildcard characters. + * + * If no match found, 1 is returned. + * If match found, 0 is returned. */ +static int +wc_match (const char *wc, char *str) +{ + while (*wc && *str) { + if (*wc == '*') { + while (*wc && *wc == '*') + wc++; + if (!*wc) + return 1; + + while (*str && *str != *wc) + str++; + } else if (*wc == '?' || *wc == *str) { + wc++; + str++; + } else { + break; + } + } + if (!*wc && !*str) + return 1; + return 0; +} + +/* Determine if the given host needs to be ignored given the list of + * referrers to ignore. + * + * On error, or the referrer is not found, 0 is returned + * On success, or if the host needs to be ignored, 1 is returned */ +int +ignore_referer (const char *host) +{ + char *needle = NULL; + int i, ignore = 0; + + if (conf.ignore_referer_idx == 0) + return 0; + if (host == NULL || *host == '\0') + return 0; + + needle = xstrdup (host); + for (i = 0; i < conf.ignore_referer_idx; ++i) { + if (conf.ignore_referers[i] == NULL || *conf.ignore_referers[i] == '\0') + continue; + + if (wc_match (conf.ignore_referers[i], needle)) { + ignore = 1; + goto out; + } + } +out: + free (needle); + + return ignore; +} + +/* Determine if the given host needs to be hidden given the list of + * referrers to hide. + * + * On error, or the referrer is not found, 0 is returned + * On success, or if the host needs to be ignored, 1 is returned */ +int +hide_referer (const char *host) +{ + char *needle = NULL; + int i, ignore = 0; + + if (conf.hide_referer_idx == 0) + return 0; + if (host == NULL || *host == '\0') + return 0; + + needle = xstrdup (host); + for (i = 0; i < conf.hide_referer_idx; ++i) { + if (conf.hide_referers[i] == NULL || *conf.hide_referers[i] == '\0') + continue; + + if (wc_match (conf.hide_referers[i], needle)) { + ignore = 1; + goto out; + } + } +out: + free (needle); + + return ignore; +} + +/* Determine if the given ip is within a range of IPs. + * + * On error, or not within the range, 0 is returned + * On success, or if within the range, 1 is returned */ +static int +within_range (const char *ip, const char *start, const char *end) +{ + struct in6_addr addr6, start6, end6; + struct in_addr addr4, start4, end4; + + if (start == NULL || *start == '\0') + return 0; + if (end == NULL || *end == '\0') + return 0; + if (ip == NULL || *ip == '\0') + return 0; + + /* IPv4 */ + if (1 == inet_pton (AF_INET, ip, &addr4)) { + if (1 != inet_pton (AF_INET, start, &start4)) + return 0; + if (1 != inet_pton (AF_INET, end, &end4)) + return 0; + if (memcmp (&addr4, &start4, sizeof (addr4)) >= 0 && + memcmp (&addr4, &end4, sizeof (addr4)) <= 0) + return 1; + } + /* IPv6 */ + else if (1 == inet_pton (AF_INET6, ip, &addr6)) { + if (1 != inet_pton (AF_INET6, start, &start6)) + return 0; + if (1 != inet_pton (AF_INET6, end, &end6)) + return 0; + if (memcmp (&addr6, &start6, sizeof (addr6)) >= 0 && + memcmp (&addr6, &end6, sizeof (addr6)) <= 0) + return 1; + } + + return 0; +} + +/* Determine if the given IP needs to be ignored given the list of IPs + * to ignore. + * + * On error, or not within the range, 0 is returned + * On success, or if within the range, 1 is returned */ +int +ip_in_range (const char *ip) +{ + char *start = NULL, *end, *dash; + int i; + + for (i = 0; i < conf.ignore_ip_idx; ++i) { + end = NULL; + if (conf.ignore_ips[i] == NULL || *conf.ignore_ips[i] == '\0') + continue; + + start = xstrdup (conf.ignore_ips[i]); + /* split range */ + if ((dash = strchr (start, '-')) != NULL) { + *dash = '\0'; + end = dash + 1; + } + + /* matches single IP */ + if (end == NULL && start) { + if (strcmp (ip, start) == 0) { + free (start); + return 1; + } + } + /* within range */ + else if (start && end) { + if (within_range (ip, start, end)) { + free (start); + return 1; + } + } + free (start); + } + + return 0; +} + +/* Searches the array of output formats for the given extension value. + * + * If not found, 1 is returned. + * On success, the given filename is malloc'd and assigned and 0 is + * returned. */ +int +find_output_type (char **filename, const char *ext, int alloc) +{ + int i; + const char *dot = NULL; + + for (i = 0; i < conf.output_format_idx; ++i) { + /* for backwards compatibility. i.e., -o json */ + if (strcmp (conf.output_formats[i], ext) == 0) + return 0; + + if ((dot = strrchr (conf.output_formats[i], '.')) != NULL && + strcmp (dot + 1, ext) == 0) { + if (alloc) + *filename = xstrdup (conf.output_formats[i]); + return 0; + } + } + + return 1; +} + +/* Validates the '-o' filename extension for any of: + * 1) .csv + * 2) .json + * 3) .html + * + * Return Value + * 1: valid + * 0: invalid + * -1: non-existent extension + */ +int +valid_output_type (const char *filename) +{ + const char *ext = NULL; + size_t sl; + + if ((ext = strrchr (filename, '.')) == NULL) + return -1; + + ext++; + /* Is extension 3<=len<=4? */ + sl = strlen (ext); + if (sl < 3 || sl > 4) + return 0; + + if (strcmp ("html", ext) == 0) + return 1; + + if (strcmp ("json", ext) == 0) + return 1; + + if (strcmp ("csv", ext) == 0) + return 1; + + return 0; +} + +/* Search the environment HOME variable and append GoAccess' config + * file. + * + * On error, it outputs an error message and the program terminates. + * On success, the path of HOME and the config file is returned. */ +char * +get_home (void) +{ + char *user_home = NULL, *path = NULL; + + user_home = getenv ("HOME"); + if (user_home == NULL) + FATAL ("Unable to determine the HOME environment variable."); + + path = xmalloc (snprintf (NULL, 0, "%s/.goaccessrc", user_home) + 1); + sprintf (path, "%s/.goaccessrc", user_home); + + return path; +} + +/* Get the path to the global config file. + * + * On success, the path of the global config file is returned. */ +char * +get_global_config (void) +{ + char *path = NULL; + + path = xmalloc (snprintf (NULL, 0, "%s/goaccess.conf", SYSCONFDIR) + 1); + sprintf (path, "%s/goaccess.conf", SYSCONFDIR); + + return path; +} + +/* A self-checking wrapper to convert_date(). + * + * On error, a newly malloc'd '---' string is returned. + * On success, a malloc'd 'Ymd' date is returned. */ +char * +get_visitors_date (const char *odate, const char *from, const char *to) +{ + char date[DATE_TIME] = ""; /* Ymd */ + + memset (date, 0, sizeof *date); + /* verify we have a valid date conversion */ + if (convert_date (date, odate, from, to, DATE_TIME) == 0) + return xstrdup (date); + + LOG_DEBUG (("invalid date: %s", odate)); + return xstrdup ("---"); +} + +/* Format the given date/time according the given format. + * + * On error, 1 is returned. + * On success, 0 is returned. */ +#pragma GCC diagnostic ignored "-Wformat-nonliteral" +int +str_to_time (const char *str, const char *fmt, struct tm *tm) +{ + char *end = NULL, *sEnd = NULL; + unsigned long long usecs = 0; + + if (str == NULL || *str == '\0' || fmt == NULL || *fmt == '\0') + return 1; + + /* check if char string needs to be converted from microseconds */ + if (strcmp ("%f", fmt) == 0) { + errno = 0; + tm->tm_year = 1970 - 1900; + tm->tm_mday = 1; + + usecs = strtoull (str, &sEnd, 10); + if (str == sEnd || *sEnd != '\0' || errno == ERANGE) + return 1; + + tm->tm_sec = usecs / SECS; + tm->tm_isdst = -1; + if (mktime (tm) == -1) + return 1; + + return 0; + } + + end = strptime (str, fmt, tm); + if (end == NULL || *end != '\0') + return 1; + + return 0; +} + +/* Convert a date from one format to another and store inot the given buffer. + * + * On error, 1 is returned. + * On success, 0 is returned. */ +int +convert_date (char *res, const char *data, const char *from, const char *to, + int size) +{ + struct tm tm; + + memset (&tm, 0, sizeof (tm)); + timestamp = time (NULL); + now_tm = localtime (×tamp); + + if (str_to_time (data, from, &tm) != 0) + return 1; + + /* if not a timestamp, use current year if not passed */ + if (!has_timestamp (from) && strpbrk (from, "Yy") == NULL) + tm.tm_year = now_tm->tm_year; + + if (strftime (res, size, to, &tm) <= 0) + return 1; + + return 0; +} + +#pragma GCC diagnostic warning "-Wformat-nonliteral" + +/* Determine if the given IP is a valid IPv4/IPv6 address. + * + * On error, 1 is returned. + * On success, 0 is returned. */ +int +invalid_ipaddr (char *str, int *ipvx) +{ + union + { + struct sockaddr addr; + struct sockaddr_in6 addr6; + struct sockaddr_in addr4; + } a; + + (*ipvx) = TYPE_IPINV; + if (str == NULL || *str == '\0') + return 1; + + memset (&a, 0, sizeof (a)); + if (1 == inet_pton (AF_INET, str, &a.addr4.sin_addr)) { + (*ipvx) = TYPE_IPV4; + return 0; + } else if (1 == inet_pton (AF_INET6, str, &a.addr6.sin6_addr)) { + (*ipvx) = TYPE_IPV6; + return 0; + } + + return 1; +} + +/* Get information about the filename. + * + * On error, -1 is returned. + * On success, the file size of the given filename. */ +off_t +file_size (const char *filename) +{ + struct stat st; + + if (stat (filename, &st) == 0) + return st.st_size; + + LOG_DEBUG (("Can't determine size of %s: %s\n", filename, strerror (errno))); + + return -1; +} + +/* Determine if the given status code is within the list of status + * codes and find out the status type/category. + * + * If not found, "Unknown" is returned. + * On success, the status code type/category is returned. */ +const char * +verify_status_code_type (const char *str) +{ + size_t i; + for (i = 0; i < ARRAY_SIZE (code_type); i++) + if (strchr (code_type[i][0], str[0]) != NULL) + return _(code_type[i][1]); + + return "Unknown"; +} + +/* Determine if the given status code is within the list of status + * codes. + * + * If not found, "Unknown" is returned. + * On success, the status code is returned. */ +const char * +verify_status_code (char *str) +{ + size_t i; + for (i = 0; i < ARRAY_SIZE (codes); i++) + if (strstr (str, codes[i][0]) != NULL) + return _(codes[i][1]); + + return "Unknown"; +} + +/* Checks if the given string is within the given array. + * + * If not found, -1 is returned. + * If found, the key for needle in the array is returned. */ +int +str_inarray (const char *s, const char *arr[], int size) +{ + int i; + for (i = 0; i < size; i++) { + if (strcmp (arr[i], s) == 0) + return i; + } + return -1; +} + +/* Strip whitespace from the beginning of a string. + * + * On success, a string with whitespace stripped from the beginning of + * the string is returned. */ +char * +ltrim (char *s) +{ + char *begin = s; + + while (isspace (*begin)) + ++begin; + memmove (s, begin, strlen (begin) + 1); + + return s; +} + +/* Strip whitespace from the end of a string. + * + * On success, a string with whitespace stripped from the end of the + * string is returned. */ +char * +rtrim (char *s) +{ + char *end = s + strlen (s); + + while ((end != s) && isspace (*(end - 1))) + --end; + *end = '\0'; + + return s; +} + +/* Strip whitespace from the beginning and end of the string. + * + * On success, the trimmed string is returned. */ +char * +trim_str (char *str) +{ + return rtrim (ltrim (str)); +} + +/* Convert the file size in bytes to a human readable format. + * + * On error, the original size of the string in bytes is returned. + * On success, the file size in a human readable format is returned. */ +char * +filesize_str (unsigned long long log_size) +{ + char *size = xmalloc (sizeof (char) * 12); + if (log_size >= (1ULL << 50)) + snprintf (size, 12, "%.2f PiB", (double) (log_size) / PIB (1ULL)); + else if (log_size >= (1ULL << 40)) + snprintf (size, 12, "%.2f TiB", (double) (log_size) / TIB (1ULL)); + else if (log_size >= (1ULL << 30)) + snprintf (size, 12, "%.2f GiB", (double) (log_size) / GIB (1ULL)); + else if (log_size >= (1ULL << 20)) + snprintf (size, 12, "%.2f MiB", (double) (log_size) / MIB (1ULL)); + else if (log_size >= (1ULL << 10)) + snprintf (size, 12, "%.2f KiB", (double) (log_size) / KIB (1ULL)); + else + snprintf (size, 12, "%.1f B", (double) (log_size)); + + return size; +} + +/* Convert microseconds to a human readable format. + * + * On error, a malloc'd string in microseconds is returned. + * On success, the time in a human readable format is returned. */ +char * +usecs_to_str (unsigned long long usec) +{ + char *size = xmalloc (sizeof (char) * 11); + if (usec >= DAY) + snprintf (size, 11, "%.2f d", (double) (usec) / DAY); + else if (usec >= HOUR) + snprintf (size, 11, "%.2f hr", (double) (usec) / HOUR); + else if (usec >= MINS) + snprintf (size, 11, "%.2f mn", (double) (usec) / MINS); + else if (usec >= SECS) + snprintf (size, 11, "%.2f s", (double) (usec) / SECS); + else if (usec >= MILS) + snprintf (size, 11, "%.2f ms", (double) (usec) / MILS); + else + snprintf (size, 11, "%.2f us", (double) (usec)); + + return size; +} + +/* Convert the given int to a string with the ability to add some + * padding. + * + * On success, the given number as a string is returned. */ +char * +int2str (int d, int width) +{ + char *s = xmalloc (snprintf (NULL, 0, "%*d", width, d) + 1); + sprintf (s, "%*d", width, d); + + return s; +} + +/* Convert the given float to a string with the ability to add some + * padding. + * + * On success, the given number as a string is returned. */ +char * +float2str (float d, int width) +{ + char *s = xmalloc (snprintf (NULL, 0, "%*.2f", width, d) + 1); + sprintf (s, "%*.2f", width, d); + + return s; +} + +/* Determine the length of an integer (number of digits). + * + * On success, the length of the number is returned. */ +int +intlen (int num) +{ + int l = 1; + while (num > 9) { + l++; + num /= 10; + } + + return l; +} + +/* Allocate a new string and fill it with the given character. + * + * On success, the newly allocated string is returned. */ +char * +char_repeat (int n, char c) +{ + char *dest = xmalloc (n + 1); + memset (dest, c, n); + dest[n] = '\0'; + + return dest; +} + +/* Replace all occurrences of the given char with the replacement + * char. + * + * On error the original string is returned. + * On success, a string with the replaced values is returned. */ +char * +char_replace (char *str, char o, char n) +{ + char *p = str; + + if (str == NULL || *str == '\0') + return str; + + while ((p = strchr (p, o)) != NULL) + *p++ = n; + + return str; +} + +/* Remove all occurrences of a new line. + * + * On success, a string with the replaced new lines is returned. */ +void +strip_newlines (char *str) +{ + char *src, *dst; + for (src = dst = str; *src != '\0'; src++) { + *dst = *src; + if (*dst != '\r' && *dst != '\n') + dst++; + } + *dst = '\0'; +} + +/* Strip blanks from a string. + * + * On success, a string without whitespace is returned. */ +char * +deblank (char *str) +{ + char *out = str, *put = str; + + for (; *str != '\0'; ++str) { + if (*str != ' ') + *put++ = *str; + } + *put = '\0'; + + return out; +} + +/* Make a string uppercase. + * + * On error the original string is returned. + * On success, the uppercased string is returned. */ +char * +strtoupper (char *str) +{ + char *p = str; + if (str == NULL || *str == '\0') + return str; + + while (*p != '\0') { + *p = toupper (*p); + p++; + } + + return str; +} + +/* Left-pad a string with n amount of spaces. + * + * On success, a left-padded string is returned. */ +char * +left_pad_str (const char *s, int indent) +{ + char *buf = NULL; + + indent = strlen (s) + indent; + buf = xmalloc (snprintf (NULL, 0, "%*s", indent, s) + 1); + sprintf (buf, "%*s", indent, s); + + return buf; +} + +/* Append the source string to destination and reallocates and + * updating the destination buffer appropriately. */ +void +append_str (char **dest, const char *src) +{ + size_t curlen = strlen (*dest); + size_t srclen = strlen (src); + size_t newlen = curlen + srclen; + + char *str = xrealloc (*dest, newlen + 1); + memcpy (str + curlen, src, srclen + 1); + *dest = str; +} + +/* Escapes the special characters, e.g., '\n', '\r', '\t', '\' + * in the string source by inserting a '\' before them. + * + * On error NULL is returned. + * On success the escaped string is returned */ +char * +escape_str (const char *src) +{ + char *dest, *q; + const unsigned char *p; + + if (src == NULL || *src == '\0') + return NULL; + + p = (unsigned char *) src; + q = dest = xmalloc (strlen (src) * 4 + 1); + + while (*p) { + switch (*p) { + case '\\': + *q++ = '\\'; + *q++ = '\\'; + break; + case '\n': + *q++ = '\\'; + *q++ = 'n'; + break; + case '\r': + *q++ = '\\'; + *q++ = 'r'; + break; + case '\t': + *q++ = '\\'; + *q++ = 't'; + break; + default: + /* not ASCII */ + if ((*p < ' ') || (*p >= 0177)) { + *q++ = '\\'; + *q++ = '0' + (((*p) >> 6) & 07); + *q++ = '0' + (((*p) >> 3) & 07); + *q++ = '0' + ((*p) & 07); + } else + *q++ = *p; + break; + } + p++; + } + *q = 0; + return dest; +} + +/* Get an unescaped malloc'd string + * + * On error NULL is returned. + * On success the unescaped string is returned */ +char * +unescape_str (const char *src) +{ + char *dest, *q; + const char *p = src; + + if (src == NULL || *src == '\0') + return NULL; + + dest = xmalloc (strlen (src) + 1); + q = dest; + + while (*p) { + if (*p == '\\') { + p++; + switch (*p) { + case '\0': + /* warning... */ + goto out; + case 'n': + *q++ = '\n'; + break; + case 'r': + *q++ = '\r'; + break; + case 't': + *q++ = '\t'; + break; + default: + *q++ = *p; + break; + } + } else + *q++ = *p; + p++; + } +out: + *q = 0; + + return dest; +} diff --git a/goaccess++/src/util.h b/goaccess++/src/util.h new file mode 100644 index 0000000..1b0bfd9 --- /dev/null +++ b/goaccess++/src/util.h @@ -0,0 +1,97 @@ +/** + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana + * + * 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 UTIL_H_INCLUDED +#define UTIL_H_INCLUDED + +#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) + +#define REGEX_ERROR 100 + +#define KIB(n) (n << 10) +#define MIB(n) (n << 20) +#define GIB(n) (n << 30) +#define TIB(n) (n << 40) +#define PIB(n) (n << 50) + +#define MILS 1000ULL +#define SECS 1000000ULL +#define MINS 60000000ULL +#define HOUR 3600000000ULL +#define DAY 86400000000ULL + +/* *INDENT-OFF* */ +#include +#include +#include + +char *alloc_string (const char *str); +char *char_repeat (int n, char c); +char *char_replace (char *str, char o, char n); +char *deblank (char *str); +char *escape_str (const char *src); +char *filesize_str (unsigned long long log_size); +char *float2str (float d, int width); +char *get_global_config (void); +char *get_home (void); +char *get_visitors_date (const char *odate, const char *from, const char *to); +char *int2str (int d, int width); +char *left_pad_str (const char *s, int indent); +char *ltrim (char *s); +char *replace_str (const char *str, const char *old, const char *new); +char *rtrim (char *s); +char *secs_to_str (int secs); +char *strtoupper(char *str); +char *substring (const char *str, int begin, int len); +char *trim_str (char *str); +char *unescape_str (const char *src); +char *usecs_to_str (unsigned long long usec); +const char *verify_status_code (char *str); +const char *verify_status_code_type (const char *str); +int convert_date (char *res, const char *data, const char *from, const char *to, int size); +int count_matches (const char *s1, char c); +int find_output_type (char **filename, const char *ext, int alloc); +int hide_referer (const char *ref); +int ignore_referer (const char *ref); +int intlen (int num); +int invalid_ipaddr (char *str, int *ipvx); +int ip_in_range (const char *ip); +int str_inarray (const char *s, const char *arr[], int size); +int str_to_time (const char *str, const char *fmt, struct tm *tm); +int valid_output_type (const char *filename); +off_t file_size (const char *filename); +uint32_t ip_to_binary (const char *ip); +void append_str (char **dest, const char *src); +void genstr(char *dest, size_t len); +void strip_newlines (char *str); +void xstrncpy (char *dest, const char *source, const size_t dest_size); + +/* *INDENT-ON* */ + +#endif diff --git a/goaccess++/src/util.o b/goaccess++/src/util.o new file mode 100644 index 0000000000000000000000000000000000000000..5b1a5a3998b3802821f94c3f007162bbbf944a4b GIT binary patch literal 28440 zcmeHve|%KcweQIfBofTTO55~m<*1>8m6*v7O%Q8_1UM-JL=(gxU>GJdWJ)p?wF*k!ckR9Q zWN~2nUf<`v|GGcSoU_0CyVqWO?X}n5=gcN|E)Fg!EGV!{DzH9fP2~(~Srwm|x^Ggq zP1Y>y9Lu-uqrPot4DU~0II+<;yUA+U3Tw?|osq0t;e>w| z%>0Lw+3RFpR|R{D=UOPdDVWKw4XoK69bfFv;(m8df6`}_llef49_ugAH<{l08-*IjLQhTdq4`V!Nqw_VO?@tnE1 zaWXBHjz7D%rLtkwb*ry;wl80?vhA8{+dF*oiYpD9NY&eKxY4qF^I9s)4IBl$a8FC+ zrxa{EBk#C<&JWMLV7Poy$pypC*m+k($CaL~Lr=m~Pdk|(J3o8f$?S9f^s2M-^?9li)RM5v{X(88(&WE*;8aWqfoBPsnx2cE1aPx+ip^J%vr?A9H01w zY6K>2(c=pn=j`j-Hr>C!so|*a?{<;51q$}TOI~l$L%{q|Ws*S0V*e``#2Mrs(+01$ z(xok#Ll`tASN9{cQ*%eMcU|S82Tdzv{E`FV`oqI&fWJRiI-PxlsQ} zuG8($<}A|Jn)$$gFgWH`RtCrBkZmx3TSphZKn7V#23e$f{rG$osX6kL%G1nQ2frP> z-Ll+|4)zyV?%B&ne&@~%5Rwin`#YI8HF;=vLF30s_?=(#XPwbtWj7pTrt)Rq$S8~m zC+R0A39Jp=9OyLj!pZzT$RaQr|7ygk*f6o(8Ojy}Gj9bmzki}oDc4e2qM93ex4<{N z9Z+!Wvz66UK7%ruW4Y3i^^=p6!Lg3YCN#mN`-7Q|%5p^sj^d7_j4V*RU}c*#>QKkoPf#KFQ-#l(!ux-T!Xq}S=lq}a zo=cihzfRKopGeSHOXa0nA6>pHh&in_SE`JFw4+#6JrT_O$uzX3S7`w%7yc=j*<%Xt zZzC=K8@?1Gf)V^-%D>T>`yPYj!0Oh_BpfXBOH3tlv)0Ui!qdjoAUk8tm|B2 z3>_|VVBO6(JVt@X8LP)P^+^kS`(fV~v*%e@3>!V=Qzf$>qcNGP$t4gzoDE>*gHmgC z+zM=mH%zW2EpzcP(BX_-MQzf2)_zWUu5HcibTYexV=5f_-*NWtq`EsOF!?9_S=AvJ zduq`;@HmxmAZ*P%Nt1f-E~>E`3~Qm}p3aakqFRa6{NYGkeo`bZfl>DsS3<6Zczo}2>$W}rUtT=789OIpQ(T&K z{`6b5>>vJ6AX8ka%`^1wq~5Jfd}2J9K{Q4NF-hU{SMw@0KV$GV^=e3CTKPU4uGKrIU z3wzHK@R7jwzoGFRdIJgyOUxxpyyDN2Eij6-;j17^(7L280i70dG(q>xwAbd*T4Su{ zPL0*a(CY@;!ts9G?5Zc8S8TPvRr`!n6xn+QHA;Jl67ARNi*n8&8t9`2ZldTnsQ8(; zbx%*|l^qLpF*;D8%1lqFd#ZUvWsDOzC1x== z&O^o6xfL6N`;xQseTW&T0U{6-p39-Rp9s@Uu?b8vZ%mLA2stG?V{t(SQ|e8V&Nnc^7z4UQ)_kW*m=dR zjW4+K^yonJIaB)&XK12;3TL8`=1JYi1U*Vkt;E7SIzCRR2@=-uiO)^R)A0gNoX4M- ziDAo8X^~P}i^)j{Z`|#>=K(6#5bkKwz2*2W*^RQzi=4ZT!)jOi?)esxDC4ty_vn4K zidTdcS=OeD-}2p{0A3d-KEm_ZgTq#8U-Gz8N^ewDG|)Dg>Z~(zu>ahgG9D=t+sEPV zLoZ|PLooc=Vdu;Pq;vKy-}Tvv=hS$4Y8)9tKWP4Y@r{fNdzGGQug>Q`K8sLeFKT!D ze|_ z5S~Gu%)5^7UyeCD-@It(-SD0IJ;l^yMz&kqXXyydo z=bi6l-XnbQnC+gik@Z>5REW@DP4!GPVj&z3;SUo^r+( zRw&9%YnNv(t>jfn_D?+z(0-*ITWNYEIPTu2YM|;!ZVT_*c8-(T38Pm{+&JZOgU4q0 zMg|dmo>&v7@V~P#ni)9Z+t!XD+KnM{s|Jsq<+g6VZ1C8b>HRy_xJ0781QD+R@f=8e zVM^Yf0`;yEMxsl_`mb1x~jx1AI_%GfE3+waxN6$;U z(Z^Hm!|!8#+e(M=4Eo=}aWcCmDyRChWrj0$D@NrlCxgAibG~gWkU2K|BlmJA^Sm>b zDj0lkP5RfqZOd?zbOU!@jG}V~-;1Z0>?xd~*i?OJccH44{xPNuz00)*-*eL!?I}D{ zNk{R-*Y)$kp2D+o&;#Ic`(PXyL?6e|KU%@Jce}kk)@M?QxD`%qvQ{MQa3UU!ZLp)U zo`{`JMY=3!9R>X3VhWq%N!4kO+mtkrWE7%hIXjWj%>-sOPeX z8>UiISVbCHHw;*@_@+=#tjq2Sxe;p1nm>QO<+oPFH^vj22cd*k|Qr#R2oG_IF`dkLDtcM9$Lts1mlqpmf$ z*5Xr#Pdz@D<8uW*4OT5UwcylN*Wgo&PaQt>_*`Mtp{x#NbtuEfo^Q8>26`iL*SgdGeeH=vFmLj83pqqZU`cmAqtTXlINz5zvO&yV)}5beJLw8i~>k+2(bV~M!E zBm{?nay4kD#*f0~u~ZlI4ZD#pBM&9epavSidFpB)ss|r6CgNQ&C2OjyHPF5m z66?UP$F&jHMySzu<#^HPIk>sXG(q2q1h%!HYP);Ul?d|J{ zkUgPmJ#1VLW7fl%^)P0A4J1MTdT3b>E$hj}`}-j`nn?DlZiad+j4QDAv~pYvqletJ z5#3c7!h(iCntNh2Xi9~Y1=&+5omy6DvlrB!hnciTY6 zomA}Bh@FU{4LzMPna~(!xf_e8G3~e$7_LZc6NZ-Bh{Z8(uzO!9=~7+7lG=r6QlNhO z=9nAqj>R`%pc8H)oaljgwoxdxk>n)olp@)EhN1MsghKt5%NE!jQ&Q~|8F&4FYALKu zy&0h{L^Q&3tTiNtO25a!^vb|~Iuhc#EVYN0+&K0TxI3ZUrK zM-C1LA-!oF(Mb}4$&dOg67l(=wA-CX#%P{wib!W#0KZA~CE}@w9Ze>B?GU;XOLi$U z4zL=KLlY8lnT7zprb=pZ+Fb~Rakz9c;--^vbYXyEH*s|P^{9siBJNaG9z3=a1_)e`(}t0y5zZ+=gF(Yh;L^n%D$pyNiXl(}5cE)gdAi4q&2NVd z(ir&Fk@YQs>#nq~UD9mVHToO0z7z%mJs5$(dgrPVf~b*;8ErRr zCt|Sv0^JfJi9U)YDK#|OAybKTG91a(S3xR4KHP@+5{jeCJp*b?6i;=jZ>q%ZB`$(A z`NeWouOre6H8G!h2JE>A%_`i@Gy2i^w?`uOO0=G|TiB|`6?x!eDa>e$d{-9{hcY7E8zSDQ7QNcZSD1zSalM*SmuE{|Xicd6=u zo}R>Jsco+=qwz?k`?TLuJ+h}713Pe1CzPSoN=_q&MH)Oar#oW3kwhAkoM)Mhq@eOWwPV)r_V|p*f0b#x-P=EYt(;}C1y*0@7sVfno#$3BMg4on2 zn6xNjmx1O<3CLxU+E#Nv~tD^MasIC^*#c)J-!0t+`bv6}2(12&^t!^%?#PeBx;lV~qI^#6U9c@f zeXeFZh}v+RC9y~kX71FM67AGcf99^(5R3QEBkzo3OGulXa8H6F5!QUDjB!Lqm08eE zx00r}NZ9sKf8#lyq`41&+<=AW+DHfwF3f9`?RfMO3Ss*w^l5Jonl&&S!SF{Z&_wiz z>Vd>oQ}Ef!SbAyK1bc3ZVH8AF+Lj8w)6vmp%w~*f6WFfYjmDvo#v#9bu*oqSoNjs~ zV}B%5@o;E8v6+P&io;9MgUunelJOo5D}Z@+(s9x3I4F>$`%*3z-Ciw*HpGxa;Roxf zv^&Rjy@!R*s)ssSGVS!#;8?VoMt#=7&c!q3RooH`q4wud^~j)hei;0dyF(jt$WivY zj<>}WyxXTDEcd&H;#zZ0BHgv5CzOmJgPCHQfS!7Lq+JWDs%J$pz}WEr`TAY-Y>9rU zcyLlX!kKe%njRdy@>V8e@O}zd={PJM?&i>{I)H}^FF#M`z305OF)Z6TN2p z!lU)q%U><?<##Q|CGKy%Gb85kze=x$Lkj1I_U0yJwW9RU%ppe z2ZyWF)oQxG$y(anyuhBjYJEEHrtQY6x~l5={a_yQsO$9x5)3lvT8pl`kqQY2Ll(8Jt-LWgYR5E~2l+W#xAlt}QFUEy?~YVMuf6 z3uQxv?K8?soYEFBsGTnpj`TWxEy=YNptf4d`U-c=D6<1)6#>=cvQpL0eZ)n&L|-f$ z*H`#{oUTEVa~;}QQd)SUx+qQw`b;Sw$3fYp%vl5@l0NqrE-I_IuV_)3JyyJ^Z0^0& z0%g^ApAjf)7@FQv_Gm%j*JhM801A}N1qIYaN>Qh@4b}Tu)-P~xb&#yZB+JRkYRSoJ zFKa7ogD4=Uh}u|I0#pCw*`Ja6BFr6}6Pv zh3jURp$n9%ajT#{A}NPe+)ZlSs)5yU*+n@y7=^owcwDNB&MJ@t6DTFyb#t9*T<8A6 zCDh-=)Ze9KJJsJ7vfa|M!Ggm6)7oxnDfQ!jvaEl=z3#^{YQGJ3>Ow!XKRBfpaSt(< zj<;!>Kv(K>+h;X3KptmVHi~ERq_{7~y%xiG$BeRakUm|CSCsI7<|yAaHsrpOTjg3u zGmaW>*bDW#xt@BcR`rz57;ns*=3KqjQc;iWww3FxC!J95KJvLS^0|A9;SG0_&kdd7 z&M2FUVa)m1l2X_d;{l)2PG?o3`Wq~3CClQuyR^){)#$BwvnW6ywbPf<6?0tq$sNW^ zRNPp|ypIqMoo$7Okj*<7SMx>HS2hpA&mKlkb%=nU5qB^@_wRGuR&D!#X0F?(CmH52E^=`+#?hon>6|F6+CMVSDl%r@S1xY0HvW)85jL{fs z|7oVW%ggLFsug&K>W9O;D~V@p#(vQw^r3cK=K6_?MA#O_Y89gO{xW0a2RWH)98yMY zsIASFcf=|o+}ON zw3ua`L-TnB#qPqp5o=mX3;Pk0wEk@Q!$T?jqvdpg-CzlpkbQj8p73$hhO-->ve~tW6&L zUdFv6{I`s6@$kRMxV}ymeueQzrXY3qRmQ*R!N0-y4?Ot4sQek$pa-V|(`28lx=ww4 zU)@f#emn)KyPb^h^5A8rzSQ#i z+Xc+m^`;uRnEBrMqUBDr&hp5wW&YeL5$djy<$v76znb|veoR$b%=|eX{xaq_O;Od| zHO#-t!(YvKz=N-4e5nT~VMW$Vk95llgZCk<0OMS84_|wMd&icFhVtN_%Y#3V2Y(1S zwQJ)_iPjrR59i^3i}`KLpQGv4xAX9~F@KQxuQUILdHB2X;Lov~zCtbF5|;BD#~}PeoImElKgfd@LN3|I?Bk7mALChGuhlaibUGLK>Bj5AJovmkcx@hh0dUf%oVOP0 zc@XU`%foMH{!!+uXFc#EjE_&(hBV_7&m$+D2OrLZKadB1C=X8KcRIU$I}iTdJowH$ z_#WWOZoJ{TN_X2jz<3+u>KPSfujG;Q$2|CnJoq&D$Lac22AuR6dw|w*Ws~yCcls%6#=q3t0~^Zhu${*86qK`br)-k1&6b`RX|pRUbC;c|Z=Z zo)(|5+#K%2k+pEQ)!DgZ)r#hh)|D$dJFBi}xZH1r6J3#%RTXTmrY}Ez)zDWhebv!d zJ$+q4UpSmY--@Yj8&zIa!f`?>Q`K;EknUAQoDrmZRbSt#N;q8y80YKgTUEswJGxg@ zYgE-5RS72p30Ljas=Bobuhoc>P^%^AQYE=oNvl=TYL&EFC8u7M)+uJ4l2E66swC7Y zX?2>TYT>LQTCYjGDK(KS=k|phnJ32c8i-Lxo3+TcIx1b_g_h7B%0GpTE_dNJCgS zg#Hk!($_hDA*@-;@WEf7Q0dt`_-_Rs6nyiXOLCSAd>;1El)Un51TN*6=PBaTnrig9 zLGbAvh`~S4IJQYx|EBPr0;i?M@DB)_mI#9vkN_lVw;dmYM+M#?@P`?v%W8Zon(>A7 zBf+ON#>m;9hyU*${0)9E{TSAHN~F&X_!v2tGj7_Q$?e`C__E#gdHB5^+~s}1H-sG7 z?kgUCc{6EeS?_spm)Bh%DUL)Jsn2YIuR)pVS5V-x-Rl@P{Wb00FZgSPoG%Gn%K5&) zZx;Mt<-y<2gMX4=EK;$Q(<<;zAwQZ2|674eIotB!KNYx?|3)7CgutcWeuSUyY5#lk;6D+#^oQdDm-1)wb11bdJ1V1A1=LIg~+kfPdb4>7~Le30+P$PXd2>fiu z$qwBD{~LkRpA0Z|xIp0N3Vg1>&l7l^z&|eVM#f2>n82F^pW@*^2k?c|Ch%_LjXtXd ze!jrNjC{_?HR%69R7*a^$?&F7Sllzbx=RfzRgmDy07{0>47wv?Vg*o)EZO30D=+$H$ZJ}(G7CFHy&@1H@Z~yEITIu#vV+7w zDR8OhKM7o}zdQ5bFAH4CIiKGj)FYr4Be?8+gUY7{GNARV6ZWXxH zCnMyL$}jN#>%sjLXO;zJ&_0hsgNV(9}@VbLjHdWe7?ZX50~|0eJ&1pb1+8wCEcz#9c#d^R#jq^Gpo3dYH93-B@hx>?}# z?$Y2~A4G z6d`%#OlO?>CHvbbaH&sA9=t=~4?>o)!v=vb7x+U0m+~JLxYYkKey>h?O8zc^Oa2jF zUx4PfzNX~n>&v|_;h@>GS1-yzpQA!J`bSJCKJW*4^almR^J*Y z`74QlM0*}ehHo=otzm@|znyW4X_O5Add8a+IwfD9H^A{pfs_6ZGQUmWB>yJHX^%w7 z$T#oB)+uyKekb$01y1s9axkPmeaY!h=N2gS>q}1l^~@g>IO(&2`CA08?9cphffIit z^U3!pQI`0Jn71VXPW*o6 z?-MxjZ)5%effN5x<{uI`@$Y2*VSy9>0P~LuocMGOgwnhElIw2;O%O_4P8Z_e!+CRl zow6jqjrrvs{wU`w1Wx=d%(n$j^6%&TT!9lm%lvAA6W_egZ4fx|-(`N2z={7w&O09b zOPn|7QYcIO?=XJ7;FJ97Y4}1~Cvf7^c@;|C0w;bq^ZNu&eD#-!aP1d3@wYO6P~gN@ zf0GK=EgqcCy-*tW;LmgZL4lL}11x{5z)Ai=&Oah>;wxj|@~FUx{}Si73!L~(REU%n zI6*IS{%L^|znl5{1WwRvoIfCN;%{aCA%PP#!TG}iC;mR>9~C%3Z*u-!5B@gi)xroK zWr<(PaifH<2B-5pl*&E$C7d_^zk&FqPdR-dnYd`=R55?9kVDiq=2r`x^r_)|g9pEy z^GzOnCFdOvPUn0mwR!Mf&YO5_^nZ}`S?A&3!g=%mFAVPv zf~`S;Q-23IzeV80uV((Zz=?l5=O6UocX58J2mcD^9}zgo?`Qds3Y_HsBj>jZocP`i@5jgP&ng6K3iGL2~w+o#3 zk1#(gaN>WI^G^$$`1_c@PvFF-^J$b02%PxlMb9CD6F*C3NQXW6Y|bC`;C{}(>%nU| zuO7%C&-m5VjF<5K!r%eM%RTrtjGO(G;kPqxd-xH?>0A{h!{1=|8n(#I*wqwL=fTZB zxXXjvBoJv(eQOycr;YKg9(<7TpL_5=Zv3zZ-^%z*u18t=RI~oo9^ClHXFa$%pKA64 zMvgg$YSwXsn{%k=5rAaya*i_%9^9PQ?D62{Jf(@}MvghBNas4Gd~;5*ocm|^=A2@k z2RG*q={%#9W6l?T&4Ul}bE)y$oP5TOUm4t-3v6QlF}OJwc)bTV=K_a4xH%X2s0TOa z0uOs|b1tx)_m!qyb1tybgPU`KK@UF8???JQ_&&z(_2B0GpV=>)cFp;}r#*ag&QERT zFaU;c&iO5*AR=&co^PE8-^%Y7tg6&NFaDMvt~lJJuHEJ?8R-dCsUt*HIM@`js@A7c zR#h@V8KV2Ea9~Ylaq3NHaizM7h&!NF>Qs~|uL`GJI=;u1kwevRqF4Pruqyn;oJbY^ z^YwgnK+V$m4e@jp{wN8K0=WY$KGNM8O@{v8{H+QbHlr!bX2P9LO?>VDDBtj<{N$`f zzcG_bHF@x+B^o%&@89S(CAGubrQH8R`2^!UeRL&!Z}+ro3OL-DtaT~wNap`-eLw1w z%o==TGVKp|1e^BFwF#9@SHFP_gY=1+`f9#S|4sdsD4=`tXPMSrtaD~NXUa@{lc#r) zRNtefHOTd=dA=LIZEpCw8rRc}Uo{=7K^kZMY5b^d(|!dNA|>#l_Ia2IQt8o8>T5OU z&BgeSx!#U~)73x3_1jEEzMA&U^>bX`+fFq(1`=O%2H(^cC3F3}xK{=IwZ>bKaZ}H5 zzls~$*PJqbT;DcCz8bv^{C(VzOmF=`u0QCRnBMx^Q1^7>myPHa#@R7w{OBhoQ{Rl= z>DpE`YjyoCyk61xww|Uw`KQbJ#Ib?Yg8$$fk4|1bC4 BY-Iod literal 0 HcmV?d00001 diff --git a/goaccess++/src/websocket.c b/goaccess++/src/websocket.c new file mode 100644 index 0000000..6f0d90a --- /dev/null +++ b/goaccess++/src/websocket.c @@ -0,0 +1,3018 @@ +/** + * websocket.c -- An rfc6455-complaint Web Socket Server + * _______ _______ __ __ + * / ____/ | / / ___/____ _____/ /_____ / /_ + * / / __ | | /| / /\__ \/ __ \/ ___/ //_/ _ \/ __/ + * / /_/ / | |/ |/ /___/ / /_/ / /__/ ,< / __/ /_ + * \____/ |__/|__//____/\____/\___/_/|_|\___/\__/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana + * + * 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if HAVE_CONFIG_H +#include +#endif + +#include "websocket.h" + +#include "base64.h" +#include "error.h" +#include "gslist.h" +#include "sha1.h" +#include "xmalloc.h" + +/* *INDENT-OFF* */ + +/* UTF-8 Decoder */ +/* Copyright (c) 2008-2009 Bjoern Hoehrmann + * See http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ for details. */ +#define UTF8_VALID 0 +#define UTF8_INVAL 1 +static const uint8_t utf8d[] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 00..1f */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 20..3f */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40..5f */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 60..7f */ + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, /* 80..9f */ + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, /* a0..bf */ + 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, /* c0..df */ + 0xa,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x4,0x3,0x3, /* e0..ef */ + 0xb,0x6,0x6,0x6,0x5,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8, /* f0..ff */ + 0x0,0x1,0x2,0x3,0x5,0x8,0x7,0x1,0x1,0x1,0x4,0x6,0x1,0x1,0x1,0x1, /* s0..s0 */ + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,1,1, /* s1..s2 */ + 1,2,1,1,1,1,1,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1, /* s3..s4 */ + 1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,3,1,1,1,1,1,1, /* s5..s6 */ + 1,3,1,1,1,1,1,3,1,3,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* s7..s8 */ +}; +/* *INDENT-ON* */ + +static int max_file_fd = 0; +static WSEState fdstate; +static WSConfig wsconfig = { 0 }; + +static void handle_read_close (int conn, WSClient * client, WSServer * server); +static void handle_reads (int conn, WSServer * server); +static void handle_writes (int conn, WSServer * server); +#ifdef HAVE_LIBSSL +static int shutdown_ssl (WSClient * client); +#endif + +/* Determine if the given string is valid UTF-8. + * + * The state after the by has been processed is returned. */ +static uint32_t +verify_utf8 (uint32_t * state, const char *str, int len) +{ + int i; + uint32_t type; + + for (i = 0; i < len; ++i) { + type = utf8d[(uint8_t) str[i]]; + *state = utf8d[256 + (*state) * 16 + type]; + + if (*state == UTF8_INVAL) + break; + } + + return *state; +} + +/* Decode a character maintaining state and a byte, and returns the + * state achieved after processing the byte. + * + * The state after the by has been processed is returned. */ +static uint32_t +utf8_decode (uint32_t * state, uint32_t * p, uint32_t b) +{ + uint32_t type = utf8d[(uint8_t) b]; + + *p = (*state != UTF8_VALID) ? (b & 0x3fu) | (*p << 6) : (0xff >> type) & (b); + *state = utf8d[256 + *state * 16 + type]; + + return *state; +} + +/* Replace malformed sequences with a substitute character. + * + * On success, it replaces the whole sequence and return a malloc'd buffer. */ +static char * +sanitize_utf8 (const char *str, int len) +{ + char *buf = NULL; + uint32_t state = UTF8_VALID, prev = UTF8_VALID, cp = 0; + int i = 0, j = 0, k = 0, l = 0; + + buf = xcalloc (len + 1, sizeof (char)); + for (; i < len; prev = state, ++i) { + switch (utf8_decode (&state, &cp, (unsigned char) str[i])) { + case UTF8_INVAL: + /* replace the whole sequence */ + if (k) { + for (l = i - k; l < i; ++l) + buf[j++] = '?'; + } else { + buf[j++] = '?'; + } + state = UTF8_VALID; + if (prev != UTF8_VALID) + i--; + k = 0; + break; + case UTF8_VALID: + /* fill i - k valid continuation bytes */ + if (k) + for (l = i - k; l < i; ++l) + buf[j++] = str[l]; + buf[j++] = str[i]; + k = 0; + break; + default: + /* UTF8_VALID + continuation bytes */ + k++; + break; + } + } + + return buf; +} + +/* Allocate memory for a websocket server */ +static WSServer * +new_wsserver (void) +{ + WSServer *server = xcalloc (1, sizeof (WSServer)); + + return server; +} + +/* Allocate memory for a websocket client */ +static WSClient * +new_wsclient (void) +{ + WSClient *client = xcalloc (1, sizeof (WSClient)); + client->status = WS_OK; + + return client; +} + +/* Allocate memory for a websocket header */ +static WSHeaders * +new_wsheader (void) +{ + WSHeaders *headers = xcalloc (1, sizeof (WSHeaders)); + memset (headers->buf, 0, sizeof (headers->buf)); + headers->reading = 1; + + return headers; +} + +/* Allocate memory for a websocket frame */ +static WSFrame * +new_wsframe (void) +{ + WSFrame *frame = xcalloc (1, sizeof (WSFrame)); + memset (frame->buf, 0, sizeof (frame->buf)); + frame->reading = 1; + + return frame; +} + +/* Allocate memory for a websocket message */ +static WSMessage * +new_wsmessage (void) +{ + WSMessage *msg = xcalloc (1, sizeof (WSMessage)); + + return msg; +} + +/* Allocate memory for a websocket pipeout */ +static WSPipeOut * +new_wspipeout (void) +{ + WSPipeOut *pipeout = xcalloc (1, sizeof (WSPipeOut)); + pipeout->fd = -1; + + return pipeout; +} + +/* Allocate memory for a websocket pipein */ +static WSPipeIn * +new_wspipein (void) +{ + WSPipeIn *pipein = xcalloc (1, sizeof (WSPipeIn)); + pipein->fd = -1; + + return pipein; +} + +/* Escapes the special characters, e.g., '\n', '\r', '\t', '\' + * in the string source by inserting a '\' before them. + * + * On error NULL is returned. + * On success the escaped string is returned */ +static char * +escape_http_request (const char *src) +{ + char *dest, *q; + const unsigned char *p; + + if (src == NULL || *src == '\0') + return NULL; + + p = (unsigned char *) src; + q = dest = xmalloc (strlen (src) * 4 + 1); + + while (*p) { + switch (*p) { + case '\\': + *q++ = '\\'; + *q++ = '\\'; + break; + case '\n': + *q++ = '\\'; + *q++ = 'n'; + break; + case '\r': + *q++ = '\\'; + *q++ = 'r'; + break; + case '\t': + *q++ = '\\'; + *q++ = 't'; + break; + case '"': + *q++ = '\\'; + *q++ = '"'; + break; + default: + if ((*p < ' ') || (*p >= 0177)) { + /* not ASCII */ + } else { + *q++ = *p; + } + break; + } + p++; + } + *q = 0; + return dest; +} + +/* Make a string uppercase. + * + * On error the original string is returned. + * On success, the uppercased string is returned. */ +static char * +strtoupper (char *str) +{ + char *p = str; + if (str == NULL || *str == '\0') + return str; + + while (*p != '\0') { + *p = toupper (*p); + p++; + } + + return str; +} + +/* Chop n characters from the beginning of the supplied buffer. + * + * The new length of the string is returned. */ +static size_t +chop_nchars (char *str, size_t n, size_t len) +{ + if (n == 0 || str == 0) + return 0; + + if (n > len) + n = len; + memmove (str, str + n, len - n); + + return (len - n); +} + +/* Match a client given a socket id and an item from the list. + * + * On match, 1 is returned, else 0. */ +static int +ws_find_client_sock_in_list (void *data, void *needle) +{ + WSClient *client = data; + + return client->listener == (*(int *) needle); +} + +/* Find a client given a socket id. + * + * On success, an instance of a GSLList node is returned, else NULL. */ +static GSLList * +ws_get_list_node_from_list (int listener, GSLList ** colist) +{ + GSLList *match = NULL; + + /* Find the client data for the socket in use */ + if (!(match = list_find (*colist, ws_find_client_sock_in_list, &listener))) + return NULL; + return match; +} + +/* Find a client given a socket id. + * + * On success, an instance of a WSClient is returned, else NULL. */ +static WSClient * +ws_get_client_from_list (int listener, GSLList ** colist) +{ + GSLList *match = NULL; + + /* Find the client data for the socket in use */ + if (!(match = list_find (*colist, ws_find_client_sock_in_list, &listener))) + return NULL; + return (WSClient *) match->data; +} + +/* Free a frame structure and its data for the given client. */ +static void +ws_free_frame (WSClient * client) +{ + if (client->frame) + free (client->frame); + client->frame = NULL; +} + +/* Free a message structure and its data for the given client. */ +static void +ws_free_message (WSClient * client) +{ + if (client->message && client->message->payload) + free (client->message->payload); + if (client->message) + free (client->message); + client->message = NULL; +} + +/* Free all HTTP handshake headers data for the given client. */ +static void +ws_free_header_fields (WSHeaders * headers) +{ + if (headers->connection) + free (headers->connection); + if (headers->host) + free (headers->host); + if (headers->agent) + free (headers->agent); + if (headers->method) + free (headers->method); + if (headers->origin) + free (headers->origin); + if (headers->path) + free (headers->path); + if (headers->protocol) + free (headers->protocol); + if (headers->upgrade) + free (headers->upgrade); + if (headers->ws_accept) + free (headers->ws_accept); + if (headers->ws_key) + free (headers->ws_key); + if (headers->ws_protocol) + free (headers->ws_protocol); + if (headers->ws_resp) + free (headers->ws_resp); + if (headers->ws_sock_ver) + free (headers->ws_sock_ver); + if (headers->referer) + free (headers->referer); +} + +/* Clear the client's sent queue and its data. */ +static void +ws_clear_queue (WSClient * client) +{ + WSQueue **queue = &client->sockqueue; + if (!(*queue)) + return; + + if ((*queue)->queued) + free ((*queue)->queued); + (*queue)->queued = NULL; + (*queue)->qlen = 0; + + free ((*queue)); + (*queue) = NULL; + + /* done sending the whole queue, stop throttling */ + client->status &= ~WS_THROTTLING; + /* done sending, close connection if set to close */ + if ((client->status & WS_CLOSE) && (client->status & WS_SENDING)) + client->status = WS_CLOSE; +} + +/* Free all HTTP handshake headers and structure. */ +static void +ws_clear_handshake_headers (WSHeaders * headers) +{ + ws_free_header_fields (headers); + free (headers); + headers = NULL; +} + +/* Remove the given client from the list. */ +static void +ws_remove_client_from_list (WSClient * client, WSServer * server) +{ + GSLList *node = NULL; + + if (!(node = ws_get_list_node_from_list (client->listener, &server->colist))) + return; + + if (client->headers) + ws_clear_handshake_headers (client->headers); + list_remove_node (&server->colist, node); +} + +#if HAVE_LIBSSL +/* Attempt to send the TLS/SSL "close notify" shutdown and and removes + * the SSL structure pointed to by ssl and frees up the allocated + * memory. */ +static void +ws_shutdown_dangling_clients (WSClient * client) +{ + shutdown_ssl (client); + SSL_free (client->ssl); + client->ssl = NULL; +} + +/* Attempt to remove the SSL_CTX object pointed to by ctx and frees up + * the allocated memory and cleans some more generally used TLS/SSL + * memory. */ +static void +ws_ssl_cleanup (WSServer * server) +{ + if (!wsconfig.use_ssl) + return; + + if (server->ctx) + SSL_CTX_free (server->ctx); + + CRYPTO_cleanup_all_ex_data (); + CRYPTO_set_id_callback (NULL); + CRYPTO_set_locking_callback (NULL); + ERR_free_strings (); +#if OPENSSL_VERSION_NUMBER < 0x10100000L + ERR_remove_state (0); +#endif + EVP_cleanup (); +} +#endif + +/* Remove all clients that are still hanging out. */ +static int +ws_remove_dangling_clients (void *value, void *user_data) +{ + WSClient *client = value; + (void) (user_data); + + if (client == NULL) + return 1; + + if (client->headers) + ws_clear_handshake_headers (client->headers); + if (client->sockqueue) + ws_clear_queue (client); +#ifdef HAVE_LIBSSL + if (client->ssl) + ws_shutdown_dangling_clients (client); +#endif + + return 0; +} + +/* Do some housekeeping on the named pipe data packet. */ +static void +ws_clear_fifo_packet (WSPacket * packet) +{ + if (!packet) + return; + + if (packet->data) + free (packet->data); + free (packet); +} + +/* Do some housekeeping on the named pipe. */ +static void +ws_clear_pipein (WSPipeIn * pipein) +{ + WSPacket **packet = &pipein->packet; + if (!pipein) + return; + + if (pipein->fd != -1) + close (pipein->fd); + + ws_clear_fifo_packet (*packet); + free (pipein); + + if (wsconfig.pipein && access (wsconfig.pipein, F_OK) != -1) + unlink (wsconfig.pipein); +} + +/* Do some housekeeping on the named pipe. */ +static void +ws_clear_pipeout (WSPipeOut * pipeout) +{ + if (!pipeout) + return; + + if (pipeout->fd != -1) + close (pipeout->fd); + + free (pipeout); + + if (wsconfig.pipeout && access (wsconfig.pipeout, F_OK) != -1) + unlink (wsconfig.pipeout); +} + +/* Stop the server and do some cleaning. */ +void +ws_stop (WSServer * server) +{ + WSPipeIn **pipein = &server->pipein; + WSPipeOut **pipeout = &server->pipeout; + + ws_clear_pipein (*pipein); + ws_clear_pipeout (*pipeout); + + /* close access log (if any) */ + if (wsconfig.accesslog) + access_log_close (); + + /* remove dangling clients */ + if (list_count (server->colist) > 0) + list_foreach (server->colist, ws_remove_dangling_clients, NULL); + + if (server->colist) + list_remove_nodes (server->colist); + +#ifdef HAVE_LIBSSL + ws_ssl_cleanup (server); +#endif + + free (server); +} + +/* A wrapper to close a socket. */ +static void +ws_close (int listener) +{ + close (listener); +} + +/* Set the connection status for the given client and return the given + * bytes. + * + * The given number of bytes are returned. */ +static int +ws_set_status (WSClient * client, WSStatus status, int bytes) +{ + client->status = status; + return bytes; +} + +/* Append the source string to destination and reallocates and + * updating the destination buffer appropriately. */ +static void +ws_append_str (char **dest, const char *src) +{ + size_t curlen = strlen (*dest); + size_t srclen = strlen (src); + size_t newlen = curlen + srclen; + + char *str = xrealloc (*dest, newlen + 1); + memcpy (str + curlen, src, srclen + 1); + *dest = str; +} + +#if HAVE_LIBSSL +/* Create a new SSL_CTX object as framework to establish TLS/SSL + * enabled connections. + * + * On error 1 is returned. + * On success, SSL_CTX object is malloc'd and 0 is returned. + */ +static int +initialize_ssl_ctx (WSServer * server) +{ + int ret = 1; + SSL_CTX *ctx = NULL; + +#if OPENSSL_VERSION_NUMBER < 0x10100000L + SSL_library_init (); + SSL_load_error_strings (); +#endif + + /* Ciphers and message digests */ + OpenSSL_add_ssl_algorithms (); + + /* ssl context */ + if (!(ctx = SSL_CTX_new (SSLv23_server_method ()))) + goto out; + /* set certificate */ + if (!SSL_CTX_use_certificate_file (ctx, wsconfig.sslcert, SSL_FILETYPE_PEM)) + goto out; + /* ssl private key */ + if (!SSL_CTX_use_PrivateKey_file (ctx, wsconfig.sslkey, SSL_FILETYPE_PEM)) + goto out; + if (!SSL_CTX_check_private_key (ctx)) + goto out; + + /* since we queued up the send data, a retry won't be the same buffer, + * thus we need the following flags */ + SSL_CTX_set_mode (ctx, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER | + SSL_MODE_ENABLE_PARTIAL_WRITE); + + server->ctx = ctx; + ret = 0; +out: + if (ret) { + SSL_CTX_free (ctx); + LOG (("Error: %s\n", ERR_error_string (ERR_get_error (), NULL))); + } + + return ret; +} + +/* Log result code for TLS/SSL I/O operation */ +static void +log_return_message (int ret, int err, const char *fn) +{ + unsigned long e; + + switch (err) { + case SSL_ERROR_NONE: + LOG (("SSL: %s -> SSL_ERROR_NONE\n", fn)); + LOG (("SSL: TLS/SSL I/O operation completed\n")); + break; + case SSL_ERROR_WANT_READ: + LOG (("SSL: %s -> SSL_ERROR_WANT_READ\n", fn)); + LOG (("SSL: incomplete, data available for reading\n")); + break; + case SSL_ERROR_WANT_WRITE: + LOG (("SSL: %s -> SSL_ERROR_WANT_WRITE\n", fn)); + LOG (("SSL: incomplete, data available for writing\n")); + break; + case SSL_ERROR_ZERO_RETURN: + LOG (("SSL: %s -> SSL_ERROR_ZERO_RETURN\n", fn)); + LOG (("SSL: TLS/SSL connection has been closed\n")); + break; + case SSL_ERROR_WANT_X509_LOOKUP: + LOG (("SSL: %s -> SSL_ERROR_WANT_X509_LOOKUP\n", fn)); + break; + case SSL_ERROR_SYSCALL: + LOG (("SSL: %s -> SSL_ERROR_SYSCALL\n", fn)); + + e = ERR_get_error (); + if (e > 0) + LOG (("SSL: %s -> %s\n", fn, ERR_error_string (e, NULL))); + + /* call was not successful because a fatal error occurred either at the + * protocol level or a connection failure occurred. */ + if (ret != 0) { + LOG (("SSL bogus handshake interrupt: \n", strerror (errno))); + break; + } + /* call not yet finished. */ + LOG (("SSL: handshake interrupted, got EOF\n")); + if (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN) + LOG (("SSL: %s -> not yet finished %s\n", fn, strerror (errno))); + break; + default: + LOG (("SSL: %s -> failed fatal error code: %d\n", fn, err)); + LOG (("SSL: %s\n", ERR_error_string (ERR_get_error (), NULL))); + break; + } +} + +/* Shut down the client's TLS/SSL connection + * + * On fatal error, 1 is returned. + * If data still needs to be read/written, -1 is returned. + * On success, the TLS/SSL connection is closed and 0 is returned */ +static int +shutdown_ssl (WSClient * client) +{ + int ret = -1, err = 0; + + /* all good */ + if ((ret = SSL_shutdown (client->ssl)) > 0) + return ws_set_status (client, WS_CLOSE, 0); + + err = SSL_get_error (client->ssl, ret); + log_return_message (ret, err, "SSL_shutdown"); + + switch (err) { + case SSL_ERROR_WANT_READ: + case SSL_ERROR_WANT_WRITE: + client->sslstatus = WS_TLS_SHUTTING; + break; + case SSL_ERROR_SYSCALL: + if (ret == 0) { + LOG (("SSL: SSL_shutdown, connection unexpectedly closed by peer.\n")); + /* The shutdown is not yet finished. */ + if (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN) + client->sslstatus = WS_TLS_SHUTTING; + break; + } + LOG (("SSL: SSL_shutdown, probably unrecoverable, forcing close.\n")); + case SSL_ERROR_ZERO_RETURN: + case SSL_ERROR_WANT_X509_LOOKUP: + default: + return ws_set_status (client, WS_ERR | WS_CLOSE, 1); + } + + return ret; +} + +/* Wait for a TLS/SSL client to initiate a TLS/SSL handshake + * + * On fatal error, the connection is shut down. + * If data still needs to be read/written, -1 is returned. + * On success, the TLS/SSL connection is completed and 0 is returned */ +static int +accept_ssl (WSClient * client) +{ + int ret = -1, err = 0; + + /* all good on TLS handshake */ + if ((ret = SSL_accept (client->ssl)) > 0) { + client->sslstatus &= ~WS_TLS_ACCEPTING; + return 0; + } + + err = SSL_get_error (client->ssl, ret); + log_return_message (ret, err, "SSL_accept"); + + switch (err) { + case SSL_ERROR_WANT_READ: + case SSL_ERROR_WANT_WRITE: + client->sslstatus = WS_TLS_ACCEPTING; + break; + case SSL_ERROR_SYSCALL: + /* Wait for more activity else bail out, for instance if the socket is closed + * during the handshake. */ + if (ret < 0 && (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR)) { + client->sslstatus = WS_TLS_ACCEPTING; + break; + } + /* The peer notified that it is shutting down through a SSL "close_notify" so + * we shutdown too */ + case SSL_ERROR_ZERO_RETURN: + case SSL_ERROR_WANT_X509_LOOKUP: + default: + client->sslstatus &= ~WS_TLS_ACCEPTING; + return ws_set_status (client, WS_ERR | WS_CLOSE, 1); + } + + return ret; +} + +/* Create a new SSL structure for a connection and perform handshake */ +static void +handle_accept_ssl (WSClient * client, WSServer * server) +{ + /* attempt to create SSL connection if we don't have one yet */ + if (!client->ssl) { + if (!(client->ssl = SSL_new (server->ctx))) { + LOG (("SSL: SSL_new, new SSL structure failed.\n")); + return; + } + if (!SSL_set_fd (client->ssl, client->listener)) { + LOG (("SSL: unable to set file descriptor\n")); + return; + } + } + + /* attempt to initiate the TLS/SSL handshake */ + if (accept_ssl (client) == 0) { + LOG (("SSL Accepted: %d %s\n", client->listener, client->remote_ip)); + } +} + +/* Given the current status of the SSL buffer, perform that action. + * + * On error or if no SSL pending status, 1 is returned. + * On success, the TLS/SSL pending action is called and 0 is returned */ +static int +handle_ssl_pending_rw (int conn, WSServer * server, WSClient * client) +{ + if (!wsconfig.use_ssl) + return 1; + + /* trying to write but still waiting for a successful SSL_accept */ + if (client->sslstatus & WS_TLS_ACCEPTING) { + handle_accept_ssl (client, server); + return 0; + } + /* trying to read but still waiting for a successful SSL_read */ + if (client->sslstatus & WS_TLS_READING) { + handle_reads (conn, server); + return 0; + } + /* trying to write but still waiting for a successful SSL_write */ + if (client->sslstatus & WS_TLS_WRITING) { + handle_writes (conn, server); + return 0; + } + /* trying to write but still waiting for a successful SSL_shutdown */ + if (client->sslstatus & WS_TLS_SHUTTING) { + if (shutdown_ssl (client) == 0) + handle_read_close (conn, client, server); + return 0; + } + + return 1; +} + +/* Write bytes to a TLS/SSL connection for a given client. + * + * On error or if no write is performed <=0 is returned. + * On success, the number of bytes actually written to the TLS/SSL + * connection are returned */ +static int +send_ssl_buffer (WSClient * client, const char *buffer, int len) +{ + int bytes = 0, err = 0; + +#if OPENSSL_VERSION_NUMBER < 0x10100000L + ERR_clear_error (); +#endif + if ((bytes = SSL_write (client->ssl, buffer, len)) > 0) + return bytes; + + err = SSL_get_error (client->ssl, bytes); + log_return_message (bytes, err, "SSL_write"); + + switch (err) { + case SSL_ERROR_WANT_WRITE: + break; + case SSL_ERROR_WANT_READ: + client->sslstatus = WS_TLS_WRITING; + break; + case SSL_ERROR_SYSCALL: + if ((bytes < 0 && + (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR))) + break; + /* The connection was shut down cleanly */ + case SSL_ERROR_ZERO_RETURN: + case SSL_ERROR_WANT_X509_LOOKUP: + default: + return ws_set_status (client, WS_ERR | WS_CLOSE, -1); + } + + return bytes; +} + +/* Read data from the given client's socket and set a connection + * status given the output of recv(). + * + * On error, -1 is returned and the connection status is set. + * On success, the number of bytes read is returned. */ +static int +read_ssl_socket (WSClient * client, char *buffer, int size) +{ + int bytes = 0, done = 0, err = 0; + do { +#if OPENSSL_VERSION_NUMBER < 0x10100000L + ERR_clear_error (); +#endif + + done = 0; + if ((bytes = SSL_read (client->ssl, buffer, size)) > 0) + break; + + err = SSL_get_error (client->ssl, bytes); + log_return_message (bytes, err, "SSL_read"); + + switch (err) { + case SSL_ERROR_WANT_WRITE: + client->sslstatus = WS_TLS_READING; + done = 1; + break; + case SSL_ERROR_WANT_READ: + done = 1; + break; + case SSL_ERROR_SYSCALL: + if ((bytes < 0 && + (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR))) + break; + case SSL_ERROR_ZERO_RETURN: + case SSL_ERROR_WANT_X509_LOOKUP: + default: + return ws_set_status (client, WS_ERR | WS_CLOSE, -1); + } + } while (SSL_pending (client->ssl) && !done); + + return bytes; +} +#endif + +/* Get sockaddr, either IPv4 or IPv6 */ +static void * +ws_get_raddr (struct sockaddr *sa) +{ + if (sa->sa_family == AF_INET) + return &(((struct sockaddr_in *) sa)->sin_addr); + + return &(((struct sockaddr_in6 *) sa)->sin6_addr); +} + +/* Set the given file descriptor as NON BLOCKING. */ +void +set_nonblocking (int sock) +{ + if (fcntl (sock, F_SETFL, fcntl (sock, F_GETFL, 0) | O_NONBLOCK) == -1) + FATAL ("Unable to set socket as non-blocking: %s.", strerror (errno)); +} + +/* Accept a new connection on a socket and add it to the list of + * current connected clients. + * + * The newly assigned socket is returned. */ +static int +accept_client (int listener, GSLList ** colist) +{ + WSClient *client; + struct sockaddr_storage raddr; + int newfd; + const void *src = NULL; + socklen_t alen; + + alen = sizeof (raddr); + if ((newfd = accept (listener, (struct sockaddr *) &raddr, &alen)) == -1) + FATAL ("Unable to set accept: %s.", strerror (errno)); + + if (newfd == -1) { + LOG (("Unable to accept: %s.", strerror (errno))); + return newfd; + } + src = ws_get_raddr ((struct sockaddr *) &raddr); + + /* malloc a new client */ + client = new_wsclient (); + client->listener = newfd; + inet_ntop (raddr.ss_family, src, client->remote_ip, INET6_ADDRSTRLEN); + + /* add up our new client to keep track of */ + if (*colist == NULL) + *colist = list_create (client); + else + *colist = list_insert_prepend (*colist, client); + + /* make the socket non-blocking */ + set_nonblocking (client->listener); + + return newfd; +} + +/* Extract the HTTP method. + * + * On error, or if not found, NULL is returned. + * On success, the HTTP method is returned. */ +static const char * +ws_get_method (const char *token) +{ + const char *lookfor = NULL; + + if ((lookfor = "GET", !memcmp (token, "GET ", 4)) || + (lookfor = "get", !memcmp (token, "get ", 4))) + return lookfor; + return NULL; +} + +/* Parse a request containing the method and protocol. + * + * On error, or unable to parse, NULL is returned. + * On success, the HTTP request is returned and the method and + * protocol are assigned to the corresponding buffers. */ +static char * +ws_parse_request (char *line, char **method, char **protocol) +{ + const char *meth; + char *req = NULL, *request = NULL, *proto = NULL; + ptrdiff_t rlen; + + if ((meth = ws_get_method (line)) == NULL) { + return NULL; + } else { + req = line + strlen (meth); + if ((proto = strstr (line, " HTTP/1.0")) == NULL && + (proto = strstr (line, " HTTP/1.1")) == NULL) + return NULL; + + req++; + if ((rlen = proto - req) <= 0) + return NULL; + + request = xmalloc (rlen + 1); + strncpy (request, req, rlen); + request[rlen] = 0; + + (*method) = strtoupper (xstrdup (meth)); + (*protocol) = strtoupper (xstrdup (++proto)); + } + + return request; +} + +/* Given a pair of key/values, assign it to our HTTP headers + * structure. */ +static void +ws_set_header_key_value (WSHeaders * headers, char *key, char *value) +{ + if (strcasecmp ("Host", key) == 0) + headers->host = xstrdup (value); + else if (strcasecmp ("Origin", key) == 0) + headers->origin = xstrdup (value); + else if (strcasecmp ("Upgrade", key) == 0) + headers->upgrade = xstrdup (value); + else if (strcasecmp ("Connection", key) == 0) + headers->connection = xstrdup (value); + else if (strcasecmp ("Sec-WebSocket-Protocol", key) == 0) + headers->ws_protocol = xstrdup (value); + else if (strcasecmp ("Sec-WebSocket-Key", key) == 0) + headers->ws_key = xstrdup (value); + else if (strcasecmp ("Sec-WebSocket-Version", key) == 0) + headers->ws_sock_ver = xstrdup (value); + else if (strcasecmp ("User-Agent", key) == 0) + headers->agent = xstrdup (value); + else if (strcasecmp ("Referer", key) == 0) + headers->referer = xstrdup (value); +} + +/* Verify that the given HTTP headers were passed upon doing the + * websocket handshake. + * + * On error, or header missing, 1 is returned. + * On success, 0 is returned. */ +static int +ws_verify_req_headers (WSHeaders * headers) +{ + if (!headers->host) + return 1; + if (!headers->method) + return 1; + if (!headers->protocol) + return 1; + if (!headers->path) + return 1; + if (wsconfig.origin && !headers->origin) + return 1; + if (wsconfig.origin && strcasecmp (wsconfig.origin, headers->origin) != 0) + return 1; + if (!headers->connection) + return 1; + if (!headers->ws_key) + return 1; + if (!headers->ws_sock_ver) + return 1; + return 0; +} + +/* From RFC2616, each header field consists of a name followed by a + * colon (":") and the field value. Field names are case-insensitive. + * The field value MAY be preceded by any amount of LWS, though a + * single SP is preferred */ +static int +ws_set_header_fields (char *line, WSHeaders * headers) +{ + char *path = NULL, *method = NULL, *proto = NULL, *p, *value; + + if (line[0] == '\n' || line[0] == '\r') + return 1; + + if ((strstr (line, "GET ")) || (strstr (line, "get "))) { + if ((path = ws_parse_request (line, &method, &proto)) == NULL) + return 1; + headers->path = path; + headers->method = method; + headers->protocol = proto; + + return 0; + } + + if ((p = strchr (line, ':')) == NULL) + return 1; + + value = p + 1; + while (p != line && isspace ((unsigned char) *(p - 1))) + p--; + + if (p == line) + return 1; + + *p = '\0'; + if (strpbrk (line, " \t") != NULL) { + *p = ' '; + return 1; + } + while (isspace ((unsigned char) *value)) + value++; + + ws_set_header_key_value (headers, line, value); + + return 0; +} + +/* Parse the given HTTP headers and set the expected websocket + * handshake. + * + * On error, or 1 is returned. + * On success, 0 is returned. */ +static int +parse_headers (WSHeaders * headers) +{ + char *tmp = NULL; + const char *buffer = headers->buf; + const char *line = buffer, *next = NULL; + int len = 0; + + while (line) { + if ((next = strstr (line, "\r\n")) != NULL) + len = (next - line); + else + len = strlen (line); + + if (len <= 0) + return 1; + + tmp = xmalloc (len + 1); + memcpy (tmp, line, len); + tmp[len] = '\0'; + + if (ws_set_header_fields (tmp, headers) == 1) { + free (tmp); + return 1; + } + + free (tmp); + line = next ? (next + 2) : NULL; + + if (strcmp (next, "\r\n\r\n") == 0) + break; + } + + return 0; +} + +/* Set into a queue the data that couldn't be sent. */ +static void +ws_queue_sockbuf (WSClient * client, const char *buffer, int len, int bytes) +{ + WSQueue *queue = xcalloc (1, sizeof (WSQueue)); + + if (bytes < 1) + bytes = 0; + + queue->queued = xcalloc (len - bytes, sizeof (char)); + memcpy (queue->queued, buffer + bytes, len - bytes); + queue->qlen = len - bytes; + client->sockqueue = queue; + + client->status |= WS_SENDING; +} + +/* Read data from the given client's socket and set a connection + * status given the output of recv(). + * + * On error, -1 is returned and the connection status is set. + * On success, the number of bytes read is returned. */ +static int +read_plain_socket (WSClient * client, char *buffer, int size) +{ + int bytes = 0; + + bytes = recv (client->listener, buffer, size, 0); + + if (bytes == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) + return ws_set_status (client, WS_READING, bytes); + else if (bytes == -1 || bytes == 0) + return ws_set_status (client, WS_ERR | WS_CLOSE, bytes); + + return bytes; +} + +/* Read data from the given client's socket and set a connection + * status given the output of recv(). + * + * On error, -1 is returned and the connection status is set. + * On success, the number of bytes read is returned. */ +static int +read_socket (WSClient * client, char *buffer, int size) +{ +#ifdef HAVE_LIBSSL + if (wsconfig.use_ssl) + return read_ssl_socket (client, buffer, size); + else + return read_plain_socket (client, buffer, size); +#else + return read_plain_socket (client, buffer, size); +#endif +} + +static int +send_plain_buffer (WSClient * client, const char *buffer, int len) +{ + return send (client->listener, buffer, len, 0); +} + +static int +send_buffer (WSClient * client, const char *buffer, int len) +{ +#ifdef HAVE_LIBSSL + if (wsconfig.use_ssl) + return send_ssl_buffer (client, buffer, len); + else + return send_plain_buffer (client, buffer, len); +#else + return send_plain_buffer (client, buffer, len); +#endif +} + +/* Attmpt to send the given buffer to the given socket. + * + * On error, -1 is returned and the connection status is set. + * On success, the number of bytes sent is returned. */ +static int +ws_respond_data (WSClient * client, const char *buffer, int len) +{ + int bytes = 0; + + bytes = send_buffer (client, buffer, len); + if (bytes == -1 && errno == EPIPE) + return ws_set_status (client, WS_ERR | WS_CLOSE, bytes); + + /* did not send all of it... buffer it for a later attempt */ + if (bytes < len || (bytes == -1 && (errno == EAGAIN || errno == EWOULDBLOCK))) + ws_queue_sockbuf (client, buffer, len, bytes); + + return bytes; +} + +/* Attempt to send the queued up client's data to the given socket. + * + * On error, -1 is returned and the connection status is set. + * On success, the number of bytes sent is returned. */ +static int +ws_respond_cache (WSClient * client) +{ + WSQueue *queue = client->sockqueue; + int bytes = 0; + + bytes = send_buffer (client, queue->queued, queue->qlen); + if (bytes == -1 && errno == EPIPE) + return ws_set_status (client, WS_ERR | WS_CLOSE, bytes); + + if (bytes == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) + return bytes; + + if (chop_nchars (queue->queued, bytes, queue->qlen) == 0) + ws_clear_queue (client); + else + queue->qlen -= bytes; + + return bytes; +} + +/* Attempt to realloc the current sent queue. + * + * On error, 1 is returned and the connection status is set. + * On success, 0 is returned. */ +static int +ws_realloc_send_buf (WSClient * client, const char *buf, int len) +{ + WSQueue *queue = client->sockqueue; + char *tmp = NULL; + int newlen = 0; + + newlen = queue->qlen + len; + tmp = realloc (queue->queued, newlen); + if (tmp == NULL && newlen > 0) { + ws_clear_queue (client); + return ws_set_status (client, WS_ERR | WS_CLOSE, 1); + } + queue->queued = tmp; + memcpy (queue->queued + queue->qlen, buf, len); + queue->qlen += len; + + /* client probably too slow, so stop queueing until everything is + * sent */ + if (queue->qlen >= WS_THROTTLE_THLD) + client->status |= WS_THROTTLING; + + return 0; +} + +/* An entry point to attempt to send the client's data. + * + * On error, 1 is returned and the connection status is set. + * On success, the number of bytes sent is returned. */ +static int +ws_respond (WSClient * client, const char *buffer, int len) +{ + int bytes = 0; + + /* attempt to send the whole buffer buffer */ + if (client->sockqueue == NULL) + bytes = ws_respond_data (client, buffer, len); + /* buffer not empty, just append new data iff we're not throttling the + * client */ + else if (client->sockqueue != NULL && buffer != NULL && + !(client->status & WS_THROTTLING)) { + if (ws_realloc_send_buf (client, buffer, len) == 1) + return bytes; + } + /* send from cache buffer */ + else { + bytes = ws_respond_cache (client); + } + + return bytes; +} + +/* Encode a websocket frame (header/message) and attempt to send it + * through the client's socket. + * + * On success, 0 is returned. */ +static int +ws_send_frame (WSClient * client, WSOpcode opcode, const char *p, int sz) +{ + unsigned char buf[32] = { 0 }; + char *frm = NULL; + uint64_t payloadlen = 0, u64; + int hsize = 2; + + if (sz < 126) { + payloadlen = sz; + } else if (sz < (1 << 16)) { + payloadlen = WS_PAYLOAD_EXT16; + hsize += 2; + } else { + payloadlen = WS_PAYLOAD_EXT64; + hsize += 8; + } + + buf[0] = 0x80 | ((uint8_t) opcode); + switch (payloadlen) { + case WS_PAYLOAD_EXT16: + buf[1] = WS_PAYLOAD_EXT16; + buf[2] = (sz & 0xff00) >> 8; + buf[3] = (sz & 0x00ff) >> 0; + break; + case WS_PAYLOAD_EXT64: + buf[1] = WS_PAYLOAD_EXT64; + u64 = htobe64 (sz); + memcpy (buf + 2, &u64, sizeof (uint64_t)); + break; + default: + buf[1] = (sz & 0xff); + } + frm = xcalloc (hsize + sz, sizeof (unsigned char)); + memcpy (frm, buf, hsize); + if (p != NULL && sz > 0) + memcpy (frm + hsize, p, sz); + + ws_respond (client, frm, hsize + sz); + free (frm); + + return 0; +} + +/* Send an error message to the given client. + * + * On success, the number of sent bytes is returned. */ +static int +ws_error (WSClient * client, unsigned short code, const char *err) +{ + unsigned int len; + unsigned short code_be; + char buf[128] = { 0 }; + + len = 2; + code_be = htobe16 (code); + memcpy (buf, &code_be, 2); + if (err) + len += snprintf (buf + 2, sizeof buf - 4, "%s", err); + + return ws_send_frame (client, WS_OPCODE_CLOSE, buf, len); +} + +/* Log hit to the access log. + * + * On success, the hit/entry is logged. */ +static void +access_log (WSClient * client, int status_code) +{ + WSHeaders *hdrs = client->headers; + char buf[64] = { 0 }; + uint32_t elapsed = 0; + struct timeval tv; + char *req = NULL, *ref = NULL, *ua = NULL; + + gettimeofday (&tv, NULL); + strftime (buf, sizeof (buf) - 1, "[%d/%b/%Y:%H:%M:%S %z]", + localtime (&tv.tv_sec)); + + elapsed = (client->end_proc.tv_sec - client->start_proc.tv_sec) * 1000.0; + elapsed += (client->end_proc.tv_usec - client->start_proc.tv_usec) / 1000.0; + + req = escape_http_request (hdrs->path); + ref = escape_http_request (hdrs->referer); + ua = escape_http_request (hdrs->agent); + + ACCESS_LOG (("%s ", client->remote_ip)); + ACCESS_LOG (("- - ")); + ACCESS_LOG (("%s ", buf)); + ACCESS_LOG (("\"%s ", hdrs->method)); + ACCESS_LOG (("%s ", req ? req : "-")); + ACCESS_LOG (("%s\" ", hdrs->protocol)); + ACCESS_LOG (("%d ", status_code)); + ACCESS_LOG (("%d ", hdrs->buflen)); + ACCESS_LOG (("\"%s\" ", ref ? ref : "-")); + ACCESS_LOG (("\"%s\" ", ua ? ua : "-")); + ACCESS_LOG (("%zu\n", elapsed)); + + if (req) + free (req); + if (ref) + free (ref); + if (ua) + free (ua); +} + +/* Send an HTTP error status to the given client. + * + * On success, the number of sent bytes is returned. */ +static int +http_error (WSClient * client, const char *buffer) +{ + /* do access logging */ + gettimeofday (&client->end_proc, NULL); + if (wsconfig.accesslog) + access_log (client, 400); + + return ws_respond (client, buffer, strlen (buffer)); +} + +/* Compute the SHA1 for the handshake. */ +static void +ws_sha1_digest (const char *s, int len, unsigned char *digest) +{ + SHA1_CTX sha; + + SHA1Init (&sha); + SHA1Update (&sha, (uint8_t *) s, len); + SHA1Final (digest, &sha); +} + +/* Set the parsed websocket handshake headers. */ +static void +ws_set_handshake_headers (WSHeaders * headers) +{ + size_t klen = strlen (headers->ws_key); + size_t mlen = strlen (WS_MAGIC_STR); + size_t len = klen + mlen; + char *s = xmalloc (klen + mlen + 1); + uint8_t digest[SHA_DIGEST_LENGTH]; + + memset (digest, 0, sizeof *digest); + + memcpy (s, headers->ws_key, klen); + memcpy (s + klen, WS_MAGIC_STR, mlen + 1); + + ws_sha1_digest (s, len, digest); + + /* set response headers */ + headers->ws_accept = + base64_encode ((unsigned char *) digest, sizeof (digest)); + headers->ws_resp = xstrdup (WS_SWITCH_PROTO_STR); + + if (!headers->upgrade) + headers->upgrade = xstrdup ("websocket"); + if (!headers->connection) + headers->upgrade = xstrdup ("Upgrade"); + + free (s); +} + +/* Send the websocket handshake headers to the given client. + * + * On success, the number of sent bytes is returned. */ +static int +ws_send_handshake_headers (WSClient * client, WSHeaders * headers) +{ + int bytes = 0; + char *str = xstrdup (""); + + ws_append_str (&str, headers->ws_resp); + ws_append_str (&str, CRLF); + + ws_append_str (&str, "Upgrade: "); + ws_append_str (&str, headers->upgrade); + ws_append_str (&str, CRLF); + + ws_append_str (&str, "Connection: "); + ws_append_str (&str, headers->connection); + ws_append_str (&str, CRLF); + + ws_append_str (&str, "Sec-WebSocket-Accept: "); + ws_append_str (&str, headers->ws_accept); + ws_append_str (&str, CRLF CRLF); + + bytes = ws_respond (client, str, strlen (str)); + free (str); + + return bytes; +} + +/* Given the HTTP connection headers, attempt to parse the web socket + * handshake headers. + * + * On success, the number of sent bytes is returned. */ +static int +ws_get_handshake (WSClient * client, WSServer * server) +{ + int bytes = 0, readh = 0; + char *buf = NULL; + + if (client->headers == NULL) + client->headers = new_wsheader (); + + buf = client->headers->buf; + readh = client->headers->buflen; + /* Probably the connection was closed before finishing handshake */ + if ((bytes = read_socket (client, buf + readh, BUFSIZ - readh)) < 1) { + if (client->status & WS_CLOSE) + http_error (client, WS_BAD_REQUEST_STR); + return bytes; + } + client->headers->buflen += bytes; + + buf[client->headers->buflen] = '\0'; /* null-terminate */ + + /* Must have a \r\n\r\n */ + if (strstr (buf, "\r\n\r\n") == NULL) { + if (strlen (buf) < BUFSIZ) + return ws_set_status (client, WS_READING, bytes); + + http_error (client, WS_BAD_REQUEST_STR); + return ws_set_status (client, WS_CLOSE, bytes); + } + + /* Ensure we have valid HTTP headers for the handshake */ + if (parse_headers (client->headers) != 0) { + http_error (client, WS_BAD_REQUEST_STR); + return ws_set_status (client, WS_CLOSE, bytes); + } + + /* Ensure we have the required headers */ + if (ws_verify_req_headers (client->headers) != 0) { + http_error (client, WS_BAD_REQUEST_STR); + return ws_set_status (client, WS_CLOSE, bytes); + } + + ws_set_handshake_headers (client->headers); + + /* handshake response */ + ws_send_handshake_headers (client, client->headers); + + /* upon success, call onopen() callback */ + if (server->onopen && wsconfig.strict && !wsconfig.echomode) + server->onopen (server->pipeout, client); + client->headers->reading = 0; + + /* do access logging */ + gettimeofday (&client->end_proc, NULL); + if (wsconfig.accesslog) + access_log (client, 101); + LOG (("Active: %d\n", list_count (server->colist))); + + return ws_set_status (client, WS_OK, bytes); +} + +/* Send a data message to the given client. + * + * On success, 0 is returned. */ +int +ws_send_data (WSClient * client, WSOpcode opcode, const char *p, int sz) +{ + char *buf = NULL; + + buf = sanitize_utf8 (p, sz); + ws_send_frame (client, opcode, buf, sz); + free (buf); + + return 0; +} + +/* Read a websocket frame's header. + * + * On success, the number of bytesr read is returned. */ +static int +ws_read_header (WSClient * client, WSFrame * frm, int pos, int need) +{ + char *buf = frm->buf; + int bytes = 0; + + /* read the first 2 bytes for basic frame info */ + if ((bytes = read_socket (client, buf + pos, need)) < 1) { + if (client->status & WS_CLOSE) + ws_error (client, WS_CLOSE_UNEXPECTED, "Unable to read header"); + return bytes; + } + frm->buflen += bytes; + frm->buf[frm->buflen] = '\0'; /* null-terminate */ + + return bytes; +} + +/* Read a websocket frame's payload. + * + * On success, the number of bytesr read is returned. */ +static int +ws_read_payload (WSClient * client, WSMessage * msg, int pos, int need) +{ + char *buf = msg->payload; + int bytes = 0; + + /* read the first 2 bytes for basic frame info */ + if ((bytes = read_socket (client, buf + pos, need)) < 1) { + if (client->status & WS_CLOSE) + ws_error (client, WS_CLOSE_UNEXPECTED, "Unable to read payload"); + return bytes; + } + msg->buflen += bytes; + msg->payloadsz += bytes; + + return bytes; +} + +/* Set the basic frame headers on a frame structure. + * + * On success, 0 is returned. */ +static int +ws_set_front_header_fields (WSClient * client) +{ + WSFrame **frm = &client->frame; + char *buf = (*frm)->buf; + + (*frm)->fin = WS_FRM_FIN (*(buf)); + (*frm)->masking = WS_FRM_MASK (*(buf + 1)); + (*frm)->opcode = WS_FRM_OPCODE (*(buf)); + (*frm)->res = WS_FRM_R1 (*(buf)) || WS_FRM_R2 (*(buf)) || WS_FRM_R3 (*(buf)); + + /* should be masked and can't be using RESVd bits */ + if (!(*frm)->masking || (*frm)->res) + return ws_set_status (client, WS_ERR | WS_CLOSE, 1); + + return 0; +} + +/* Unmask the payload given the current frame's masking key. */ +static void +ws_unmask_payload (char *buf, int len, int offset, unsigned char mask[]) +{ + int i, j = 0; + + /* unmask data */ + for (i = offset; i < len; ++i, ++j) { + buf[i] ^= mask[j % 4]; + } +} + +/* Close a websocket connection. */ +static int +ws_handle_close (WSClient * client) +{ + client->status = WS_ERR | WS_CLOSE; + return ws_send_frame (client, WS_OPCODE_CLOSE, NULL, 0); +} + +/* Handle a websocket error. + * + * On success, the number of bytes sent is returned. */ +static int +ws_handle_err (WSClient * client, unsigned short code, WSStatus status, + const char *m) +{ + client->status = status; + return ws_error (client, code, m); +} + +/* Handle a websocket pong. */ +static void +ws_handle_pong (WSClient * client) +{ + WSFrame **frm = &client->frame; + + if (!(*frm)->fin) { + ws_handle_err (client, WS_CLOSE_PROTO_ERR, WS_ERR | WS_CLOSE, NULL); + return; + } + ws_free_message (client); +} + +/* Handle a websocket ping from the client and it attempts to send + * back a pong as soon as possible. */ +static void +ws_handle_ping (WSClient * client) +{ + WSFrame **frm = &client->frame; + WSMessage **msg = &client->message; + char *buf = NULL, *tmp = NULL; + int pos = 0, len = (*frm)->payloadlen, newlen = 0; + + /* RFC states that Control frames themselves MUST NOT be + * fragmented. */ + if (!(*frm)->fin) { + ws_handle_err (client, WS_CLOSE_PROTO_ERR, WS_ERR | WS_CLOSE, NULL); + return; + } + + /* Control frames are only allowed to have payload up to and + * including 125 octets */ + if ((*frm)->payloadlen > 125) { + ws_handle_err (client, WS_CLOSE_PROTO_ERR, WS_ERR | WS_CLOSE, NULL); + return; + } + + /* No payload from ping */ + if (len == 0) { + ws_send_frame (client, WS_OPCODE_PONG, NULL, 0); + return; + } + + /* Copy the ping payload */ + pos = (*msg)->payloadsz - len; + buf = xcalloc (len, sizeof (char)); + memcpy (buf, (*msg)->payload + pos, len); + + /* Unmask it */ + ws_unmask_payload (buf, len, 0, (*frm)->mask); + + /* Resize the current payload (keep an eye on this realloc) */ + newlen = (*msg)->payloadsz - len; + tmp = realloc ((*msg)->payload, newlen); + if (tmp == NULL && newlen > 0) { + free ((*msg)->payload); + free (buf); + + (*msg)->payload = NULL; + client->status = WS_ERR | WS_CLOSE; + return; + } + + (*msg)->payload = tmp; + (*msg)->payloadsz -= len; + + ws_send_frame (client, WS_OPCODE_PONG, buf, len); + + (*msg)->buflen = 0; /* done with the current frame's payload */ + /* Control frame injected in the middle of a fragmented message. */ + if (!(*msg)->fragmented) { + ws_free_message (client); + } + free (buf); +} + +/* Ensure we have valid UTF-8 text payload. + * + * On error, or if the message is invalid, 1 is returned. + * On success, or if the message is valid, 0 is returned. */ +int +ws_validate_string (const char *str, int len) +{ + uint32_t state = UTF8_VALID; + + if (verify_utf8 (&state, str, len) == UTF8_INVAL) { + LOG (("Invalid UTF8 data!\n")); + return 1; + } + if (state != UTF8_VALID) { + LOG (("Invalid UTF8 data!\n")); + return 1; + } + + return 0; +} + +/* It handles a text or binary message frame from the client. */ +static void +ws_handle_text_bin (WSClient * client, WSServer * server) +{ + WSFrame **frm = &client->frame; + WSMessage **msg = &client->message; + int offset = (*msg)->mask_offset; + + /* All data frames after the initial data frame must have opcode 0 */ + if ((*msg)->fragmented && (*frm)->opcode != WS_OPCODE_CONTINUATION) { + client->status = WS_ERR | WS_CLOSE; + return; + } + + /* RFC states that there is a new masking key per frame, therefore, + * time to unmask... */ + ws_unmask_payload ((*msg)->payload, (*msg)->payloadsz, offset, (*frm)->mask); + /* Done with the current frame's payload */ + (*msg)->buflen = 0; + /* Reading a fragmented frame */ + (*msg)->fragmented = 1; + + if (!(*frm)->fin) + return; + + /* validate text data encoded as UTF-8 */ + if ((*msg)->opcode == WS_OPCODE_TEXT) { + if (ws_validate_string ((*msg)->payload, (*msg)->payloadsz) != 0) { + ws_handle_err (client, WS_CLOSE_INVALID_UTF8, WS_ERR | WS_CLOSE, NULL); + return; + } + } + + if ((*msg)->opcode != WS_OPCODE_CONTINUATION && server->onmessage) { + /* just echo the message to the client */ + if (wsconfig.echomode) + ws_send_data (client, (*msg)->opcode, (*msg)->payload, (*msg)->payloadsz); + /* just pipe out the message */ + else if (!wsconfig.strict) + ws_write_fifo (server->pipeout, (*msg)->payload, (*msg)->payloadsz); + else + server->onmessage (server->pipeout, client); + } + ws_free_message (client); +} + +/* Depending on the frame opcode, then we take certain decisions. */ +static void +ws_manage_payload_opcode (WSClient * client, WSServer * server) +{ + WSFrame **frm = &client->frame; + WSMessage **msg = &client->message; + + switch ((*frm)->opcode) { + case WS_OPCODE_CONTINUATION: + LOG (("CONTINUATION\n")); + /* first frame can't be a continuation frame */ + if (!(*msg)->fragmented) { + client->status = WS_ERR | WS_CLOSE; + break; + } + ws_handle_text_bin (client, server); + break; + case WS_OPCODE_TEXT: + case WS_OPCODE_BIN: + LOG (("TEXT\n")); + client->message->opcode = (*frm)->opcode; + ws_handle_text_bin (client, server); + break; + case WS_OPCODE_PONG: + LOG (("PONG\n")); + ws_handle_pong (client); + break; + case WS_OPCODE_PING: + LOG (("PING\n")); + ws_handle_ping (client); + break; + default: + LOG (("CLOSE\n")); + ws_handle_close (client); + } +} + +/* Set the extended payload length into the given pointer. */ +static void +ws_set_extended_header_size (const char *buf, int *extended) +{ + uint64_t payloadlen = 0; + /* determine the payload length, else read more data */ + payloadlen = WS_FRM_PAYLOAD (*(buf + 1)); + switch (payloadlen) { + case WS_PAYLOAD_EXT16: + *extended = 2; + break; + case WS_PAYLOAD_EXT64: + *extended = 8; + break; + } +} + +/* Set the extended payload length into our frame structure. */ +static void +ws_set_payloadlen (WSFrame * frm, const char *buf) +{ + uint64_t payloadlen = 0, len64; + uint16_t len16; + + /* determine the payload length, else read more data */ + payloadlen = WS_FRM_PAYLOAD (*(buf + 1)); + switch (payloadlen) { + case WS_PAYLOAD_EXT16: + memcpy (&len16, (buf + 2), sizeof (uint16_t)); + frm->payloadlen = ntohs (len16); + break; + case WS_PAYLOAD_EXT64: + memcpy (&len64, (buf + 2), sizeof (uint64_t)); + frm->payloadlen = be64toh (len64); + break; + default: + frm->payloadlen = payloadlen; + } +} + +/* Set the masking key into our frame structure. */ +static void +ws_set_masking_key (WSFrame * frm, const char *buf) +{ + uint64_t payloadlen = 0; + + /* determine the payload length, else read more data */ + payloadlen = WS_FRM_PAYLOAD (*(buf + 1)); + switch (payloadlen) { + case WS_PAYLOAD_EXT16: + memcpy (&frm->mask, buf + 4, sizeof (frm->mask)); + break; + case WS_PAYLOAD_EXT64: + memcpy (&frm->mask, buf + 10, sizeof (frm->mask)); + break; + default: + memcpy (&frm->mask, buf + 2, sizeof (frm->mask)); + } +} + +/* Attempt to read the frame's header and set the relavant data into + * our frame structure. + * + * On error, or if no data available to read, the number of bytes is + * returned and the appropriate connection status is set. + * On success, the number of bytes is returned. */ +static int +ws_get_frm_header (WSClient * client) +{ + WSFrame **frm = NULL; + int bytes = 0, readh = 0, need = 0, offset = 0, extended = 0; + + if (client->frame == NULL) + client->frame = new_wsframe (); + + frm = &client->frame; + + /* Read the first 2 bytes for basic frame info */ + readh = (*frm)->buflen; /* read from header so far */ + need = 2 - readh; /* need to read */ + if (need > 0) { + if ((bytes = ws_read_header (client, (*frm), readh, need)) < 1) + return bytes; + if (bytes != need) + return ws_set_status (client, WS_READING, bytes); + } + offset += 2; + + if (ws_set_front_header_fields (client) != 0) + return bytes; + + ws_set_extended_header_size ((*frm)->buf, &extended); + /* read the extended header */ + readh = (*frm)->buflen; /* read from header so far */ + need = (extended + offset) - readh; /* read from header field so far */ + if (need > 0) { + if ((bytes = ws_read_header (client, (*frm), readh, need)) < 1) + return bytes; + if (bytes != need) + return ws_set_status (client, WS_READING, bytes); + } + offset += extended; + + /* read the masking key */ + readh = (*frm)->buflen; /* read from header so far */ + need = (4 + offset) - readh; + if (need > 0) { + if ((bytes = ws_read_header (client, (*frm), readh, need)) < 1) + return bytes; + if (bytes != need) + return ws_set_status (client, WS_READING, bytes); + } + offset += 4; + + ws_set_payloadlen ((*frm), (*frm)->buf); + ws_set_masking_key ((*frm), (*frm)->buf); + + if ((*frm)->payloadlen > wsconfig.max_frm_size) { + ws_error (client, WS_CLOSE_TOO_LARGE, "Frame is too big"); + return ws_set_status (client, WS_ERR | WS_CLOSE, bytes); + } + + (*frm)->buflen = 0; + (*frm)->reading = 0; + (*frm)->payload_offset = offset; + + return ws_set_status (client, WS_OK, bytes); +} + +/* Attempt to realloc the message payload. + * + * On error, 1 is returned. + * On success, 0 is returned. */ +static int +ws_realloc_frm_payload (WSFrame * frm, WSMessage * msg) +{ + char *tmp = NULL; + uint64_t newlen = 0; + + newlen = msg->payloadsz + frm->payloadlen; + tmp = realloc (msg->payload, newlen); + if (tmp == NULL && newlen > 0) { + free (msg->payload); + msg->payload = NULL; + return 1; + } + msg->payload = tmp; + + return 0; +} + +/* Attempt to read the frame's payload and set the relavant data into + * our message structure. + * + * On error, or if no data available to read, the number of bytes is + * returned and the appropriate connection status is set. + * On success, the number of bytes is returned. */ +static int +ws_get_frm_payload (WSClient * client, WSServer * server) +{ + WSFrame **frm = NULL; + WSMessage **msg = NULL; + int bytes = 0, readh = 0, need = 0; + + if (client->message == NULL) + client->message = new_wsmessage (); + + frm = &client->frame; + msg = &client->message; + + /* message within the same frame */ + if ((*msg)->payload == NULL && (*frm)->payloadlen) + (*msg)->payload = xcalloc ((*frm)->payloadlen, sizeof (char)); + /* handle a new frame */ + else if ((*msg)->buflen == 0 && (*frm)->payloadlen) { + if (ws_realloc_frm_payload ((*frm), (*msg)) == 1) + return ws_set_status (client, WS_ERR | WS_CLOSE, 0); + } + + readh = (*msg)->buflen; /* read from so far */ + need = (*frm)->payloadlen - readh; /* need to read */ + if (need > 0) { + if ((bytes = ws_read_payload (client, (*msg), (*msg)->payloadsz, need)) < 0) + return bytes; + if (bytes != need) + return ws_set_status (client, WS_READING, bytes); + } + + (*msg)->mask_offset = (*msg)->payloadsz - (*msg)->buflen; + + ws_manage_payload_opcode (client, server); + ws_free_frame (client); + + return bytes; +} + +/* Determine if we need to read a frame's header or its payload. + * + * On success, the number of bytes is returned. */ +static int +ws_get_message (WSClient * client, WSServer * server) +{ + int bytes = 0; + if ((client->frame == NULL) || (client->frame->reading)) + if ((bytes = ws_get_frm_header (client)) < 1 || client->frame->reading) + return bytes; + return ws_get_frm_payload (client, server); +} + +/* Determine if we need to read an HTTP request or a websocket frame. + * + * On success, the number of bytes is returned. */ +static int +read_client_data (WSClient * client, WSServer * server) +{ + int bytes = 0; + + /* Handshake */ + if ((!(client->headers) || (client->headers->reading))) + bytes = ws_get_handshake (client, server); + /* Message */ + else + bytes = ws_get_message (client, server); + + return bytes; +} + +/* Handle a tcp close connection. */ +static void +handle_tcp_close (int conn, WSClient * client, WSServer * server) +{ +#ifdef HAVE_LIBSSL + if (client->ssl) + shutdown_ssl (client); +#endif + + shutdown (conn, SHUT_RDWR); + /* upon close, call onclose() callback */ + if (server->onclose && wsconfig.strict && !wsconfig.echomode) + (*server->onclose) (server->pipeout, client); + + /* do access logging */ + gettimeofday (&client->end_proc, NULL); + if (wsconfig.accesslog) + access_log (client, 200); + + /* errored out while parsing a frame or a message */ + if (client->status & WS_ERR) { + ws_clear_queue (client); + ws_free_frame (client); + ws_free_message (client); + } + + server->closing = 0; + ws_close (conn); + +#ifdef HAVE_LIBSSL + if (client->ssl) + SSL_free (client->ssl); + client->ssl = NULL; +#endif + + /* remove client from our list */ + ws_remove_client_from_list (client, server); + LOG (("Active: %d\n", list_count (server->colist))); +} + +/* Handle a tcp read close connection. */ +static void +handle_read_close (int conn, WSClient * client, WSServer * server) +{ + if (client->status & WS_SENDING) { + server->closing = 1; + return; + } + handle_tcp_close (conn, client, server); +} + +/* Handle a new socket connection. */ +static void +handle_accept (int listener, WSServer * server) +{ + WSClient *client = NULL; + int newfd; + + newfd = accept_client (listener, &server->colist); + if (newfd == -1) + return; + + client = ws_get_client_from_list (newfd, &server->colist); + if (newfd > FD_SETSIZE - 1) { + LOG (("Too busy: %d %s.\n", newfd, client->remote_ip)); + + http_error (client, WS_TOO_BUSY_STR); + handle_read_close (newfd, client, server); + return; + } +#ifdef HAVE_LIBSSL + /* set flag to do TLS handshake */ + if (wsconfig.use_ssl) + client->sslstatus |= WS_TLS_ACCEPTING; +#endif + + LOG (("Accepted: %d %s\n", newfd, client->remote_ip)); +} + +/* Handle a tcp read. */ +static void +handle_reads (int conn, WSServer * server) +{ + WSClient *client = NULL; + + if (!(client = ws_get_client_from_list (conn, &server->colist))) + return; + +#ifdef HAVE_LIBSSL + if (handle_ssl_pending_rw (conn, server, client) == 0) + return; +#endif + + /* *INDENT-OFF* */ + client->start_proc = client->end_proc = (struct timeval) {0}; + /* *INDENT-ON* */ + gettimeofday (&client->start_proc, NULL); + read_client_data (client, server); + /* An error ocurred while reading data or connection closed */ + if ((client->status & WS_CLOSE)) { + handle_read_close (conn, client, server); + } +} + +/* Handle a tcp write close connection. */ +static void +handle_write_close (int conn, WSClient * client, WSServer * server) +{ + handle_tcp_close (conn, client, server); +} + +/* Handle a tcp write. */ +static void +handle_writes (int conn, WSServer * server) +{ + WSClient *client = NULL; + + if (!(client = ws_get_client_from_list (conn, &server->colist))) + return; + +#ifdef HAVE_LIBSSL + if (handle_ssl_pending_rw (conn, server, client) == 0) + return; +#endif + + ws_respond (client, NULL, 0); /* buffered data */ + /* done sending data */ + if (client->sockqueue == NULL) + client->status &= ~WS_SENDING; + + /* An error ocurred while sending data or while reading data but still + * waiting from the last send() from the server to the client. e.g., + * sending status code */ + if ((client->status & WS_CLOSE) && !(client->status & WS_SENDING)) + handle_write_close (conn, client, server); +} + +/* Handle reads/writes on a TCP connection. */ +static void +ws_listen (int listener, int conn, WSServer * server) +{ + /* handle new connections */ + if (FD_ISSET (conn, &fdstate.rfds) && conn == listener) + handle_accept (listener, server); + /* handle data from a client */ + else if (FD_ISSET (conn, &fdstate.rfds) && conn != listener) + handle_reads (conn, server); + /* handle sending data to a client */ + else if (FD_ISSET (conn, &fdstate.wfds) && conn != listener) + handle_writes (conn, server); +} + +/* Create named pipe (FIFO) with the given pipe name. + * + * On error, 1 is returned. + * On success, 0 is returned. */ +int +ws_setfifo (const char *pipename) +{ + struct stat fistat; + const char *f = pipename; + + if (access (f, F_OK) == 0) + return 0; + + if (mkfifo (f, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH) < 0) + FATAL ("Unable to set fifo: %s.", strerror (errno)); + if (stat (f, &fistat) < 0) + FATAL ("Unable to stat fifo: %s.", strerror (errno)); + if (!S_ISFIFO (fistat.st_mode)) + FATAL ("pipe is not a fifo: %s.", strerror (errno)); + + return 0; +} + +/* Open a named pipe (FIFO) for input to the server (reader). */ +static int +ws_openfifo_in (WSPipeIn * pipein) +{ + ws_setfifo (wsconfig.pipein); + /* we should be able to open it at as reader */ + if ((pipein->fd = open (wsconfig.pipein, O_RDWR | O_NONBLOCK)) < 0) + FATAL ("Unable to open fifo in: %s.", strerror (errno)); + + return pipein->fd; +} + + +/* Open a named pipe (FIFO) for output from the server (writer). */ +static int +ws_openfifo_out (WSPipeOut * pipeout) +{ + int status = 0; + + ws_setfifo (wsconfig.pipeout); + status = open (wsconfig.pipeout, O_WRONLY | O_NONBLOCK); + /* will attempt on the next write */ + if (status == -1 && errno == ENXIO) + LOG (("Unable to open fifo out: %s.\n", strerror (errno))); + else if (status < 0) + FATAL ("Unable to open fifo out: %s.", strerror (errno)); + pipeout->fd = status; + + if (status != -1 && status > max_file_fd) + max_file_fd = status; + + return status; +} + +/* Set a new named pipe for incoming messages and one for outgoing + * messages from the client. */ +static void +ws_fifo (WSServer * server) +{ + wsconfig.pipein = wsconfig.pipein ? wsconfig.pipein : WS_PIPEIN; + wsconfig.pipeout = wsconfig.pipeout ? wsconfig.pipeout : WS_PIPEOUT; + + ws_openfifo_in (server->pipein); + ws_openfifo_out (server->pipeout); +} + +/* Clear the queue for an outgoing named pipe. */ +static void +clear_fifo_queue (WSPipeOut * pipeout) +{ + WSQueue **queue = &pipeout->fifoqueue; + if (!(*queue)) + return; + + if ((*queue)->queued) + free ((*queue)->queued); + (*queue)->queued = NULL; + (*queue)->qlen = 0; + + free ((*queue)); + (*queue) = NULL; +} + +/* Attempt to realloc the current sent queue for an outgoing named pip + * (FIFO). + * + * On error, 1 is returned and the connection status is closed and + * reopened. + * On success, 0 is returned. */ +static int +ws_realloc_fifobuf (WSPipeOut * pipeout, const char *buf, int len) +{ + WSQueue *queue = pipeout->fifoqueue; + char *tmp = NULL; + int newlen = 0; + + newlen = queue->qlen + len; + tmp = realloc (queue->queued, newlen); + if (tmp == NULL && newlen > 0) { + close (pipeout->fd); + clear_fifo_queue (pipeout); + ws_openfifo_out (pipeout); + return 1; + } + + queue->queued = tmp; + memcpy (queue->queued + queue->qlen, buf, len); + queue->qlen += len; + + return 0; +} + +/* Set into a queue the data that couldn't be sent in the outgoing + * FIFO. */ +static void +ws_queue_fifobuf (WSPipeOut * pipeout, const char *buffer, int len, int bytes) +{ + WSQueue **queue = &pipeout->fifoqueue; + + if (bytes < 1) + bytes = 0; + + (*queue) = xcalloc (1, sizeof (WSQueue)); + (*queue)->queued = xcalloc (len - bytes, sizeof (char)); + memcpy ((*queue)->queued, buffer + bytes, len - bytes); + (*queue)->qlen = len - bytes; + + pipeout->status |= WS_SENDING; +} + +/* Attmpt to send the given buffer to the given outgoing FIFO. + * + * On error, the data is queued up. + * On success, the number of bytes sent is returned. */ +static int +ws_write_fifo_data (WSPipeOut * pipeout, char *buffer, int len) +{ + int bytes = 0; + + bytes = write (pipeout->fd, buffer, len); + + /* At this point, the reader probably closed the pipe, so a cheap *hack* for + * this is to close the pipe on our end and attempt to reopen it. If unable to + * do so, then let it be -1 and try on the next attempt to write. */ + if (bytes == -1 && errno == EPIPE) { + close (pipeout->fd); + ws_openfifo_out (pipeout); + return bytes; + } + if (bytes < len || (bytes == -1 && (errno == EAGAIN || errno == EWOULDBLOCK))) + ws_queue_fifobuf (pipeout, buffer, len, bytes); + + return bytes; +} + +/* Attempt to send the queued up client's data through the outgoing + * named pipe (FIFO) . + * + * On error, 1 is returned and the connection status is set. + * On success, the number of bytes sent is returned. */ +static int +ws_write_fifo_cache (WSPipeOut * pipeout) +{ + WSQueue *queue = pipeout->fifoqueue; + int bytes = 0; + + bytes = write (pipeout->fd, queue->queued, queue->qlen); + + /* At this point, the reader probably closed the pipe, so a cheap *hack* for + * this is to close the pipe on our end and attempt to reopen it. If unable to + * do so, then let it be -1 and try on the next attempt to write. */ + if (bytes == -1 && errno == EPIPE) { + close (pipeout->fd); + ws_openfifo_out (pipeout); + return bytes; + } + + if (chop_nchars (queue->queued, bytes, queue->qlen) == 0) + clear_fifo_queue (pipeout); + else + queue->qlen -= bytes; + + return bytes; +} + +/* An entry point to attempt to send the client's data into an + * outgoing named pipe (FIFO). + * + * On success, the number of bytes sent is returned. */ +int +ws_write_fifo (WSPipeOut * pipeout, char *buffer, int len) +{ + int bytes = 0; + + if (pipeout->fd == -1 && ws_openfifo_out (pipeout) == -1) + return bytes; + + /* attempt to send the whole buffer buffer */ + if (pipeout->fifoqueue == NULL) + bytes = ws_write_fifo_data (pipeout, buffer, len); + /* buffer not empty, just append new data */ + else if (pipeout->fifoqueue != NULL && buffer != NULL) { + if (ws_realloc_fifobuf (pipeout, buffer, len) == 1) + return bytes; + } + /* send from cache buffer */ + else { + bytes = ws_write_fifo_cache (pipeout); + } + + if (pipeout->fifoqueue == NULL) + pipeout->status &= ~WS_SENDING; + + return bytes; +} + +/* Clear an incoming FIFO packet and header data. */ +static void +clear_fifo_packet (WSPipeIn * pipein) +{ + memset (pipein->hdr, 0, sizeof (pipein->hdr)); + pipein->hlen = 0; + + if (pipein->packet == NULL) + return; + + if (pipein->packet->data) + free (pipein->packet->data); + free (pipein->packet); + pipein->packet = NULL; +} + +/* Broadcast to all connected clients the given message. */ +static int +ws_broadcast_fifo (void *value, void *user_data) +{ + WSClient *client = value; + WSPacket *packet = user_data; + + if (client == NULL || user_data == NULL) + return 1; + /* no handshake for this client */ + if (client->headers == NULL || client->headers->ws_accept == NULL) + return 1; + + ws_send_data (client, packet->type, packet->data, packet->size); + + return 0; +} + +/* Send a message from the incoming named pipe to specific client + * given the socket id. */ +static void +ws_send_strict_fifo_to_client (WSServer * server, int listener, WSPacket * pa) +{ + WSClient *client = NULL; + + if (!(client = ws_get_client_from_list (listener, &server->colist))) + return; + /* no handshake for this client */ + if (client->headers == NULL || client->headers->ws_accept == NULL) + return; + ws_send_data (client, pa->type, pa->data, pa->len); +} + +/* Attempt to read message from a named pipe (FIFO). + * + * On error, -1 is returned. + * On success, the number of bytes read is returned. */ +int +ws_read_fifo (int fd, char *buf, int *buflen, int pos, int need) +{ + int bytes = 0; + + bytes = read (fd, buf + pos, need); + if (bytes == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) + return bytes; + else if (bytes == -1) + return bytes; + *buflen += bytes; + + return bytes; +} + +/* Pack the given value into a network byte order. + * + * On success, the number size of uint32_t is returned. */ +size_t +pack_uint32 (void *buf, uint32_t val) +{ + uint32_t v32 = htonl (val); + memcpy (buf, &v32, sizeof (uint32_t)); + + return sizeof (uint32_t); +} + +/* Unpack the given value into a host byte order. + * + * On success, the number size of uint32_t is returned. */ +size_t +unpack_uint32 (const void *buf, uint32_t * val) +{ + uint32_t v32 = 0; + memcpy (&v32, buf, sizeof (uint32_t)); + *val = ntohl (v32); + + return sizeof (uint32_t); +} + +/* Ensure the fields coming from the named pipe are valid. + * + * On error, 1 is returned. + * On success, 0 is returned. */ +static int +validate_fifo_packet (uint32_t listener, uint32_t type, int size) +{ + if (listener > FD_SETSIZE) { + LOG (("Invalid listener\n")); + return 1; + } + + if (type != WS_OPCODE_TEXT && type != WS_OPCODE_BIN) { + LOG (("Invalid fifo packet type\n")); + return 1; + } + + if (size > wsconfig.max_frm_size) { + LOG (("Invalid fifo packet size\n")); + return 1; + } + + return 0; +} + +/* Handle reading and sending the incoming data from the named pipe on + * strict mode. */ +static void +handle_strict_fifo (WSServer * server) +{ + WSPipeIn *pi = server->pipein; + WSPacket **pa = &pi->packet; + int bytes = 0, readh = 0, need = 0; + + char *ptr = NULL; + uint32_t listener = 0, type = 0, size = 0; + + readh = pi->hlen; /* read from header so far */ + need = HDR_SIZE - readh; /* need to read */ + if (need > 0) { + if ((bytes = ws_read_fifo (pi->fd, pi->hdr, &pi->hlen, readh, need)) < 0) + return; + if (bytes != need) + return; + } + + /* unpack size, and type */ + ptr = pi->hdr; + ptr += unpack_uint32 (ptr, &listener); + ptr += unpack_uint32 (ptr, &type); + ptr += unpack_uint32 (ptr, &size); + + if (validate_fifo_packet (listener, type, size) == 1) { + close (pi->fd); + clear_fifo_packet (pi); + ws_openfifo_in (pi); + return; + } + + if ((*pa) == NULL) { + (*pa) = xcalloc (1, sizeof (WSPacket)); + (*pa)->type = type; + (*pa)->size = size; + (*pa)->data = xcalloc (size, sizeof (char)); + } + + readh = (*pa)->len; /* read from payload so far */ + need = (*pa)->size - readh; /* need to read */ + if (need > 0) { + if ((bytes = + ws_read_fifo (pi->fd, (*pa)->data, &(*pa)->len, readh, need)) < 0) + return; + if (bytes != need) + return; + } + + /* no clients to send data to */ + if (list_count (server->colist) == 0) { + clear_fifo_packet (pi); + return; + } + + /* Either send it to a specific client or brodcast message to all + * clients */ + if (listener != 0) + ws_send_strict_fifo_to_client (server, listener, *pa); + else + list_foreach (server->colist, ws_broadcast_fifo, *pa); + clear_fifo_packet (pi); +} + +/* Handle reading and sending the incoming data from the named pipe on + * a fixed buffer mode. */ +static void +handle_fixed_fifo (WSServer * server) +{ + WSPipeIn *pi = server->pipein; + WSPacket **pa = &pi->packet; + + int bytes = 0; + char buf[PIPE_BUF] = { 0 }; + + if ((bytes = read (pi->fd, buf, PIPE_BUF)) < 0) + return; + + buf[bytes] = '\0'; /* null-terminate */ + if (ws_validate_string (buf, bytes) != 0) + return; + + (*pa) = xcalloc (1, sizeof (WSPacket)); + (*pa)->type = WS_OPCODE_TEXT; + (*pa)->size = bytes; + (*pa)->data = xstrdup (buf); + + /* no clients to send data to */ + if (list_count (server->colist) == 0) { + clear_fifo_packet (pi); + return; + } + + /* brodcast message to all clients */ + list_foreach (server->colist, ws_broadcast_fifo, *pa); + clear_fifo_packet (pi); +} + +/* Determine which mode should use the incoming message from the FIFO. */ +static void +handle_fifo (WSServer * server) +{ + if (wsconfig.strict) + handle_strict_fifo (server); + else + handle_fixed_fifo (server); +} + +/* Creates an endpoint for communication and start listening for + * connections on a socket */ +static void +ws_socket (int *listener) +{ + int ov = 1; + struct addrinfo hints, *ai; + + /* get a socket and bind it */ + memset (&hints, 0, sizeof hints); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + /*hints.ai_flags = AI_PASSIVE; */ + if (getaddrinfo (wsconfig.host, wsconfig.port, &hints, &ai) != 0) + FATAL ("Unable to set server: %s.", gai_strerror (errno)); + + /* Create a TCP socket. */ + *listener = socket (ai->ai_family, ai->ai_socktype, ai->ai_protocol); + + /* Options */ + if (setsockopt (*listener, SOL_SOCKET, SO_REUSEADDR, &ov, sizeof (ov)) == -1) + FATAL ("Unable to set setsockopt: %s.", strerror (errno)); + + /* Bind the socket to the address. */ + if (bind (*listener, ai->ai_addr, ai->ai_addrlen) != 0) + FATAL ("Unable to set bind: %s.", strerror (errno)); + freeaddrinfo (ai); + + /* Tell the socket to accept connections. */ + if (listen (*listener, SOMAXCONN) == -1) + FATAL ("Unable to listen: %s.", strerror (errno)); +} + +/* Handle incoming messages through a pipe (let gwsocket be the + * reader) and outgoing messages through the pipe (writer). */ +static void +ws_fifos (WSServer * server, WSPipeIn * pi, WSPipeOut * po) +{ + /* handle data via fifo */ + if (pi->fd != -1 && FD_ISSET (pi->fd, &fdstate.rfds)) + handle_fifo (server); + /* handle data via fifo */ + if (po->fd != -1 && FD_ISSET (po->fd, &fdstate.wfds)) + ws_write_fifo (po, NULL, 0); +} + +/* Check each client to determine if: + * 1. We want to see if it has data for reading + * 2. We want to write data to it. + * If so, set the client's socket descriptor in the descriptor set. */ +static void +set_rfds_wfds (int listener, WSServer * server, WSPipeIn * pi, WSPipeOut * po) +{ + WSClient *client = NULL; + int conn; + + /* pipe out */ + if (po->fd != -1) { + if (po->status & WS_SENDING) + FD_SET (po->fd, &fdstate.wfds); + } + /* pipe in */ + if (pi->fd != -1) + FD_SET (pi->fd, &fdstate.rfds); + + /* self-pipe trick to stop the event loop */ + FD_SET (server->self_pipe[0], &fdstate.rfds); + /* server socket, ready for accept() */ + FD_SET (listener, &fdstate.rfds); + + for (conn = 0; conn < FD_SETSIZE; ++conn) { + if (conn == pi->fd || conn == po->fd) + continue; + if (!(client = ws_get_client_from_list (conn, &server->colist))) + continue; + + /* As long as we are not closing a connection, we assume we always + * check a client for reading */ + if (!server->closing) { + FD_SET (conn, &fdstate.rfds); + if (conn > max_file_fd) + max_file_fd = conn; + } + /* Only if we have data to send the client */ + if (client->status & WS_SENDING) { + FD_SET (conn, &fdstate.wfds); + if (conn > max_file_fd) + max_file_fd = conn; + } + } +} + +/* Start the websocket server and start to monitor multiple file + * descriptors until we have something to read or write. */ +void +ws_start (WSServer * server) +{ + WSPipeIn *pipein = server->pipein; + WSPipeOut *pipeout = server->pipeout; + int listener = 0, conn = 0; + +#ifdef HAVE_LIBSSL + if (wsconfig.sslcert && wsconfig.sslkey) { + LOG (("==Using TLS/SSL==\n")); + wsconfig.use_ssl = 1; + if (initialize_ssl_ctx (server)) { + LOG (("Unable to initialize_ssl_ctx\n")); + return; + } + } +#endif + + memset (&fdstate, 0, sizeof fdstate); + ws_socket (&listener); + + while (1) { + /* If the pipeout file descriptor was opened after the server socket + * was opened, then it's possible the max file descriptor would be the + * pipeout fd, in any case we check this here */ + max_file_fd = MAX (listener, pipeout->fd); + /* Clear out the fd sets for this iteration. */ + FD_ZERO (&fdstate.rfds); + FD_ZERO (&fdstate.wfds); + + set_rfds_wfds (listener, server, pipein, pipeout); + max_file_fd += 1; + + /* yep, wait patiently */ + /* should it be using epoll/kqueue? will see... */ + if (select (max_file_fd, &fdstate.rfds, &fdstate.wfds, NULL, NULL) == -1) { + switch (errno) { + case EINTR: + LOG (("A signal was caught on select(2)\n")); + break; + default: + FATAL ("Unable to select: %s.", strerror (errno)); + } + } + /* handle self-pipe trick */ + if (FD_ISSET (server->self_pipe[0], &fdstate.rfds)) { + LOG (("Handled self-pipe to close event loop.\n")); + break; + } + + /* iterate over existing connections */ + for (conn = 0; conn < max_file_fd; ++conn) { + if (conn != pipein->fd && conn != pipeout->fd) { + ws_listen (listener, conn, server); + } + } + /* handle FIFOs */ + ws_fifos (server, pipein, pipeout); + } +} + +/* Set the origin so the server can force connections to have the + * given HTTP origin. */ +void +ws_set_config_origin (const char *origin) +{ + wsconfig.origin = origin; +} + +/* Set the the maximum websocket frame size. */ +void +ws_set_config_frame_size (int max_frm_size) +{ + wsconfig.max_frm_size = max_frm_size; +} + +/* Set specific name for the reader named pipe. */ +void +ws_set_config_pipein (const char *pipein) +{ + wsconfig.pipein = pipein; +} + +/* Set specific name for the writer named pipe. */ +void +ws_set_config_pipeout (const char *pipeout) +{ + wsconfig.pipeout = pipeout; +} + +/* Set a path and a file for the access log. */ +void +ws_set_config_accesslog (const char *accesslog) +{ + wsconfig.accesslog = accesslog; + + if (access_log_open (wsconfig.accesslog) == 1) + FATAL ("Unable to open access log: %s.", strerror (errno)); +} + +/* Set if the server should handle strict named pipe handling. */ +void +ws_set_config_strict (int strict) +{ + wsconfig.strict = strict; +} + +/* Set the server into echo mode. */ +void +ws_set_config_echomode (int echomode) +{ + wsconfig.echomode = echomode; +} + +/* Set the server host bind address. */ +void +ws_set_config_host (const char *host) +{ + wsconfig.host = host; +} + +/* Set the server port bind address. */ +void +ws_set_config_port (const char *port) +{ + wsconfig.port = port; +} + +/* Set specific name for the SSL certificate. */ +void +ws_set_config_sslcert (const char *sslcert) +{ + wsconfig.sslcert = sslcert; +} + +/* Set specific name for the SSL key. */ +void +ws_set_config_sslkey (const char *sslkey) +{ + wsconfig.sslkey = sslkey; +} + +/* Create a new websocket server context. */ +WSServer * +ws_init (const char *host, const char *port, void (*initopts) (void)) +{ + WSServer *server = new_wsserver (); + server->pipein = new_wspipein (); + server->pipeout = new_wspipeout (); + memset (server->self_pipe, 0, sizeof (server->self_pipe)); + + wsconfig.accesslog = NULL; + wsconfig.host = host; + wsconfig.max_frm_size = WS_MAX_FRM_SZ; + wsconfig.origin = NULL; + wsconfig.pipein = NULL; + wsconfig.pipeout = NULL; + wsconfig.sslcert = NULL; + wsconfig.sslkey = NULL; + wsconfig.port = port; + wsconfig.strict = 0; + wsconfig.use_ssl = 0; + + initopts (); + ws_fifo (server); + + return server; +} diff --git a/goaccess++/src/websocket.h b/goaccess++/src/websocket.h new file mode 100644 index 0000000..0b98618 --- /dev/null +++ b/goaccess++/src/websocket.h @@ -0,0 +1,341 @@ +/** + * _______ _______ __ __ + * / ____/ | / / ___/____ _____/ /_____ / /_ + * / / __ | | /| / /\__ \/ __ \/ ___/ //_/ _ \/ __/ + * / /_/ / | |/ |/ /___/ / /_/ / /__/ ,< / __/ /_ + * \____/ |__/|__//____/\____/\___/_/|_|\___/\__/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana + * + * 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 WEBSOCKET_H_INCLUDED +#define WEBSOCKET_H_INCLUDED + +#include +#include +#include + +#if HAVE_LIBSSL +#include +#include +#include +#endif + +#if defined(__linux__) || defined(__CYGWIN__) +# include +#if ((__GLIBC__ == 2) && (__GLIBC_MINOR__ < 9)) +#if defined(__BYTE_ORDER) && (__BYTE_ORDER == __LITTLE_ENDIAN) +# include +# define htobe16(x) htons(x) +# define htobe64(x) (((uint64_t)htonl(((uint32_t)(((uint64_t)(x)) >> 32)))) | \ + (((uint64_t)htonl(((uint32_t)(x)))) << 32)) +# define be16toh(x) ntohs(x) +# define be32toh(x) ntohl(x) +# define be64toh(x) (((uint64_t)ntohl(((uint32_t)(((uint64_t)(x)) >> 32)))) | \ + (((uint64_t)ntohl(((uint32_t)(x)))) << 32)) +#else +# error Byte Order not supported! +#endif +#endif +#elif defined(__sun__) +# include +# define htobe16(x) BE_16(x) +# define htobe64(x) BE_64(x) +# define be16toh(x) BE_IN16(x) +# define be32toh(x) BE_IN32(x) +# define be64toh(x) BE_IN64(x) +#elif defined(__FreeBSD__) || defined(__NetBSD__) +# include +#elif defined(__OpenBSD__) +# include +# if !defined(be16toh) +# define be16toh(x) betoh16(x) +# endif +# if !defined(be32toh) +# define be32toh(x) betoh32(x) +# endif +# if !defined(be64toh) +# define be64toh(x) betoh64(x) +# endif +#elif defined(__APPLE__) +# include +# define htobe16(x) OSSwapHostToBigInt16(x) +# define htobe64(x) OSSwapHostToBigInt64(x) +# define be16toh(x) OSSwapBigToHostInt16(x) +# define be32toh(x) OSSwapBigToHostInt32(x) +# define be64toh(x) OSSwapBigToHostInt64(x) +#else +# error Platform not supported! +#endif + +#define MAX(a,b) (((a)>(b))?(a):(b)) +#include "gslist.h" + +#define WS_PIPEIN "/tmp/wspipein.fifo" +#define WS_PIPEOUT "/tmp/wspipeout.fifo" + +#define WS_BAD_REQUEST_STR "HTTP/1.1 400 Invalid Request\r\n\r\n" +#define WS_SWITCH_PROTO_STR "HTTP/1.1 101 Switching Protocols" +#define WS_TOO_BUSY_STR "HTTP/1.1 503 Service Unavailable\r\n\r\n" + +#define CRLF "\r\n" +#define SHA_DIGEST_LENGTH 20 + +/* packet header is 3 unit32_t : type, size, listener */ +#define HDR_SIZE 3 * 4 +#define WS_MAX_FRM_SZ 1048576 /* 1 MiB max frame size */ +#define WS_THROTTLE_THLD 2097152 /* 2 MiB throttle threshold */ + +#define WS_MAGIC_STR "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" +#define WS_PAYLOAD_EXT16 126 +#define WS_PAYLOAD_EXT64 127 +#define WS_PAYLOAD_FULL 125 +#define WS_FRM_HEAD_SZ 16 /* frame header size */ + +#define WS_FRM_FIN(x) (((x) >> 7) & 0x01) +#define WS_FRM_MASK(x) (((x) >> 7) & 0x01) +#define WS_FRM_R1(x) (((x) >> 6) & 0x01) +#define WS_FRM_R2(x) (((x) >> 5) & 0x01) +#define WS_FRM_R3(x) (((x) >> 4) & 0x01) +#define WS_FRM_OPCODE(x) ((x) & 0x0F) +#define WS_FRM_PAYLOAD(x) ((x) & 0x7F) + +#define WS_CLOSE_NORMAL 1000 +#define WS_CLOSE_GOING_AWAY 1001 +#define WS_CLOSE_PROTO_ERR 1002 +#define WS_CLOSE_INVALID_UTF8 1007 +#define WS_CLOSE_TOO_LARGE 1009 +#define WS_CLOSE_UNEXPECTED 1011 + +typedef enum WSSTATUS +{ + WS_OK = 0, + WS_ERR = (1 << 0), + WS_CLOSE = (1 << 1), + WS_READING = (1 << 2), + WS_SENDING = (1 << 3), + WS_THROTTLING = (1 << 4), + WS_TLS_ACCEPTING = (1 << 5), + WS_TLS_READING = (1 << 6), + WS_TLS_WRITING = (1 << 7), + WS_TLS_SHUTTING = (1 << 8), +} WSStatus; + +typedef enum WSOPCODE +{ + WS_OPCODE_CONTINUATION = 0x00, + WS_OPCODE_TEXT = 0x01, + WS_OPCODE_BIN = 0x02, + WS_OPCODE_END = 0x03, + WS_OPCODE_CLOSE = 0x08, + WS_OPCODE_PING = 0x09, + WS_OPCODE_PONG = 0x0A, +} WSOpcode; + +typedef struct WSQueue_ +{ + char *queued; /* queue data */ + int qlen; /* queue length */ +} WSQueue; + +typedef struct WSPacket_ +{ + uint32_t type; /* packet type (fixed-size) */ + uint32_t size; /* payload size in bytes (fixed-size) */ + char *data; /* payload */ + int len; /* payload buffer len */ +} WSPacket; + +/* WS HTTP Headers */ +typedef struct WSHeaders_ +{ + int reading; + int buflen; + char buf[BUFSIZ + 1]; + + char *agent; + char *path; + char *method; + char *protocol; + char *host; + char *origin; + char *upgrade; + char *referer; + char *connection; + char *ws_protocol; + char *ws_key; + char *ws_sock_ver; + + char *ws_accept; + char *ws_resp; +} WSHeaders; + +/* A WebSocket Message */ +typedef struct WSFrame_ +{ + /* frame format */ + WSOpcode opcode; /* frame opcode */ + unsigned char fin; /* frame fin flag */ + unsigned char mask[4]; /* mask key */ + uint8_t res; /* extensions */ + int payload_offset; /* end of header/start of payload */ + int payloadlen; /* payload length (for each frame) */ + + /* status flags */ + int reading; /* still reading frame's header part? */ + int masking; /* are we masking the frame? */ + + char buf[WS_FRM_HEAD_SZ + 1]; /* frame's header */ + int buflen; /* recv'd buf length so far (for each frame) */ +} WSFrame; + +/* A WebSocket Message */ +typedef struct WSMessage_ +{ + WSOpcode opcode; /* frame opcode */ + int fragmented; /* reading a fragmented frame */ + int mask_offset; /* for fragmented frames */ + + char *payload; /* payload message */ + int payloadsz; /* total payload size (whole message) */ + int buflen; /* recv'd buf length so far (for each frame) */ +} WSMessage; + +/* FD event states */ +typedef struct WSEState_ +{ + fd_set master; + fd_set rfds; + fd_set wfds; +} WSEState; + +/* A WebSocket Client */ +typedef struct WSClient_ +{ + /* socket data */ + int listener; /* socket */ + char remote_ip[INET6_ADDRSTRLEN]; /* client IP */ + + WSQueue *sockqueue; /* sending buffer */ + WSEState *state; /* FDs states */ + WSHeaders *headers; /* HTTP headers */ + WSFrame *frame; /* frame headers */ + WSMessage *message; /* message */ + WSStatus status; /* connection status */ + + struct timeval start_proc; + struct timeval end_proc; + +#ifdef HAVE_LIBSSL + SSL *ssl; + WSStatus sslstatus; /* ssl connection status */ +#endif +} WSClient; + +/* Config OOptions */ +typedef struct WSPipeIn_ +{ + int fd; /* named pipe FD */ + + WSPacket *packet; /* FIFO data's buffer */ + WSEState *state; /* FDs states */ + + char hdr[HDR_SIZE]; /* FIFO header's buffer */ + int hlen; +} WSPipeIn; + +/* Pipe Out */ +typedef struct WSPipeOut_ +{ + int fd; /* named pipe FD */ + WSEState *state; /* FDs states */ + WSQueue *fifoqueue; /* FIFO out queue */ + WSStatus status; /* connection status */ +} WSPipeOut; + +/* Config OOptions */ +typedef struct WSConfig_ +{ + /* Config Options */ + const char *accesslog; + const char *host; + const char *origin; + const char *pipein; + const char *pipeout; + const char *port; + const char *sslcert; + const char *sslkey; + int echomode; + int strict; + int max_frm_size; + int use_ssl; +} WSConfig; + +/* A WebSocket Instance */ +typedef struct WSServer_ +{ + /* Server Status */ + int closing; + + /* Callbacks */ + int (*onclose) (WSPipeOut * pipeout, WSClient * client); + int (*onmessage) (WSPipeOut * pipeout, WSClient * client); + int (*onopen) (WSPipeOut * pipeout, WSClient * client); + + /* self-pipe */ + int self_pipe[2]; + /* FIFO reader */ + WSPipeIn *pipein; + /* FIFO writer */ + WSPipeOut *pipeout; + /* Connected Clients */ + GSLList *colist; + +#ifdef HAVE_LIBSSL + SSL_CTX *ctx; +#endif +} WSServer; + +int ws_read_fifo (int fd, char *buf, int *buflen, int pos, int need); +int ws_send_data (WSClient * client, WSOpcode opcode, const char *p, int sz); +int ws_setfifo (const char *pipename); +int ws_validate_string (const char *str, int len); +int ws_write_fifo (WSPipeOut * pipeout, char *buffer, int len); +size_t pack_uint32 (void *buf, uint32_t val); +size_t unpack_uint32 (const void *buf, uint32_t * val); +void set_nonblocking (int listener); +void ws_set_config_accesslog (const char *accesslog); +void ws_set_config_echomode (int echomode); +void ws_set_config_frame_size (int max_frm_size); +void ws_set_config_host (const char *host); +void ws_set_config_origin (const char *origin); +void ws_set_config_pipein (const char *pipein); +void ws_set_config_pipeout (const char *pipeout); +void ws_set_config_port (const char *port); +void ws_set_config_sslcert (const char *sslcert); +void ws_set_config_sslkey (const char *sslkey); +void ws_set_config_strict (int strict); +void ws_start (WSServer * server); +void ws_stop (WSServer * server); +WSServer *ws_init (const char *host, const char *port, void (*initopts) (void)); + +#endif // for #ifndef WEBSOCKET_H diff --git a/goaccess++/src/websocket.o b/goaccess++/src/websocket.o new file mode 100644 index 0000000000000000000000000000000000000000..0db519113d908566a0e8b37c2305d1dc76cfcba0 GIT binary patch literal 48424 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 literal 0 HcmV?d00001 diff --git a/goaccess++/src/xmalloc.c b/goaccess++/src/xmalloc.c new file mode 100644 index 0000000..ba4bb92 --- /dev/null +++ b/goaccess++/src/xmalloc.c @@ -0,0 +1,88 @@ +/** + * xmalloc.c -- *alloc functions with error handling + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana + * + * 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 +#if !defined __SUNPRO_C +#include +#endif +#include +#include + +#include "error.h" +#include "xmalloc.h" + +/* Self-checking wrapper to malloc() */ +void * +xmalloc (size_t size) +{ + void *ptr; + + if ((ptr = malloc (size)) == NULL) + FATAL ("Unable to allocate memory - failed."); + + return (ptr); +} + +char * +xstrdup (const char *s) +{ + char *ptr; + size_t len; + + len = strlen (s) + 1; + ptr = xmalloc (len); + + strncpy (ptr, s, len); + return (ptr); +} + +/* Self-checking wrapper to calloc() */ +void * +xcalloc (size_t nmemb, size_t size) +{ + void *ptr; + + if ((ptr = calloc (nmemb, size)) == NULL) + FATAL ("Unable to calloc memory - failed."); + + return (ptr); +} + +/* Self-checking wrapper to realloc() */ +void * +xrealloc (void *oldptr, size_t size) +{ + void *newptr; + + if ((newptr = realloc (oldptr, size)) == NULL) + FATAL ("Unable to reallocate memory - failed"); + + return (newptr); +} diff --git a/goaccess++/src/xmalloc.h b/goaccess++/src/xmalloc.h new file mode 100644 index 0000000..dafd739 --- /dev/null +++ b/goaccess++/src/xmalloc.h @@ -0,0 +1,38 @@ +/** + * ______ ___ + * / ____/___ / | _____________ __________ + * / / __/ __ \/ /| |/ ___/ ___/ _ \/ ___/ ___/ + * / /_/ / /_/ / ___ / /__/ /__/ __(__ |__ ) + * \____/\____/_/ |_\___/\___/\___/____/____/ + * + * The MIT License (MIT) + * Copyright (c) 2009-2016 Gerardo Orellana + * + * 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 XMALLOC_H_INCLUDED +#define XMALLOC_H_INCLUDED + +char *xstrdup (const char *s); +void *xcalloc (size_t nmemb, size_t size); +void *xmalloc (size_t size); +void *xrealloc (void *oldptr, size_t size); + +#endif diff --git a/goaccess++/src/xmalloc.o b/goaccess++/src/xmalloc.o new file mode 100644 index 0000000000000000000000000000000000000000..d9a831108ac3a1b45a11f9146329f4d2a08fd655 GIT binary patch literal 6432 zcmd6rZEO@p7{{j^g;MZZPy_{GdDEh@+?5t6g6Yw;J>pqVTSX&YuXlTJp}i}6TWF04 z2`{0+A~C`6NfR~EsL}Yv7otD}gT}`d?9=^c`&2~V;+ zGrxJ}KQH^t?B4Baj2o zz4GXu(-o)u;=wgc!zZIdH*hAVlX5N{=We1yQdhZ4ujszds`kFeb$)Z@BHhC$rRT9* zWVLixGP0-9y+%F=ky~s?_NIm~rqg2!t|E18+*K;0Luz)i*AqM&zkh$0=hqAm52p|F z`b640qJvjPRw*{rSr!}oQ98#4zmE=Hhz_3do6^#4iadTQowlpy?j=ESeXs928sI;z z?>zE}9xVQ-{-gCBS=s9?{yMH(iFAlDTX;v)M{#x*e-8@1#U%<*NGStLhuX z{fPm~YOrcUwRIwFFB44#&sElVDYi&v7tz0tM=enekcaux|dlKE< zxul&Gm6bwNw&o(qq?6BEORVjVo6qF3q(KF`Nv&q7q7|%!$9?$qIEebdsE87NCpmCO;8nPd+Hh z`m4)kO_^A6n9h)y#AmCzIr4-IR<~6KDgqXd306NdE)tx%KhPSqlEImg zVD;Kyh1BR&ex?R%KUJbm;i3r-WxTjJT&yxs^o_xD)w3PlDnLrbEFf2FY)wE+7z1fJ zsMm>du3TB6JZ@8**Pc!DrIcrXZIg6{(g1M4#L=rz6A(ID3ygCC!J`^&5m_u3i$`P8 zqPUI&U45V8JP))DvM_cX_=w>sTO!lK?J=1xr?>fNiz~iyG!`jYo**oPXB3YbJS)rP zB5iO_aRZA12_}eMqhgohM-9%!z{t}pRPLkfG>A7D-^7OK($Bo$EyVs3{N)n-^%DG@ z68uC7e!2wzyafNc1pk&e&)4D&NGA6^r9aSBY`#C2;FpNAPN&k*>-Jj-|G$*~ZvF%! z)Bcw!U##Epq&rpoI;{7bPW1swuZeiPrK7E>eck%Dc-*dE77CjrTswxW6n3m>8Q;Qu ztL0lA-|G3coNp`mCjA;X7Y^}V-ommCsp>;K-WprKHWG`kZ)tg`xjo(d>#0Y;H%~>ygVia-#4FIESvw^p(iQ=ROkS@*n zoMU5NMVIEw8Im#Q=coBvhGfjA(xrJTLoy!EJi0V*V@SsS^XYms!X+V|@Ds@`%4>fI z_%z_#6gTyEg1-g+gTQYDen@fF;ZJ$p?-9j$oEGp`fb%J?&)+wIGt)Z!LxhcWrqiYQ zhYZQg@qg;$G3)RZ@S7>Gb-q#D9RE4+x4{1*@EO4WP~6nH0{+-9?^ibVUr3i8PZ0Pb z;L{c7b>LXl{!79C4&e6ypACE+aE@WElL3Aw@P6R9FLo(zKHmetabG+O9QVcZz;R!^ z1RVFptBUiw&4Y2i1^)Ai>wR$?xCQ>70LOjtrQ)Xkci@jY=YiwCxBxo1FMbDq)EUnU zNyZ89iz!?nn+zQH#SGxMFJ>!lj=u){Ez;G`y$(44s@J>$ba4F5;Ey^F0LOjta0#7F z;E(;Lz#sQT7C7#UKG4B^F$n&5!@Q0H$9R4bbZ}m;0mpcL8#u=EyTCD?KL(ERd`5Be zd3^!?^J)A#p3efuah?N?@qAHnQ~wJ1qt2uNbwM-@khZQ`)vn)EA;y)=qv#4fIsSN1CH^$y@bwA@W+1lg8xG3_YiQ5 z=Odtl@yugm&JXl>i7sK&XOy3A(K*-YPS~E) z?+H6a|40bCE1ws(o8tnzhi&@M!yA^mMIrmhPe$%~{#s`})o@;inRcuw_j8s8D%I^ZeuOgIKBR$4YgBt)A2i*s zPCKbm=h3fSwMWKz)3=ux|7&56f8#Zd|A5jo+xM&XN2wmooc|uGEEaz?e0Y*|%DWI8 ze;ks!J)a$HJRh@f=GAILY*5dU-);PzXttk3%#1xkqLUAGvdPAR8AbV