[PATCH 3/3] Cygwin: tzcode resync v2: details

Mark Geisert mark@maxrnd.com
Tue May 19 05:02:29 GMT 2020


Add tz_posixrules.h with data generated from most recent Cygwin tzdata
package.  Establish localtime.cc as primarily a wrapper around a patched
copy of localtime.c.  See README for more information.

---
 winsup/cygwin/tzcode/README            |  37 +++
 winsup/cygwin/tzcode/localtime.c.patch | 399 +++++++++++++++++++++++++
 winsup/cygwin/tzcode/localtime.cc      | 159 ++++++++++
 winsup/cygwin/tzcode/tz_posixrules.h   | 231 ++++++++++++++
 4 files changed, 826 insertions(+)
 create mode 100644 winsup/cygwin/tzcode/README
 create mode 100644 winsup/cygwin/tzcode/localtime.c.patch
 create mode 100644 winsup/cygwin/tzcode/localtime.cc
 create mode 100644 winsup/cygwin/tzcode/tz_posixrules.h

diff --git a/winsup/cygwin/tzcode/README b/winsup/cygwin/tzcode/README
new file mode 100644
index 000000000..dd01ac565
--- /dev/null
+++ b/winsup/cygwin/tzcode/README
@@ -0,0 +1,37 @@
+/*
+	How the code in this directory is supposed to work...
+	2020/05/13 Mark Geisert <mark@maxrnd.com>
+
+	localtime.cc is the Cygwin-specific module that is compiled into
+	the Cygwin DLL when the latter is built.  It's just a wrapper that
+	#defines a bunch of stuff then #includes localtime.c.
+
+	localtime.c, at any point in time, is a reasonably recent version
+	of /src/lib/libc/time/localtime.c from NetBSD.  The same goes for
+	private.h and tzfile.h.
+
+	The idea is that in the future, one just needs to bring over newer
+	versions of localtime.c, private.h, and/or tzfile.h from NetBSD as
+	they become available.
+
+	With luck, you can drop those files into this directory and they
+	can be immediately used to build a newer Cygwin DLL that has the
+	newer NetBSD functionality.  Without luck, you'll have to tweak the
+	wrapper localtime.cc.  In the worst case, some other strategy will
+	need to be figured out, such as manually pulling out the parts of
+	the NetBSD code Cygwin needs to build a stand-alone localtime.cc.
+
+	Re tz_posixrules.h: The data elements can be generated from
+	/usr/share/zoneinfo/posixrules in any version of Cygwin's tzdata
+	package.  Instructions are in the comment leading tz_posixrules.h.
+
+	Addendum:
+	Implementation of the strategy above has uncovered a small number
+	of NetBSD-isms in localtime.c that cannot be worked around with
+	preprocessor tricks.  So there is another file localtime.c.patched
+	that holds just these adjustments for Cygwin, and it's this file
+	that localtime.cc #includes.  localtime.c.patched is generated by
+	winsup/cygwin/Makefile[.in] operating with localtime.c.patch.
+
+	..mark
+*/
diff --git a/winsup/cygwin/tzcode/localtime.c.patch b/winsup/cygwin/tzcode/localtime.c.patch
new file mode 100644
index 000000000..a17d9ee90
--- /dev/null
+++ b/winsup/cygwin/tzcode/localtime.c.patch
@@ -0,0 +1,399 @@
+*** localtime.c	2020-05-16 21:54:00.533111800 -0700
+--- localtime.c.patched	2020-05-16 22:42:40.486924300 -0700
+***************
+*** 1,3 ****
+--- 1,4 ----
++ // localtime.c.patched: based on NetBSD's localtime.c version 1.122
+  /*	$NetBSD: localtime.c,v 1.122 2019/07/03 15:50:16 christos Exp $	*/
+  
+  /* Convert timestamp from time_t to struct tm.  */
+***************
+*** 23,29 ****
+  
+  /*LINTLIBRARY*/
+  
+- #include "namespace.h"
+  #include <assert.h>
+  #define LOCALTIME_IMPLEMENTATION
+  #include "private.h"
+--- 24,29 ----
+***************
+*** 182,188 ****
+  
+  
+  #if !defined(__LIBC12_SOURCE__)
+! timezone_t __lclptr;
+  #ifdef _REENTRANT
+  rwlock_t __lcl_lock = RWLOCK_INITIALIZER;
+  #endif
+--- 182,188 ----
+  
+  
+  #if !defined(__LIBC12_SOURCE__)
+! static timezone_t __lclptr;
+  #ifdef _REENTRANT
+  rwlock_t __lcl_lock = RWLOCK_INITIALIZER;
+  #endif
+***************
+*** 198,204 ****
+  
+  static struct tm	tm;
+  
+! #if !HAVE_POSIX_DECLS || TZ_TIME_T || defined(__NetBSD__)
+  # if !defined(__LIBC12_SOURCE__)
+  
+  __aconst char *		tzname[2] = {
+--- 198,204 ----
+  
+  static struct tm	tm;
+  
+! #if !HAVE_POSIX_DECLS || TZ_TIME_T || defined(__NetBSD__) || defined(__CYGWIN__)
+  # if !defined(__LIBC12_SOURCE__)
+  
+  __aconst char *		tzname[2] = {
+***************
+*** 413,419 ****
+  };
+  
+  /* TZDIR with a trailing '/' rather than a trailing '\0'.  */
+! static char const tzdirslash[sizeof TZDIR] = TZDIR "/";
+  
+  /* Local storage needed for 'tzloadbody'.  */
+  union local_storage {
+--- 413,420 ----
+  };
+  
+  /* TZDIR with a trailing '/' rather than a trailing '\0'.  */
+! static char const tzdirslash[] = TZDIR "/";
+! #define sizeof_tzdirslash (sizeof tzdirslash - 1)
+  
+  /* Local storage needed for 'tzloadbody'.  */
+  union local_storage {
+***************
+*** 428,434 ****
+  
+  	/* The file name to be opened.  */
+  	char fullname[/*CONSTCOND*/BIGGEST(sizeof (struct file_analysis),
+! 	    sizeof tzdirslash + 1024)];
+  };
+  
+  /* Load tz data from the file named NAME into *SP.  Read extended
+--- 429,435 ----
+  
+  	/* The file name to be opened.  */
+  	char fullname[/*CONSTCOND*/BIGGEST(sizeof (struct file_analysis),
+! 	    sizeof_tzdirslash + 1024)];
+  };
+  
+  /* Load tz data from the file named NAME into *SP.  Read extended
+***************
+*** 466,479 ****
+  	if (!doaccess) {
+  		char const *dot;
+  		size_t namelen = strlen(name);
+! 		if (sizeof lsp->fullname - sizeof tzdirslash <= namelen)
+  			return ENAMETOOLONG;
+  
+  		/* Create a string "TZDIR/NAME".  Using sprintf here
+  		   would pull in stdio (and would fail if the
+  		   resulting string length exceeded INT_MAX!).  */
+! 		memcpy(lsp->fullname, tzdirslash, sizeof tzdirslash);
+! 		strcpy(lsp->fullname + sizeof tzdirslash, name);
+  
+  		/* Set doaccess if NAME contains a ".." file name
+  		   component, as such a name could read a file outside
+--- 467,480 ----
+  	if (!doaccess) {
+  		char const *dot;
+  		size_t namelen = strlen(name);
+! 		if (sizeof lsp->fullname - sizeof_tzdirslash <= namelen)
+  			return ENAMETOOLONG;
+  
+  		/* Create a string "TZDIR/NAME".  Using sprintf here
+  		   would pull in stdio (and would fail if the
+  		   resulting string length exceeded INT_MAX!).  */
+! 		memcpy(lsp->fullname, tzdirslash, sizeof_tzdirslash);
+! 		strcpy(lsp->fullname + sizeof_tzdirslash, name);
+  
+  		/* Set doaccess if NAME contains a ".." file name
+  		   component, as such a name could read a file outside
+***************
+*** 488,498 ****
+  		name = lsp->fullname;
+  	}
+  	if (doaccess && access(name, R_OK) != 0)
+! 		return errno;
+  
+  	fid = open(name, OPEN_MODE);
+  	if (fid < 0)
+! 		return errno;
+  	nread = read(fid, up->buf, sizeof up->buf);
+  	if (nread < (ssize_t)tzheadsize) {
+  		int err = nread < 0 ? errno : EINVAL;
+--- 489,499 ----
+  		name = lsp->fullname;
+  	}
+  	if (doaccess && access(name, R_OK) != 0)
+! 		goto trydefrules;
+  
+  	fid = open(name, OPEN_MODE);
+  	if (fid < 0)
+! 		goto trydefrules;
+  	nread = read(fid, up->buf, sizeof up->buf);
+  	if (nread < (ssize_t)tzheadsize) {
+  		int err = nread < 0 ? errno : EINVAL;
+***************
+*** 501,506 ****
+--- 502,516 ----
+  	}
+  	if (close(fid) < 0)
+  		return errno;
++ 	if (0) {
++ trydefrules:
++ 		const char *base = strrchr(name, '/');
++ 		base = base ? base + 1 : name;
++ 		if (strcmp(base, TZDEFRULES))
++ 		    return errno;
++ 		nread = sizeof _posixrules_data;
++ 		memcpy(up->buf, _posixrules_data, nread);
++ 	}
+  	for (stored = 4; stored <= 8; stored *= 2) {
+  		int_fast32_t ttisstdcnt = detzcode(up->tzhead.tzh_ttisstdcnt);
+  		int_fast32_t ttisutcnt = detzcode(up->tzhead.tzh_ttisutcnt);
+***************
+*** 793,799 ****
+  static int
+  tzload(char const *name, struct state *sp, bool doextend)
+  {
+! 	union local_storage *lsp = malloc(sizeof *lsp);
+  	if (!lsp)
+  		return errno;
+  	else {
+--- 803,809 ----
+  static int
+  tzload(char const *name, struct state *sp, bool doextend)
+  {
+! 	union local_storage *lsp = (union local_storage *) calloc(1, sizeof *lsp);
+  	if (!lsp)
+  		return errno;
+  	else {
+***************
+*** 1417,1429 ****
+  tzsetlcl(char const *name)
+  {
+  	struct state *sp = __lclptr;
+  	int lcl = name ? strlen(name) < sizeof lcl_TZname : -1;
+  	if (lcl < 0 ? lcl_is_set < 0
+  	    : 0 < lcl_is_set && strcmp(lcl_TZname, name) == 0)
+  		return;
+  
+  	if (! sp)
+! 		__lclptr = sp = malloc(sizeof *__lclptr);
+  	if (sp) {
+  		if (zoneinit(sp, name) != 0)
+  			zoneinit(sp, "");
+--- 1427,1441 ----
+  tzsetlcl(char const *name)
+  {
+  	struct state *sp = __lclptr;
++ 	if (! name)
++ 		name = tzgetwintzi(__UNCONST(wildabbr), (char *) alloca (512));
+  	int lcl = name ? strlen(name) < sizeof lcl_TZname : -1;
+  	if (lcl < 0 ? lcl_is_set < 0
+  	    : 0 < lcl_is_set && strcmp(lcl_TZname, name) == 0)
+  		return;
+  
+  	if (! sp)
+! 		__lclptr = sp = (struct state *) calloc(1, sizeof *__lclptr);
+  	if (sp) {
+  		if (zoneinit(sp, name) != 0)
+  			zoneinit(sp, "");
+***************
+*** 1438,1446 ****
+  void
+  tzsetwall(void)
+  {
+! 	rwlock_wrlock(&__lcl_lock);
+  	tzsetlcl(NULL);
+! 	rwlock_unlock(&__lcl_lock);
+  }
+  #endif
+  
+--- 1450,1458 ----
+  void
+  tzsetwall(void)
+  {
+! 	tzset_guard.init("tzset_guard")->acquire();
+  	tzsetlcl(NULL);
+! 	tzset_guard.release();
+  }
+  #endif
+  
+***************
+*** 1453,1475 ****
+  void
+  tzset(void)
+  {
+! 	rwlock_wrlock(&__lcl_lock);
+  	tzset_unlocked();
+! 	rwlock_unlock(&__lcl_lock);
+  }
+  
+  static void
+  gmtcheck(void)
+  {
+  	static bool gmt_is_set;
+! 	rwlock_wrlock(&__lcl_lock);
+  	if (! gmt_is_set) {
+! 		gmtptr = malloc(sizeof *gmtptr);
+  		if (gmtptr)
+  			gmtload(gmtptr);
+  		gmt_is_set = true;
+  	}
+! 	rwlock_unlock(&__lcl_lock);
+  }
+  
+  #if NETBSD_INSPIRED
+--- 1465,1487 ----
+  void
+  tzset(void)
+  {
+! 	tzset_guard.init("tzset_guard")->acquire();
+  	tzset_unlocked();
+! 	tzset_guard.release();
+  }
+  
+  static void
+  gmtcheck(void)
+  {
+  	static bool gmt_is_set;
+! 	tzset_guard.init("tzset_guard")->acquire();
+  	if (! gmt_is_set) {
+! 		gmtptr = (timezone_t) calloc(1, sizeof *gmtptr);
+  		if (gmtptr)
+  			gmtload(gmtptr);
+  		gmt_is_set = true;
+  	}
+! 	tzset_guard.release();
+  }
+  
+  #if NETBSD_INSPIRED
+***************
+*** 1477,1483 ****
+  timezone_t
+  tzalloc(const char *name)
+  {
+! 	timezone_t sp = malloc(sizeof *sp);
+  	if (sp) {
+  		int err = zoneinit(sp, name);
+  		if (err != 0) {
+--- 1489,1495 ----
+  timezone_t
+  tzalloc(const char *name)
+  {
+! 	timezone_t sp = (timezone_t) calloc(1, sizeof *sp);
+  	if (sp) {
+  		int err = zoneinit(sp, name);
+  		if (err != 0) {
+***************
+*** 1618,1628 ****
+  static struct tm *
+  localtime_tzset(time_t const *timep, struct tm *tmp, bool setname)
+  {
+! 	rwlock_wrlock(&__lcl_lock);
+  	if (setname || !lcl_is_set)
+  		tzset_unlocked();
+  	tmp = localsub(__lclptr, timep, setname, tmp);
+! 	rwlock_unlock(&__lcl_lock);
+  	return tmp;
+  }
+  
+--- 1630,1640 ----
+  static struct tm *
+  localtime_tzset(time_t const *timep, struct tm *tmp, bool setname)
+  {
+! 	tzset_guard.init("tzset_guard")->acquire();
+  	if (setname || !lcl_is_set)
+  		tzset_unlocked();
+  	tmp = localsub(__lclptr, timep, setname, tmp);
+! 	tzset_guard.release();
+  	return tmp;
+  }
+  
+***************
+*** 2358,2367 ****
+  {
+  	time_t t;
+  
+! 	rwlock_wrlock(&__lcl_lock);
+  	tzset_unlocked();
+  	t = mktime_tzname(__lclptr, tmp, true);
+! 	rwlock_unlock(&__lcl_lock);
+  	return t;
+  }
+  
+--- 2370,2379 ----
+  {
+  	time_t t;
+  
+! 	tzset_guard.init("tzset_guard")->acquire();
+  	tzset_unlocked();
+  	t = mktime_tzname(__lclptr, tmp, true);
+! 	tzset_guard.release();
+  	return t;
+  }
+  
+***************
+*** 2439,2450 ****
+  time_t
+  time2posix(time_t t)
+  {
+! 	rwlock_wrlock(&__lcl_lock);
+  	if (!lcl_is_set)
+  		tzset_unlocked();
+  	if (__lclptr)
+  		t = (time_t)(t - leapcorr(__lclptr, t));
+! 	rwlock_unlock(&__lcl_lock);
+  	return t;
+  }
+  
+--- 2451,2462 ----
+  time_t
+  time2posix(time_t t)
+  {
+! 	tzset_guard.init("tzset_guard")->acquire();
+  	if (!lcl_is_set)
+  		tzset_unlocked();
+  	if (__lclptr)
+  		t = (time_t)(t - leapcorr(__lclptr, t));
+! 	tzset_guard.release();
+  	return t;
+  }
+  
+***************
+*** 2481,2492 ****
+  time_t
+  posix2time(time_t t)
+  {
+! 	rwlock_wrlock(&__lcl_lock);
+  	if (!lcl_is_set)
+  		tzset_unlocked();
+  	if (__lclptr)
+  		t = posix2time_z(__lclptr, t);
+! 	rwlock_unlock(&__lcl_lock);
+  	return t;
+  }
+  
+--- 2493,2504 ----
+  time_t
+  posix2time(time_t t)
+  {
+! 	tzset_guard.init("tzset_guard")->acquire();
+  	if (!lcl_is_set)
+  		tzset_unlocked();
+  	if (__lclptr)
+  		t = posix2time_z(__lclptr, t);
+! 	tzset_guard.release();
+  	return t;
+  }
+  
diff --git a/winsup/cygwin/tzcode/localtime.cc b/winsup/cygwin/tzcode/localtime.cc
new file mode 100644
index 000000000..893f84ad8
--- /dev/null
+++ b/winsup/cygwin/tzcode/localtime.cc
@@ -0,0 +1,159 @@
+/* localtime.cc: Wrapper of NetBSD tzcode support for Cygwin. See README file.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license.  Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include "../winsup.h"
+#include "../sync.h"
+#include "../include/cygwin/version.h"
+#include "tz_posixrules.h"
+
+static NO_COPY muto tzset_guard;
+
+// Set these NetBSD-related option #defines appropriately for Cygwin
+//#define STD_INSPIRED	// early-include private.h below does this
+#define lint
+#define USG_COMPAT 1
+#define NO_ERROR_IN_DST_GAP
+#define state __state
+
+// Turn a specific known kind of const parameter into non-const
+#define __UNCONST(X) ((char *) (X))
+
+// Turn off these NetBSD audit-related definitions
+#define __aconst
+#define _DIAGASSERT(X)
+
+// Supply this Cygwin-specific function in advance of its use in localtime.c
+static char *
+tzgetwintzi (char *wildabbr, char *outbuf)
+{
+    TIME_ZONE_INFORMATION tzi;
+    char *cp, *dst;
+    wchar_t *wsrc;
+    div_t d;
+
+    GetTimeZoneInformation (&tzi);
+    dst = cp = outbuf;
+    for (wsrc = tzi.StandardName; *wsrc; wsrc++)
+	if (*wsrc >= L'A' && *wsrc <= L'Z')
+	    *dst++ = *wsrc;
+    if ((dst - cp) < 3)
+      {
+	/* In non-english Windows, converted tz.StandardName
+	   may not contain a valid standard timezone name. */
+	strcpy (cp, wildabbr);
+	cp += strlen (wildabbr);
+      }
+    else
+	cp = dst;
+    d = div (tzi.Bias + tzi.StandardBias, 60);
+    __small_sprintf (cp, "%d", d.quot);
+    if (d.rem)
+	__small_sprintf (cp = strchr (cp, 0), ":%d", abs (d.rem));
+    if (tzi.StandardDate.wMonth)
+      {
+	cp = strchr (cp, 0);
+	dst = cp;
+	for (wsrc = tzi.DaylightName; *wsrc; wsrc++)
+	    if (*wsrc >= L'A' && *wsrc <= L'Z')
+		*dst++ = *wsrc;
+	if ((dst - cp) < 3)
+	  {
+	    /* In non-english Windows, converted tz.DaylightName
+	       may not contain a valid daylight timezone name. */
+	    strcpy (cp, wildabbr);
+	    cp += strlen (wildabbr);
+	  }
+	else
+	    cp = dst;
+	d = div (tzi.Bias + tzi.DaylightBias, 60);
+	__small_sprintf (cp, "%d", d.quot);
+	if (d.rem)
+	    __small_sprintf (cp = strchr (cp, 0), ":%d", abs (d.rem));
+	cp = strchr (cp, 0);
+	__small_sprintf (cp = strchr (cp, 0), ",M%d.%d.%d/%d",
+			 tzi.DaylightDate.wMonth,
+			 tzi.DaylightDate.wDay,
+			 tzi.DaylightDate.wDayOfWeek,
+			 tzi.DaylightDate.wHour);
+	if (tzi.DaylightDate.wMinute || tzi.DaylightDate.wSecond)
+	    __small_sprintf (cp = strchr (cp, 0), ":%d",
+			     tzi.DaylightDate.wMinute);
+	if (tzi.DaylightDate.wSecond)
+	    __small_sprintf (cp = strchr (cp, 0), ":%d",
+			     tzi.DaylightDate.wSecond);
+	cp = strchr (cp, 0);
+	__small_sprintf (cp = strchr (cp, 0), ",M%d.%d.%d/%d",
+			 tzi.StandardDate.wMonth,
+			 tzi.StandardDate.wDay,
+			 tzi.StandardDate.wDayOfWeek,
+			 tzi.StandardDate.wHour);
+	if (tzi.StandardDate.wMinute || tzi.StandardDate.wSecond)
+	    __small_sprintf (cp = strchr (cp, 0), ":%d",
+			     tzi.StandardDate.wMinute);
+	if (tzi.StandardDate.wSecond)
+	    __small_sprintf (cp = strchr (cp, 0), ":%d",
+			     tzi.StandardDate.wSecond);
+      }
+    /* __small_printf ("TZ deduced as `%s'\n", outbuf); */
+    return outbuf;
+}
+
+// Get ready to wrap NetBSD's localtime.c
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Pull these in early to catch any small issues before the real test
+#include "private.h"
+#include "tzfile.h"
+
+/* Some NetBSD differences were too difficult to work around..
+   so #include a patched copy of localtime.c rather than the NetBSD original.
+   Here is a list of the patches...
+   (1) fix an erroneous decl of tzdirslash size (flagged by g++)
+   (2) add missing casts on all results of malloc() calls (flagged by g++)
+   (3) change all malloc() calls to analogous calloc() calls
+   (4) add conditional call to Cygwin's tzgetwintzi() from tzsetlcl()
+   (5) add Cygwin's historical "posixrules" support to tzloadbody()
+   (6) enable exported defs of daylight, timezone, and tzname
+   (7) make def of __lclptr static to avoid exporting it
+   (8) change NetBSD rwlock ops to analogous Cygwin muto ops
+*/
+#include "localtime.c.patched"
+
+#ifdef __cplusplus
+}
+#endif
+
+// Don't forget these Cygwin-specific additions from this point to EOF
+EXPORT_ALIAS (tzset_unlocked, _tzset_unlocked)
+
+extern "C" long
+__cygwin_gettzoffset (const struct tm *tmp)
+{
+#ifdef TM_GMTOFF
+    if (CYGWIN_VERSION_CHECK_FOR_EXTRA_TM_MEMBERS)
+    	return tmp->TM_GMTOFF;
+#endif /* defined TM_GMTOFF */
+    __tzinfo_type *tz = __gettzinfo ();
+    /* The sign of this is exactly opposite the envvar TZ.  We
+       could directly use the global _timezone for tm_isdst==0,
+       but have to use __tzrule for daylight savings.  */
+    long offset = -tz->__tzrule[tmp->tm_isdst > 0].offset;
+    return offset;
+}
+
+extern "C" const char *
+__cygwin_gettzname (const struct tm *tmp)
+{
+#ifdef TM_ZONE
+    if (CYGWIN_VERSION_CHECK_FOR_EXTRA_TM_MEMBERS)
+	return tmp->TM_ZONE;
+#endif
+    return _tzname[tmp->tm_isdst > 0];
+}
diff --git a/winsup/cygwin/tzcode/tz_posixrules.h b/winsup/cygwin/tzcode/tz_posixrules.h
new file mode 100644
index 000000000..ebfcd065a
--- /dev/null
+++ b/winsup/cygwin/tzcode/tz_posixrules.h
@@ -0,0 +1,231 @@
+/*	tz_posixrules.h
+ *
+ *	The data elements were generated with...
+ *	od -vt u1 -A n /usr/share/zoneinfo/posixrules | 
+ *		sed 's/$/,/;s/^ //;s/[0-9] /&,/g;s/ ,/, /g' > elements_file
+ *
+ *	The source posixrules file is from the Cygwin tzdata 2020a-1 package.
+ */
+static NO_COPY unsigned char _posixrules_data[] = {
+ 84,  90, 105, 102,  50,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+  0,   0,   0,   0,   0,   0,   0,   5,   0,   0,   0,   5,   0,   0,   0,   0,
+  0,   0,   0, 236,   0,   0,   0,   5,   0,   0,   0,  20, 128,   0,   0,   0,
+158, 166,  30, 112, 159, 186, 235,  96, 160, 134,   0, 112, 161, 154, 205,  96,
+162, 101, 226, 112, 163, 131, 233, 224, 164, 106, 174, 112, 165,  53, 167,  96,
+166,  83, 202, 240, 167,  21, 137,  96, 168,  51, 172, 240, 168, 254, 165, 224,
+170,  19, 142, 240, 170, 222, 135, 224, 171, 243, 112, 240, 172, 190, 105, 224,
+173, 211,  82, 240, 174, 158,  75, 224, 175, 179,  52, 240, 176, 126,  45, 224,
+177, 156,  81, 112, 178, 103,  74,  96, 179, 124,  51, 112, 180,  71,  44,  96,
+181,  92,  21, 112, 182,  39,  14,  96, 183,  59, 247, 112, 184,   6, 240,  96,
+185,  27, 217, 112, 185, 230, 210,  96, 187,   4, 245, 240, 187, 198, 180,  96,
+188, 228, 215, 240, 189, 175, 208, 224, 190, 196, 185, 240, 191, 143, 178, 224,
+192, 164, 155, 240, 193, 111, 148, 224, 194, 132, 125, 240, 195,  79, 118, 224,
+196, 100,  95, 240, 197,  47,  88, 224, 198,  77, 124, 112, 199,  15,  58, 224,
+200,  45,  94, 112, 200, 248,  87,  96, 202,  13,  64, 112, 202, 216,  57,  96,
+203, 136, 240, 112, 210,  35, 244, 112, 210,  96, 251, 224, 211, 117, 228, 240,
+212,  64, 221, 224, 213,  85, 198, 240, 214,  32, 191, 224, 215,  53, 168, 240,
+216,   0, 161, 224, 217,  21, 138, 240, 217, 224, 131, 224, 218, 254, 167, 112,
+219, 192, 101, 224, 220, 222, 137, 112, 221, 169, 130,  96, 222, 190, 107, 112,
+223, 137, 100,  96, 224, 158,  77, 112, 225, 105,  70,  96, 226, 126,  47, 112,
+227,  73,  40,  96, 228,  94,  17, 112, 229,  87,  46, 224, 230,  71,  45, 240,
+231,  55,  16, 224, 232,  39,  15, 240, 233,  22, 242, 224, 234,   6, 241, 240,
+234, 246, 212, 224, 235, 230, 211, 240, 236, 214, 182, 224, 237, 198, 181, 240,
+238, 191, 211,  96, 239, 175, 210, 112, 240, 159, 181,  96, 241, 143, 180, 112,
+242, 127, 151,  96, 243, 111, 150, 112, 244,  95, 121,  96, 245,  79, 120, 112,
+246,  63,  91,  96, 247,  47,  90, 112, 248,  40, 119, 224, 249,  15,  60, 112,
+250,   8,  89, 224, 250, 248,  88, 240, 251, 232,  59, 224, 252, 216,  58, 240,
+253, 200,  29, 224, 254, 184,  28, 240, 255, 167, 255, 224,   0, 151, 254, 240,
+  1, 135, 225, 224,   2, 119, 224, 240,   3, 112, 254,  96,   4,  96, 253, 112,
+  5,  80, 224,  96,   6,  64, 223, 112,   7,  48, 194,  96,   7, 141,  25, 112,
+  9,  16, 164,  96,   9, 173, 148, 240,  10, 240, 134,  96,  11, 224, 133, 112,
+ 12, 217, 162, 224,  13, 192, 103, 112,  14, 185, 132, 224,  15, 169, 131, 240,
+ 16, 153, 102, 224,  17, 137, 101, 240,  18, 121,  72, 224,  19, 105,  71, 240,
+ 20,  89,  42, 224,  21,  73,  41, 240,  22,  57,  12, 224,  23,  41,  11, 240,
+ 24,  34,  41,  96,  25,   8, 237, 240,  26,   2,  11,  96,  26, 242,  10, 112,
+ 27, 225, 237,  96,  28, 209, 236, 112,  29, 193, 207,  96,  30, 177, 206, 112,
+ 31, 161, 177,  96,  32, 118,   0, 240,  33, 129, 147,  96,  34,  85, 226, 240,
+ 35, 106, 175, 224,  36,  53, 196, 240,  37,  74, 145, 224,  38,  21, 166, 240,
+ 39,  42, 115, 224,  39, 254, 195, 112,  41,  10,  85, 224,  41, 222, 165, 112,
+ 42, 234,  55, 224,  43, 190, 135, 112,  44, 211,  84,  96,  45, 158, 105, 112,
+ 46, 179,  54,  96,  47, 126,  75, 112,  48, 147,  24,  96,  49, 103, 103, 240,
+ 50, 114, 250,  96,  51,  71,  73, 240,  52,  82, 220,  96,  53,  39,  43, 240,
+ 54,  50, 190,  96,  55,   7,  13, 240,  56,  27, 218, 224,  56, 230, 239, 240,
+ 57, 251, 188, 224,  58, 198, 209, 240,  59, 219, 158, 224,  60, 175, 238, 112,
+ 61, 187, 128, 224,  62, 143, 208, 112,  63, 155,  98, 224,  64, 111, 178, 112,
+ 65, 132, 127,  96,  66,  79, 148, 112,  67, 100,  97,  96,  68,  47, 118, 112,
+ 69,  68,  67,  96,  69, 243, 168, 240,  71,  45,  95, 224,  71, 211, 138, 240,
+ 73,  13,  65, 224,  73, 179, 108, 240,  74, 237,  35, 224,  75, 156, 137, 112,
+ 76, 214,  64,  96,  77, 124, 107, 112,  78, 182,  34,  96,  79,  92,  77, 112,
+ 80, 150,   4,  96,  81,  60,  47, 112,  82, 117, 230,  96,  83,  28,  17, 112,
+ 84,  85, 200,  96,  84, 251, 243, 112,  86,  53, 170,  96,  86, 229,  15, 240,
+ 88,  30, 198, 224,  88, 196, 241, 240,  89, 254, 168, 224,  90, 164, 211, 240,
+ 91, 222, 138, 224,  92, 132, 181, 240,  93, 190, 108, 224,  94, 100, 151, 240,
+ 95, 158,  78, 224,  96,  77, 180, 112,  97, 135, 107,  96,  98,  45, 150, 112,
+ 99, 103,  77,  96, 100,  13, 120, 112, 101,  71,  47,  96, 101, 237,  90, 112,
+103,  39,  17,  96, 103, 205,  60, 112, 105,   6, 243,  96, 105, 173,  30, 112,
+106, 230, 213,  96, 107, 150,  58, 240, 108, 207, 241, 224, 109, 118,  28, 240,
+110, 175, 211, 224, 111,  85, 254, 240, 112, 143, 181, 224, 113,  53, 224, 240,
+114, 111, 151, 224, 115,  21, 194, 240, 116,  79, 121, 224, 116, 254, 223, 112,
+118,  56, 150,  96, 118, 222, 193, 112, 120,  24, 120,  96, 120, 190, 163, 112,
+121, 248,  90,  96, 122, 158, 133, 112, 123, 216,  60,  96, 124, 126, 103, 112,
+125, 184,  30,  96, 126,  94,  73, 112, 127, 152,   0,  96,   2,   1,   2,   1,
+  2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,
+  2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,
+  2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   3,   4,   2,
+  1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,
+  1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,
+  1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,
+  1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,
+  1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,
+  1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,
+  1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,
+  1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,
+  1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,
+  1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,
+  1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,
+  1,   2,   1,   2,   1,   2,   1,   2, 255, 255, 186, 158,   0,   0, 255, 255,
+199, 192,   1,   4, 255, 255, 185, 176,   0,   8, 255, 255, 199, 192,   1,  12,
+255, 255, 199, 192,   1,  16,  76,  77,  84,   0,  69,  68,  84,   0,  69,  83,
+ 84,   0,  69,  87,  84,   0,  69,  80,  84,   0,   0,   0,   0,   0,   1,   0,
+  0,   0,   0,   1,  84,  90, 105, 102,  50,   0,   0,   0,   0,   0,   0,   0,
+  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   0,   0,   0,   5,
+  0,   0,   0,   0,   0,   0,   0, 236,   0,   0,   0,   5,   0,   0,   0,  20,
+255, 255, 255, 255,  94,   3, 240, 144, 255, 255, 255, 255, 158, 166,  30, 112,
+255, 255, 255, 255, 159, 186, 235,  96, 255, 255, 255, 255, 160, 134,   0, 112,
+255, 255, 255, 255, 161, 154, 205,  96, 255, 255, 255, 255, 162, 101, 226, 112,
+255, 255, 255, 255, 163, 131, 233, 224, 255, 255, 255, 255, 164, 106, 174, 112,
+255, 255, 255, 255, 165,  53, 167,  96, 255, 255, 255, 255, 166,  83, 202, 240,
+255, 255, 255, 255, 167,  21, 137,  96, 255, 255, 255, 255, 168,  51, 172, 240,
+255, 255, 255, 255, 168, 254, 165, 224, 255, 255, 255, 255, 170,  19, 142, 240,
+255, 255, 255, 255, 170, 222, 135, 224, 255, 255, 255, 255, 171, 243, 112, 240,
+255, 255, 255, 255, 172, 190, 105, 224, 255, 255, 255, 255, 173, 211,  82, 240,
+255, 255, 255, 255, 174, 158,  75, 224, 255, 255, 255, 255, 175, 179,  52, 240,
+255, 255, 255, 255, 176, 126,  45, 224, 255, 255, 255, 255, 177, 156,  81, 112,
+255, 255, 255, 255, 178, 103,  74,  96, 255, 255, 255, 255, 179, 124,  51, 112,
+255, 255, 255, 255, 180,  71,  44,  96, 255, 255, 255, 255, 181,  92,  21, 112,
+255, 255, 255, 255, 182,  39,  14,  96, 255, 255, 255, 255, 183,  59, 247, 112,
+255, 255, 255, 255, 184,   6, 240,  96, 255, 255, 255, 255, 185,  27, 217, 112,
+255, 255, 255, 255, 185, 230, 210,  96, 255, 255, 255, 255, 187,   4, 245, 240,
+255, 255, 255, 255, 187, 198, 180,  96, 255, 255, 255, 255, 188, 228, 215, 240,
+255, 255, 255, 255, 189, 175, 208, 224, 255, 255, 255, 255, 190, 196, 185, 240,
+255, 255, 255, 255, 191, 143, 178, 224, 255, 255, 255, 255, 192, 164, 155, 240,
+255, 255, 255, 255, 193, 111, 148, 224, 255, 255, 255, 255, 194, 132, 125, 240,
+255, 255, 255, 255, 195,  79, 118, 224, 255, 255, 255, 255, 196, 100,  95, 240,
+255, 255, 255, 255, 197,  47,  88, 224, 255, 255, 255, 255, 198,  77, 124, 112,
+255, 255, 255, 255, 199,  15,  58, 224, 255, 255, 255, 255, 200,  45,  94, 112,
+255, 255, 255, 255, 200, 248,  87,  96, 255, 255, 255, 255, 202,  13,  64, 112,
+255, 255, 255, 255, 202, 216,  57,  96, 255, 255, 255, 255, 203, 136, 240, 112,
+255, 255, 255, 255, 210,  35, 244, 112, 255, 255, 255, 255, 210,  96, 251, 224,
+255, 255, 255, 255, 211, 117, 228, 240, 255, 255, 255, 255, 212,  64, 221, 224,
+255, 255, 255, 255, 213,  85, 198, 240, 255, 255, 255, 255, 214,  32, 191, 224,
+255, 255, 255, 255, 215,  53, 168, 240, 255, 255, 255, 255, 216,   0, 161, 224,
+255, 255, 255, 255, 217,  21, 138, 240, 255, 255, 255, 255, 217, 224, 131, 224,
+255, 255, 255, 255, 218, 254, 167, 112, 255, 255, 255, 255, 219, 192, 101, 224,
+255, 255, 255, 255, 220, 222, 137, 112, 255, 255, 255, 255, 221, 169, 130,  96,
+255, 255, 255, 255, 222, 190, 107, 112, 255, 255, 255, 255, 223, 137, 100,  96,
+255, 255, 255, 255, 224, 158,  77, 112, 255, 255, 255, 255, 225, 105,  70,  96,
+255, 255, 255, 255, 226, 126,  47, 112, 255, 255, 255, 255, 227,  73,  40,  96,
+255, 255, 255, 255, 228,  94,  17, 112, 255, 255, 255, 255, 229,  87,  46, 224,
+255, 255, 255, 255, 230,  71,  45, 240, 255, 255, 255, 255, 231,  55,  16, 224,
+255, 255, 255, 255, 232,  39,  15, 240, 255, 255, 255, 255, 233,  22, 242, 224,
+255, 255, 255, 255, 234,   6, 241, 240, 255, 255, 255, 255, 234, 246, 212, 224,
+255, 255, 255, 255, 235, 230, 211, 240, 255, 255, 255, 255, 236, 214, 182, 224,
+255, 255, 255, 255, 237, 198, 181, 240, 255, 255, 255, 255, 238, 191, 211,  96,
+255, 255, 255, 255, 239, 175, 210, 112, 255, 255, 255, 255, 240, 159, 181,  96,
+255, 255, 255, 255, 241, 143, 180, 112, 255, 255, 255, 255, 242, 127, 151,  96,
+255, 255, 255, 255, 243, 111, 150, 112, 255, 255, 255, 255, 244,  95, 121,  96,
+255, 255, 255, 255, 245,  79, 120, 112, 255, 255, 255, 255, 246,  63,  91,  96,
+255, 255, 255, 255, 247,  47,  90, 112, 255, 255, 255, 255, 248,  40, 119, 224,
+255, 255, 255, 255, 249,  15,  60, 112, 255, 255, 255, 255, 250,   8,  89, 224,
+255, 255, 255, 255, 250, 248,  88, 240, 255, 255, 255, 255, 251, 232,  59, 224,
+255, 255, 255, 255, 252, 216,  58, 240, 255, 255, 255, 255, 253, 200,  29, 224,
+255, 255, 255, 255, 254, 184,  28, 240, 255, 255, 255, 255, 255, 167, 255, 224,
+  0,   0,   0,   0,   0, 151, 254, 240,   0,   0,   0,   0,   1, 135, 225, 224,
+  0,   0,   0,   0,   2, 119, 224, 240,   0,   0,   0,   0,   3, 112, 254,  96,
+  0,   0,   0,   0,   4,  96, 253, 112,   0,   0,   0,   0,   5,  80, 224,  96,
+  0,   0,   0,   0,   6,  64, 223, 112,   0,   0,   0,   0,   7,  48, 194,  96,
+  0,   0,   0,   0,   7, 141,  25, 112,   0,   0,   0,   0,   9,  16, 164,  96,
+  0,   0,   0,   0,   9, 173, 148, 240,   0,   0,   0,   0,  10, 240, 134,  96,
+  0,   0,   0,   0,  11, 224, 133, 112,   0,   0,   0,   0,  12, 217, 162, 224,
+  0,   0,   0,   0,  13, 192, 103, 112,   0,   0,   0,   0,  14, 185, 132, 224,
+  0,   0,   0,   0,  15, 169, 131, 240,   0,   0,   0,   0,  16, 153, 102, 224,
+  0,   0,   0,   0,  17, 137, 101, 240,   0,   0,   0,   0,  18, 121,  72, 224,
+  0,   0,   0,   0,  19, 105,  71, 240,   0,   0,   0,   0,  20,  89,  42, 224,
+  0,   0,   0,   0,  21,  73,  41, 240,   0,   0,   0,   0,  22,  57,  12, 224,
+  0,   0,   0,   0,  23,  41,  11, 240,   0,   0,   0,   0,  24,  34,  41,  96,
+  0,   0,   0,   0,  25,   8, 237, 240,   0,   0,   0,   0,  26,   2,  11,  96,
+  0,   0,   0,   0,  26, 242,  10, 112,   0,   0,   0,   0,  27, 225, 237,  96,
+  0,   0,   0,   0,  28, 209, 236, 112,   0,   0,   0,   0,  29, 193, 207,  96,
+  0,   0,   0,   0,  30, 177, 206, 112,   0,   0,   0,   0,  31, 161, 177,  96,
+  0,   0,   0,   0,  32, 118,   0, 240,   0,   0,   0,   0,  33, 129, 147,  96,
+  0,   0,   0,   0,  34,  85, 226, 240,   0,   0,   0,   0,  35, 106, 175, 224,
+  0,   0,   0,   0,  36,  53, 196, 240,   0,   0,   0,   0,  37,  74, 145, 224,
+  0,   0,   0,   0,  38,  21, 166, 240,   0,   0,   0,   0,  39,  42, 115, 224,
+  0,   0,   0,   0,  39, 254, 195, 112,   0,   0,   0,   0,  41,  10,  85, 224,
+  0,   0,   0,   0,  41, 222, 165, 112,   0,   0,   0,   0,  42, 234,  55, 224,
+  0,   0,   0,   0,  43, 190, 135, 112,   0,   0,   0,   0,  44, 211,  84,  96,
+  0,   0,   0,   0,  45, 158, 105, 112,   0,   0,   0,   0,  46, 179,  54,  96,
+  0,   0,   0,   0,  47, 126,  75, 112,   0,   0,   0,   0,  48, 147,  24,  96,
+  0,   0,   0,   0,  49, 103, 103, 240,   0,   0,   0,   0,  50, 114, 250,  96,
+  0,   0,   0,   0,  51,  71,  73, 240,   0,   0,   0,   0,  52,  82, 220,  96,
+  0,   0,   0,   0,  53,  39,  43, 240,   0,   0,   0,   0,  54,  50, 190,  96,
+  0,   0,   0,   0,  55,   7,  13, 240,   0,   0,   0,   0,  56,  27, 218, 224,
+  0,   0,   0,   0,  56, 230, 239, 240,   0,   0,   0,   0,  57, 251, 188, 224,
+  0,   0,   0,   0,  58, 198, 209, 240,   0,   0,   0,   0,  59, 219, 158, 224,
+  0,   0,   0,   0,  60, 175, 238, 112,   0,   0,   0,   0,  61, 187, 128, 224,
+  0,   0,   0,   0,  62, 143, 208, 112,   0,   0,   0,   0,  63, 155,  98, 224,
+  0,   0,   0,   0,  64, 111, 178, 112,   0,   0,   0,   0,  65, 132, 127,  96,
+  0,   0,   0,   0,  66,  79, 148, 112,   0,   0,   0,   0,  67, 100,  97,  96,
+  0,   0,   0,   0,  68,  47, 118, 112,   0,   0,   0,   0,  69,  68,  67,  96,
+  0,   0,   0,   0,  69, 243, 168, 240,   0,   0,   0,   0,  71,  45,  95, 224,
+  0,   0,   0,   0,  71, 211, 138, 240,   0,   0,   0,   0,  73,  13,  65, 224,
+  0,   0,   0,   0,  73, 179, 108, 240,   0,   0,   0,   0,  74, 237,  35, 224,
+  0,   0,   0,   0,  75, 156, 137, 112,   0,   0,   0,   0,  76, 214,  64,  96,
+  0,   0,   0,   0,  77, 124, 107, 112,   0,   0,   0,   0,  78, 182,  34,  96,
+  0,   0,   0,   0,  79,  92,  77, 112,   0,   0,   0,   0,  80, 150,   4,  96,
+  0,   0,   0,   0,  81,  60,  47, 112,   0,   0,   0,   0,  82, 117, 230,  96,
+  0,   0,   0,   0,  83,  28,  17, 112,   0,   0,   0,   0,  84,  85, 200,  96,
+  0,   0,   0,   0,  84, 251, 243, 112,   0,   0,   0,   0,  86,  53, 170,  96,
+  0,   0,   0,   0,  86, 229,  15, 240,   0,   0,   0,   0,  88,  30, 198, 224,
+  0,   0,   0,   0,  88, 196, 241, 240,   0,   0,   0,   0,  89, 254, 168, 224,
+  0,   0,   0,   0,  90, 164, 211, 240,   0,   0,   0,   0,  91, 222, 138, 224,
+  0,   0,   0,   0,  92, 132, 181, 240,   0,   0,   0,   0,  93, 190, 108, 224,
+  0,   0,   0,   0,  94, 100, 151, 240,   0,   0,   0,   0,  95, 158,  78, 224,
+  0,   0,   0,   0,  96,  77, 180, 112,   0,   0,   0,   0,  97, 135, 107,  96,
+  0,   0,   0,   0,  98,  45, 150, 112,   0,   0,   0,   0,  99, 103,  77,  96,
+  0,   0,   0,   0, 100,  13, 120, 112,   0,   0,   0,   0, 101,  71,  47,  96,
+  0,   0,   0,   0, 101, 237,  90, 112,   0,   0,   0,   0, 103,  39,  17,  96,
+  0,   0,   0,   0, 103, 205,  60, 112,   0,   0,   0,   0, 105,   6, 243,  96,
+  0,   0,   0,   0, 105, 173,  30, 112,   0,   0,   0,   0, 106, 230, 213,  96,
+  0,   0,   0,   0, 107, 150,  58, 240,   0,   0,   0,   0, 108, 207, 241, 224,
+  0,   0,   0,   0, 109, 118,  28, 240,   0,   0,   0,   0, 110, 175, 211, 224,
+  0,   0,   0,   0, 111,  85, 254, 240,   0,   0,   0,   0, 112, 143, 181, 224,
+  0,   0,   0,   0, 113,  53, 224, 240,   0,   0,   0,   0, 114, 111, 151, 224,
+  0,   0,   0,   0, 115,  21, 194, 240,   0,   0,   0,   0, 116,  79, 121, 224,
+  0,   0,   0,   0, 116, 254, 223, 112,   0,   0,   0,   0, 118,  56, 150,  96,
+  0,   0,   0,   0, 118, 222, 193, 112,   0,   0,   0,   0, 120,  24, 120,  96,
+  0,   0,   0,   0, 120, 190, 163, 112,   0,   0,   0,   0, 121, 248,  90,  96,
+  0,   0,   0,   0, 122, 158, 133, 112,   0,   0,   0,   0, 123, 216,  60,  96,
+  0,   0,   0,   0, 124, 126, 103, 112,   0,   0,   0,   0, 125, 184,  30,  96,
+  0,   0,   0,   0, 126,  94,  73, 112,   0,   0,   0,   0, 127, 152,   0,  96,
+  2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,
+  2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,
+  2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,
+  2,   3,   4,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,
+  1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,
+  1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,
+  1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,
+  1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,
+  1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,
+  1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,
+  1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,
+  1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,
+  1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,
+  1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,
+  1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2, 255, 255, 186, 158,
+  0,   0, 255, 255, 199, 192,   1,   4, 255, 255, 185, 176,   0,   8, 255, 255,
+199, 192,   1,  12, 255, 255, 199, 192,   1,  16,  76,  77,  84,   0,  69,  68,
+ 84,   0,  69,  83,  84,   0,  69,  87,  84,   0,  69,  80,  84,   0,   0,   0,
+  0,   0,   1,   0,   0,   0,   0,   1,  10,  69,  83,  84,  53,  69,  68,  84,
+ 44,  77,  51,  46,  50,  46,  48,  44,  77,  49,  49,  46,  49,  46,  48,  10,
+};
-- 
2.21.0



More information about the Cygwin-patches mailing list