]> git.ipfire.org Git - thirdparty/cups.git/commitdiff
Merge pull request #5913 from apple/bug-fix-rollup-1
authorMichael R Sweet <michael.r.sweet@gmail.com>
Mon, 26 Apr 2021 20:15:00 +0000 (16:15 -0400)
committerGitHub <noreply@github.com>
Mon, 26 Apr 2021 20:15:00 +0000 (16:15 -0400)
Import select bug fixes and improvements from the OpenPrinting CUPS repository.

73 files changed:
CHANGES.md
Makefile
backend/backend-private.h
backend/ipp.c
backend/network.c
backend/org.cups.usb-quirks
backend/snmp.c
backend/testbackend.c
backend/usb-darwin.c
backend/usb-unix.c
cgi-bin/admin.c
cgi-bin/classes.c
cgi-bin/help-index.c
cgi-bin/ipp-var.c
cgi-bin/printers.c
cgi-bin/template.c
configure
configure.ac
cups/auth.c
cups/cups.h
cups/dest.c
cups/getifaddrs-internal.h
cups/hash.c
cups/http-addr.c
cups/http-addrlist.c
cups/http-support.c
cups/http.c
cups/ipp-support.c
cups/ipp-vars.c
cups/ipp.c
cups/ppd-cache.c
cups/ppd-mark.c
cups/ppd-private.h
cups/ppd.c
cups/request.c
cups/snprintf.c
cups/testclient.c
cups/testdest.c
cups/tls-gnutls.c
cups/tls-sspi.c
doc/help/man-cupsd.conf.html
doc/help/man-ipptool.html
doc/help/man-ipptoolfile.html
man/cupsd.conf.5
man/ipptool.1
man/ipptoolfile.5
ppdc/ppdc-import.cxx
ppdc/sample.drv
scheduler/classes.c
scheduler/client.c
scheduler/conf.c
scheduler/conf.h
scheduler/cups-deviced.c
scheduler/cups-lpd.c
scheduler/ipp.c
scheduler/job.c
scheduler/listen.c
scheduler/main.c
scheduler/printers.c
scheduler/subscriptions.c
systemv/cancel.c
systemv/lp.c
tools/ippeveprinter.c
tools/ippfind.c
tools/ipptool.c
tools/printer-lg-png.h [new file with mode: 0644]
tools/printer-lg.png [new file with mode: 0644]
tools/printer-png.h
tools/printer-sm-png.h [new file with mode: 0644]
tools/printer-sm.png [new file with mode: 0644]
tools/printer.png
vcnet/config.h
xcode/config.h

index 9e1b74c7e97a640bcf017ece4dd2c903623d0707..29992b2f4917aae61539643a439f33e7aa87a367 100644 (file)
@@ -1,10 +1,90 @@
-CHANGES - 2.3.4 - 2020-04-24 (IN PROGRESS)
-============================
+Change History
+==============
+
+
+Changes in CUPS v2.3.5
+----------------------
+
+- The automated test suite can now be activated using `make test` for
+  consistency with other projects and CI environments - the old `make check`
+  continues to work as well, and the previous test server behavior can be
+  accessed by running `make testserver`.
+- ippeveprinter now supports multiple icons and strings files.
+- ippeveprinter now uses the system's FQDN with Avahi.
+- ippeveprinter now supports Get-Printer-Attributes on "/".
+- ippeveprinter now uses a deterministic "printer-uuid" value.
+- ippeveprinter now uses system sounds on macOS for Identify-Printer.
+- Updated ippfind to look for files in "~/Desktop" on Windows.
+- Updated ippfind to honor `SKIP-XXX` directives with `PAUSE`.
+- Updated IPP Everywhere support to work around printers that only advertise
+  color raster support but really also support grayscale (OpenPrinting #1)
+- ipptool now supports DNS-SD URIs like `ipps://My%20Printer._ipps._tcp.local`
+  (OpenPrinting #5)
+- ipptool now supports monitoring the printer state while submitting a job
+  with the `MONITOR-PRINTER-STATE` directive (OpenPrinting #153)
+- ipptool now supports testing for unique values with the `WITH-DISTINCT-VALUES`
+  predicate (OpenPrinting #153)
+- ipptool now supports retrying requests on a `server-error-busy` status code
+  (OpenPrinting #153)
+- ipptool now supports `value-tag(MAX)` and `value-tag(MIN:MAX)` for the
+  `OF-TYPE` predicate (OpenPrinting #153)
+- The scheduler now allows root backends to have world read permissions but not
+  world execute permissions (OpenPrinting #21)
+- Failures to bind IPv6 listener sockets no longer cause errors if IPv6 is
+  disabled on the host (OpenPrinting #25)
+- The SNMP backend now supports the HP and Ricoh vendor MIBs (OpenPrinting #28)
+- The scheduler no longer includes a timestamp in files it writes (OpenPrinting #29)
+- IPP Everywhere PPDs could have an "unknown" default InputSlot (OpenPrinting #44)
+- The `httpAddrListen` function now uses a listen backlog of 128.
+- The PPD functions now treat boolean values as case-insensitive (OpenPrinting #106)
+- Temporary queue names no longer end with an underscore (OpenPrinting #110)
+- Added USB quirks (Issue #5789, #5766, #5823, #5831, #5838, #5843, #5867)
+- Fixed IPP Everywhere v1.1 conformance issues in ippeveprinter.
+- Fixed DNS-SD name collision support in ippeveprinter.
+- Fixed compiler and code analyzer warnings.
+- Fixed TLS support on Windows.
+- Fixed ippfind sub-type searches with Avahi.
+- Fixed the default hostname used by ippeveprinter on macOS.
+- Fixed resolution of local IPP-USB printers with Avahi.
+- Fixed coverity issues (OpenPrinting #2)
+- Fixed `httpAddrConnect` issues (OpenPrinting #3)
+- Fixed web interface device URI issue (OpenPrinting #4)
+- Fixed lp/lpr "printer/class not found" error reporting (OpenPrinting #6)
+- Fixed a memory leak in the scheduler (OpenPrinting #12)
+- Fixed a potential integer overflow in the PPD hashing code (OpenPrinting #13)
+- Fixed output-bin and print-quality handling issues (OpenPrinting #18)
+- Fixed PPD options getting mapped to odd IPP values like "tray---4" (OpenPrinting #23)
+- Fixed remote access to the cupsd.conf and log files (OpenPrinting #24)
+- Fixed a logging regression caused by a previous change for Issue #5604
+  (OpenPrinting #25)
+- Fixed the "uri-security-supported" value from the scheduler (OpenPrinting #42)
+- Fixed IPP backend crash bug with "printer-alert" values (OpenPrinting #43)
+- Fixed default options that incorrectly use the "custom" prefix (OpenPrinting #48)
+- Fixed a memory leak when resolving DNS-SD URIs (OpenPrinting #49)
+- Fixed cupsManualCopies values in IPP Everywhere PPDs (Issue #5807)
+- Fixed duplicate ColorModel entries for AirPrint printers (Issue 59)
+- Fixed crash bug in `ppdOpen` (OpenPrinting #64, OpenPrinting #78)
+- Fixed regression in `snprintf` emulation function (OpenPrinting #67)
+- Fixed segfault in help.cgi when searching in man pages (OpenPrinting #81)
+- Fixed a bug in ipptool that caused the reuse of request IDs when repeating a
+  test (OpenPrinting #153)
+- Root certificates were incorrectly stored in "~/.cups/ssl".
+- Fixed a PPD memory leak caused by emulator definitions (OpenPrinting #124)
+- `httpReconnect2` did not reset the socket file descriptor when the TLS
+  negotiation failed (Issue #5907)
+- `httpUpdate` did not reset the socket file descriptor when the TLS
+  negotiation failed (Apple #5915)
+- The `ippeveprinter` tool now automatically uses an available port.
+- The IPP backend now retries Validate-Job requests (OpenPrinting #132)
+- Removed support for the (long deprecated and unused) `KeepAliveTimeout`
+  directive in `cupsd.conf` (Issue #5733)
+
 
 Changes in CUPS v2.3.4
 ----------------------
 
-- CVE-20XX-YYYY: TODO rdar://61415567 embargo
+- CVE-2020-10001: Fixed a buffer (read) overflow in the `ippReadIO` function.
+
 
 Changes in CUPS v2.3.3
 ----------------------
@@ -16,6 +96,7 @@ Changes in CUPS v2.3.3
   field.
 - Fixed WARNING_OPTIONS support for GCC 9.x
 
+
 Changes in CUPS v2.3.2
 ----------------------
 
index 15544627f6cd0c6975d8409f790162dbade0f01d..294ac5ea499cdf79bbc79fcf401e91e23c74d54f 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 #
 # Top-level Makefile for CUPS.
 #
-# Copyright © 2007-2019 by Apple Inc.
+# Copyright © 2007-2021 by Apple Inc.
 # Copyright © 1997-2007 by Easy Software Products, all rights reserved.
 #
 # Licensed under Apache License v2.0.  See the file "LICENSE" for more
@@ -230,16 +230,16 @@ uninstall:
 # Run the test suite...
 #
 
-test:  all unittests
-       echo Running CUPS test suite...
+testserver:    all unittests
+       echo Running CUPS test server...
        cd test; ./run-stp-tests.sh $(TESTOPTIONS)
 
 
-check: all unittests
+check test:    all unittests
        echo Running CUPS test suite with defaults...
        cd test; ./run-stp-tests.sh 1 0 n n
 
-debugcheck:    all unittests
+debugcheck debugtest:  all unittests
        echo Running CUPS test suite with debug printfs...
        cd test; ./run-stp-tests.sh 1 0 n y
 
index 85fb8aef8ae36f5ef2cc664d888d2e45601065e0..d19b06b823b6d77a8bb3e4861de8d0d59c174dfe 100644 (file)
@@ -1,7 +1,8 @@
 /*
  * Backend support definitions for CUPS.
  *
- * Copyright © 2007-2014 by Apple Inc.
+ * Copyright © 2021 by OpenPrinting
+ * Copyright © 2007-2021 by Apple Inc.
  * Copyright © 1997-2007 by Easy Software Products, all rights reserved.
  *
  * Licensed under Apache License v2.0.  See the file "LICENSE" for more
@@ -52,6 +53,14 @@ extern "C" {
 #  endif /* __cplusplus */
 
 
+/*
+ * Log messages in backend signal handlers or other places where stdio cannot
+ * be used...
+ */
+
+#  define backendMessage(msg) {const char *s = msg; write(2, s, strlen(s));}
+
+
 /*
  * OID constants...
  */
@@ -320,7 +329,6 @@ extern int          backendSNMPSupplies(int snmp_fd, http_addr_t *addr,
 extern int             backendWaitLoop(int snmp_fd, http_addr_t *addr,
                                        int use_bc, _cups_sccb_t side_cb);
 
-
 #  ifdef __cplusplus
 }
 #  endif /* __cplusplus */
index 3f3e1867d3efb0b631b743a28b5a62e701386e31..020ab7fd4ae8eaf862b5c229e1822227d6e59cf9 100644 (file)
@@ -1,7 +1,8 @@
 /*
  * IPP backend for CUPS.
  *
- * Copyright © 2007-2019 by Apple Inc.
+ * Copyright © 2021 by OpenPrinting
+ * Copyright © 2007-2021 by Apple Inc.
  * Copyright © 1997-2007 by Easy Software Products, all rights reserved.
  *
  * Licensed under Apache License v2.0.  See the file "LICENSE" for more
@@ -256,6 +257,7 @@ main(int  argc,                             /* I - Number of command-line args */
                get_job_attrs = 0,      /* Does printer support Get-Job-Attributes? */
                send_document = 0,      /* Does printer support Send-Document? */
                validate_job = 0,       /* Does printer support Validate-Job? */
+               validate_retried = 0,   /* Was Validate-Job request retried? */
                copies,                 /* Number of copies for job */
                copies_remaining;       /* Number of copies remaining */
   const char   *content_type,          /* CONTENT_TYPE environment variable */
@@ -1559,7 +1561,17 @@ main(int  argc,                          /* I - Number of command-line args */
              ipp_status == IPP_STATUS_ERROR_BAD_REQUEST)
       break;
     else if (job_auth == NULL && ipp_status > IPP_STATUS_ERROR_BAD_REQUEST)
+    {
+      if (!validate_retried)
+      {
+        // Retry Validate-Job operation once, to work around known printer bug...
+        validate_retried = 1;
+        sleep(10);
+        continue;
+      }
+
       goto cleanup;
+    }
   }
 
  /*
@@ -2240,7 +2252,8 @@ main(int  argc,                           /* I - Number of command-line args */
   else if (ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_AUTHORIZATION_FAILED)
     fputs("JOBSTATE: account-authorization-failed\n", stderr);
 
-  if (job_canceled)
+  // job_canceled can be -1 which should not be treated as CUPS_BACKEND_OK
+  if (job_canceled > 0)
     return (CUPS_BACKEND_OK);
   else if (ipp_status == IPP_STATUS_ERROR_NOT_AUTHORIZED || ipp_status == IPP_STATUS_ERROR_FORBIDDEN || ipp_status == IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED)
     return (CUPS_BACKEND_AUTH_REQUIRED);
@@ -2825,7 +2838,21 @@ new_request(
         */
 
         _httpDecodeURI(phone, keyword, sizeof(phone));
-        for (ptr = phone; *ptr;)
+        ptr = phone;
+
+        /*
+         * Weed out "Custom." in the beginning, this allows to put the
+         * "phone" option as custom string option into the PPD so that
+         * print dialogs not supporting fax display the option and
+         * allow entering the phone number. Print dialogs also send "None"
+         * if no phone number got entered, filter this, too.
+         */
+        if (!_cups_strcasecmp(phone, "None"))
+          *ptr = '\0';
+        if (!_cups_strncasecmp(phone, "Custom.", 7))
+          _cups_strcpy(ptr, ptr + 7);
+
+        for (; *ptr;)
        {
          if (*ptr == ',')
            *ptr = 'p';
@@ -2835,20 +2862,36 @@ new_request(
            ptr ++;
         }
 
-        httpAssembleURI(HTTP_URI_CODING_ALL, tel_uri, sizeof(tel_uri), "tel", NULL, NULL, 0, phone);
-        ippAddString(destination, IPP_TAG_JOB, IPP_TAG_URI, "destination-uri", NULL, tel_uri);
-
-       if ((keyword = cupsGetOption("faxPrefix", num_options,
-                                    options)) != NULL && *keyword)
+        if (strlen(phone) > 0)
         {
-         char  predial[1024];          /* Pre-dial string */
+          httpAssembleURI(HTTP_URI_CODING_ALL, tel_uri, sizeof(tel_uri), "tel", NULL, NULL, 0, phone);
+          ippAddString(destination, IPP_TAG_JOB, IPP_TAG_URI, "destination-uri", NULL, tel_uri);
+          fprintf(stderr, "DEBUG: Faxing to phone %s; destination-uri: %s\n", phone, tel_uri);
 
-         _httpDecodeURI(predial, keyword, sizeof(predial));
-         ippAddString(destination, IPP_TAG_JOB, IPP_TAG_TEXT, "pre-dial-string", NULL, predial);
-       }
+          if ((keyword = cupsGetOption("faxPrefix", num_options, options)) != NULL && *keyword)
+          {
+            char       predial[1024];          /* Pre-dial string */
+
+            _httpDecodeURI(predial, keyword, sizeof(predial));
+            ptr = predial;
+            if (!_cups_strcasecmp(ptr, "None"))
+              *ptr = '\0';
+            if (!_cups_strncasecmp(ptr, "Custom.", 7))
+              ptr += 7;
+            if (strlen(ptr) > 0)
+            {
+              ippAddString(destination, IPP_TAG_JOB, IPP_TAG_TEXT, "pre-dial-string", NULL, ptr);
+              fprintf(stderr, "DEBUG: Pre-dialing %s; pre-dial-string: %s\n", ptr, ptr);
+            }
+            else
+              fprintf(stderr, "WARNING: Pre-dial number for fax not valid! Sending fax without pre-dial number.\n");
+          }
 
-        ippAddCollection(request, IPP_TAG_JOB, "destination-uris", destination);
-        ippDelete(destination);
+          ippAddCollection(request, IPP_TAG_JOB, "destination-uris", destination);
+          ippDelete(destination);
+        }
+        else
+          fprintf(stderr, "ERROR: Phone number for fax not valid! Fax cannot be sent.\n");
       }
     }
     else
@@ -3075,7 +3118,7 @@ report_printer_state(ipp_t *ipp)  /* I - IPP response */
   * Report alerts and messages...
   */
 
-  if ((pa = ippFindAttribute(ipp, "printer-alert", IPP_TAG_TEXT)) != NULL)
+  if ((pa = ippFindAttribute(ipp, "printer-alert", IPP_TAG_STRING)) != NULL)
     report_attr(pa);
 
   if ((pam = ippFindAttribute(ipp, "printer-alert-message",
@@ -3116,11 +3159,10 @@ report_printer_state(ipp_t *ipp)        /* I - IPP response */
       if (*ptr < ' ' && *ptr > 0 && *ptr != '\t')
       {
        /*
-        * Substitute "<XX>" for the control character; sprintf is safe because
-       * we always leave 6 chars free at the end...
+        * Substitute "<XX>" for the control character...
        */
 
-        sprintf(valptr, "<%02X>", *ptr);
+        snprintf(valptr, sizeof(value) - (size_t)(valptr - value), "<%02X>", *ptr);
        valptr += 4;
       }
       else
@@ -3388,7 +3430,7 @@ sigterm_handler(int sig)          /* I - Signal */
 {
   (void)sig;   /* remove compiler warnings... */
 
-  write(2, "DEBUG: Got SIGTERM.\n", 20);
+  backendMessage("DEBUG: Got SIGTERM.\n");
 
 #if defined(HAVE_GSSAPI) && defined(HAVE_XPC)
   if (child_pid)
@@ -3404,7 +3446,7 @@ sigterm_handler(int sig)          /* I - Signal */
     * Flag that the job should be canceled...
     */
 
-    write(2, "DEBUG: sigterm_handler: job_canceled = 1.\n", 25);
+    backendMessage("DEBUG: sigterm_handler: job_canceled = 1.\n");
 
     job_canceled = 1;
     return;
index 5af0a8eeadd07145f6c5b6eab74ee1d68ad2d890..f7ee2fbbe3c8e080c9e34d6d7f1e7e22e4240a21 100644 (file)
@@ -258,7 +258,7 @@ backendNetworkSideCB(
                         i < packet.object_value.string.num_bytes &&
                             dataptr < (data + sizeof(data) - 3);
                         i ++, dataptr += 2)
-                     sprintf(dataptr, "%02X", packet.object_value.string.bytes[i]);
+                     snprintf(dataptr, sizeof(data) - (size_t)(dataptr - data), "%02X", packet.object_value.string.bytes[i]);
                    datalen += (int)strlen(dataptr);
                    break;
 
index cd684d33f9c87cbf629726b63145f8560726b73f..83f62c165fc909cda94d85a54208acbb914ff5ff 100644 (file)
@@ -68,7 +68,7 @@
 # Canon, Inc. PIXMA iP6000D Printer (https://bugs.launchpad.net/bugs/1160638)
 0x04a9 0x1095 unidir
 
-# Canon, Inc. PIXMA iP4200 Printer (Issue #4155)
+# Canon, Inc. PIXMA iP4200 Printer (Apple #4155)
 0x04a9 0x10a2 unidir
 
 # Canon, Inc. PIXMA iP4300 Printer (https://bugs.launchpad.net/bugs/1032385)
 # Canon, Inc. MP540 Printer, https://bugzilla.redhat.com/967873
 0x04a9 0x1730 unidir
 
-# Canon, Inc. MP550 Printer (Issue #4155)
+# Canon, Inc. MP550 Printer (Apple #4155)
 0x04a9 0x173d unidir
 
-# Canon, Inc. MP560 Printer (Issue #4155)
+# Canon, Inc. MP560 Printer (Apple #4155)
 0x04a9 0x173e unidir
 
+# Canon, Inc. PIXMA G1501 Printer (Apple #5831)
+0x04a9 0x1796 unidir
+
 # Canon, Inc. MF4150 Printer (https://bugs.launchpad.net/bugs/1160638)
 0x04a9 0x26a3 no-reattach
 
 # Samsung ML-2160 Series (https://bugzilla.redhat.com/show_bug.cgi?id=873123)
 0x04e8 0x330f unidir
 
-# All Zebra devices (https://bugs.launchpad.net/bugs/1001028) (Issue #5395)
+# All Zebra devices (https://bugs.launchpad.net/bugs/1001028) (Apple #5395)
 0x0a5f unidir no-reattach
 
 # Canon CP-10
 # Lexmark E238 (<rdar://problem/14493054>)
 0x043d 0x00d7 no-reattach
 
-# Lexmark E238 (Issue #4448)
+# Lexmark E238 (Apple #4448)
 0x043d 0x009a no-reattach
 
-# Canon MX310 (Issue #4482)
+# Canon MX310 (Apple #4482)
 0x04a9 0x1728 unidir
 
-# Canon MX320 (Issue #4482)
+# Canon MX320 (Apple #4482)
 0x04A9 0x1736 unidir
 
-# All Intermec devices (Issue #4553)
+# All Intermec devices (Apple #4553)
 0x067e no-reattach
 
-# HP LaserJet 1015 (Issue #5617)
+# HP LaserJet 1010 (Apple #5789)
+0x03f0 0x0c17 delay-close
+
+# HP LaserJet 1015 (Apple #5617)
 0x03f0 0x0e17 delay-close
 
-# HP LaserJet 1150 (Issue #4549)
+# HP LaserJet 1150 (Apple #4549)
 0x03f0 0x0f17 delay-close
 
-# HP LaserJet 1300 (Issue #4549)
+# HP LaserJet 1300 (Apple #4549)
 0x03f0 0x1017 delay-close
 0x03f0 0x1117 delay-close
 
-# HP LaserJet 1320 (Issue #4549)
+# HP LaserJet 1320 (Apple #4549)
 0x03f0 0x1d17 delay-close
 
 # Canon, Inc. MP530 Printer
 0x04a9 0x1712 unidir
 
-# Xerox WorkCentre 3220 (https://bugs.launchpad.net/bugs/1406203, Issue #4789)
+# Xerox WorkCentre 3220 (https://bugs.launchpad.net/bugs/1406203, Apple #4789)
 0x0924 0x4294 no-reattach
 
-# Lexmark C540n (Issue #4778)
+# Lexmark C540n (Apple #4778)
 0x043d 0x0139 no-reattach
 
-# Kyocera Ecosys P6026cdn (Issue #4900)
+# Kyocera Ecosys P6026cdn (Apple #4900)
 0x0482 0x063f no-reattach
 
-# Kyocera Ecosys P6130cdn (Issue #5102)
+# Kyocera Ecosys P6130cdn (Apple #5102)
 0x0482 0x0677 no-reattach
 
-# Lexmark E260dn (Issue #4994)
+# Lexmark E260dn (Apple #4994)
 0x043d 0x0123 no-reattach
 
-# HP LaserJet 1160 (Issue #5121)
+# HP LaserJet 1160 (Apple #5121)
 0x03f0 0x1e17 delay-close
 
-# Canon, Inc. MP280 series (Issue #5221)
+# Canon, Inc. MP280 series (Apple #5221)
 0x04a9 0x1746 unidir
 
-# Star Micronics printers (Issue #5251)
+# Star Micronics printers (Apple #5251)
 0x0519 unidir
 
-# Lexmark Optra E310 (Issue #5259)
+# Lexmark Optra E310 (Apple #5259)
 0x043d 0x000c no-reattach
 
-# HP LaserJet P1102 (Issue #5310)
+# HP LaserJet P1102 (Apple #5310)
 0x03F0 0x002A no-reattach
 
 # Lexmark MS317dn
 0x043d 0x0226 no-reattach
 
-# Star TSP743 (Issue #5443)
+# Star TSP743 (Apple #5443)
 0x0519 0x0001 delay-close
 
-# Lexmark E120n (Issue #5478)
+# Lexmark E120n (Apple #5478)
 0x043d 0x00cc no-reattach
 
-# All Xerox printers (Issue #5523)
+# Lexmark E120n MT4506-100 (Apple #5766)
+0x043d 0x00cd no-reattach
+
+# All Xerox printers (Apple #5523)
 0x0924 no-reattach
 
-# Dymo 450 Turbo (Issue #5521)
-0x0922 0x0021 unidir
+# Citizen CT-S4000 (Apple #5823)
+0x2730 0x2008 unidir delay-close
+
+# All Arkscan label printers (Apple #5867)
+0x2d84 unidir no-reattach
+
+# HP DesignJet 130 (Apple #5838)
+0x03f0 0x0314 no-reattach
index 66ac884c67e24e83013864cf2625384f569abfb9..084c6f5118a28388c31000c68b6741ba40c38455 100644 (file)
@@ -154,6 +154,8 @@ static const int    UriOID[] = { CUPS_OID_ppmPortServiceNameOrURI, 1, 1, -1 };
 static const int       LexmarkProductOID[] = { 1,3,6,1,4,1,641,2,1,2,1,2,1,-1 };
 static const int       LexmarkProductOID2[] = { 1,3,6,1,4,1,674,10898,100,2,1,2,1,2,1,-1 };
 static const int       LexmarkDeviceIdOID[] = { 1,3,6,1,4,1,641,2,1,2,1,3,1,-1 };
+static const int       HPDeviceIdOID[] = { 1,3,6,1,4,1,11,2,3,9,1,1,7,0,-1 };
+static const int       RicohDeviceIdOID[] = { 1,3,6,1,4,1,367,3,2,1,1,1,11,0,-1 };
 static const int       XeroxProductOID[] = { 1,3,6,1,4,1,128,2,1,3,1,2,0,-1 };
 static cups_array_t    *DeviceURIs = NULL;
 static int             HostNameLookups = 0;
@@ -422,7 +424,7 @@ alarm_handler(int sig)                      /* I - Signal number */
 #endif /* !HAVE_SIGSET && !HAVE_SIGACTION */
 
   if (DebugLevel)
-    write(2, "DEBUG: ALARM!\n", 14);
+    backendMessage("DEBUG: ALARM!\n");
 }
 
 
@@ -969,9 +971,15 @@ read_snmp_response(int fd)         /* I - SNMP socket file descriptor */
        _cupsSNMPWrite(fd, &(packet.address), CUPS_SNMP_VERSION_1,
                       packet.community, CUPS_ASN1_GET_REQUEST,
                       DEVICE_ID, LexmarkDeviceIdOID);
+       _cupsSNMPWrite(fd, &(packet.address), CUPS_SNMP_VERSION_1,
+                      packet.community, CUPS_ASN1_GET_REQUEST,
+                      DEVICE_ID, RicohDeviceIdOID);
        _cupsSNMPWrite(fd, &(packet.address), CUPS_SNMP_VERSION_1,
                       packet.community, CUPS_ASN1_GET_REQUEST,
                       DEVICE_PRODUCT, XeroxProductOID);
+       _cupsSNMPWrite(fd, &(packet.address), CUPS_SNMP_VERSION_1,
+                      packet.community, CUPS_ASN1_GET_REQUEST,
+                      DEVICE_ID, HPDeviceIdOID);
         break;
 
     case DEVICE_DESCRIPTION :
index 6dbd0abee691651678b3ca330e9cddec835a3c1f..6412a022b766fbda099b681d9d25150d1ca306f0 100644 (file)
@@ -19,6 +19,7 @@
 #include <fcntl.h>
 #include <sys/wait.h>
 #include <signal.h>
+#include "backend-private.h"
 
 
 /*
@@ -395,7 +396,7 @@ main(int  argc,                             /* I - Number of command-line args */
          data = ps_data;
 
         write(1, data, strlen(data));
-       write(2, "DEBUG: START\n", 13);
+       backendMessage("DEBUG: START\n");
        timeout = 60.0;
         while ((bytes = cupsBackChannelRead(buffer, sizeof(buffer),
                                            timeout)) > 0)
@@ -403,7 +404,7 @@ main(int  argc,                             /* I - Number of command-line args */
          write(2, buffer, (size_t)bytes);
          timeout = 5.0;
        }
-       write(2, "\nDEBUG: END\n", 12);
+       backendMessage("\nDEBUG: END\n");
       }
 
       exit(0);
index 3f03630f01b9793f0095ef6fae379cf4c487f37a..ee75b9e0d0c978ef2e52fe8dc9d92eeafcb42176 100644 (file)
@@ -1,5 +1,7 @@
 /*
- * Copyright 2005-2016 Apple Inc. All rights reserved.
+ * USB backend for macOS.
+ *
+ * Copyright © 2005-2021 Apple Inc. All rights reserved.
  *
  * IMPORTANT:  This Apple software is supplied to you by Apple Computer,
  * Inc. ("Apple") in consideration of your agreement to the following
@@ -1667,11 +1669,34 @@ static CFStringRef copy_printer_interface_deviceid(printer_interface_t printer,
                                        CFStringAppendFormat(extras, NULL, CFSTR("MDL:%@;"), model);
                        }
 
-                       if (serial == NULL && desc.iSerialNumber != 0)
+                       if (desc.iSerialNumber != 0)
                        {
-                               serial = copy_printer_interface_indexed_description(printer, desc.iSerialNumber, kUSBLanguageEnglish);
-                               if (serial && CFStringGetLength(serial) > 0)
-                                       CFStringAppendFormat(extras, NULL, CFSTR("SERN:%@;"), serial);
+                               // Always look at the USB serial number since some printers
+                               // incorrectly include a bogus static serial number in their
+                               // IEEE-1284 device ID string...
+                               CFStringRef userial = copy_printer_interface_indexed_description(printer, desc.iSerialNumber, kUSBLanguageEnglish);
+                               if (userial && CFStringGetLength(userial) > 0 && (serial == NULL || CFStringCompare(serial, userial, kCFCompareCaseInsensitive) != kCFCompareEqualTo))
+                               {
+                                       if (serial != NULL)
+                                       {
+                                               // 1284 serial number doesn't match USB serial number, so  replace the existing SERN: in device ID
+                                               CFRange range = CFStringFind(ret, serial, 0);
+                                               CFMutableStringRef deviceIDString = CFStringCreateMutableCopy(NULL, 0, ret);
+                                               CFStringReplace(deviceIDString, range, userial);
+                                               CFRelease(ret);
+                                               ret = deviceIDString;
+
+                                               CFRelease(serial);
+                                       }
+                                       else
+                                       {
+                                               // No 1284 serial number so add SERN: with USB serial number to device ID
+                                               CFStringAppendFormat(extras, NULL, CFSTR("SERN:%@;"), userial);
+                                       }
+                                       serial = userial;
+                               }
+                               else if (userial != NULL)
+                                       CFRelease(userial);
                        }
 
                        if (ret != NULL)
@@ -1690,18 +1715,18 @@ static CFStringRef copy_printer_interface_deviceid(printer_interface_t printer,
 
        if (ret != NULL)
        {
-       /* Remove special characters from the serial number */
-       CFRange range = (serial != NULL ? CFStringFind(serial, CFSTR("+"), 0) : CFRangeMake(0, 0));
-       if (range.length == 1)
-       {
-               range = CFStringFind(ret, serial, 0);
+               /* Remove special characters from the serial number */
+               CFRange range = (serial != NULL ? CFStringFind(serial, CFSTR("+"), 0) : CFRangeMake(0, 0));
+               if (range.length == 1)
+               {
+                       range = CFStringFind(ret, serial, 0);
 
-               CFMutableStringRef deviceIDString = CFStringCreateMutableCopy(NULL, 0, ret);
-               CFRelease(ret);
+                       CFMutableStringRef deviceIDString = CFStringCreateMutableCopy(NULL, 0, ret);
+                       CFRelease(ret);
 
-               ret = deviceIDString;
-               CFStringFindAndReplace(deviceIDString, CFSTR("+"), CFSTR(""), range, 0);
-       }
+                       ret = deviceIDString;
+                       CFStringFindAndReplace(deviceIDString, CFSTR("+"), CFSTR(""), range, 0);
+               }
        }
 
        if (manufacturer != NULL)
@@ -2230,7 +2255,7 @@ sigterm_handler(int sig)          /* I - Signal */
       _exit(0);
     else
     {
-      write(2, "DEBUG: Child crashed.\n", 22);
+      backendMessage("DEBUG: Child crashed.\n");
       _exit(CUPS_BACKEND_STOP);
     }
   }
index 81e20c524bc66c108addb0aa14cdc9ff128d116d..d256a813ba80e4b4868e891f70102028b98c3740 100644 (file)
@@ -214,21 +214,21 @@ list_devices(void)
     * for USB printer devices.  We get the honor of trying them all...
     */
 
-    sprintf(device, "/dev/usblp%d", i);
+    snprintf(device, sizeof(device), "/dev/usblp%d", i);
 
     if ((fd = open(device, O_RDWR | O_EXCL)) < 0)
     {
       if (errno != ENOENT)
        continue;
 
-      sprintf(device, "/dev/usb/lp%d", i);
+      snprintf(device, sizeof(device), "/dev/usb/lp%d", i);
 
       if ((fd = open(device, O_RDWR | O_EXCL)) < 0)
       {
        if (errno != ENOENT)
          continue;
 
-       sprintf(device, "/dev/usb/usblp%d", i);
+       snprintf(device, sizeof(device), "/dev/usb/usblp%d", i);
 
        if ((fd = open(device, O_RDWR | O_EXCL)) < 0)
          continue;
@@ -258,7 +258,7 @@ list_devices(void)
 
   for (i = 0; i < 8; i ++)
   {
-    sprintf(device, "/dev/usb/printer%d", i);
+    snprintf(device, sizeof(device), "/dev/usb/printer%d", i);
 
     if ((fd = open(device, O_WRONLY | O_EXCL)) >= 0)
     {
@@ -278,11 +278,11 @@ list_devices(void)
 
   for (i = 0; i < 8; i ++)
   {
-    sprintf(device, "/dev/ulpt%d", i);
+    snprintf(device, sizeof(device), "/dev/ulpt%d", i);
     if (!access(device, 0))
       printf("direct usb:%s \"Unknown\" \"USB Printer #%d\"\n", device, i + 1);
 
-    sprintf(device, "/dev/unlpt%d", i);
+    snprintf(device, sizeof(device), "/dev/unlpt%d", i);
     if (!access(device, 0))
       printf("direct usb:%s \"Unknown\" \"USB Printer #%d (no reset)\"\n", device, i + 1);
   }
@@ -344,15 +344,15 @@ open_device(const char *uri,              /* I - Device URI */
        * for USB printer devices.  We get the honor of trying them all...
        */
 
-       sprintf(device, "/dev/usblp%d", i);
+       snprintf(device, sizeof(device), "/dev/usblp%d", i);
 
        if ((fd = open(device, O_RDWR | O_EXCL)) < 0 && errno == ENOENT)
        {
-         sprintf(device, "/dev/usb/lp%d", i);
+         snprintf(device, sizeof(device), "/dev/usb/lp%d", i);
 
          if ((fd = open(device, O_RDWR | O_EXCL)) < 0 && errno == ENOENT)
          {
-           sprintf(device, "/dev/usb/usblp%d", i);
+           snprintf(device, sizeof(device), "/dev/usb/usblp%d", i);
 
            if ((fd = open(device, O_RDWR | O_EXCL)) < 0 && errno == ENOENT)
              continue;
@@ -440,7 +440,7 @@ open_device(const char *uri,                /* I - Device URI */
     {
       for (i = 0, busy = 0; i < 8; i ++)
       {
-       sprintf(device, "/dev/usb/printer%d", i);
+       snprintf(device, sizeof(device), "/dev/usb/printer%d", i);
 
        if ((fd = open(device, O_WRONLY | O_EXCL)) >= 0)
          backendGetDeviceID(fd, device_id, sizeof(device_id),
index f087809f7cf1e3d6298cf84daed90fb844869f0e..c6489389f50f4bb33f0a9f4c654b22e3e79bc4c5 100644 (file)
@@ -208,7 +208,7 @@ main(void)
          * bytes left in the array...
          */
 
-         sprintf(ptr, "%%%02X", *url & 255);
+         snprintf(ptr, sizeof(encoded) - (size_t)(ptr - encoded), "%%%02X", *url & 255);
          ptr += 3;
        }
        else
@@ -763,6 +763,13 @@ do_am_printer(http_t *http,                /* I - HTTP connection */
 
         cgiSetVariable("TEMPLATE_NAME", template);
       }
+
+     /*
+      * Set DEVICE_URI to the actual device uri, without make and model from
+      * html form.
+      */
+
+      cgiSetVariable("DEVICE_URI", var);
     }
   }
 
@@ -864,7 +871,7 @@ do_am_printer(http_t *http,         /* I - HTTP connection */
         break;
       else
       {
-        sprintf(baudrate, "%d", baudrates[i]);
+        snprintf(baudrate, sizeof(baudrate), "%d", baudrates[i]);
        cgiSetArray("BAUDRATES", i, baudrate);
       }
 
index 78ef08e22f1ab2ecbb08c5f81cd1c4da0d5ce415..718604ab2bf9cd2f821a9f8268dd82f49ccccf81 100644 (file)
@@ -362,7 +362,7 @@ show_all_classes(http_t     *http,  /* I - Connection to server */
     if (first < 0)
       first = 0;
 
-    sprintf(val, "%d", count);
+    snprintf(val, sizeof(val), "%d", count);
     cgiSetVariable("TOTAL", val);
 
     for (i = 0, pclass = (ipp_attribute_t *)cupsArrayIndex(classes, first);
@@ -378,13 +378,13 @@ show_all_classes(http_t     *http,        /* I - Connection to server */
 
     if (first > 0)
     {
-      sprintf(val, "%d", first - CUPS_PAGE_MAX);
+      snprintf(val, sizeof(val), "%d", first - CUPS_PAGE_MAX);
       cgiSetVariable("PREV", val);
     }
 
     if ((first + CUPS_PAGE_MAX) < count)
     {
-      sprintf(val, "%d", first + CUPS_PAGE_MAX);
+      snprintf(val, sizeof(val), "%d", first + CUPS_PAGE_MAX);
       cgiSetVariable("NEXT", val);
     }
 
index ce97e47a43e3777f29bc8abdd048b7b59ac79a04..3da1010e6a2985c7520e39381f8cd39bb3c6c9b1 100644 (file)
@@ -579,7 +579,7 @@ helpSearchIndex(help_index_t *hi,   /* I - Index */
   */
 
   for (; node; node = (help_node_t *)cupsArrayNext(hi->nodes))
-    if (section && strcmp(node->section, section))
+    if (node->section && section && strcmp(node->section, section))
       continue;
     else if (filename && strcmp(node->filename, filename))
       continue;
index 8c5a5616dd5232ab5c3f52b5239d96381f5034c0..443f920a5a2826b5c5147d8744a31fa3b2b0f850 100644 (file)
@@ -224,7 +224,7 @@ cgiGetIPPObjects(ipp_t *response,   /* I - IPP response */
                char    buf[255];       /* Number buffer */
 
 
-                sprintf(buf, "%d", attr->values[i].integer);
+                snprintf(buf, sizeof(buf), "%d", attr->values[i].integer);
 
                if (cgiDoSearch(search, buf))
                  add = 1;
@@ -291,7 +291,7 @@ cgiMoveJobs(http_t     *http,               /* I - Connection to server */
       char     temp[255];              /* Temporary string */
 
 
-      sprintf(temp, "%d", job_id);
+      snprintf(temp, sizeof(temp), "%d", job_id);
       cgiSetVariable("JOB_ID", temp);
     }
 
@@ -1441,7 +1441,7 @@ cgiShowJobs(http_t     *http,             /* I - Connection to server */
 
     cgiSetVariable("SECTION", section);
 
-    sprintf(val, "%d", count);
+    snprintf(val, sizeof(val), "%d", count);
     cgiSetVariable("TOTAL", val);
 
     if (which_jobs)
@@ -1469,13 +1469,13 @@ cgiShowJobs(http_t     *http,           /* I - Connection to server */
 
     if (first > 0)
     {
-      sprintf(val, "%d", first - CUPS_PAGE_MAX);
+      snprintf(val, sizeof(val), "%d", first - CUPS_PAGE_MAX);
       cgiSetVariable("PREV", val);
     }
 
     if ((first + CUPS_PAGE_MAX) < count)
     {
-      sprintf(val, "%d", first + CUPS_PAGE_MAX);
+      snprintf(val, sizeof(val), "%d", first + CUPS_PAGE_MAX);
       cgiSetVariable("NEXT", val);
     }
 
index bbc153e3b74a35ecc414e5f399db5ddf634af200..2a33b6832d6d2f124b07e91c57f134a19530e500 100644 (file)
@@ -379,7 +379,7 @@ show_all_printers(http_t     *http, /* I - Connection to server */
     if (first < 0)
       first = 0;
 
-    sprintf(val, "%d", count);
+    snprintf(val, sizeof(val), "%d", count);
     cgiSetVariable("TOTAL", val);
 
     for (i = 0, printer = (ipp_attribute_t *)cupsArrayIndex(printers, first);
@@ -395,13 +395,13 @@ show_all_printers(http_t     *http,       /* I - Connection to server */
 
     if (first > 0)
     {
-      sprintf(val, "%d", first - CUPS_PAGE_MAX);
+      snprintf(val, sizeof(val), "%d", first - CUPS_PAGE_MAX);
       cgiSetVariable("PREV", val);
     }
 
     if ((first + CUPS_PAGE_MAX) < count)
     {
-      sprintf(val, "%d", first + CUPS_PAGE_MAX);
+      snprintf(val, sizeof(val), "%d", first + CUPS_PAGE_MAX);
       cgiSetVariable("NEXT", val);
     }
 
index 1972b4ae2ca2252b03135ae5a6a523fdfe02bfb7..0b785b2f677f9b93ce8e8d300c815d8fdd369b32 100644 (file)
@@ -307,9 +307,9 @@ cgi_copy(FILE *out,                 /* I - Output file */
        */
 
         if (name[1])
-          sprintf(outval, "%d", cgiGetSize(name + 1));
+          snprintf(outval, sizeof(outval), "%d", cgiGetSize(name + 1));
        else
-         sprintf(outval, "%d", element + 1);
+         snprintf(outval, sizeof(outval), "%d", element + 1);
 
         outptr = outval;
       }
@@ -457,7 +457,7 @@ cgi_copy(FILE *out,                 /* I - Output file */
            continue;
          else if (ch == '#')
          {
-           sprintf(s, "%d", element + 1);
+           snprintf(s, sizeof(compare) - (size_t)(s - compare), "%d", element + 1);
            s += strlen(s);
          }
          else if (ch == '{')
@@ -473,7 +473,7 @@ cgi_copy(FILE *out,                 /* I - Output file */
            *innerptr = '\0';
 
             if (innername[0] == '#')
-             sprintf(s, "%d", cgiGetSize(innername + 1));
+             snprintf(s, sizeof(compare) - (size_t)(s - compare), "%d", cgiGetSize(innername + 1));
            else if ((innerptr = strrchr(innername, '-')) != NULL &&
                     isdigit(innerptr[1] & 255))
             {
index 2958d78df0aa0307169ea122ffe3dd7ab39c4f89..0abf8c1ad286d6a8e05bb5fc49c24c17574601fd 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for CUPS 2.3.4.
+# Generated by GNU Autoconf 2.69 for CUPS 2.3.5.
 #
 # Report bugs to <https://github.com/apple/cups/issues>.
 #
@@ -580,8 +580,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='CUPS'
 PACKAGE_TARNAME='cups'
-PACKAGE_VERSION='2.3.4'
-PACKAGE_STRING='CUPS 2.3.4'
+PACKAGE_VERSION='2.3.5'
+PACKAGE_STRING='CUPS 2.3.5'
 PACKAGE_BUGREPORT='https://github.com/apple/cups/issues'
 PACKAGE_URL='https://www.cups.org/'
 
@@ -1467,7 +1467,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures CUPS 2.3.4 to adapt to many kinds of systems.
+\`configure' configures CUPS 2.3.5 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1532,7 +1532,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of CUPS 2.3.4:";;
+     short | recursive ) echo "Configuration of CUPS 2.3.5:";;
    esac
   cat <<\_ACEOF
 
@@ -1713,7 +1713,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-CUPS configure 2.3.4
+CUPS configure 2.3.5
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2177,7 +2177,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by CUPS $as_me 2.3.4, which was
+It was created by CUPS $as_me 2.3.5, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -2694,7 +2694,7 @@ done
 ac_config_headers="$ac_config_headers config.h"
 
 
-CUPS_VERSION="2.3.4"
+CUPS_VERSION="2.3.5"
 CUPS_REVISION=""
 CUPS_BUILD="cups-$CUPS_VERSION"
 
@@ -10385,7 +10385,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by CUPS $as_me 2.3.4, which was
+This file was extended by CUPS $as_me 2.3.5, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -10448,7 +10448,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-CUPS config.status 2.3.4
+CUPS config.status 2.3.5
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
index ae842ff7e5a5f959c247029d0b600eb1c6e63a94..5ba59dd3e0dc27cf02f2b43fbdc9c8e51db388cd 100644 (file)
@@ -1,7 +1,7 @@
 dnl
 dnl Configuration script for CUPS.
 dnl
-dnl Copyright © 2007-2020 by Apple Inc.
+dnl Copyright © 2007-2021 by Apple Inc.
 dnl Copyright © 1997-2007 by Easy Software Products, all rights reserved.
 dnl
 dnl Licensed under Apache License v2.0.  See the file "LICENSE" for more
@@ -12,7 +12,7 @@ dnl We need at least autoconf 2.60...
 AC_PREREQ(2.60)
 
 dnl Package name and version...
-AC_INIT([CUPS], [2.3.4], [https://github.com/apple/cups/issues], [cups], [https://www.cups.org/])
+AC_INIT([CUPS], [2.3.5], [https://github.com/apple/cups/issues], [cups], [https://www.cups.org/])
 
 sinclude(config-scripts/cups-opsys.m4)
 sinclude(config-scripts/cups-common.m4)
index db45bbba68bd427bed9fa933dacd54c801ec9d48..b6fec6b983220947f5719808d9620ed6b621afdb 100644 (file)
@@ -90,6 +90,7 @@ static void   cups_gss_printf(OM_uint32 major_status, OM_uint32 minor_status,
 #    define    cups_gss_printf(major, minor, message)
 #  endif /* DEBUG */
 #endif /* HAVE_GSSAPI */
+static int     cups_is_local_connection(http_t *http);
 static int     cups_local_auth(http_t *http);
 
 
@@ -174,10 +175,10 @@ cupsDoAuthentication(
     DEBUG_printf(("2cupsDoAuthentication: Trying scheme \"%s\"...", scheme));
 
 #ifdef HAVE_GSSAPI
-    if (!_cups_strcasecmp(scheme, "Negotiate"))
+    if (!_cups_strcasecmp(scheme, "Negotiate") && !cups_is_local_connection(http))
     {
      /*
-      * Kerberos authentication...
+      * Kerberos authentication to remote server...
       */
 
       int gss_status;                  /* Auth status */
@@ -201,7 +202,9 @@ cupsDoAuthentication(
     }
     else
 #endif /* HAVE_GSSAPI */
-    if (_cups_strcasecmp(scheme, "Basic") && _cups_strcasecmp(scheme, "Digest"))
+    if (_cups_strcasecmp(scheme, "Basic") &&
+       _cups_strcasecmp(scheme, "Digest") &&
+       _cups_strcasecmp(scheme, "Negotiate"))
     {
      /*
       * Other schemes not yet supported...
@@ -215,7 +218,7 @@ cupsDoAuthentication(
     * See if we should retry the current username:password...
     */
 
-    if ((http->digest_tries > 1 || !http->userpass[0]) && (!_cups_strcasecmp(scheme, "Basic") || (!_cups_strcasecmp(scheme, "Digest"))))
+    if (http->digest_tries > 1 || !http->userpass[0])
     {
      /*
       * Nope - get a new password from the user...
@@ -295,7 +298,7 @@ cupsDoAuthentication(
     }
   }
 
-  if (http->authstring)
+  if (http->authstring && http->authstring[0])
   {
     DEBUG_printf(("1cupsDoAuthentication: authstring=\"%s\".", http->authstring));
 
@@ -916,6 +919,14 @@ cups_gss_printf(OM_uint32  major_status,/* I - Major status code */
 #  endif /* DEBUG */
 #endif /* HAVE_GSSAPI */
 
+static int                             /* O - 0 if not a local connection */
+                                       /*     1  if local connection */
+cups_is_local_connection(http_t *http) /* I - HTTP connection to server */
+{
+  if (!httpAddrLocalhost(http->hostaddr) && _cups_strcasecmp(http->hostname, "localhost") != 0)
+    return 0;
+  return 1;
+}
 
 /*
  * 'cups_local_auth()' - Get the local authorization certificate if
@@ -958,7 +969,7 @@ cups_local_auth(http_t *http)               /* I - HTTP connection to server */
   * See if we are accessing localhost...
   */
 
-  if (!httpAddrLocalhost(http->hostaddr) && _cups_strcasecmp(http->hostname, "localhost") != 0)
+  if (!cups_is_local_connection(http))
   {
     DEBUG_puts("8cups_local_auth: Not a local connection!");
     return (1);
@@ -1032,11 +1043,6 @@ cups_local_auth(http_t *http)            /* I - HTTP connection to server */
   }
 #  endif /* HAVE_AUTHORIZATION_H */
 
-#  ifdef HAVE_GSSAPI
-  if (cups_auth_find(www_auth, "Negotiate"))
-    return (1);
-#  endif /* HAVE_GSSAPI */
-
 #  if defined(SO_PEERCRED) && defined(AF_LOCAL)
  /*
   * See if we can authenticate using the peer credentials provided over a
index 3793dfbe8e47b8f97fe015581e05a2c8a3c8b02e..826e600bcc7c8035e6974b5976223121fa176024 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * API definitions for CUPS.
  *
- * Copyright © 2007-2020 by Apple Inc.
+ * Copyright © 2007-2021 by Apple Inc.
  * Copyright © 1997-2007 by Easy Software Products.
  *
  * Licensed under Apache License v2.0.  See the file "LICENSE" for more
@@ -42,10 +42,10 @@ extern "C" {
  * Constants...
  */
 
-#  define CUPS_VERSION                 2.0304
+#  define CUPS_VERSION                 2.0305
 #  define CUPS_VERSION_MAJOR           2
 #  define CUPS_VERSION_MINOR           3
-#  define CUPS_VERSION_PATCH           4
+#  define CUPS_VERSION_PATCH           5
 
 #  define CUPS_BC_FD                   3
                                        /* Back-channel file descriptor for
index cde987a0951f2f9a27e8d2e973aca34ee6f903fd..4d0c250326f3449aae73b81885ddef2120e085e3 100644 (file)
@@ -1839,7 +1839,10 @@ cupsGetNamedDest(http_t     *http,       /* I - Connection to server or @code CUPS_HTT
       cupsEnumDests(0, 1000, NULL, 0, 0, (cups_dest_cb_t)cups_name_cb, &data);
 
       if (!data.dest)
+      {
+        _cupsSetError(IPP_STATUS_ERROR_NOT_FOUND, _("The printer or class does not exist."), 1);
         return (NULL);
+      }
 
       dest = data.dest;
     }
@@ -4366,5 +4369,13 @@ cups_queue_name(
       *nameptr++ = '_';
   }
 
+ /*
+  * Remove an underscore if it is the last character and isn't the only
+  * character in the name...
+  */
+
+  if (nameptr > (name + 1) && nameptr[-1] == '_')
+    nameptr --;
+
   *nameptr = '\0';
 }
index 35e98be77f816461a09c79f6299d20e4109394da..4e20f73d93fdd5f5c208526605c8da8a77a1a287 100644 (file)
@@ -25,6 +25,7 @@
 #    include <unistd.h>
 #    include <fcntl.h>
 #    include <sys/socket.h>
+#    include <netinet/in.h>
 #    define CUPS_SOCAST
 #  endif /* _WIN32 */
 
index 4fbb443db10cbf2180bb2af6266ed00a177d9a89..c153c665591dff31a6bc7e5ab8614a4f90ae5715 100644 (file)
@@ -199,7 +199,7 @@ cupsHashData(const char    *algorithm,      /* I - Algorithm name */
       goto too_small;
 
     _cupsMD5Init(&state);
-    _cupsMD5Append(&state, data, datalen);
+    _cupsMD5Append(&state, data, (int)datalen);
     _cupsMD5Finish(&state, hash);
 
     return (16);
index 86749c84856ad7f56a86e601e1522c3ef10e8614..8e81c6f7db043ee3c9f7951893492b2d2eab2106 100644 (file)
@@ -243,7 +243,7 @@ httpAddrListen(http_addr_t *addr,   /* I - Address to bind to */
   * Listen...
   */
 
-  if (listen(fd, 5))
+  if (listen(fd, 128))
   {
     _cupsSetHTTPError(HTTP_STATUS_ERROR);
 
index 485c6f43da2012f67d09b35440fdf8d11a44c419..89b3d92fb6fc2bb1f57c552a875f494be76f8e02 100644 (file)
@@ -238,7 +238,14 @@ httpAddrConnect2(
     }
 
     if (!addrlist && nfds == 0)
+    {
+#ifdef _WIN32
+      errno = WSAEHOSTDOWN;
+#else
+      errno = EHOSTDOWN;
+#endif // _WIN32
       break;
+    }
 
    /*
     * See if we can connect to any of the addresses so far...
@@ -369,6 +376,9 @@ httpAddrConnect2(
       remaining -= 250;
   }
 
+  if (remaining <= 0)
+    errno = ETIMEDOUT;
+
   while (nfds > 0)
   {
     nfds --;
index 63175145ee97acae89909529282e97032c5a96c3..49557300eea7933835aee533429a563c16da4680 100644 (file)
@@ -840,6 +840,13 @@ httpGetDateTime(const char *s)             /* I - Date/time string */
   DEBUG_printf(("4httpGetDateTime: day=%d, mon=\"%s\", year=%d, hour=%d, "
                 "min=%d, sec=%d", day, mon, year, hour, min, sec));
 
+ /*
+  * Check for invalid year (RFC 7231 says it's 4DIGIT)
+  */
+
+  if (year > 9999)
+    return (0);
+
  /*
   * Convert the month name to a number from 0 to 11.
   */
index dcc00ac52253f6b50b2c57dc7f8c03b40e4615f2..43ace18f4428f7313809e644dead8b4af81a677a 100644 (file)
@@ -2787,6 +2787,7 @@ _httpUpdate(http_t        *http,  /* I - HTTP connection */
       if (_httpTLSStart(http) != 0)
       {
         httpAddrClose(NULL, http->fd);
+        http->fd = -1;
 
        *status = http->status = HTTP_STATUS_ERROR;
        return (0);
index bfb9dff09909a9a227e93f9593ad66da186afbc1..d9e900649aa86ea2dfb05e16924c3422a938d868 100644 (file)
@@ -2262,7 +2262,7 @@ ippErrorString(ipp_status_t error)        /* I - Error status */
   * No, build an "0xxxxx" error string...
   */
 
-  sprintf(cg->ipp_unknown, "0x%04x", error);
+  snprintf(cg->ipp_unknown, sizeof(cg->ipp_unknown), "0x%04x", error);
 
   return (cg->ipp_unknown);
 }
@@ -2339,7 +2339,7 @@ ippOpString(ipp_op_t op)          /* I - Operation ID */
   * No, build an "0xxxxx" operation string...
   */
 
-  sprintf(cg->ipp_unknown, "0x%04x", op);
+  snprintf(cg->ipp_unknown, sizeof(cg->ipp_unknown), "0x%04x", op);
 
   return (cg->ipp_unknown);
 }
index 395b0ebf3e130951cb2482c3230c3d3b6150a7bc..69efbd9aa0751ef28e61cc38a797a8255f90c100 100644 (file)
@@ -12,7 +12,7 @@
  * Include necessary headers...
  */
 
-#include <cups/cups.h>
+#include "cups-private.h"
 #include "ipp-private.h"
 #include "string-private.h"
 #include "debug-internal.h"
@@ -220,10 +220,22 @@ _ippVarsSet(_ipp_vars_t *v,               /* I - IPP variables */
 {
   if (!strcmp(name, "uri"))
   {
-    char               uri[1024];      /* New printer URI */
-    http_uri_status_t  uri_status;     /* URI status */
+    char       uri[1024];              /* New printer URI */
+    char       resolved[1024];         /* Resolved mDNS URI */
 
-    if ((uri_status = httpSeparateURI(HTTP_URI_CODING_ALL, value, v->scheme, sizeof(v->scheme), v->username, sizeof(v->username), v->host, sizeof(v->host), &(v->port), v->resource, sizeof(v->resource))) < HTTP_URI_STATUS_OK)
+    if (strstr(value, "._tcp"))
+    {
+     /*
+      * Resolve URI...
+      */
+
+      if (!_httpResolveURI(value, resolved, sizeof(resolved), _HTTP_RESOLVE_DEFAULT, NULL, NULL))
+        return (0);
+
+      value = resolved;
+    }
+
+    if (httpSeparateURI(HTTP_URI_CODING_ALL, value, v->scheme, sizeof(v->scheme), v->username, sizeof(v->username), v->host, sizeof(v->host), &(v->port), v->resource, sizeof(v->resource)) < HTTP_URI_STATUS_OK)
       return (0);
 
     if (v->username[0])
index f19747d619356eb07b47d0e89058d495c8f9c9b4..94a2264a6e04b9fcae5927fb89582086220bc712 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Internet Printing Protocol functions for CUPS.
  *
- * Copyright © 2007-2020 by Apple Inc.
+ * Copyright © 2007-2021 by Apple Inc.
  * Copyright © 1997-2007 by Easy Software Products, all rights reserved.
  *
  * Licensed under Apache License v2.0.  See the file "LICENSE" for more
@@ -2867,7 +2867,7 @@ ippReadIO(void       *src,                /* I - Data source */
                        string[IPP_MAX_TEXT],
                                        /* Small string buffer */
                        *bufptr,        /* Pointer into buffer */
-                       *bufptrEnd;     /* Pointer after valid buffer range */
+                       *bufend;        /* End of buffer */
   ipp_attribute_t      *attr;          /* Current attribute */
   ipp_tag_t            tag;            /* Current tag */
   ipp_tag_t            value_tag;      /* Current value tag */
@@ -3442,7 +3442,7 @@ ippReadIO(void       *src,                /* I - Data source */
                }
 
                 bufptr = buffer;
-                bufptrEnd = &buffer[n];
+                bufend = buffer + n;
 
 
               /*
@@ -3457,7 +3457,7 @@ ippReadIO(void       *src,                /* I - Data source */
 
                n = (bufptr[0] << 8) | bufptr[1];
 
-               if ((bufptr + 2 + n) > bufptrEnd || n >= (int)sizeof(string))
+               if ((bufptr + 2 + n) >= bufend || n >= (int)sizeof(string))
                {
                  _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
                                _("IPP language length overflows value."), 1);
@@ -3481,10 +3481,10 @@ ippReadIO(void       *src,              /* I - Data source */
 
                value->string.language = _cupsStrAlloc((char *)string);
 
-                bufptr += 2 + n;
+               bufptr += 2 + n;
                n = (bufptr[0] << 8) | bufptr[1];
 
-               if ((bufptr + 2 + n) > bufptrEnd)
+               if ((bufptr + 2 + n) > bufend)
                {
                  _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
                                _("IPP string length overflows value."), 1);
index 5965e382bb80b2108b7c9ebbf56451daa4af53fb..2c47d599593860eacb4d4ccdf789f5e34704dbf7 100644 (file)
@@ -3228,7 +3228,7 @@ _ppdCreateFromIPP(char   *buffer, /* I - Filename buffer */
         cupsFilePuts(fp, "*cupsFilter2: \"application/vnd.cups-pdf application/pdf 10 -\"\n");
     }
     else
-      cupsFilePuts(fp, "*cupsManualCopies: true\n");
+      cupsFilePuts(fp, "*cupsManualCopies: True\n");
     if (is_apple)
       cupsFilePuts(fp, "*cupsFilter2: \"image/urf image/urf 100 -\"\n");
     if (is_pwg)
@@ -3620,10 +3620,12 @@ _ppdCreateFromIPP(char   *buffer,       /* I - Filename buffer */
   if ((attr = ippFindAttribute(ippGetCollection(defattr, 0), "media-source", IPP_TAG_ZERO)) != NULL)
     pwg_ppdize_name(ippGetString(attr, 0, NULL), ppdname, sizeof(ppdname));
   else
-    strlcpy(ppdname, "Unknown", sizeof(ppdname));
+    ppdname[0] = '\0';
 
   if ((attr = ippFindAttribute(response, "media-source-supported", IPP_TAG_ZERO)) != NULL && (count = ippGetCount(attr)) > 1)
   {
+    int have_default = ppdname[0] != '\0';
+                                       /* Do we have a default InputSlot? */
     static const char * const sources[] =
     {                                  /* Standard "media-source" strings */
       "auto",
@@ -3678,21 +3680,31 @@ _ppdCreateFromIPP(char   *buffer,       /* I - Filename buffer */
       "roll-10"
     };
 
-    cupsFilePrintf(fp, "*OpenUI *InputSlot: PickOne\n"
-                       "*OrderDependency: 10 AnySetup *InputSlot\n"
-                       "*DefaultInputSlot: %s\n", ppdname);
-    for (i = 0, count = ippGetCount(attr); i < count; i ++)
+    cupsFilePuts(fp, "*OpenUI *InputSlot: PickOne\n"
+                     "*OrderDependency: 10 AnySetup *InputSlot\n");
+    if (have_default)
+      cupsFilePrintf(fp, "*DefaultInputSlot: %s\n", ppdname);
+
+    for (i = 0; i < count; i ++)
     {
       keyword = ippGetString(attr, i, NULL);
 
       pwg_ppdize_name(keyword, ppdname, sizeof(ppdname));
 
+      if (i == 0 && !have_default)
+       cupsFilePrintf(fp, "*DefaultInputSlot: %s\n", ppdname);
+
       for (j = 0; j < (int)(sizeof(sources) / sizeof(sources[0])); j ++)
         if (!strcmp(sources[j], keyword))
        {
          snprintf(msgid, sizeof(msgid), "media-source.%s", keyword);
+
+         if ((msgstr = _cupsLangString(lang, msgid)) == msgid || !strcmp(msgid, msgstr))
+           if ((msgstr = _cupsMessageLookup(strings, msgid)) == msgid)
+             msgstr = keyword;
+
          cupsFilePrintf(fp, "*InputSlot %s: \"<</MediaPosition %d>>setpagedevice\"\n", ppdname, j);
-         cupsFilePrintf(fp, "*%s.InputSlot %s/%s: \"\"\n", lang->language, ppdname, _cupsLangString(lang, msgid));
+         cupsFilePrintf(fp, "*%s.InputSlot %s/%s: \"\"\n", lang->language, ppdname, msgstr);
          break;
        }
     }
@@ -3744,6 +3756,8 @@ _ppdCreateFromIPP(char   *buffer, /* I - Filename buffer */
     int wrote_color = 0;
     const char *default_color = NULL;  /* Default */
 
+    cupsFilePrintf(fp, "*%% ColorModel from %s\n", ippGetName(attr));
+
     for (i = 0, count = ippGetCount(attr); i < count; i ++)
     {
       keyword = ippGetString(attr, i, NULL);
@@ -3790,6 +3804,11 @@ _ppdCreateFromIPP(char   *buffer,        /* I - Filename buffer */
        PRINTF_COLOROPTION("RGB", _("Color"), CUPS_CSPACE_SRGB, 8)
 
        default_color = "RGB";
+
+        // Apparently some printers only advertise color support, so make sure
+        // we also do grayscale for these printers...
+       if (!ippContainsString(attr, "sgray_8") && !ippContainsString(attr, "black_1") && !ippContainsString(attr, "black_8") && !ippContainsString(attr, "W8") && !ippContainsString(attr, "W8-16"))
+         PRINTF_COLOROPTION("Gray", _("GrayScale"), CUPS_CSPACE_SW, 8)
       }
       else if (!strcasecmp(keyword, "adobe-rgb_16") || !strcmp(keyword, "ADOBERGB48") || !strcmp(keyword, "ADOBERGB24-48"))
       {
@@ -3924,7 +3943,7 @@ _ppdCreateFromIPP(char   *buffer, /* I - Filename buffer */
   else
     strlcpy(ppdname, "Unknown", sizeof(ppdname));
 
-  if ((attr = ippFindAttribute(response, "output-bin-supported", IPP_TAG_ZERO)) != NULL && (count = ippGetCount(attr)) > 1)
+  if ((attr = ippFindAttribute(response, "output-bin-supported", IPP_TAG_ZERO)) != NULL && (count = ippGetCount(attr)) > 0)
   {
     ipp_attribute_t    *trays = ippFindAttribute(response, "printer-output-tray", IPP_TAG_STRING);
                                        /* printer-output-tray attribute, if any */
@@ -5140,6 +5159,8 @@ pwg_unppdize_name(const char *ppd,        /* I - PPD keyword */
 {
   char *ptr,                           /* Pointer into name buffer */
        *end;                           /* End of name buffer */
+  int   nodash = 1;                     /* Next char in IPP name cannot be a
+                                           dash (first char or after a dash) */
 
 
   if (_cups_islower(*ppd))
@@ -5151,7 +5172,9 @@ pwg_unppdize_name(const char *ppd,        /* I - PPD keyword */
     const char *ppdptr;                        /* Pointer into PPD keyword */
 
     for (ppdptr = ppd + 1; *ppdptr; ppdptr ++)
-      if (_cups_isupper(*ppdptr) || strchr(dashchars, *ppdptr))
+      if (_cups_isupper(*ppdptr) || strchr(dashchars, *ppdptr) ||
+         (*ppdptr == '-' && *(ppdptr - 1) == '-') ||
+         (*ppdptr == '-' && *(ppdptr + 1) == '\0'))
         break;
 
     if (!*ppdptr)
@@ -5163,19 +5186,44 @@ pwg_unppdize_name(const char *ppd,      /* I - PPD keyword */
 
   for (ptr = name, end = name + namesize - 1; *ppd && ptr < end; ppd ++)
   {
-    if (_cups_isalnum(*ppd) || *ppd == '-')
+    if (_cups_isalnum(*ppd))
+    {
       *ptr++ = (char)tolower(*ppd & 255);
-    else if (strchr(dashchars, *ppd))
-      *ptr++ = '-';
+      nodash = 0;
+    }
+    else if (*ppd == '-' || strchr(dashchars, *ppd))
+    {
+      if (nodash == 0)
+      {
+       *ptr++ = '-';
+       nodash = 1;
+      }
+    }
     else
+    {
       *ptr++ = *ppd;
+      nodash = 0;
+    }
 
-    if (!_cups_isupper(*ppd) && _cups_isalnum(*ppd) &&
-       _cups_isupper(ppd[1]) && ptr < end)
-      *ptr++ = '-';
-    else if (!isdigit(*ppd & 255) && isdigit(ppd[1] & 255))
-      *ptr++ = '-';
+    if (nodash == 0)
+    {
+      if (!_cups_isupper(*ppd) && _cups_isalnum(*ppd) &&
+         _cups_isupper(ppd[1]) && ptr < end)
+      {
+       *ptr++ = '-';
+       nodash = 1;
+      }
+      else if (!isdigit(*ppd & 255) && isdigit(ppd[1] & 255))
+      {
+       *ptr++ = '-';
+       nodash = 1;
+      }
+    }
   }
 
+  /* Remove trailing dashes */
+  while (ptr > name && *(ptr - 1) == '-')
+    ptr --;
+
   *ptr = '\0';
 }
index 7ec0df473951a40cfc5beb0e12fbf656e8cd149e..25797b3761ea4c1296c37a2459ee642f1a1bab29 100644 (file)
@@ -307,7 +307,7 @@ cupsMarkOptions(
         * Look it up in the PPD file...
        */
 
-       sprintf(s, "%d", j);
+       snprintf(s, sizeof(s), "%d", j);
 
         if ((attr = ppdFindAttr(ppd, "cupsIPPFinishings", s)) == NULL)
          continue;
index 7b406c971bdd6e37edc9bc4dd6e4151e942ee12d..11ddae3662c8ada77f01c0f1d6d9c51758ce84d3 100644 (file)
@@ -35,7 +35,7 @@ extern "C" {
  * Constants...
  */
 
-#  define _PPD_CACHE_VERSION         /* Version number in cache file */
+#  define _PPD_CACHE_VERSION   10      /* Version number in cache file */
 
 
 /*
index cf84833a4569b2c339de7240b3f676a9896de430..ac5dbc62bb8d78aa8de022f8f9bb854d4525eaa8 100644 (file)
@@ -125,6 +125,7 @@ ppdClose(ppd_file_t *ppd)           /* I - PPD file record */
   free(ppd->lang_encoding);
   free(ppd->nickname);
   free(ppd->patches);
+  free(ppd->emulations);
   free(ppd->jcl_begin);
   free(ppd->jcl_end);
   free(ppd->jcl_ps);
@@ -871,15 +872,15 @@ _ppdOpen(
       ppd_decode(ppd->jcl_ps);         /* Decode quoted string */
     }
     else if (!strcmp(keyword, "AccurateScreensSupport"))
-      ppd->accurate_screens = !strcmp(string, "True");
+      ppd->accurate_screens = !strcasecmp(string, "True");
     else if (!strcmp(keyword, "ColorDevice"))
-      ppd->color_device = !strcmp(string, "True");
+      ppd->color_device = !strcasecmp(string, "True");
     else if (!strcmp(keyword, "ContoneOnly"))
-      ppd->contone_only = !strcmp(string, "True");
+      ppd->contone_only = !strcasecmp(string, "True");
     else if (!strcmp(keyword, "cupsFlipDuplex"))
-      ppd->flip_duplex = !strcmp(string, "True");
+      ppd->flip_duplex = !strcasecmp(string, "True");
     else if (!strcmp(keyword, "cupsManualCopies"))
-      ppd->manual_copies = !strcmp(string, "True");
+      ppd->manual_copies = !strcasecmp(string, "True");
     else if (!strcmp(keyword, "cupsModelNumber"))
       ppd->model_number = atoi(string);
     else if (!strcmp(keyword, "cupsColorProfile"))
@@ -1496,6 +1497,27 @@ _ppdOpen(
        goto error;
       }
 
+      if (option && (!_cups_strcasecmp(option->defchoice, "custom") || !_cups_strncasecmp(option->defchoice, "custom.", 7)))
+      {
+       /*
+       * "*DefaultOption: Custom..." may set the default to a custom value
+       * or (for a very small number of incompatible PPD files) select a
+       * standard choice for the option, which CUPS renames to "_Custom..."
+       * to avoid compatibility issues.  See which this is...
+       */
+
+        char tchoice[PPD_MAX_NAME];    /* Temporary choice name */
+
+       snprintf(tchoice, sizeof(tchoice), "_%s", option->defchoice);
+
+       if (ppdFindChoice(option, tchoice))
+       {
+         strlcpy(option->defchoice, tchoice, sizeof(option->defchoice));
+
+         DEBUG_printf(("2_ppdOpen: Reset Default%s to %s...", option->keyword, tchoice));
+       }
+      }
+
       option = NULL;
 
       free(string);
@@ -1510,6 +1532,27 @@ _ppdOpen(
        goto error;
       }
 
+      if (option && (!_cups_strcasecmp(option->defchoice, "custom") || !_cups_strncasecmp(option->defchoice, "custom.", 7)))
+      {
+       /*
+       * "*DefaultOption: Custom..." may set the default to a custom value
+       * or (for a very small number of incompatible PPD files) select a
+       * standard choice for the option, which CUPS renames to "_Custom..."
+       * to avoid compatibility issues.  See which this is...
+       */
+
+        char tchoice[PPD_MAX_NAME];    /* Temporary choice name */
+
+       snprintf(tchoice, sizeof(tchoice), "_%s", option->defchoice);
+
+       if (ppdFindChoice(option, tchoice))
+       {
+         strlcpy(option->defchoice, tchoice, sizeof(option->defchoice));
+
+         DEBUG_printf(("2_ppdOpen: Reset Default%s to %s...", option->keyword, tchoice));
+       }
+      }
+
       option = NULL;
 
       free(string);
@@ -1668,11 +1711,9 @@ _ppdOpen(
         * Set the default as part of the current option...
        */
 
-        DEBUG_printf(("2_ppdOpen: Setting %s to %s...", keyword, string));
+       strlcpy(option->defchoice, string, sizeof(option->defchoice));
 
-        strlcpy(option->defchoice, string, sizeof(option->defchoice));
-
-        DEBUG_printf(("2_ppdOpen: %s is now %s...", keyword, option->defchoice));
+        DEBUG_printf(("2_ppdOpen: Set %s to %s...", keyword, option->defchoice));
       }
       else
       {
@@ -1682,11 +1723,27 @@ _ppdOpen(
 
         ppd_option_t   *toption;       /* Temporary option */
 
-
         if ((toption = ppdFindOption(ppd, keyword + 7)) != NULL)
        {
-         DEBUG_printf(("2_ppdOpen: Setting %s to %s...", keyword, string));
-         strlcpy(toption->defchoice, string, sizeof(toption->defchoice));
+         if (!_cups_strcasecmp(string, "custom") || !_cups_strncasecmp(string, "custom.", 7))
+         {
+          /*
+           * "*DefaultOption: Custom..." may set the default to a custom value
+           * or (for a very small number of incompatible PPD files) select a
+           * standard choice for the option, which CUPS renames to "_Custom..."
+           * to avoid compatibility issues.  See which this is...
+           */
+
+           snprintf(toption->defchoice, sizeof(toption->defchoice), "_%s", string);
+           if (!ppdFindChoice(toption, toption->defchoice))
+             strlcpy(toption->defchoice, string, sizeof(toption->defchoice));
+         }
+         else
+         {
+           strlcpy(toption->defchoice, string, sizeof(toption->defchoice));
+         }
+
+         DEBUG_printf(("2_ppdOpen: Set %s to %s...", keyword, toption->defchoice));
        }
       }
     }
@@ -2847,7 +2904,7 @@ ppd_hash_option(ppd_option_t *option)     /* I - Option */
 
 
   for (hash = option->keyword[0], k = option->keyword + 1; *k;)
-    hash = 33 * hash + *k++;
+    hash = (int)(33U * (unsigned)hash) + *k++;
 
   return (hash & 511);
 }
index 69a7801375ade2a3a8eb8b16f92baf8fc3aa1bcf..ff967f05ad14a8edc57f169438ad9a3acc248d6a 100644 (file)
@@ -395,7 +395,7 @@ cupsGetResponse(http_t     *http,   /* I - Connection to server or @code CUPS_HTTP
       ippDelete(response);
       response = NULL;
 
-      http->status = status = HTTP_STATUS_ERROR;
+      http->status = HTTP_STATUS_ERROR;
       http->error  = EINVAL;
     }
   }
@@ -422,7 +422,7 @@ cupsGetResponse(http_t     *http,   /* I - Connection to server or @code CUPS_HTTP
       if (!cupsDoAuthentication(http, "POST", resource))
         httpReconnect2(http, 30000, NULL);
       else
-        http->status = status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED;
+        http->status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED;
     }
 
 #ifdef HAVE_SSL
index 49652e2c43b55abc415fa6538fd01f1dd3b89e4a..3c468571879251ac050316326464deb48ca69739 100644 (file)
@@ -81,7 +81,8 @@ _cups_vsnprintf(char       *buffer,   /* O - Output buffer */
        format ++;
        width = va_arg(ap, int);
 
-       snprintf(tptr, sizeof(tformat) - (tptr - tformat), "%d", width);
+        /* Note: Can't use snprintf here since we are implementing this function... */
+       sprintf(tptr, "%d", width);
        tptr += strlen(tptr);
       }
       else
@@ -113,7 +114,8 @@ _cups_vsnprintf(char       *buffer, /* O - Output buffer */
          format ++;
          prec = va_arg(ap, int);
 
-         snprintf(tptr, sizeof(tformat) - (tptr - tformat), "%d", prec);
+          /* Note: Can't use snprintf here since we are implementing this function... */
+         sprintf(tptr, "%d", prec);
          tptr += strlen(tptr);
        }
        else
@@ -171,6 +173,7 @@ _cups_vsnprintf(char       *buffer, /* O - Output buffer */
            if ((width + 2) > sizeof(temp))
              break;
 
+            /* Note: Can't use snprintf here since we are implementing this function... */
            sprintf(temp, tformat, va_arg(ap, double));
            templen = strlen(temp);
 
@@ -202,6 +205,7 @@ _cups_vsnprintf(char       *buffer, /* O - Output buffer */
            if ((width + 2) > sizeof(temp))
              break;
 
+           /* Note: Can't use snprintf here since we are implementing this function... */
            sprintf(temp, tformat, va_arg(ap, int));
            templen = strlen(temp);
 
@@ -226,6 +230,7 @@ _cups_vsnprintf(char       *buffer, /* O - Output buffer */
            if ((width + 2) > sizeof(temp))
              break;
 
+           /* Note: Can't use snprintf here since we are implementing this function... */
            sprintf(temp, tformat, va_arg(ap, void *));
            templen = strlen(temp);
 
index cf945df98a6d3d24fb1051c0ff344911e1cb0a8d..16ac40db7cc8a2b5ca375081b8fe15f67ed01f35 100644 (file)
@@ -24,7 +24,7 @@
  * Constants...
  */
 
-#define MAX_CLIENTS    1             /* Maximum number of client threads */
+#define MAX_CLIENTS    100             /* Maximum number of client threads */
 
 
 /*
@@ -44,12 +44,12 @@ typedef struct _client_data_s
   int                  grayscale,      /* Force grayscale? */
                        keepfile;       /* Keep temporary file? */
   ipp_pstate_t         printer_state;  /* Current printer state */
-  char                  printer_state_reasons[1024];
-                                        /* Current printer-state-reasons */
+  char                 printer_state_reasons[1024];
+                                       /* Current printer-state-reasons */
   int                  job_id;         /* Job ID for submitted job */
   ipp_jstate_t         job_state;      /* Current job state */
-  char                  job_state_reasons[1024];
-                                        /* Current job-state-reasons */
+  char                 job_state_reasons[1024];
+                                       /* Current job-state-reasons */
 } _client_data_t;
 
 
@@ -66,12 +66,12 @@ static int          verbosity = 0;
  * Local functions...
  */
 
-static const char       *make_raster_file(ipp_t *response, int grayscale, char *tempname, size_t tempsize, const char **format);
-static void            *monitor_printer(_client_data_t *data);
+static const char      *make_raster_file(ipp_t *response, int grayscale, char *tempname, size_t tempsize, const char **format);
+static void            *monitor_printer(_client_data_t *data);
 static void            *run_client(_client_data_t *data);
-static void             show_attributes(const char *title, int request, ipp_t *ipp);
-static void             show_capabilities(ipp_t *response);
-static void             usage(void);
+static void            show_attributes(const char *title, int request, ipp_t *ipp);
+static void            show_capabilities(ipp_t *response);
+static void            usage(void);
 
 
 /*
@@ -396,15 +396,7 @@ make_raster_file(ipp_t      *response,  /* I - Printer attributes */
   * Figure out the the media, resolution, and color mode...
   */
 
-  if ((attr = ippFindAttribute(response, "media-default", IPP_TAG_KEYWORD)) != NULL)
-  {
-   /*
-    * Use default media...
-    */
-
-    media = pwgMediaForPWG(ippGetString(attr, 0, NULL));
-  }
-  else if ((attr = ippFindAttribute(response, "media-ready", IPP_TAG_KEYWORD)) != NULL)
+  if ((attr = ippFindAttribute(response, "media-ready", IPP_TAG_KEYWORD)) != NULL)
   {
    /*
     * Use ready media...
@@ -417,6 +409,14 @@ make_raster_file(ipp_t      *response,  /* I - Printer attributes */
     else
       media = pwgMediaForPWG(ippGetString(attr, 0, NULL));
   }
+  else if ((attr = ippFindAttribute(response, "media-default", IPP_TAG_KEYWORD)) != NULL)
+  {
+   /*
+    * Use default media...
+    */
+
+    media = pwgMediaForPWG(ippGetString(attr, 0, NULL));
+  }
   else
   {
     puts("No default or ready media reported by printer, aborting.");
@@ -486,15 +486,15 @@ make_raster_file(ipp_t      *response,  /* I - Printer attributes */
 
   header.cupsInteger[CUPS_RASTER_PWG_TotalPageCount] = 1;
 
-  if (header.cupsWidth > (4 * header.HWResolution[0]))
+  if (header.cupsWidth > (2 * header.HWResolution[0]))
   {
     xoff = header.HWResolution[0] / 2;
     yoff = header.HWResolution[1] / 2;
   }
   else
   {
-    xoff = 0;
-    yoff = 0;
+    xoff = header.HWResolution[0] / 4;
+    yoff = header.HWResolution[1] / 4;
   }
 
   xrep = (header.cupsWidth - 2 * xoff) / 140;
@@ -603,6 +603,8 @@ make_raster_file(ipp_t      *response,  /* I - Printer attributes */
   for (y = 0; y < header.cupsHeight; y ++)
     cupsRasterWritePixels(ras, line, header.cupsBytesPerLine);
 
+  free(line);
+
   cupsRasterClose(ras);
 
   close(fd);
@@ -768,11 +770,8 @@ run_client(
   ipp_attribute_t *attr;               /* Attribute in response */
   static const char * const pattrs[] =  /* Printer attributes we are interested in */
   {
-    "job-template",
-    "printer-defaults",
-    "printer-description",
-    "media-col-database",
-    "media-col-ready"
+    "all",
+    "media-col-database"
   };
 
 
index a65e09960d84cd1219e8c1f010331595f023a2d0..9b07e77718fb161c2c5a92cb1b72f7e9d8079062 100644 (file)
@@ -410,7 +410,6 @@ print_file(http_t        *http,             /* I - Connection to destination */
 {
   cups_file_t  *fp;                    /* File to print */
   int          job_id;                 /* Job ID */
-  ipp_status_t status;                 /* Submission status */
   const char   *title;                 /* Title of job */
   char         buffer[32768];          /* File buffer */
   ssize_t      bytes;                  /* Bytes read/to write */
@@ -427,7 +426,7 @@ print_file(http_t        *http,             /* I - Connection to destination */
   else
     title = filename;
 
-  if ((status = cupsCreateDestJob(http, dest, dinfo, &job_id, title, num_options, options)) > IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED)
+  if (cupsCreateDestJob(http, dest, dinfo, &job_id, title, num_options, options) > IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED)
   {
     printf("Unable to create job: %s\n", cupsLastErrorString());
     cupsFileClose(fp);
@@ -454,7 +453,7 @@ print_file(http_t        *http,             /* I - Connection to destination */
 
   cupsFileClose(fp);
 
-  if ((status = cupsFinishDestDocument(http, dest, dinfo)) > IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED)
+  if (cupsFinishDestDocument(http, dest, dinfo) > IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED)
   {
     printf("Unable to send document: %s\n", cupsLastErrorString());
     return;
index 329cc0eb42e4183f9efd1615111f4c417379bf95..25adbdfb23773b5c9d65a8aa63275c4c21231bb9 100644 (file)
@@ -939,7 +939,7 @@ http_gnutls_default_path(char   *buffer,/* I - Path buffer */
                                        /* Pointer to library globals */
 
 
-  if (cg->home)
+  if (cg->home && getuid())
   {
     snprintf(buffer, bufsize, "%s/.cups", cg->home);
     if (access(buffer, 0))
index ccbdf8aaf0648d94b0d9019c4885f20fcd58cea0..52ded5f21f6f43f55e482d4844f839559b55a298 100644 (file)
@@ -1332,8 +1332,6 @@ http_sspi_client(http_t     *http,        /* I - Client connection */
   SecBufferDesc        outBuffer;              /* Array of SecBuffer structs */
   SecBuffer    outBuffers[1];          /* Security package buffer */
   int          ret = 0;                /* Return value */
-  char         username[1024],         /* Current username */
-               common_name[1024];      /* CN=username */
 
 
   DEBUG_printf(("4http_sspi_client(http=%p, hostname=\"%s\")", http, hostname));
@@ -1349,16 +1347,11 @@ http_sspi_client(http_t     *http,      /* I - Client connection */
   * Lookup the client certificate...
   */
 
-  dwSize = sizeof(username);
-  GetUserNameA(username, &dwSize);
-  snprintf(common_name, sizeof(common_name), "CN=%s", username);
-
-  if (!http_sspi_find_credentials(http, L"ClientContainer", common_name))
-    if (!http_sspi_make_credentials(http->tls, L"ClientContainer", common_name, _HTTP_MODE_CLIENT, 10))
-    {
-      DEBUG_puts("5http_sspi_client: Unable to get client credentials.");
-      return (-1);
-    }
+  if (!http_sspi_find_credentials(http, L"ClientContainer", NULL))
+  {
+    DEBUG_puts("5http_sspi_client: Unable to get client credentials.");
+    return (-1);
+  }
 
  /*
   * Initiate a ClientHello message and generate a token.
@@ -1711,48 +1704,55 @@ http_sspi_find_credentials(
     goto cleanup;
   }
 
-  dwSize = 0;
-
-  if (!CertStrToNameA(X509_ASN_ENCODING, common_name, CERT_OID_NAME_STR, NULL, NULL, &dwSize, NULL))
+  if (common_name)
   {
-    DEBUG_printf(("5http_sspi_find_credentials: CertStrToName failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError())));
-    ok = FALSE;
-    goto cleanup;
-  }
+    dwSize = 0;
 
-  p = (PBYTE)malloc(dwSize);
+    if (!CertStrToNameA(X509_ASN_ENCODING, common_name, CERT_OID_NAME_STR, NULL, NULL, &dwSize, NULL))
+    {
+      DEBUG_printf(("5http_sspi_find_credentials: CertStrToName failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError())));
+      ok = FALSE;
+      goto cleanup;
+    }
 
-  if (!p)
-  {
-    DEBUG_printf(("5http_sspi_find_credentials: malloc failed for %d bytes.", dwSize));
-    ok = FALSE;
-    goto cleanup;
-  }
+    p = (PBYTE)malloc(dwSize);
 
-  if (!CertStrToNameA(X509_ASN_ENCODING, common_name, CERT_OID_NAME_STR, NULL, p, &dwSize, NULL))
-  {
-    DEBUG_printf(("5http_sspi_find_credentials: CertStrToName failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError())));
-    ok = FALSE;
-    goto cleanup;
-  }
+    if (!p)
+    {
+      DEBUG_printf(("5http_sspi_find_credentials: malloc failed for %d bytes.", dwSize));
+      ok = FALSE;
+      goto cleanup;
+    }
 
-  sib.cbData = dwSize;
-  sib.pbData = p;
+    if (!CertStrToNameA(X509_ASN_ENCODING, common_name, CERT_OID_NAME_STR, NULL, p, &dwSize, NULL))
+    {
+      DEBUG_printf(("5http_sspi_find_credentials: CertStrToName failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError())));
+      ok = FALSE;
+      goto cleanup;
+    }
 
-  storedContext = CertFindCertificateInStore(store, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_FIND_SUBJECT_NAME, &sib, NULL);
+    sib.cbData = dwSize;
+    sib.pbData = p;
 
-  if (!storedContext)
-  {
-    DEBUG_printf(("5http_sspi_find_credentials: Unable to find credentials for \"%s\".", common_name));
-    ok = FALSE;
-    goto cleanup;
+    storedContext = CertFindCertificateInStore(store, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_FIND_SUBJECT_NAME, &sib, NULL);
+
+    if (!storedContext)
+    {
+      DEBUG_printf(("5http_sspi_find_credentials: Unable to find credentials for \"%s\".", common_name));
+      ok = FALSE;
+      goto cleanup;
+    }
   }
 
   ZeroMemory(&SchannelCred, sizeof(SchannelCred));
 
   SchannelCred.dwVersion = SCHANNEL_CRED_VERSION;
-  SchannelCred.cCreds    = 1;
-  SchannelCred.paCred    = &storedContext;
+
+  if (common_name)
+  {
+    SchannelCred.cCreds = 1;
+    SchannelCred.paCred = &storedContext;
+  }
 
  /*
   * Set supported protocols (can also be overriden in the registry...)
@@ -2017,13 +2017,6 @@ http_sspi_make_credentials(
   SchannelCred.cCreds    = 1;
   SchannelCred.paCred    = &storedContext;
 
- /*
-  * SSPI doesn't seem to like it if grbitEnabledProtocols is set for a client.
-  */
-
-  if (mode == _HTTP_MODE_SERVER)
-    SchannelCred.grbitEnabledProtocols = SP_PROT_SSL3TLS1;
-
  /*
   * Create an SSPI credential.
   */
index 1668eee8afdaef64d82a191596e85e1ea7df382b..f1e519dab43973a38bfbf1227800686fbce02488 100644 (file)
@@ -145,9 +145,6 @@ The default is "5".
 <dd style="margin-left: 5.0em"><dt><b>KeepAlive No</b>
 <dd style="margin-left: 5.0em">Specifies whether to support HTTP keep-alive connections.
 The default is "Yes".
-<dt><a name="KeepAliveTimeout"></a><b>KeepAliveTimeout </b><i>seconds</i>
-<dd style="margin-left: 5.0em">Specifies how long an idle client connection remains open.
-The default is "30".
 <dt><a name="LimitIPP"></a><b>&lt;Limit </b><i>operation </i>...<b>> </b>... <b>&lt;/Limit></b>
 <dd style="margin-left: 5.0em">Specifies the IPP operations that are being limited inside a Policy section. IPP operation names are listed below in the section "IPP OPERATION NAMES".
 <dt><a name="Limit"></a><b>&lt;Limit </b><i>method </i>...<b>> </b>... <b>&lt;/Limit></b>
index 5f9b86212b744c6809cbc89966191d8f5c63a67c..c908fa709408a5df39bfe3da203429991a2d2138 100644 (file)
@@ -36,6 +36,8 @@ ipptool - perform internet printing protocol requests
 <b>-P</b>
 <i>filename.plist</i>
 ] [
+<b>-R</b>
+] [
 <b>-S</b>
 ] [
 <b>-T</b>
@@ -128,6 +130,8 @@ The default is to use "Transfer-Encoding: chunked" for requests with attached fi
 <dt><b>-P</b><i> filename.plist</i>
 <dd style="margin-left: 5.0em">Specifies that the test results should be written to the named XML (Apple plist) file in addition to the regular test report (<b>-t</b>).
 This option is incompatible with the <b>-i</b> (interval) and <b>-n</b> (repeat-count) options.
+<dt><b>-R</b>
+<dd style="margin-left: 5.0em">Retries tests when the "server-error-busy" status code is returned.
 <dt><b>-S</b>
 <dd style="margin-left: 5.0em">Forces (dedicated) TLS encryption when connecting to the server.
 <dt><b>-T</b><i> seconds</i>
@@ -225,7 +229,7 @@ IANA IPP Registry (<a href="http://www.iana.org/assignments/ipp\-registrations)"
 PWG Internet Printing Protocol Workgroup (<a href="http://www.pwg.org/ipp">http://www.pwg.org/ipp</a>)
 RFC 8011 (<a href="http://tools.ietf.org/html/rfc8011)">http://tools.ietf.org/html/rfc8011)</a>,
 <h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
-Copyright &copy; 2007-2019 by Apple Inc.
+Copyright &copy; 2007-2021 by Apple Inc.
 
 </body>
 </html>
index e0f6727d783527285b7ea989b936b2f5bea1376f..64f800295acf6704c6dd3b50855d67d4ee46c83a 100644 (file)
@@ -175,6 +175,9 @@ test report.
 <dd style="margin-left: 5.0em">Specifies whether
 <b>ipptool</b>(8)
 will ignore errors and continue with subsequent tests.
+<dt><b>MONITOR-PRINTER-STATE </b>[ <i>printer-uri </i>] <b>{ EXPECT </b><i>attribute-name </i>[ <i>predicate(s) </i>] <b>}</b>
+<dd style="margin-left: 5.0em">Specifies printer state monitoring tests to run in parallel with the test operation.
+The monitoring tests will run until all of the <b>EXPECT</b> conditions are satisfied or the primary test operation has completed, whichever occurs first.
 <dt><b>NAME "</b><i>literal string</i><b>"</b>
 <dd style="margin-left: 5.0em">Specifies the human-readable name of the test.
 <dt><b>OPERATION </b><i>operation-code</i>
@@ -230,8 +233,9 @@ The following predicates are understood following the <b>EXPECT</b> test directi
 <dd style="margin-left: 5.0em">Makes the <b>EXPECT</b> conditions apply only if the specified variable is not defined.
 <dt><b>IN-GROUP </b><i>tag</i>
 <dd style="margin-left: 5.0em">Requires the <b>EXPECT</b> attribute to be in the specified group tag.
-<dt><b>OF-TYPE </b><i>tag[|tag,...]</i>
+<dt><b>OF-TYPE </b><i>tag[(limits)|tag|...]</i>
 <dd style="margin-left: 5.0em">Requires the <b>EXPECT</b> attribute to use one of the specified value tag(s).
+Most value tags also support the specification of limits in parenthesis, for example "name(42)" would allow nameWith/WithoutLanguage strings up to 42 octets in length, "name(4:MAX)" would allow nameWith/WithoutLanguage strings between 4 and 255 octets in length, and "integer(-273:MAX)" would allow integers between -273 and 2147483647.
 <dt><b>REPEAT-LIMIT </b><i>number</i>
 <dd style="margin-left: 5.0em"><br>
 Specifies the maximum number of times to repeat if the <b>REPEAT-MATCH</b> or <b>REPEAT-NO-MATCH</b> predicate is specified. The default value is 1000.
@@ -260,7 +264,12 @@ Specifies the maximum number of times to repeat if the <b>REPEAT-MATCH</b> or <b
 <dd style="margin-left: 5.0em"><dt><b>WITH-ALL-VALUES "true"</b>
 <dd style="margin-left: 5.0em">Requires that all values of the <b>EXPECT</b> attribute match the boolean value given.
 <dt><b>WITH-ALL-VALUES "/</b><i>regular expression</i><b>/"</b>
-<dd style="margin-left: 5.0em">Requires that all values of the <b>EXPECT</b> attribute match the regular expression, which must conform to the POSIX regular expression syntax. Comparisons are case-sensitive.
+<dd style="margin-left: 5.0em">Requires that all values of the <b>EXPECT</b> attribute match the regular expression, which must conform to the POSIX regular expression syntax.
+Comparisons are case-sensitive.
+<dt><b>WITH-DISTINCT-VALUES</b>
+<dd style="margin-left: 5.0em">Requires that all values of the <b>EXPECT</b> attribute are unique.
+Comparisons are case-sensitive.
+Only charset, collection, enum, integer, keyword, mimeMediaType, naturalLanguage, rangeOfInteger, resolution, uriScheme attributes support this predicate.
 <dt><b>WITH-HOSTNAME "</b><i>literal string</i><b>"</b>
 <dd style="margin-left: 5.0em"><dt><b>WITH-HOSTNAME "/</b><i>regular expression</i><b>/"</b>
 <dd style="margin-left: 5.0em">Requires that at least one URI value contains a matching hostname.
@@ -536,7 +545,7 @@ IANA IPP Registry (<a href="http://www.iana.org/assignments/ipp-registrations)">
 PWG Internet Printing Protocol Workgroup (<a href="http://www.pwg.org/ipp)">http://www.pwg.org/ipp)</a>,
 RFC 8011 (<a href="http://tools.ietf.org/html/rfc8011">http://tools.ietf.org/html/rfc8011</a>)
 <h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
-Copyright &copy; 2007-2019 by Apple Inc.
+Copyright &copy; 2007-2021 by Apple Inc.
 
 </body>
 </html>
index 00b1a22d66af8ef410a5337f516e810a2be0e3ba..6436512696782efdff5162e85df0679f59d1adbf 100644 (file)
@@ -212,11 +212,6 @@ The default is "5".
 \fBKeepAlive No\fR
 Specifies whether to support HTTP keep-alive connections.
 The default is "Yes".
-.\"#KeepAliveTimeout
-.TP 5
-\fBKeepAliveTimeout \fIseconds\fR
-Specifies how long an idle client connection remains open.
-The default is "30".
 .\"#LimitIPP
 .TP 5
 \fB<Limit \fIoperation \fR...\fB> \fR... \fB</Limit>\fR
index ce858da596247a709b90d044a78317f09a068a1b..7d2cca562f0805d67e8b82e64aff6b572f5d362b 100644 (file)
@@ -1,12 +1,12 @@
 .\"
 .\" ipptool man page.
 .\"
-.\" Copyright © 2010-2019 by Apple Inc.
+.\" Copyright © 2010-2021 by Apple Inc.
 .\"
 .\" Licensed under Apache License v2.0.  See the file "LICENSE" for more
 .\" information.
 .\"
-.TH ipptool 1 "CUPS" "26 April 2019" "Apple Inc."
+.TH ipptool 1 "CUPS" "5 April 2021" "Apple Inc."
 .SH NAME
 ipptool \- perform internet printing protocol requests
 .SH SYNOPSIS
@@ -36,6 +36,8 @@ ipptool \- perform internet printing protocol requests
 .B \-P
 .I filename.plist
 ] [
+.B \-R
+] [
 .B \-S
 ] [
 .B \-T
@@ -139,6 +141,9 @@ The default is to use "Transfer\-Encoding: chunked" for requests with attached f
 Specifies that the test results should be written to the named XML (Apple plist) file in addition to the regular test report (\fB\-t\fR).
 This option is incompatible with the \fB\-i\fR (interval) and \fB\-n\fR (repeat\-count) options.
 .TP 5
+.B \-R
+Retries tests when the "server-error-busy" status code is returned.
+.TP 5
 .B \-S
 Forces (dedicated) TLS encryption when connecting to the server.
 .TP 5
@@ -249,4 +254,4 @@ IANA IPP Registry (http://www.iana.org/assignments/ipp\-registrations),
 PWG Internet Printing Protocol Workgroup (http://www.pwg.org/ipp)
 RFC 8011 (http://tools.ietf.org/html/rfc8011),
 .SH COPYRIGHT
-Copyright \[co] 2007-2019 by Apple Inc.
+Copyright \[co] 2007-2021 by Apple Inc.
index 700101773c8f7a8a24b6f709d3a6ce0a7135a8b3..a4ffd635cf1197d1feff3d01c622ccea05bd7529 100644 (file)
@@ -1,12 +1,12 @@
 .\"
 .\" ipptoolfile man page.
 .\"
-.\" Copyright © 2010-2019 by Apple Inc.
+.\" Copyright © 2010-2021 by Apple Inc.
 .\"
 .\" Licensed under Apache License v2.0.  See the file "LICENSE" for more
 .\" information.
 .\"
-.TH ipptoolfile 5 "CUPS" "15 August 2019" "Apple Inc."
+.TH ipptoolfile 5 "CUPS" "5 April 2021" "Apple Inc."
 .SH NAME
 ipptoolfile \- ipptool file format
 .SH DESCRIPTION
@@ -214,6 +214,10 @@ Specifies whether
 .BR ipptool (8)
 will ignore errors and continue with subsequent tests.
 .TP 5
+\fBMONITOR-PRINTER-STATE \fR[ \fIprinter-uri \fR] \fB{ EXPECT \fIattribute-name \fR[ \fIpredicate(s) \fR] \fB}\fR
+Specifies printer state monitoring tests to run in parallel with the test operation.
+The monitoring tests will run until all of the \fBEXPECT\fR conditions are satisfied or the primary test operation has completed, whichever occurs first.
+.TP 5
 \fBNAME "\fIliteral string\fB"\fR
 Specifies the human-readable name of the test.
 .TP 5
@@ -294,8 +298,9 @@ Makes the \fBEXPECT\fR conditions apply only if the specified variable is not de
 \fBIN\-GROUP \fItag\fR
 Requires the \fBEXPECT\fR attribute to be in the specified group tag.
 .TP 5
-\fBOF\-TYPE \fItag[|tag,...]\fR
+\fBOF\-TYPE \fItag[(limits)|tag|...]\fR
 Requires the \fBEXPECT\fR attribute to use one of the specified value tag(s).
+Most value tags also support the specification of limits in parenthesis, for example "name(42)" would allow nameWith/WithoutLanguage strings up to 42 octets in length, "name(4:MAX)" would allow nameWith/WithoutLanguage strings between 4 and 255 octets in length, and "integer(-273:MAX)" would allow integers between -273 and 2147483647.
 .TP 5
 \fBREPEAT\-LIMIT \fInumber\fR
 .br
@@ -342,7 +347,13 @@ Requires that all values of the \fBEXPECT\fR attribute match the number(s) or nu
 Requires that all values of the \fBEXPECT\fR attribute match the boolean value given.
 .TP 5
 \fBWITH\-ALL\-VALUES "/\fIregular expression\fB/"\fR
-Requires that all values of the \fBEXPECT\fR attribute match the regular expression, which must conform to the POSIX regular expression syntax. Comparisons are case-sensitive.
+Requires that all values of the \fBEXPECT\fR attribute match the regular expression, which must conform to the POSIX regular expression syntax.
+Comparisons are case-sensitive.
+.TP 5
+\fBWITH\-DISTINCT\-VALUES\fR
+Requires that all values of the \fBEXPECT\fR attribute are unique.
+Comparisons are case-sensitive.
+Only charset, collection, enum, integer, keyword, mimeMediaType, naturalLanguage, rangeOfInteger, resolution, uriScheme attributes support this predicate.
 .TP 5
 \fBWITH\-HOSTNAME "\fIliteral string\fB"\fR
 .TP 5
@@ -652,4 +663,4 @@ IANA IPP Registry (http://www.iana.org/assignments/ipp-registrations),
 PWG Internet Printing Protocol Workgroup (http://www.pwg.org/ipp),
 RFC 8011 (http://tools.ietf.org/html/rfc8011)
 .SH COPYRIGHT
-Copyright \[co] 2007-2019 by Apple Inc.
+Copyright \[co] 2007-2021 by Apple Inc.
index 04b587d7ff6d398a00c30630792855ecf74fdf03..b4a8341386d25a770f096bfeb7450fa583b6e075 100644 (file)
@@ -323,5 +323,8 @@ ppdcSource::import_ppd(const char *f)       // I - Filename
     }
   }
 
+  if (ppd)
+    ppdClose(ppd);
+
   return (1);
 }
index 148cf0f543ba6f86fa0709ad11c802f08d83a022..416e545d1cd082981e66275ce362d5d7c3a4a060 100644 (file)
@@ -56,6 +56,7 @@
 #media "w108h36/1.50x0.50\"" 108 36
 #media "w108h72/1.50x1.00\"" 108 72
 #media "w108h144/1.50x2.00\"" 108 144
+#media "w142h227/80x50mm" 142 227
 #media "w144h26/2.00x0.37\"" 144 26
 #media "w144h36/2.00x0.50\"" 144 36
 #media "w144h72/2.00x1.00\"" 144 72
 #media "w216h90/3.00x1.25\"" 216 90
 #media "w216h144/3.00x2.00\"" 216 144
 #media "w216h216/3.00x3.00\"" 216 216
+#media "w216h288/3.00x4.00\"" 216 288
 #media "w216h360/3.00x5.00\"" 216 360
+#media "w216h432/3.00x6.00\"" 216 432
+#media "w216h576/3.00x8.00\"" 216 576
 #media "w234h144/3.25x2.00\"" 234 144
 #media "w234h360/3.25x5.00\"" 234 360
 #media "w234h396/3.25x5.50\"" 234 396
@@ -93,6 +97,7 @@
 #media "w288h360/4.00x5.00\"" 288 360
 #media "w288h432/4.00x6.00\"" 288 432
 #media "w288h468/4.00x6.50\"" 288 468
+#media "w288h576/4.00x8.00\"" 288 576
 #media "w288h936/4.00x13.00\"" 288 936
 #media "w432h72/6.00x1.00\"" 432 72
 #media "w432h144/6.00x2.00\"" 432 144
 #media "w432h360/6.00x5.00\"" 432 360
 #media "w432h432/6.00x6.00\"" 432 432
 #media "w432h468/6.00x6.50\"" 432 468
+#media "w432h576/6.00x8.00\"" 432 576
 #media "w576h72/8.00x1.00\"" 576 72
 #media "w576h144/8.00x2.00\"" 576 144
 #media "w576h216/8.00x3.00\"" 576 216
 #media "w576h360/8.00x5.00\"" 576 360
 #media "w576h432/8.00x6.00\"" 576 432
 #media "w576h468/8.00x6.50\"" 576 468
+#media "w595h72/8.26x1.00\"" 595 72
 
 // Common stuff for all drivers...
 Attribute "cupsVersion" "" "2.3"
@@ -115,7 +122,7 @@ Attribute "FileSystem" "" "False"
 Attribute "LandscapeOrientation" "" "Plus90"
 Attribute "TTRasterizer" "" "Type42"
 
-Copyright "Copyright (c) 2007-2019 by Apple Inc."
+Copyright "Copyright (c) 2007-2021 by Apple Inc."
 Copyright "Copyright (c) 1997-2007 by Easy Software Products."
 Copyright ""
 Copyright "Licensed under Apache License v2.0.  See the file \"LICENSE\" for more"
@@ -936,12 +943,16 @@ Version "2.3"
     MinSize 36 36
     MaxSize 576 3600
 
+    MediaSize A4
+    MediaSize A5
+    MediaSize A5Rotated
     MediaSize w90h18
     MediaSize w90h162
     MediaSize w108h18
     MediaSize w108h36
     MediaSize w108h72
     MediaSize w108h144
+    MediaSize w142h227
     MediaSize w144h26
     MediaSize w144h36
     MediaSize w144h72
@@ -959,8 +970,11 @@ Version "2.3"
     MediaSize w216h72
     MediaSize w216h90
     MediaSize w216h144
+    MediaSize w216h288
     MediaSize w216h216
     MediaSize w216h360
+    MediaSize w216h432
+    MediaSize w216h576
     MediaSize w234h144
     MediaSize w234h360
     MediaSize w234h396
@@ -975,6 +989,7 @@ Version "2.3"
     *MediaSize w288h360
     MediaSize w288h432
     MediaSize w288h468
+    MediaSize w288h576
     MediaSize w288h936
     MediaSize w432h72
     MediaSize w432h144
@@ -983,6 +998,7 @@ Version "2.3"
     MediaSize w432h360
     MediaSize w432h432
     MediaSize w432h468
+    MediaSize w432h576
     MediaSize w576h72
     MediaSize w576h144
     MediaSize w576h216
@@ -990,6 +1006,7 @@ Version "2.3"
     MediaSize w576h360
     MediaSize w576h432
     MediaSize w576h468
+    MediaSize w595h72
 
     *Resolution k 1 0 0 0 203dpi
     Resolution k 1 0 0 0 300dpi
index 14d2558bf0f12a97e7d3dfea359042ac4f5e80bc..8e24f9ba4187d301bf5f1b8be0c47cfb0d21d670 100644 (file)
@@ -658,13 +658,10 @@ cupsdSaveAllClasses(void)
 {
   cups_file_t          *fp;            /* classes.conf file */
   char                 filename[1024], /* classes.conf filename */
-                       temp[1024],     /* Temporary string */
                        value[2048],    /* Value string */
                        *name;          /* Current user name */
   cupsd_printer_t      *pclass;        /* Current printer class */
   int                  i;              /* Looping var */
-  time_t               curtime;        /* Current time */
-  struct tm            curdate;        /* Current date */
   cups_option_t                *option;        /* Current option */
 
 
@@ -683,12 +680,8 @@ cupsdSaveAllClasses(void)
   * Write a small header to the file...
   */
 
-  time(&curtime);
-  localtime_r(&curtime, &curdate);
-  strftime(temp, sizeof(temp) - 1, "%Y-%m-%d %H:%M", &curdate);
-
   cupsFilePuts(fp, "# Class configuration file for " CUPS_SVERSION "\n");
-  cupsFilePrintf(fp, "# Written by cupsd on %s\n", temp);
+  cupsFilePrintf(fp, "# Written by cupsd\n");
   cupsFilePuts(fp, "# DO NOT EDIT THIS FILE WHEN CUPSD IS RUNNING\n");
 
  /*
index c2ee8f12a6e3a460790a1e664efcd1180f4587a0..479b70aed86ebde7e27a39efb134406db4214c76 100644 (file)
@@ -2109,18 +2109,13 @@ cupsdSendHeader(
     }
     else if (auth_type == CUPSD_AUTH_NEGOTIATE)
     {
-#if defined(SO_PEERCRED) && defined(AF_LOCAL)
-      if (httpAddrFamily(httpGetAddress(con->http)) == AF_LOCAL)
-       strlcpy(auth_str, "PeerCred", sizeof(auth_str));
-      else
-#endif /* SO_PEERCRED && AF_LOCAL */
       strlcpy(auth_str, "Negotiate", sizeof(auth_str));
     }
 
-    if (con->best && auth_type != CUPSD_AUTH_NEGOTIATE && !con->is_browser && !_cups_strcasecmp(httpGetHostname(con->http, NULL, 0), "localhost"))
+    if (con->best && !con->is_browser && !_cups_strcasecmp(httpGetHostname(con->http, NULL, 0), "localhost"))
     {
      /*
-      * Add a "trc" (try root certification) parameter for local non-Kerberos
+      * Add a "trc" (try root certification) parameter for local
       * requests when the request requires system group membership - then the
       * client knows the root certificate can/should be used.
       *
@@ -2789,6 +2784,25 @@ get_file(cupsd_client_t *con,            /* I  - Client connection */
 
     perm_check = 0;
   }
+  else if (!strcmp(con->uri, "/admin/conf/cupsd.conf"))
+  {
+    strlcpy(filename, ConfigurationFile, len);
+
+    perm_check = 0;
+  }
+  else if (!strncmp(con->uri, "/admin/log/", 11))
+  {
+    if (!strncmp(con->uri + 11, "access_log", 10) && AccessLog[0] == '/')
+      strlcpy(filename, AccessLog, len);
+    else if (!strncmp(con->uri + 11, "error_log", 9) && ErrorLog[0] == '/')
+      strlcpy(filename, ErrorLog, len);
+    else if (!strncmp(con->uri + 11, "page_log", 8) && PageLog[0] == '/')
+      strlcpy(filename, PageLog, len);
+    else
+      return (NULL);
+
+    perm_check = 0;
+  }
   else if (!strncmp(con->uri, "/admin", 6) || !strncmp(con->uri, "/classes", 8) || !strncmp(con->uri, "/jobs", 5) || !strncmp(con->uri, "/printers", 9))
   {
    /*
@@ -2822,25 +2836,6 @@ get_file(cupsd_client_t *con,            /* I  - Client connection */
 
     perm_check = 0;
   }
-  else if (!strcmp(con->uri, "/admin/conf/cupsd.conf"))
-  {
-    strlcpy(filename, ConfigurationFile, len);
-
-    perm_check = 0;
-  }
-  else if (!strncmp(con->uri, "/admin/log/", 11))
-  {
-    if (!strncmp(con->uri + 11, "access_log", 10) && AccessLog[0] == '/')
-      strlcpy(filename, AccessLog, len);
-    else if (!strncmp(con->uri + 11, "error_log", 9) && ErrorLog[0] == '/')
-      strlcpy(filename, ErrorLog, len);
-    else if (!strncmp(con->uri + 11, "page_log", 8) && PageLog[0] == '/')
-      strlcpy(filename, PageLog, len);
-    else
-      return (NULL);
-
-    perm_check = 0;
-  }
   else if (con->language)
   {
     snprintf(language, sizeof(language), "/%s", con->language->language);
@@ -3471,8 +3466,7 @@ pipe_command(cupsd_client_t *con, /* I - Client connection */
   }
   else
   {
-    sprintf(content_length, "CONTENT_LENGTH=" CUPS_LLFMT,
-            CUPS_LLCAST con->bytes);
+    snprintf(content_length, sizeof(content_length), "CONTENT_LENGTH=" CUPS_LLFMT, CUPS_LLCAST con->bytes);
     snprintf(content_type, sizeof(content_type), "CONTENT_TYPE=%s",
              httpGetField(con->http, HTTP_FIELD_CONTENT_TYPE));
 
index bb6049b2c6ce28483ceaf21bf707d53fe6d8dca2..1180ac9b81f87bf98b274ea20addb90631790c92 100644 (file)
@@ -95,7 +95,6 @@ static const cupsd_var_t      cupsd_vars[] =
   { "JobKillDelay",            &JobKillDelay,          CUPSD_VARTYPE_TIME },
   { "JobRetryLimit",           &JobRetryLimit,         CUPSD_VARTYPE_INTEGER },
   { "JobRetryInterval",                &JobRetryInterval,      CUPSD_VARTYPE_TIME },
-  { "KeepAliveTimeout",                &KeepAliveTimeout,      CUPSD_VARTYPE_TIME },
   { "KeepAlive",               &KeepAlive,             CUPSD_VARTYPE_BOOLEAN },
 #ifdef HAVE_LAUNCHD
   { "LaunchdTimeout",          &IdleExitTimeout,       CUPSD_VARTYPE_TIME },
@@ -719,7 +718,6 @@ cupsdReadConfiguration(void)
   FilterNice               = 0;
   HostNameLookups          = FALSE;
   KeepAlive                = TRUE;
-  KeepAliveTimeout         = DEFAULT_KEEPALIVE;
   ListenBackLog            = SOMAXCONN;
   LogDebugHistory          = 200;
   LogFilePerm              = CUPS_DEFAULT_LOG_FILE_PERM;
index b4e14eed99d157b2c1e02c1e4708ca85f08678f4..791c0d360cbcb76d35985c9dc927f49b41329037 100644 (file)
@@ -199,8 +199,6 @@ VAR int                     MaxClients              VALUE(100),
                                        /* Timeout during requests */
                        KeepAlive               VALUE(TRUE),
                                        /* Support the Keep-Alive option? */
-                       KeepAliveTimeout        VALUE(DEFAULT_KEEPALIVE),
-                                       /* Timeout between requests */
                        FileDevice              VALUE(FALSE),
                                        /* Allow file: devices? */
                        FilterLimit             VALUE(0),
index 77703b98330bbf8f985871033c4dc3aa929d3b9a..14478fd990afece7781fbff3efeeaf966cd1edf7 100644 (file)
@@ -265,7 +265,7 @@ main(int  argc,                             /* I - Number of command-line args */
     * all others run as the unprivileged user...
     */
 
-    start_backend(dent->filename, !(dent->fileinfo.st_mode & (S_IWGRP | S_IRWXO)));
+    start_backend(dent->filename, !(dent->fileinfo.st_mode & (S_IWGRP | S_IWOTH | S_IXOTH)));
   }
 
   cupsDirClose(dir);
index 0da3d0c06e4e10ddcd446b87f261e8b6c15aa9a2..7b1dc4834631605bc78adbd89c9133e074e961fe 100644 (file)
@@ -1268,7 +1268,7 @@ remove_jobs(const char *dest,             /* I - Destination */
 
     request = ippNewRequest(IPP_OP_CANCEL_JOB);
 
-    sprintf(uri, "ipp://localhost/jobs/%d", id);
+    snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%d", id);
     ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, uri);
 
     ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
index 2fe3bf25cc3ac6d384663a95788ae9bf6f18deb2..191844117060de073844d7e292599fced029e38f 100644 (file)
@@ -880,7 +880,7 @@ add_class(cupsd_client_t  *con,             /* I - Client connection */
     * Class doesn't exist; see if we have a printer of the same name...
     */
 
-    if ((pclass = cupsdFindPrinter(resource + 9)) != NULL)
+    if (cupsdFindPrinter(resource + 9))
     {
      /*
       * Yes, return an error...
@@ -2273,7 +2273,7 @@ add_printer(cupsd_client_t  *con, /* I - Client connection */
     * Printer doesn't exist; see if we have a class of the same name...
     */
 
-    if ((printer = cupsdFindClass(resource + 10)) != NULL)
+    if (cupsdFindClass(resource + 10))
     {
      /*
       * Yes, return an error...
@@ -4891,7 +4891,7 @@ copy_printer_attrs(
   }
 
   if (printer->alert && (!ra || cupsArrayFind(ra, "printer-alert")))
-    ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_STRING, "printer-alert", NULL, printer->alert);
+    ippAddOctetString(con->response, IPP_TAG_PRINTER, "printer-alert", printer->alert, (int)strlen(printer->alert));
 
   if (printer->alert_description && (!ra || cupsArrayFind(ra, "printer-alert-description")))
     ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-alert-description", NULL, printer->alert_description);
@@ -5016,6 +5016,9 @@ copy_printer_attrs(
   if (!ra || cupsArrayFind(ra, "queued-job-count"))
     add_queued_job_count(con, printer);
 
+  if (!ra || cupsArrayFind(ra, "uri-security-supported"))
+    ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "uri-security-supported", NULL, is_encrypted ? "tls" : "none");
+
   copy_attrs(con->response, printer->attrs, ra, IPP_TAG_ZERO, 0, NULL);
   if (printer->ppd_attrs)
     copy_attrs(con->response, printer->ppd_attrs, ra, IPP_TAG_ZERO, 0, NULL);
@@ -10866,17 +10869,13 @@ set_printer_defaults(
 
       case IPP_TAG_INTEGER :
       case IPP_TAG_ENUM :
-          sprintf(value, "%d", attr->values[0].integer);
-          printer->num_options = cupsAddOption(name, value,
-                                              printer->num_options,
-                                              &(printer->options));
+          printer->num_options = cupsAddIntegerOption(name, attr->values[0].integer, printer->num_options, &(printer->options));
           cupsdLogMessage(CUPSD_LOG_DEBUG,
                          "Setting %s to %s...", attr->name, value);
           break;
 
       case IPP_TAG_RANGE :
-          sprintf(value, "%d-%d", attr->values[0].range.lower,
-                 attr->values[0].range.upper);
+          snprintf(value, sizeof(value), "%d-%d", attr->values[0].range.lower, attr->values[0].range.upper);
           printer->num_options = cupsAddOption(name, value,
                                               printer->num_options,
                                               &(printer->options));
@@ -10885,10 +10884,7 @@ set_printer_defaults(
           break;
 
       case IPP_TAG_RESOLUTION :
-          sprintf(value, "%dx%d%s", attr->values[0].resolution.xres,
-                 attr->values[0].resolution.yres,
-                 attr->values[0].resolution.units == IPP_RES_PER_INCH ?
-                     "dpi" : "dpcm");
+          snprintf(value, sizeof(value), "%dx%d%s", attr->values[0].resolution.xres, attr->values[0].resolution.yres, attr->values[0].resolution.units == IPP_RES_PER_INCH ? "dpi" : "dpcm");
           printer->num_options = cupsAddOption(name, value,
                                               printer->num_options,
                                               &(printer->options));
index e20e7c563edc65340155d2ad8b8882fe24e0e10e..cafdf5a469bc4af31b0ce0648bc7001429aa825c 100644 (file)
@@ -893,7 +893,7 @@ cupsdContinueJob(cupsd_job_t *job)  /* I - Job */
     goto abort_job;
   }
 
-  sprintf(jobid, "%d", job->id);
+  snprintf(jobid, sizeof(jobid), "%d", job->id);
 
   argv[0] = job->printer->name;
   argv[1] = jobid;
@@ -1247,7 +1247,7 @@ cupsdContinueJob(cupsd_job_t *job)        /* I - Job */
       else if (stat(command, &backinfo))
        backroot = 0;
       else
-        backroot = !(backinfo.st_mode & (S_IWGRP | S_IRWXO));
+        backroot = !(backinfo.st_mode & (S_IWGRP | S_IWOTH | S_IXOTH));
 
       argv[0] = job->printer->sanitized_device_uri;
 
@@ -2179,11 +2179,8 @@ cupsdSaveAllJobs(void)
 {
   int          i;                      /* Looping var */
   cups_file_t  *fp;                    /* job.cache file */
-  char         filename[1024],         /* job.cache filename */
-               temp[1024];             /* Temporary string */
+  char         filename[1024];         /* job.cache filename */
   cupsd_job_t  *job;                   /* Current job */
-  time_t       curtime;                /* Current time */
-  struct tm    curdate;                /* Current date */
 
 
   snprintf(filename, sizeof(filename), "%s/job.cache", CacheDir);
@@ -2196,12 +2193,8 @@ cupsdSaveAllJobs(void)
   * Write a small header to the file...
   */
 
-  time(&curtime);
-  localtime_r(&curtime, &curdate);
-  strftime(temp, sizeof(temp) - 1, "%Y-%m-%d %H:%M", &curdate);
-
   cupsFilePuts(fp, "# Job cache file for " CUPS_SVERSION "\n");
-  cupsFilePrintf(fp, "# Written by cupsd on %s\n", temp);
+  cupsFilePrintf(fp, "# Written by cupsd\n");
   cupsFilePrintf(fp, "NextJobId %d\n", NextJobId);
 
  /*
@@ -2625,7 +2618,7 @@ cupsdSetJobState(
     else
       cupsdAddEvent(CUPSD_EVENT_JOB_STATE, job->printer, job, "%s", buffer);
 
-    if (newstate == IPP_JOB_STOPPED || newstate == IPP_JOB_ABORTED || newstate == IPP_JOB_HELD)
+    if (newstate == IPP_JOB_STOPPED || newstate == IPP_JOB_ABORTED)
       cupsdLogJob(job, CUPSD_LOG_ERROR, "%s", buffer);
     else
       cupsdLogJob(job, CUPSD_LOG_INFO, "%s", buffer);
@@ -3229,7 +3222,7 @@ finalize_job(cupsd_job_t *job,            /* I - Job */
       exit_code = job->status;
     }
 
-    cupsdLogJob(job, CUPSD_LOG_INFO, "Backend returned status %d (%s)",
+    cupsdLogJob(job, CUPSD_LOG_WARN, "Backend returned status %d (%s)",
                exit_code,
                exit_code == CUPS_BACKEND_FAILED ? "failed" :
                    exit_code == CUPS_BACKEND_AUTH_REQUIRED ?
index 92c7c626b182accfae0af62f21eb2cff94d7c0bb..dbf959b25aac2a32c55464472789b38d62d1ad89 100644 (file)
@@ -160,7 +160,7 @@ cupsdStartListening(void)
 
       if (lis->fd == -1)
       {
-       cupsdLogMessage(CUPSD_LOG_ERROR,
+       cupsdLogMessage(errno == EAFNOSUPPORT ? CUPSD_LOG_INFO : CUPSD_LOG_ERROR,
                        "Unable to open listen socket for address %s:%d - %s.",
                        s, p, strerror(errno));
 
index d5fdf971a8acee0ac51bf9e5f353828c4ae3f2bc..bd6080a508ca3b64837fadfa42231fa3c59f52dd 100644 (file)
@@ -581,7 +581,7 @@ main(int  argc,                             /* I - Number of command-line args */
   * Clean out old temp files and printer cache data.
   */
 
-  if (!strncmp(TempDir, RequestRoot, strlen(RequestRoot)))
+  if (!RequestRoot || !strncmp(TempDir, RequestRoot, strlen(RequestRoot)))
     cupsdCleanFiles(TempDir, NULL);
 
   cupsdCleanFiles(CacheDir, "*.ipp");
index 432e87dc5e142ad0eb13d3097bdabe4dde825663..991a17eb1989706dd9b1c43b34f1bf13e6e1f3a0 100644 (file)
@@ -822,12 +822,15 @@ cupsdDeletePrinter(
   ippDelete(p->attrs);
   ippDelete(p->ppd_attrs);
 
+  _ppdCacheDestroy(p->pc);
+
   mimeDeleteType(MimeDatabase, p->filetype);
   mimeDeleteType(MimeDatabase, p->prefiltertype);
 
   cupsdFreeStrings(&(p->users));
   cupsdFreeQuotas(p);
 
+  cupsdClearString(&p->uuid);
   cupsdClearString(&p->uri);
   cupsdClearString(&p->hostname);
   cupsdClearString(&p->name);
@@ -1472,13 +1475,10 @@ cupsdSaveAllPrinters(void)
   int                  i;              /* Looping var */
   cups_file_t          *fp;            /* printers.conf file */
   char                 filename[1024], /* printers.conf filename */
-                       temp[1024],     /* Temporary string */
                        value[2048],    /* Value string */
                        *ptr,           /* Pointer into value */
                        *name;          /* Current user/group name */
   cupsd_printer_t      *printer;       /* Current printer class */
-  time_t               curtime;        /* Current time */
-  struct tm            curdate;        /* Current date */
   cups_option_t                *option;        /* Current option */
   ipp_attribute_t      *marker;        /* Current marker attribute */
 
@@ -1498,12 +1498,8 @@ cupsdSaveAllPrinters(void)
   * Write a small header to the file...
   */
 
-  time(&curtime);
-  localtime_r(&curtime, &curdate);
-  strftime(temp, sizeof(temp) - 1, "%Y-%m-%d %H:%M", &curdate);
-
   cupsFilePuts(fp, "# Printer configuration file for " CUPS_SVERSION "\n");
-  cupsFilePrintf(fp, "# Written by cupsd on %s\n", temp);
+  cupsFilePrintf(fp, "# Written by cupsd\n");
   cupsFilePuts(fp, "# DO NOT EDIT THIS FILE WHEN CUPSD IS RUNNING\n");
 
   cupsFilePrintf(fp, "NextPrinterId %d\n", NextPrinterId);
@@ -2316,8 +2312,6 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */
 
   ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
                "uri-authentication-supported", NULL, auth_supported);
-  ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
-               "uri-security-supported", NULL, "none");
   if (p->printer_id)
     ippAddInteger(p->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "printer-id", p->printer_id);
   ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_NAME, "printer-name", NULL,
@@ -4016,7 +4010,8 @@ load_ppd(cupsd_printer_t *p)              /* I - Printer */
 
     num_qualities = 0;
 
-    if ((output_mode = ppdFindOption(ppd, "OutputMode")) != NULL)
+    if ((output_mode = ppdFindOption(ppd, "OutputMode")) ||
+        (output_mode = ppdFindOption(ppd, "cupsPrintQuality")))
     {
       if (ppdFindChoice(output_mode, "draft") ||
           ppdFindChoice(output_mode, "fast"))
index 15acedca8d07a5b9ce6af4b23fc75aa5ac38e00c..2dbb28f85b146d35abcaf98c0c2c9ddde21bd2ab 100644 (file)
@@ -1021,11 +1021,8 @@ cupsdSaveAllSubscriptions(void)
 {
   int                  i;              /* Looping var */
   cups_file_t          *fp;            /* subscriptions.conf file */
-  char                 filename[1024], /* subscriptions.conf filename */
-                       temp[1024];     /* Temporary string */
+  char                 filename[1024]; /* subscriptions.conf filename */
   cupsd_subscription_t *sub;           /* Current subscription */
-  time_t               curtime;        /* Current time */
-  struct tm            curdate;        /* Current date */
   unsigned             mask;           /* Current event mask */
   const char           *name;          /* Current event name */
   int                  hex;            /* Non-zero if we are writing hex data */
@@ -1046,12 +1043,8 @@ cupsdSaveAllSubscriptions(void)
   * Write a small header to the file...
   */
 
-  time(&curtime);
-  localtime_r(&curtime, &curdate);
-  strftime(temp, sizeof(temp) - 1, "%Y-%m-%d %H:%M", &curdate);
-
   cupsFilePuts(fp, "# Subscription configuration file for " CUPS_SVERSION "\n");
-  cupsFilePrintf(fp, "# Written by cupsd on %s\n", temp);
+  cupsFilePrintf(fp, "# Written by cupsd\n");
 
   cupsFilePrintf(fp, "NextSubscriptionId %d\n", NextSubscriptionId);
 
index c85a86e0cac3402b934413f305efe5d0032f95a4..bcd638cc44e423c71282c11687a9a3d1a5e74b4c 100644 (file)
@@ -274,7 +274,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
       }
       else
       {
-        sprintf(uri, "ipp://localhost/jobs/%d", job_id);
+        snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%d", job_id);
        ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL,
                     uri);
       }
index 298c158257ea90f100b5e345a64f705fcc3b7885..fd818a56d5a715bc2c48a6a403ede5309bcff5e2 100644 (file)
@@ -161,6 +161,12 @@ main(int  argc,                            /* I - Number of command-line arguments */
                                  "name."), argv[0]);
                return (1);
              }
+             else if (cupsLastError() == IPP_STATUS_ERROR_NOT_FOUND)
+             {
+               _cupsLangPrintf(stderr,
+                               _("%s: Error - The printer or class does not exist."), argv[0]);
+               return (1);
+             }
              break;
 
          case 'f' : /* Form */
@@ -280,9 +286,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
                return (1);
              }
 
-             sprintf(buffer, "%d", num_copies);
-             num_options = cupsAddOption("copies", buffer, num_options,
-                                         &options);
+             num_options = cupsAddIntegerOption("copies", num_copies, num_options, &options);
              break;
 
          case 'o' : /* Option */
@@ -342,9 +346,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
                return (1);
              }
 
-             sprintf(buffer, "%d", priority);
-             num_options = cupsAddOption("job-priority", buffer, num_options,
-                                         &options);
+             num_options = cupsAddIntegerOption("job-priority", priority, num_options, &options);
              break;
 
          case 's' : /* Silent */
@@ -660,7 +662,7 @@ restart_job(const char *command,    /* I - Command name */
 
   request = ippNewRequest(IPP_RESTART_JOB);
 
-  sprintf(uri, "ipp://localhost/jobs/%d", job_id);
+  snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%d", job_id);
 
   ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
                "job-uri", NULL, uri);
@@ -708,7 +710,7 @@ set_job_attrs(
 
   request = ippNewRequest(IPP_SET_JOB_ATTRIBUTES);
 
-  sprintf(uri, "ipp://localhost/jobs/%d", job_id);
+  snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%d", job_id);
 
   ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
                "job-uri", NULL, uri);
index 41954a570c76d1750765bd21399c126a69bd8e32..b38a7b0f69799e6697a306c7f3d7e4d37b5b2315 100644 (file)
@@ -1,10 +1,12 @@
 /*
  * IPP Everywhere printer application for CUPS.
  *
- * Copyright © 2010-2019 by Apple Inc.
+ * Copyright © 2021 by OpenPrinting.
+ * Copyright © 2020 by the IEEE-ISTO Printer Working Group.
+ * Copyright © 2010-2021 by Apple Inc.
  *
  * Licensed under Apache License v2.0.  See the file "LICENSE" for more
- * information.º
+ * information.
  *
  * Note: This program began life as the "ippserver" sample code that first
  * appeared in CUPS 1.4.  The name has been changed in order to distinguish it
@@ -38,6 +40,7 @@ typedef ULONG nfds_t;
 #else
 extern char **environ;
 
+#  include <spawn.h>
 #  include <sys/fcntl.h>
 #  include <sys/wait.h>
 #  include <poll.h>
@@ -48,7 +51,9 @@ extern char **environ;
 #elif defined(HAVE_AVAHI)
 #  include <avahi-client/client.h>
 #  include <avahi-client/publish.h>
+#  include <avahi-common/alternative.h>
 #  include <avahi-common/error.h>
+#  include <avahi-common/malloc.h>
 #  include <avahi-common/thread-watch.h>
 #endif /* HAVE_DNSSD */
 
@@ -74,6 +79,8 @@ extern char **environ;
 #endif /* HAVE_LIBPAM */
 
 #include "printer-png.h"
+#include "printer-lg-png.h"
+#include "printer-sm-png.h"
 
 
 /*
@@ -178,16 +185,22 @@ typedef struct ippeve_printer_s           /**** Printer data ****/
   /* TODO: One IPv4 and one IPv6 listener are really not sufficient */
   int                  ipv4,           /* IPv4 listener */
                        ipv6;           /* IPv6 listener */
-  ippeve_srv_t         ipp_ref,        /* Bonjour IPP service */
-                       ipps_ref,       /* Bonjour IPPS service */
-                       http_ref,       /* Bonjour HTTP service */
-                       printer_ref;    /* Bonjour LPD service */
-  char                 *dnssd_name,    /* printer-dnssd-name */
+#ifdef HAVE_DNSSD
+  ippeve_srv_t         ipp_ref,        /* DNS-SD IPP service */
+                       ipps_ref,       /* DNS-SD IPPS service */
+                       http_ref,       /* DNS-SD HTTP service */
+                       printer_ref;    /* DNS-SD LPD service */
+#elif defined(HAVE_AVAHI)
+  ippeve_srv_t         dnssd_ref;      /* DNS-SD services */
+#endif /* HAVE_DNSSD */
+  char                 *dnssd_subtypes;/* DNS-SD subtypes */
+  int                  dnssd_collision;/* Name collision? */
+  char                 *dnssd_name,    /* printer-dns-sd-name */
                        *name,          /* printer-name */
-                       *icon,          /* Icon filename */
+                       *icons[3],      /* Icon filenames */
+                       *strings,       /* Strings filename */
                        *directory,     /* Spool directory */
                        *hostname,      /* Hostname */
-                       *uri,           /* printer-uri-supported */
                        *device_uri,    /* Device URI (if any) */
                        *output_format, /* Output format */
 #if !CUPS_LITE
@@ -239,7 +252,10 @@ typedef struct ippeve_client_s             /**** Client data ****/
   http_state_t         operation;      /* Request operation */
   ipp_op_t             operation_id;   /* IPP operation-id */
   char                 uri[1024],      /* Request URI */
-                       *options;       /* URI options */
+                       *options,       /* URI options */
+                       host_field[HTTP_MAX_VALUE];
+                                       /* Host: header */
+  int                  host_port;      /* Port number from Host: header */
   http_addr_t          addr;           /* Client address */
   char                 hostname[256],  /* Client hostname */
                        username[HTTP_MAX_VALUE];
@@ -264,7 +280,7 @@ static int          create_job_file(ippeve_job_t *job, char *fname, size_t fnamesize, co
 static int             create_listener(const char *name, int port, int family);
 static ipp_t           *create_media_col(const char *media, const char *source, const char *type, int width, int length, int bottom, int left, int right, int top);
 static ipp_t           *create_media_size(int width, int length);
-static ippeve_printer_t        *create_printer(const char *servername, int serverport, const char *name, const char *location, const char *icon, cups_array_t *docformats, const char *subtypes, const char *directory, const char *command, const char *device_uri, const char *output_format, ipp_t *attrs);
+static ippeve_printer_t        *create_printer(const char *servername, int serverport, const char *name, const char *location, const char *icons, const char *strings, cups_array_t *docformats, const char *subtypes, const char *directory, const char *command, const char *device_uri, const char *output_format, ipp_t *attrs);
 static void            debug_attributes(const char *title, ipp_t *ipp, int response);
 static void            delete_client(ippeve_client_t *client);
 static void            delete_job(ippeve_job_t *job);
@@ -280,11 +296,14 @@ static int                filter_cb(ippeve_filter_t *filter, ipp_t *dst, ipp_attribute_t *attr
 static ippeve_job_t    *find_job(ippeve_client_t *client);
 static void            finish_document_data(ippeve_client_t *client, ippeve_job_t *job);
 static void            finish_document_uri(ippeve_client_t *client, ippeve_job_t *job);
+static void            flush_document_data(ippeve_client_t *client);
+static int             have_document_data(ippeve_client_t *client);
 static void            html_escape(ippeve_client_t *client, const char *s, size_t slen);
 static void            html_footer(ippeve_client_t *client);
 static void            html_header(ippeve_client_t *client, const char *title, int refresh);
 static void            html_printf(ippeve_client_t *client, const char *format, ...) _CUPS_FORMAT(2, 3);
 static void            ipp_cancel_job(ippeve_client_t *client);
+static void            ipp_cancel_my_jobs(ippeve_client_t *client);
 static void            ipp_close_job(ippeve_client_t *client);
 static void            ipp_create_job(ippeve_client_t *client);
 static void            ipp_get_job_attributes(ippeve_client_t *client);
@@ -311,7 +330,7 @@ static int          process_http(ippeve_client_t *client);
 static int             process_ipp(ippeve_client_t *client);
 static void            *process_job(ippeve_job_t *job);
 static void            process_state_message(ippeve_job_t *job, char *message);
-static int             register_printer(ippeve_printer_t *printer, const char *subtypes);
+static int             register_printer(ippeve_printer_t *printer);
 static int             respond_http(ippeve_client_t *client, http_status_t code, const char *content_coding, const char *type, size_t length);
 static void            respond_ipp(ippeve_client_t *client, ipp_status_t status, const char *message, ...) _CUPS_FORMAT(3, 4);
 static void            respond_unsupported(ippeve_client_t *client, ipp_attribute_t *attr);
@@ -368,6 +387,7 @@ main(int  argc,                             /* I - Number of command-line args */
 #if !CUPS_LITE
                *ppdfile = NULL,        /* PPD file */
 #endif /* !CUPS_LITE */
+               *strings = NULL,        /* Strings file */
                *subtypes = "_print";   /* DNS-SD service subtype */
   int          legacy = 0,             /* Legacy mode? */
                duplex = 0,             /* Duplex mode */
@@ -475,6 +495,14 @@ main(int  argc,                            /* I - Number of command-line args */
               break;
 #endif /* !CUPS_LITE */
 
+         case 'S' : /* -S filename.strings */
+             i ++;
+             if (i >= argc)
+               usage(1);
+
+             strings = argv[i];
+             break;
+
           case 'V' : /* -V max-version */
              i ++;
              if (i >= argc)
@@ -621,27 +649,6 @@ main(int  argc,                            /* I - Number of command-line args */
   * Apply defaults as needed...
   */
 
-  if (!serverport)
-  {
-#ifdef _WIN32
-   /*
-    * Windows is almost always used as a single user system, so use a default
-    * port number of 8631.
-    */
-
-    serverport = 8631;
-
-#else
-   /*
-    * Use 8000 + UID mod 1000 for the default port number...
-    */
-
-    serverport = 8000 + ((int)getuid() % 1000);
-#endif /* _WIN32 */
-
-    _cupsLangPrintf(stderr, _("Listening on port %d."), serverport);
-  }
-
   if (!directory[0])
   {
     const char *tmpdir;                        /* Temporary directory */
@@ -699,7 +706,7 @@ main(int  argc,                             /* I - Number of command-line args */
   else
     attrs = load_legacy_attributes(make, model, ppm, ppm_color, duplex, docformats);
 
-  if ((printer = create_printer(servername, serverport, name, location, icon, docformats, subtypes, directory, command, device_uri, output_format, attrs)) == NULL)
+  if ((printer = create_printer(servername, serverport, name, location, icon, strings, docformats, subtypes, directory, command, device_uri, output_format, attrs)) == NULL)
     return (1);
 
   printer->web_forms = web_forms;
@@ -1177,7 +1184,11 @@ create_job(ippeve_client_t *client)      /* I - Client */
 
   job->id = client->printer->next_job_id ++;
 
-  snprintf(uri, sizeof(uri), "%s/%d", client->printer->uri, job->id);
+  if ((attr = ippFindAttribute(client->request, "printer-uri", IPP_TAG_URI)) != NULL)
+    snprintf(uri, sizeof(uri), "%s/%d", ippGetString(attr, 0, NULL), job->id);
+  else
+    httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, client->printer->hostname, client->printer->port, "/ipp/print/%d", job->id);
+
   httpAssembleUUID(client->printer->hostname, client->printer->port, client->printer->name, job->id, uuid, sizeof(uuid));
 
   ippAddDate(job->attrs, IPP_TAG_JOB, "date-time-at-creation", ippTimeToDate(time(&job->created)));
@@ -1185,9 +1196,17 @@ create_job(ippeve_client_t *client)      /* I - Client */
   ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-uri", NULL, uri);
   ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-uuid", NULL, uuid);
   if ((attr = ippFindAttribute(client->request, "printer-uri", IPP_TAG_URI)) != NULL)
+  {
     ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-printer-uri", NULL, ippGetString(attr, 0, NULL));
+  }
   else
-    ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-printer-uri", NULL, client->printer->uri);
+  {
+    char printer_uri[1024];            /* job-printer-uri value */
+
+    httpAssembleURI(HTTP_URI_CODING_ALL, printer_uri, sizeof(printer_uri), "ipp", NULL, client->printer->hostname, client->printer->port, "/ipp/print");
+    ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-printer-uri", NULL, printer_uri);
+  }
+
   ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "time-at-creation", (int)(job->created - client->printer->start_time));
 
   cupsArrayAdd(client->printer->jobs, job);
@@ -1385,9 +1404,10 @@ create_printer(
     int          serverport,           /* I - Server port */
     const char   *name,                        /* I - printer-name */
     const char   *location,            /* I - printer-location */
-    const char   *icon,                        /* I - printer-icons */
+    const char   *icons,               /* I - printer-icons */
+    const char   *strings,             /* I - printer-strings-uri */
     cups_array_t *docformats,          /* I - document-format-supported */
-    const char   *subtypes,            /* I - Bonjour service subtype(s) */
+    const char   *subtypes,            /* I - DNS-SD service subtype(s) */
     const char   *directory,           /* I - Spool directory */
     const char   *command,             /* I - Command to run on job files, if any */
     const char   *device_uri,          /* I - Output device, if any */
@@ -1399,15 +1419,10 @@ create_printer(
 #ifndef _WIN32
   char                 path[1024];     /* Full path to command */
 #endif /* !_WIN32 */
-  char                 uri[1024],      /* Printer URI */
-#ifdef HAVE_SSL
-                       securi[1024],   /* Secure printer URI */
-                       *uris[2],       /* All URIs */
-#endif /* HAVE_SSL */
-                       icons[1024],    /* printer-icons URI */
-                       adminurl[1024], /* printer-more-info URI */
-                       supplyurl[1024],/* printer-supply-info-uri URI */
-                       uuid[128];      /* printer-uuid */
+  unsigned char                sha256[32];     /* SHA-256 digest/sum */
+  char                 uuid_data[1024],/* Data to hash for printer-uuid */
+                       uuid[128],      /* printer-uuid */
+                       *iconsptr;      /* Pointer into icons string */
   int                  k_supported;    /* Maximum file size supported */
   int                  num_formats;    /* Number of supported document formats */
   const char           *formats[100],  /* Supported document formats */
@@ -1629,23 +1644,47 @@ create_printer(
     return (NULL);
   }
 
-  printer->ipv4          = -1;
-  printer->ipv6          = -1;
-  printer->name          = strdup(name);
-  printer->dnssd_name    = strdup(name);
-  printer->command       = command ? strdup(command) : NULL;
-  printer->device_uri    = device_uri ? strdup(device_uri) : NULL;
-  printer->output_format = output_format ? strdup(output_format) : NULL;
-  printer->directory     = strdup(directory);
-  printer->icon          = icon ? strdup(icon) : NULL;
-  printer->port          = serverport;
-  printer->start_time    = time(NULL);
-  printer->config_time   = printer->start_time;
-  printer->state         = IPP_PSTATE_IDLE;
-  printer->state_reasons = IPPEVE_PREASON_NONE;
-  printer->state_time    = printer->start_time;
-  printer->jobs          = cupsArrayNew((cups_array_func_t)compare_jobs, NULL);
-  printer->next_job_id   = 1;
+  printer->ipv4           = -1;
+  printer->ipv6           = -1;
+  printer->name           = strdup(name);
+  printer->dnssd_name     = strdup(name);
+  printer->dnssd_subtypes = subtypes ? strdup(subtypes) : NULL;
+  printer->command        = command ? strdup(command) : NULL;
+  printer->device_uri     = device_uri ? strdup(device_uri) : NULL;
+  printer->output_format  = output_format ? strdup(output_format) : NULL;
+  printer->directory      = strdup(directory);
+  printer->icons[0]       = icons ? strdup(icons) : NULL;
+  printer->strings        = strings ? strdup(strings) : NULL;
+  printer->port           = serverport;
+  printer->start_time     = time(NULL);
+  printer->config_time    = printer->start_time;
+  printer->state          = IPP_PSTATE_IDLE;
+  printer->state_reasons  = IPPEVE_PREASON_NONE;
+  printer->state_time     = printer->start_time;
+  printer->jobs           = cupsArrayNew((cups_array_func_t)compare_jobs, NULL);
+  printer->next_job_id    = 1;
+
+  if (printer->icons[0])
+  {
+   /*
+    * Extract up to 3 icons...
+    */
+
+    for (i = 1, iconsptr = strchr(icons, ','); iconsptr && i < 3; i ++, iconsptr = strchr(iconsptr, ','))
+    {
+      *iconsptr++ = '\0';
+      printer->icons[i] = iconsptr;
+    }
+
+    if (iconsptr)
+      *iconsptr = '\0';                        /* Strip any icons after the third... */
+
+    while (i < 3)
+    {
+      printer->icons[i] = printer->icons[i - 1];
+      i ++;
+    }
+  }
 
   if (servername)
   {
@@ -1653,9 +1692,21 @@ create_printer(
   }
   else
   {
-    char       temp[1024];             /* Temporary string */
+    char       temp[1024],             /* Temporary string */
+               *tempptr;               /* Pointer into temporary string */
+
+#ifdef HAVE_AVAHI
+    const char *avahi_name = avahi_client_get_host_name_fqdn(DNSSDClient);
 
-    printer->hostname = strdup(httpGetHostname(NULL, temp, sizeof(temp)));
+    if (avahi_name)
+      strlcpy(temp, avahi_name, sizeof(temp));
+    else
+#endif /* HAVE_AVAHI */
+
+    if ((tempptr = strstr(httpGetHostname(NULL, temp, sizeof(temp)), ".lan")) != NULL && !tempptr[5])
+      strlcpy(tempptr, ".local", sizeof(temp) - (size_t)(tempptr - temp));
+
+    printer->hostname = strdup(temp);
   }
 
   _cupsRWInit(&(printer->rwlock));
@@ -1664,10 +1715,50 @@ create_printer(
   * Create the listener sockets...
   */
 
-  if ((printer->ipv4 = create_listener(servername, printer->port, AF_INET)) < 0)
+  if (printer->port)
   {
-    perror("Unable to create IPv4 listener");
-    goto bad_printer;
+    if ((printer->ipv4 = create_listener(servername, printer->port, AF_INET)) < 0)
+    {
+      perror("Unable to create IPv4 listener");
+      goto bad_printer;
+    }
+  }
+  else
+  {
+#ifdef _WIN32
+   /*
+    * Windows is almost always used as a single user system, so use a default
+    * port number of 8631.
+    */
+
+    serverport = 8631;
+
+#else
+   /*
+    * Use 8000 + UID mod 1000 for the default port number...
+    */
+
+    serverport = 8000 + ((int)getuid() % 1000);
+#endif /* _WIN32 */
+
+    while (serverport < 10000)
+    {
+      if ((printer->ipv4 = create_listener(servername, serverport, AF_INET)) >= 0)
+        break;
+
+      serverport ++;
+    }
+
+    if (serverport < 10000)
+    {
+      _cupsLangPrintf(stderr, _("Listening on port %d."), serverport);
+      printer->port = serverport;
+    }
+    else
+    {
+      perror("Unable to create IPv4 listener");
+      goto bad_printer;
+    }
   }
 
   if ((printer->ipv6 = create_listener(servername, printer->port, AF_INET6)) < 0)
@@ -1677,31 +1768,21 @@ create_printer(
   }
 
  /*
-  * Prepare URI values for the printer attributes...
+  * Prepare values for the printer attributes...
   */
 
-  httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, printer->hostname, printer->port, "/ipp/print");
-  printer->uri    = strdup(uri);
-  printer->urilen = strlen(uri);
-
-#ifdef HAVE_SSL
-  httpAssembleURI(HTTP_URI_CODING_ALL, securi, sizeof(securi), "ipps", NULL, printer->hostname, printer->port, "/ipp/print");
-#endif /* HAVE_SSL */
-
-  httpAssembleURI(HTTP_URI_CODING_ALL, icons, sizeof(icons), WEB_SCHEME, NULL, printer->hostname, printer->port, "/icon.png");
-  httpAssembleURI(HTTP_URI_CODING_ALL, adminurl, sizeof(adminurl), WEB_SCHEME, NULL, printer->hostname, printer->port, "/");
-  httpAssembleURI(HTTP_URI_CODING_ALL, supplyurl, sizeof(supplyurl), WEB_SCHEME, NULL, printer->hostname, printer->port, "/supplies");
-  httpAssembleUUID(printer->hostname, serverport, name, 0, uuid, sizeof(uuid));
+  snprintf(uuid_data, sizeof(uuid_data), "_IPPEVEPRINTER_:%s:%d:%s", printer->hostname, printer->port, printer->name);
+  cupsHashData("sha2-256", (unsigned char *)uuid_data, strlen(uuid_data), sha256, sizeof(sha256));
+  snprintf(uuid, sizeof(uuid), "urn:uuid:%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", sha256[0], sha256[1], sha256[3], sha256[4], sha256[5], sha256[6], (sha256[10] & 15) | 0x30, sha256[11], (sha256[15] & 0x3f) | 0x40, sha256[16], sha256[20], sha256[21], sha256[25], sha256[26], sha256[30], sha256[31]);
 
   if (Verbosity)
   {
-    fprintf(stderr, "printer-more-info=\"%s\"\n", adminurl);
-    fprintf(stderr, "printer-supply-info-uri=\"%s\"\n", supplyurl);
 #ifdef HAVE_SSL
-    fprintf(stderr, "printer-uri=\"%s\",\"%s\"\n", uri, securi);
+    fprintf(stderr, "printer-uri-supported=\"ipp://%s:%d/ipp/print\",\"ipps://%s:%d/ipp/print\"\n", printer->hostname, printer->port, printer->hostname, printer->port);
 #else
-    fprintf(stderr, "printer-uri=\"%s\"\n", uri);
+    fprintf(stderr, "printer-uri-supported=\"ipp://%s:%d/ipp/print\"\n", printer->hostname, printer->port);
 #endif /* HAVE_SSL */
+    fprintf(stderr, "printer-uuid=\"%s\"\n", uuid);
   }
 
  /*
@@ -1859,9 +1940,6 @@ create_printer(
   /* printer-geo-location */
   ippAddOutOfBand(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_UNKNOWN, "printer-geo-location");
 
-  /* printer-icons */
-  ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-icons", NULL, icons);
-
   /* printer-is-accepting-jobs */
   ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, "printer-is-accepting-jobs", 1);
 
@@ -1871,9 +1949,6 @@ create_printer(
   /* printer-location */
   ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-location", NULL, location);
 
-  /* printer-more-info */
-  ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-more-info", NULL, adminurl);
-
   /* printer-name */
   ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_NAME, "printer-name", NULL, name);
 
@@ -1883,19 +1958,8 @@ create_printer(
   /* printer-organizational-unit */
   ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_TEXT), "printer-organizational-unit", NULL, "");
 
-  /* printer-supply-info-uri */
-  ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-supply-info-uri", NULL, supplyurl);
-
-  /* printer-uri-supported */
-#ifdef HAVE_SSL
-  uris[0] = uri;
-  uris[1] = securi;
-
-  ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uri-supported", 2, NULL, (const char **)uris);
-
-#else
-  ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uri-supported", NULL, uri);
-#endif /* HAVE_SSL */
+  /* printer-strings-languages-supported */
+  ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_LANGUAGE, "printer-strings-languages-supported", NULL, "en");
 
   /* printer-uuid */
   ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uuid", NULL, uuid);
@@ -1929,10 +1993,10 @@ create_printer(
   debug_attributes("Printer", printer->attrs, 0);
 
  /*
-  * Register the printer with Bonjour...
+  * Register the printer with DNS-SD...
   */
 
-  if (!register_printer(printer, subtypes))
+  if (!register_printer(printer))
     goto bad_printer;
 
  /*
@@ -2088,14 +2152,8 @@ delete_printer(ippeve_printer_t *printer)        /* I - Printer */
 #elif defined(HAVE_AVAHI)
   avahi_threaded_poll_lock(DNSSDMaster);
 
-  if (printer->printer_ref)
-    avahi_entry_group_free(printer->printer_ref);
-  if (printer->ipp_ref)
-    avahi_entry_group_free(printer->ipp_ref);
-  if (printer->ipps_ref)
-    avahi_entry_group_free(printer->ipps_ref);
-  if (printer->http_ref)
-    avahi_entry_group_free(printer->http_ref);
+  if (printer->dnssd_ref)
+    avahi_entry_group_free(printer->dnssd_ref);
 
   avahi_threaded_poll_unlock(DNSSDMaster);
 #endif /* HAVE_DNSSD */
@@ -2104,8 +2162,10 @@ delete_printer(ippeve_printer_t *printer)        /* I - Printer */
     free(printer->dnssd_name);
   if (printer->name)
     free(printer->name);
-  if (printer->icon)
-    free(printer->icon);
+  if (printer->icons[0])
+    free(printer->icons[0]);
+  if (printer->strings)
+    free(printer->strings);
   if (printer->command)
     free(printer->command);
   if (printer->device_uri)
@@ -2118,8 +2178,6 @@ delete_printer(ippeve_printer_t *printer) /* I - Printer */
     free(printer->directory);
   if (printer->hostname)
     free(printer->hostname);
-  if (printer->uri)
-    free(printer->uri);
 
   ippDelete(printer->attrs);
   cupsArrayDelete(printer->jobs);
@@ -2130,7 +2188,7 @@ delete_printer(ippeve_printer_t *printer) /* I - Printer */
 
 #ifdef HAVE_DNSSD
 /*
- * 'dnssd_callback()' - Handle Bonjour registration events.
+ * 'dnssd_callback()' - Handle DNS-SD registration events.
  */
 
 static void DNSSD_API
@@ -2141,32 +2199,29 @@ dnssd_callback(
     const char          *name,         /* I - Service name */
     const char          *regtype,      /* I - Service type */
     const char          *domain,       /* I - Domain for service */
-    ippeve_printer_t      *printer)    /* I - Printer */
+    ippeve_printer_t    *printer)      /* I - Printer */
 {
   (void)sdRef;
   (void)flags;
   (void)domain;
+  (void)name;
 
-  if (errorCode)
+  if (errorCode == kDNSServiceErr_NameConflict)
   {
-    fprintf(stderr, "DNSServiceRegister for %s failed with error %d.\n", regtype, (int)errorCode);
-    return;
+    fputs("DNS-SD service name collision detected.\n", stderr);
+    printer->dnssd_collision = 1;
   }
-  else if (strcasecmp(name, printer->dnssd_name))
+  else if (errorCode)
   {
-    if (Verbosity)
-      fprintf(stderr, "Now using DNS-SD service name \"%s\".\n", name);
-
-    /* No lock needed since only the main thread accesses/changes this */
-    free(printer->dnssd_name);
-    printer->dnssd_name = strdup(name);
+    fprintf(stderr, "DNSServiceRegister for %s failed with error %d.\n", regtype, (int)errorCode);
+    return;
   }
 }
 
 
 #elif defined(HAVE_AVAHI)
 /*
- * 'dnssd_callback()' - Handle Bonjour registration events.
+ * 'dnssd_callback()' - Handle DNS-SD registration events.
  */
 
 static void
@@ -2175,9 +2230,17 @@ dnssd_callback(
     AvahiEntryGroupState state,                /* I - Registration state */
     void                 *context)     /* I - Printer */
 {
+  ippeve_printer_t *printer = (ippeve_printer_t *)context;
+                                       /* Printer */
+
+
   (void)srv;
-  (void)state;
-  (void)context;
+
+  if (state == AVAHI_ENTRY_GROUP_COLLISION)
+  {
+    fputs("DNS-SD service name collision detected.\n", stderr);
+    printer->dnssd_collision = 1;
+  }
 }
 
 
@@ -2191,10 +2254,8 @@ static void
 dnssd_client_cb(
     AvahiClient      *c,               /* I - Client */
     AvahiClientState state,            /* I - Current state */
-    void             *userdata)                /* I - User data (unused) */
+    void             *userdata)                /* I - User data (printer) */
 {
-  (void)userdata;
-
   if (!c)
     return;
 
@@ -2226,7 +2287,7 @@ dnssd_init(void)
 #ifdef HAVE_DNSSD
   if (DNSServiceCreateConnection(&DNSSDMaster) != kDNSServiceErr_NoError)
   {
-    fputs("Error: Unable to initialize Bonjour.\n", stderr);
+    fputs("Error: Unable to initialize DNS-SD.\n", stderr);
     exit(1);
   }
 
@@ -2235,13 +2296,13 @@ dnssd_init(void)
 
   if ((DNSSDMaster = avahi_threaded_poll_new()) == NULL)
   {
-    fputs("Error: Unable to initialize Bonjour.\n", stderr);
+    fputs("Error: Unable to initialize DNS-SD.\n", stderr);
     exit(1);
   }
 
   if ((DNSSDClient = avahi_client_new(avahi_threaded_poll_get(DNSSDMaster), AVAHI_CLIENT_NO_FAIL, dnssd_client_cb, NULL, &error)) == NULL)
   {
-    fputs("Error: Unable to initialize Bonjour.\n", stderr);
+    fputs("Error: Unable to initialize DNS-SD.\n", stderr);
     exit(1);
   }
 
@@ -2292,10 +2353,12 @@ find_job(ippeve_client_t *client)               /* I - Client */
   if ((attr = ippFindAttribute(client->request, "job-uri", IPP_TAG_URI)) != NULL)
   {
     const char *uri = ippGetString(attr, 0, NULL);
+                                       /* URI value */
+    const char *uriptr = strrchr(uri, '/');
+                                       /* Pointer to the last slash in the URI */
 
-    if (!strncmp(uri, client->printer->uri, client->printer->urilen) &&
-        uri[client->printer->urilen] == '/')
-      key.id = atoi(uri + client->printer->urilen + 1);
+    if (uriptr && isdigit(uriptr[1] & 255))
+      key.id = atoi(uriptr + 1);
     else
       return (NULL);
   }
@@ -2476,8 +2539,9 @@ finish_document_uri(
   * Do we have a file to print?
   */
 
-  if (httpGetState(client->http) == HTTP_STATE_POST_RECV)
+  if (have_document_data(client))
   {
+    flush_document_data(client);
     respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Unexpected document data following request.");
 
     goto abort_job;
@@ -2727,6 +2791,42 @@ finish_document_uri(
 }
 
 
+/*
+ * 'flush_document_data()' - Safely flush remaining document data.
+ */
+
+static void
+flush_document_data(
+    ippeve_client_t *client)           /* I - Client */
+{
+  char buffer[8192];                   /* Read buffer */
+
+
+  if (httpGetState(client->http) == HTTP_STATE_POST_RECV)
+  {
+    while (httpRead2(client->http, buffer, sizeof(buffer)) > 0);
+  }
+}
+
+
+/*
+ * 'have_document_data()' - Determine whether we have more document data.
+ */
+
+static int                             /* O - 1 if data is present, 0 otherwise */
+have_document_data(
+    ippeve_client_t *client)           /* I - Client */
+{
+  char temp;                           /* Data */
+
+
+  if (httpGetState(client->http) != HTTP_STATE_POST_RECV)
+    return (0);
+  else
+    return (httpPeek(client->http, &temp, 1) > 0);
+}
+
+
 /*
  * 'html_escape()' - Write a HTML-safe string.
  */
@@ -2989,7 +3089,7 @@ html_printf(ippeve_client_t *client,      /* I - Client */
            if ((size_t)(width + 2) > sizeof(temp))
              break;
 
-           sprintf(temp, tformat, va_arg(ap, double));
+           snprintf(temp, sizeof(temp), tformat, va_arg(ap, double));
 
             httpWrite2(client->http, temp, strlen(temp));
            break;
@@ -3007,13 +3107,13 @@ html_printf(ippeve_client_t *client,    /* I - Client */
 
 #  ifdef HAVE_LONG_LONG
             if (size == 'L')
-             sprintf(temp, tformat, va_arg(ap, long long));
+             snprintf(temp, sizeof(temp), tformat, va_arg(ap, long long));
            else
 #  endif /* HAVE_LONG_LONG */
             if (size == 'l')
-             sprintf(temp, tformat, va_arg(ap, long));
+             snprintf(temp, sizeof(temp), tformat, va_arg(ap, long));
            else
-             sprintf(temp, tformat, va_arg(ap, int));
+             snprintf(temp, sizeof(temp), tformat, va_arg(ap, int));
 
             httpWrite2(client->http, temp, strlen(temp));
            break;
@@ -3022,7 +3122,7 @@ html_printf(ippeve_client_t *client,      /* I - Client */
            if ((size_t)(width + 2) > sizeof(temp))
              break;
 
-           sprintf(temp, tformat, va_arg(ap, void *));
+           snprintf(temp, sizeof(temp), tformat, va_arg(ap, void *));
 
             httpWrite2(client->http, temp, strlen(temp));
            break;
@@ -3123,6 +3223,53 @@ ipp_cancel_job(ippeve_client_t *client)  /* I - Client */
 }
 
 
+/*
+ * 'ipp_cancel_my_jobs()' - Cancel all jobs.
+ *
+ * Note: Since ippeveprinter doesn't do spooling, this really just cancels the
+ * current job.
+ */
+
+static void
+ipp_cancel_my_jobs(
+    ippeve_client_t *client)           /* I - Client */
+{
+  ippeve_job_t         *job;           /* Job information */
+
+
+  _cupsRWLockWrite(&client->printer->rwlock);
+
+  if ((job = client->printer->active_job) != NULL)
+  {
+   /*
+    * See if the job is already completed, canceled, or aborted; if so,
+    * we can't cancel...
+    */
+
+    if (job->state < IPP_JSTATE_CANCELED)
+    {
+     /*
+      * Cancel the job...
+      */
+
+      if (job->state == IPP_JSTATE_PROCESSING || (job->state == IPP_JSTATE_HELD && job->fd >= 0))
+      {
+       job->cancel = 1;
+      }
+      else
+      {
+       job->state     = IPP_JSTATE_CANCELED;
+       job->completed = time(NULL);
+      }
+    }
+  }
+
+  respond_ipp(client, IPP_STATUS_OK, NULL);
+
+  _cupsRWUnlock(&client->printer->rwlock);
+}
+
+
 /*
  * 'ipp_close_job()' - Close an open job.
  */
@@ -3190,25 +3337,23 @@ ipp_create_job(ippeve_client_t *client) /* I - Client */
 
 
  /*
-  * Validate print job attributes...
+  * Do we have a file to print?
   */
 
-  if (!valid_job_attributes(client))
+  if (have_document_data(client))
   {
-    httpFlush(client->http);
+    flush_document_data(client);
+    respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
+                "Unexpected document data following request.");
     return;
   }
 
  /*
-  * Do we have a file to print?
+  * Validate print job attributes...
   */
 
-  if (httpGetState(client->http) == HTTP_STATE_POST_RECV)
-  {
-    respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
-                "Unexpected document data following request.");
+  if (!valid_job_attributes(client))
     return;
-  }
 
  /*
   * Create the job...
@@ -3477,6 +3622,29 @@ ipp_get_printer_attributes(
   if (!ra || cupsArrayFind(ra, "printer-current-time"))
     ippAddDate(client->response, IPP_TAG_PRINTER, "printer-current-time", ippTimeToDate(time(NULL)));
 
+  if (!ra || cupsArrayFind(ra, "printer-icons"))
+  {
+    char       uris[3][1024];          /* Buffers for URIs */
+    const char *values[3];             /* Values for attribute */
+
+    httpAssembleURI(HTTP_URI_CODING_ALL, uris[0], sizeof(uris[0]), WEB_SCHEME, NULL, client->host_field, client->host_port, "/icon-sm.png");
+    httpAssembleURI(HTTP_URI_CODING_ALL, uris[1], sizeof(uris[1]), WEB_SCHEME, NULL, client->host_field, client->host_port, "/icon.png");
+    httpAssembleURI(HTTP_URI_CODING_ALL, uris[2], sizeof(uris[2]), WEB_SCHEME, NULL, client->host_field, client->host_port, "/icon-lg.png");
+
+    values[0] = uris[0];
+    values[1] = uris[1];
+    values[2] = uris[2];
+
+    ippAddStrings(client->response, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-icons", 3, NULL, values);
+  }
+
+  if (!ra || cupsArrayFind(ra, "printer-more-info"))
+  {
+    char       uri[1024];              /* URI value */
+
+    httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), WEB_SCHEME, NULL, client->host_field, client->host_port, "/");
+    ippAddString(client->response, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-more-info", NULL, uri);
+  }
 
   if (!ra || cupsArrayFind(ra, "printer-state"))
     ippAddInteger(client->response, IPP_TAG_PRINTER, IPP_TAG_ENUM, "printer-state", (int)printer->state);
@@ -3521,9 +3689,42 @@ ipp_get_printer_attributes(
     }
   }
 
+  if (!ra || cupsArrayFind(ra, "printer-strings-uri"))
+  {
+    char       uri[1024];              /* URI value */
+
+    httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), WEB_SCHEME, NULL, client->host_field, client->host_port, "/en.strings");
+    ippAddString(client->response, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-strings-uri", NULL, uri);
+  }
+
+  if (!ra || cupsArrayFind(ra, "printer-supply-info-uri"))
+  {
+    char       uri[1024];              /* URI value */
+
+    httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), WEB_SCHEME, NULL, client->host_field, client->host_port, "/supplies");
+    ippAddString(client->response, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-supply-info-uri", NULL, uri);
+  }
+
   if (!ra || cupsArrayFind(ra, "printer-up-time"))
     ippAddInteger(client->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "printer-up-time", (int)(time(NULL) - printer->start_time));
 
+  if (!ra || cupsArrayFind(ra, "printer-uri-supported"))
+  {
+    char       uris[2][1024];          /* Buffers for URIs */
+    const char *values[2];             /* Values for attribute */
+    int                num_values = 0;         /* Number of values */
+
+    httpAssembleURI(HTTP_URI_CODING_ALL, uris[0], sizeof(uris[0]), "ipp", NULL, client->host_field, client->host_port, "/ipp/print");
+    values[num_values ++] = uris[0];
+
+#ifdef HAVE_SSL
+    httpAssembleURI(HTTP_URI_CODING_ALL, uris[1], sizeof(uris[1]), "ipps", NULL, client->host_field, client->host_port, "/ipp/print");
+    values[num_values ++] = uris[1];
+#endif /* HAVE_SSL */
+
+    ippAddStrings(client->response, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uri-supported", num_values, NULL, values);
+  }
+
   if (!ra || cupsArrayFind(ra, "queued-job-count"))
     ippAddInteger(client->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "queued-job-count", printer->active_job && printer->active_job->state < IPP_JSTATE_CANCELED);
 
@@ -3550,8 +3751,21 @@ ipp_identify_printer(
 
   if (!actions || ippContainsString(actions, "sound"))
   {
+#ifdef __APPLE__
+    pid_t      pid;                    /* Process ID for "afplay" utility */
+    static const char * const afplay[3] =
+    {                                  /* Arguments for "afplay" utility */
+      "/usr/bin/afplay",
+      "/System/Library/Sounds/Ping.aiff",
+      NULL
+    };
+
+    posix_spawn(&pid, afplay[0], NULL, NULL, (char **)afplay, NULL);
+
+#else
     putchar(0x07);
     fflush(stdout);
+#endif /* __APPLE__ */
   }
 
   if (ippContainsString(actions, "display"))
@@ -3577,7 +3791,7 @@ ipp_print_job(ippeve_client_t *client)    /* I - Client */
 
   if (!valid_job_attributes(client))
   {
-    httpFlush(client->http);
+    flush_document_data(client);
     return;
   }
 
@@ -3585,7 +3799,7 @@ ipp_print_job(ippeve_client_t *client)    /* I - Client */
   * Do we have a file to print?
   */
 
-  if (httpGetState(client->http) == HTTP_STATE_POST_SEND)
+  if (!have_document_data(client))
   {
     respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "No file in request.");
     return;
@@ -3625,7 +3839,7 @@ ipp_print_uri(ippeve_client_t *client)    /* I - Client */
 
   if (!valid_job_attributes(client))
   {
-    httpFlush(client->http);
+    flush_document_data(client);
     return;
   }
 
@@ -3658,6 +3872,7 @@ ipp_send_document(
 {
   ippeve_job_t         *job;           /* Job information */
   ipp_attribute_t      *attr;          /* Current attribute */
+  int                  have_data;      /* Have document data? */
 
 
  /*
@@ -3666,26 +3881,28 @@ ipp_send_document(
 
   if ((job = find_job(client)) == NULL)
   {
+    flush_document_data(client);
     respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job does not exist.");
-    httpFlush(client->http);
     return;
   }
 
  /*
   * See if we already have a document for this job or the job has already
-  * in a non-pending state...
+  * in a terminating state...
   */
 
-  if (job->state > IPP_JSTATE_HELD)
+  have_data = have_document_data(client);
+
+  if ((job->filename || job->fd >= 0) && have_data)
   {
-    respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Job is not in a pending state.");
-    httpFlush(client->http);
+    flush_document_data(client);
+    respond_ipp(client, IPP_STATUS_ERROR_MULTIPLE_JOBS_NOT_SUPPORTED, "Multiple document jobs are not supported.");
     return;
   }
-  else if (job->filename || job->fd >= 0)
+  else if (job->state > IPP_JSTATE_HELD && have_data)
   {
-    respond_ipp(client, IPP_STATUS_ERROR_MULTIPLE_JOBS_NOT_SUPPORTED, "Multiple document jobs are not supported.");
-    httpFlush(client->http);
+    flush_document_data(client);
+    respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Job is not in a pending state.");
     return;
   }
 
@@ -3695,20 +3912,20 @@ ipp_send_document(
 
   if ((attr = ippFindAttribute(client->request, "last-document", IPP_TAG_ZERO)) == NULL)
   {
+    flush_document_data(client);
     respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Missing required last-document attribute.");
-    httpFlush(client->http);
     return;
   }
   else if (ippGetGroupTag(attr) != IPP_TAG_OPERATION)
   {
+    flush_document_data(client);
     respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "The last-document attribute is not in the operation group.");
-    httpFlush(client->http);
     return;
   }
-  else if (ippGetValueTag(attr) != IPP_TAG_BOOLEAN || ippGetCount(attr) != 1 || !ippGetBoolean(attr, 0))
+  else if (ippGetValueTag(attr) != IPP_TAG_BOOLEAN || ippGetCount(attr) != 1)
   {
+    flush_document_data(client);
     respond_unsupported(client, attr);
-    httpFlush(client->http);
     return;
   }
 
@@ -3716,12 +3933,15 @@ ipp_send_document(
   * Validate document attributes...
   */
 
-  if (!valid_doc_attributes(client))
+  if (have_data && !valid_doc_attributes(client))
   {
-    httpFlush(client->http);
+    flush_document_data(client);
     return;
   }
 
+  if (!have_data && !job->filename)
+    job->state = IPP_JSTATE_ABORTED;
+
  /*
   * Then finish getting the document data and process things...
   */
@@ -3739,7 +3959,8 @@ ipp_send_document(
 
   _cupsRWUnlock(&(client->printer->rwlock));
 
-  finish_document_data(client, job);
+  if (have_data)
+    finish_document_data(client, job);
 }
 
 
@@ -3762,44 +3983,39 @@ ipp_send_uri(ippeve_client_t *client)   /* I - Client */
   if ((job = find_job(client)) == NULL)
   {
     respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job does not exist.");
-    httpFlush(client->http);
     return;
   }
 
  /*
   * See if we already have a document for this job or the job has already
-  * in a non-pending state...
+  * in a non-terminating state...
   */
 
-  if (job->state > IPP_JSTATE_HELD)
+  if (job->filename || job->fd >= 0)
   {
-    respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Job is not in a pending state.");
-    httpFlush(client->http);
+    respond_ipp(client, IPP_STATUS_ERROR_MULTIPLE_JOBS_NOT_SUPPORTED, "Multiple document jobs are not supported.");
     return;
   }
-  else if (job->filename || job->fd >= 0)
+  else if (job->state > IPP_JSTATE_HELD)
   {
-    respond_ipp(client, IPP_STATUS_ERROR_MULTIPLE_JOBS_NOT_SUPPORTED, "Multiple document jobs are not supported.");
-    httpFlush(client->http);
+    flush_document_data(client);
+    respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Job is not in a pending state.");
     return;
   }
 
   if ((attr = ippFindAttribute(client->request, "last-document", IPP_TAG_ZERO)) == NULL)
   {
     respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Missing required last-document attribute.");
-    httpFlush(client->http);
     return;
   }
   else if (ippGetGroupTag(attr) != IPP_TAG_OPERATION)
   {
     respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "The last-document attribute is not in the operation group.");
-    httpFlush(client->http);
     return;
   }
-  else if (ippGetValueTag(attr) != IPP_TAG_BOOLEAN || ippGetCount(attr) != 1 || !ippGetBoolean(attr, 0))
+  else if (ippGetValueTag(attr) != IPP_TAG_BOOLEAN || ippGetCount(attr) != 1)
   {
     respond_unsupported(client, attr);
-    httpFlush(client->http);
     return;
   }
 
@@ -3809,7 +4025,7 @@ ipp_send_uri(ippeve_client_t *client)     /* I - Client */
 
   if (!valid_doc_attributes(client))
   {
-    httpFlush(client->http);
+    flush_document_data(client);
     return;
   }
 
@@ -4359,9 +4575,36 @@ load_legacy_attributes(
   if (cupsArrayFind(docformats, (void *)"application/pdf"))
     ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "document-password-supported", 1023);
 
+  /* finishing-template-supported */
+  ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "finishing-template-supported", NULL, "none");
+
+  /* finishings-col-database */
+  col = ippNew();
+  ippAddString(col, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "finishing-template", NULL, "none");
+  ippAddCollection(attrs, IPP_TAG_PRINTER, "finishings-col-database", col);
+  ippDelete(col);
+
+  /* finishings-col-default */
+  col = ippNew();
+  ippAddString(col, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "finishing-template", NULL, "none");
+  ippAddCollection(attrs, IPP_TAG_PRINTER, "finishings-col-default", col);
+  ippDelete(col);
+
+  /* finishings-col-ready */
+  col = ippNew();
+  ippAddString(col, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "finishing-template", NULL, "none");
+  ippAddCollection(attrs, IPP_TAG_PRINTER, "finishings-col-ready", col);
+  ippDelete(col);
+
+  /* finishings-col-supported */
+  ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "finishings-col-supported", NULL, "finishing-template");
+
   /* finishings-default */
   ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "finishings-default", IPP_FINISHINGS_NONE);
 
+  /* finishings-ready */
+  ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "finishings-ready", IPP_FINISHINGS_NONE);
+
   /* finishings-supported */
   ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "finishings-supported", IPP_FINISHINGS_NONE);
 
@@ -5000,7 +5243,7 @@ load_ppd_attributes(
   }
 
   /* finishings-col-supported */
-  ippAddString(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "finishings-col-supported", NULL, "finishing-template");
+  ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "finishings-col-supported", NULL, "finishing-template");
 
   /* finishings-default */
   ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "finishings-default", IPP_FINISHINGS_NONE);
@@ -5623,8 +5866,9 @@ process_http(ippeve_client_t *client)     /* I - Client connection */
   ipp_state_t          ipp_state;      /* State of IPP transfer */
   char                 scheme[32],     /* Method/scheme */
                        userpass[128],  /* Username:password */
-                       hostname[HTTP_MAX_HOST];
+                       hostname[HTTP_MAX_HOST],
                                        /* Hostname */
+                       *ptr;           /* Pointer into value */
   int                  port;           /* Port number */
   static const char * const http_states[] =
   {                                    /* Strings for logging HTTP method */
@@ -5733,6 +5977,10 @@ process_http(ippeve_client_t *client)    /* I - Client connection */
     return (0);
   }
 
+ /*
+  * Validate the host header...
+  */
+
   if (!httpGetField(client->http, HTTP_FIELD_HOST)[0] &&
       httpGetVersion(client->http) >= HTTP_VERSION_1_1)
   {
@@ -5740,6 +5988,36 @@ process_http(ippeve_client_t *client)    /* I - Client connection */
     * HTTP/1.1 and higher require the "Host:" field...
     */
 
+    fprintf(stderr, "%s Missing Host: header.\n", client->hostname);
+    respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0);
+    return (0);
+  }
+
+  strlcpy(client->host_field, httpGetField(client->http, HTTP_FIELD_HOST), sizeof(client->host_field));
+  if ((ptr = strrchr(client->host_field, ':')) != NULL)
+  {
+   /*
+    * Grab port number from Host: header...
+    */
+
+    *ptr++ = '\0';
+    client->host_port = atoi(ptr);
+  }
+  else
+  {
+   /*
+    * Use the default port number...
+    */
+
+    client->host_port = client->printer->port;
+  }
+
+  ptr = strrchr(client->host_field, '.');
+
+  if (!isdigit(client->host_field[0] & 255) && client->host_field[0] != '[' && strcmp(client->host_field, client->printer->hostname) && strcmp(client->host_field, "localhost") &&
+      (!ptr || (strcmp(ptr, ".local") && strcmp(ptr, ".local."))))
+  {
+    fprintf(stderr, "%s Bad Host: header '%s'.\n", client->hostname, client->host_field);
     respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0);
     return (0);
   }
@@ -5787,7 +6065,9 @@ process_http(ippeve_client_t *client)     /* I - Client connection */
        return (respond_http(client, HTTP_STATUS_OK, NULL, NULL, 0));
 
     case HTTP_STATE_HEAD :
-        if (!strcmp(client->uri, "/icon.png"))
+        if (!strcmp(client->uri, "/en.strings"))
+         return (respond_http(client, HTTP_STATUS_OK, NULL, "text/strings", 0));
+        else if (!strcmp(client->uri, "/icon.png") || !strcmp(client->uri, "/icon-lg.png") || !strcmp(client->uri, "/icon-sm.png"))
          return (respond_http(client, HTTP_STATUS_OK, NULL, "image/png", 0));
        else if (!strcmp(client->uri, "/") || !strcmp(client->uri, "/media") || !strcmp(client->uri, "/supplies"))
          return (respond_http(client, HTTP_STATUS_OK, NULL, "text/html", 0));
@@ -5795,22 +6075,54 @@ process_http(ippeve_client_t *client)   /* I - Client connection */
          return (respond_http(client, HTTP_STATUS_NOT_FOUND, NULL, NULL, 0));
 
     case HTTP_STATE_GET :
-        if (!strcmp(client->uri, "/icon.png"))
+        if (!strcmp(client->uri, "/en.strings"))
        {
         /*
-         * Send PNG icon file.
+         * Send strings file.
          */
 
-          if (client->printer->icon)
+          if (client->printer->strings)
           {
            int         fd;             /* Icon file */
            struct stat fileinfo;       /* Icon file information */
            char        buffer[4096];   /* Copy buffer */
            ssize_t     bytes;          /* Bytes */
 
-           fprintf(stderr, "Icon file is \"%s\".\n", client->printer->icon);
+           if (!stat(client->printer->strings, &fileinfo) && (fd = open(client->printer->strings, O_RDONLY)) >= 0)
+           {
+             if (!respond_http(client, HTTP_STATUS_OK, NULL, "text/strings", (size_t)fileinfo.st_size))
+             {
+               close(fd);
+               return (0);
+             }
+
+             while ((bytes = read(fd, buffer, sizeof(buffer))) > 0)
+               httpWrite2(client->http, buffer, (size_t)bytes);
 
-           if (!stat(client->printer->icon, &fileinfo) && (fd = open(client->printer->icon, O_RDONLY)) >= 0)
+             httpFlushWrite(client->http);
+
+             close(fd);
+           }
+           else
+             return (respond_http(client, HTTP_STATUS_NOT_FOUND, NULL, NULL, 0));
+         }
+         else
+           return (respond_http(client, HTTP_STATUS_NOT_FOUND, NULL, NULL, 0));
+        }
+        else if (!strcmp(client->uri, "/icon.png"))
+       {
+        /*
+         * Send medium PNG icon file.
+         */
+
+          if (client->printer->icons[1])
+          {
+           int         fd;             /* Icon file */
+           struct stat fileinfo;       /* Icon file information */
+           char        buffer[4096];   /* Copy buffer */
+           ssize_t     bytes;          /* Bytes */
+
+           if (!stat(client->printer->icons[1], &fileinfo) && (fd = open(client->printer->icons[1], O_RDONLY)) >= 0)
            {
              if (!respond_http(client, HTTP_STATUS_OK, NULL, "image/png", (size_t)fileinfo.st_size))
              {
@@ -5839,6 +6151,90 @@ process_http(ippeve_client_t *client)    /* I - Client connection */
            httpFlushWrite(client->http);
          }
        }
+        else if (!strcmp(client->uri, "/icon-lg.png"))
+       {
+        /*
+         * Send large PNG icon file.
+         */
+
+          if (client->printer->icons[2])
+          {
+           int         fd;             /* Icon file */
+           struct stat fileinfo;       /* Icon file information */
+           char        buffer[4096];   /* Copy buffer */
+           ssize_t     bytes;          /* Bytes */
+
+           if (!stat(client->printer->icons[2], &fileinfo) && (fd = open(client->printer->icons[2], O_RDONLY)) >= 0)
+           {
+             if (!respond_http(client, HTTP_STATUS_OK, NULL, "image/png", (size_t)fileinfo.st_size))
+             {
+               close(fd);
+               return (0);
+             }
+
+             while ((bytes = read(fd, buffer, sizeof(buffer))) > 0)
+               httpWrite2(client->http, buffer, (size_t)bytes);
+
+             httpFlushWrite(client->http);
+
+             close(fd);
+           }
+           else
+             return (respond_http(client, HTTP_STATUS_NOT_FOUND, NULL, NULL, 0));
+         }
+         else
+         {
+           fputs("Icon file is internal printer-lg.png.\n", stderr);
+
+           if (!respond_http(client, HTTP_STATUS_OK, NULL, "image/png", sizeof(printer_lg_png)))
+             return (0);
+
+            httpWrite2(client->http, (const char *)printer_lg_png, sizeof(printer_lg_png));
+           httpFlushWrite(client->http);
+         }
+       }
+        else if (!strcmp(client->uri, "/icon-sm.png"))
+       {
+        /*
+         * Send small PNG icon file.
+         */
+
+          if (client->printer->icons[0])
+          {
+           int         fd;             /* Icon file */
+           struct stat fileinfo;       /* Icon file information */
+           char        buffer[4096];   /* Copy buffer */
+           ssize_t     bytes;          /* Bytes */
+
+           if (!stat(client->printer->icons[0], &fileinfo) && (fd = open(client->printer->icons[0], O_RDONLY)) >= 0)
+           {
+             if (!respond_http(client, HTTP_STATUS_OK, NULL, "image/png", (size_t)fileinfo.st_size))
+             {
+               close(fd);
+               return (0);
+             }
+
+             while ((bytes = read(fd, buffer, sizeof(buffer))) > 0)
+               httpWrite2(client->http, buffer, (size_t)bytes);
+
+             httpFlushWrite(client->http);
+
+             close(fd);
+           }
+           else
+             return (respond_http(client, HTTP_STATUS_NOT_FOUND, NULL, NULL, 0));
+         }
+         else
+         {
+           fputs("Icon file is internal printer-sm.png.\n", stderr);
+
+           if (!respond_http(client, HTTP_STATUS_OK, NULL, "image/png", sizeof(printer_sm_png)))
+             return (0);
+
+            httpWrite2(client->http, (const char *)printer_sm_png, sizeof(printer_sm_png));
+           httpFlushWrite(client->http);
+         }
+       }
        else
        {
         /*
@@ -6083,12 +6479,13 @@ process_ipp(ippeve_client_t *client)    /* I - Client */
         else if ((!strcmp(name, "job-uri") &&
                   strncmp(resource, "/ipp/print/", 11)) ||
                  (!strcmp(name, "printer-uri") &&
-                  strcmp(resource, "/ipp/print")))
+                  strcmp(resource, "/ipp/print") &&
+                  (strcmp(resource, "/") || ippGetOperation(client->request) != IPP_OP_GET_PRINTER_ATTRIBUTES)))
          respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "%s %s not found.",
                      name, ippGetString(uri, 0, NULL));
        else if (client->operation_id != IPP_OP_GET_PRINTER_ATTRIBUTES && (status = authenticate_request(client)) != HTTP_STATUS_CONTINUE)
         {
-          httpFlush(client->http);
+          flush_document_data(client);
 
           return (respond_http(client, status, NULL, NULL, 0));
         }
@@ -6118,7 +6515,7 @@ process_ipp(ippeve_client_t *client)      /* I - Client */
              if (!respond_http(client, HTTP_STATUS_EXPECTATION_FAILED, NULL, NULL, 0))
                return (0);
 
-             httpFlush(client->http);
+             flush_document_data(client);
              return (1);
            }
          }
@@ -6157,6 +6554,10 @@ process_ipp(ippeve_client_t *client)     /* I - Client */
                ipp_cancel_job(client);
                break;
 
+           case IPP_OP_CANCEL_MY_JOBS :
+               ipp_cancel_my_jobs(client);
+               break;
+
            case IPP_OP_GET_JOB_ATTRIBUTES :
                ipp_get_job_attributes(client);
                break;
@@ -6745,44 +7146,44 @@ process_state_message(
 
 
 /*
- * 'register_printer()' - Register a printer object via Bonjour.
+ * 'register_printer()' - Register a printer object via DNS-SD.
  */
 
 static int                             /* O - 1 on success, 0 on error */
 register_printer(
-    ippeve_printer_t *printer,         /* I - Printer */
-    const char       *subtypes)                /* I - Service subtype(s) */
+    ippeve_printer_t *printer)         /* I - Printer */
 {
 #if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
-  ippeve_txt_t         ipp_txt;        /* Bonjour IPP TXT record */
+  ippeve_txt_t         ipp_txt;        /* DNS-SD IPP TXT record */
   int                  i,              /* Looping var */
                        count;          /* Number of values */
   ipp_attribute_t      *color_supported,
                        *document_format_supported,
                        *printer_location,
                        *printer_make_and_model,
-                       *printer_more_info,
                        *printer_uuid,
                        *sides_supported,
                        *urf_supported; /* Printer attributes */
   const char           *value;         /* Value string */
-  char                 formats[252],   /* List of supported formats */
+  char                 adminurl[247],  /* adminurl value */
+                       formats[252],   /* List of supported formats */
                        urf[252],       /* List of supported URF values */
                        *ptr;           /* Pointer into string */
 
 
-  if (!strcmp(subtypes, "off"))
+  if (printer->dnssd_subtypes && !strcmp(printer->dnssd_subtypes, "off"))
     return (1);
 
   color_supported           = ippFindAttribute(printer->attrs, "color-supported", IPP_TAG_BOOLEAN);
   document_format_supported = ippFindAttribute(printer->attrs, "document-format-supported", IPP_TAG_MIMETYPE);
   printer_location          = ippFindAttribute(printer->attrs, "printer-location", IPP_TAG_TEXT);
   printer_make_and_model    = ippFindAttribute(printer->attrs, "printer-make-and-model", IPP_TAG_TEXT);
-  printer_more_info         = ippFindAttribute(printer->attrs, "printer-more-info", IPP_TAG_URI);
   printer_uuid              = ippFindAttribute(printer->attrs, "printer-uuid", IPP_TAG_URI);
   sides_supported           = ippFindAttribute(printer->attrs, "sides-supported", IPP_TAG_KEYWORD);
   urf_supported             = ippFindAttribute(printer->attrs, "urf-supported", IPP_TAG_KEYWORD);
 
+  httpAssembleURI(HTTP_URI_CODING_ALL, adminurl, sizeof(adminurl), WEB_SCHEME, NULL, printer->hostname, printer->port, "/");
+
   for (i = 0, count = ippGetCount(document_format_supported), ptr = formats; i < count; i ++)
   {
     value = ippGetString(document_format_supported, i, NULL);
@@ -6815,11 +7216,35 @@ register_printer(
       break;
   }
 
-#endif /* HAVE_DNSSD || HAVE_AVAHI */
+ /*
+  * Rename the service as needed...
+  */
+
+  if (printer->dnssd_collision)
+  {
+    char       new_dnssd_name[256];    /* New DNS-SD name */
+    const char *uuid = ippGetString(printer_uuid, 0, NULL);
+                                       /* "printer-uuid" value */
+
+    _cupsRWLockWrite(&printer->rwlock);
+
+    snprintf(new_dnssd_name, sizeof(new_dnssd_name), "%s (%c%c%c%c%c%c)", printer->dnssd_name, toupper(uuid[39]), toupper(uuid[40]), toupper(uuid[41]), toupper(uuid[42]), toupper(uuid[43]), toupper(uuid[44]));
+
+    free(printer->dnssd_name);
+    printer->dnssd_name = strdup(new_dnssd_name);
+
+    fprintf(stderr, "DNS-SD name collision, trying new DNS-SD service name '%s'.\n", printer->dnssd_name);
+
+    _cupsRWUnlock(&printer->rwlock);
+
+    printer->dnssd_collision = 0;
+  }
+#endif /* HAVE_DNSSD || HAVE_AVAHI  */
+
 #ifdef HAVE_DNSSD
-  DNSServiceErrorType  error;          /* Error from Bonjour */
-  char                 regtype[256];   /* Bonjour service type */
-  uint32_t             interface;      /* Interface index */
+  DNSServiceErrorType  error;          /* Error from DNS-SD */
+  char                 regtype[256];   /* DNS-SD service type */
+  uint32_t             ifindex;        /* Interface index */
 
 
  /*
@@ -6830,8 +7255,7 @@ register_printer(
   TXTRecordSetValue(&ipp_txt, "rp", 9, "ipp/print");
   if ((value = ippGetString(printer_make_and_model, 0, NULL)) != NULL)
     TXTRecordSetValue(&ipp_txt, "ty", (uint8_t)strlen(value), value);
-  if ((value = ippGetString(printer_more_info, 0, NULL)) != NULL)
-    TXTRecordSetValue(&ipp_txt, "adminurl", (uint8_t)strlen(value), value);
+  TXTRecordSetValue(&ipp_txt, "adminurl", (uint8_t)strlen(adminurl), adminurl);
   if ((value = ippGetString(printer_location, 0, NULL)) != NULL)
     TXTRecordSetValue(&ipp_txt, "note", (uint8_t)strlen(value), value);
   TXTRecordSetValue(&ipp_txt, "pdl", (uint8_t)strlen(formats), formats);
@@ -6852,11 +7276,14 @@ register_printer(
   * defend our service name but not actually support LPD...
   */
 
-  interface = !strcmp(printer->hostname, "localhost") ? kDNSServiceInterfaceIndexLocalOnly : kDNSServiceInterfaceIndexAny;
+  ifindex = !strcmp(printer->hostname, "localhost") ? kDNSServiceInterfaceIndexLocalOnly : kDNSServiceInterfaceIndexAny;
+
+  if (printer->printer_ref)
+    DNSServiceRefDeallocate(printer->printer_ref);
 
   printer->printer_ref = DNSSDMaster;
 
-  if ((error = DNSServiceRegister(&(printer->printer_ref), kDNSServiceFlagsShareConnection, interface, printer->dnssd_name, "_printer._tcp", NULL /* domain */, NULL /* host */, 0 /* port */, 0 /* txtLen */, NULL /* txtRecord */, (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError)
+  if ((error = DNSServiceRegister(&(printer->printer_ref), kDNSServiceFlagsShareConnection | kDNSServiceFlagsNoAutoRename, ifindex, printer->dnssd_name, "_printer._tcp", NULL /* domain */, NULL /* host */, 0 /* port */, 0 /* txtLen */, NULL /* txtRecord */, (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError)
   {
     _cupsLangPrintf(stderr, _("Unable to register \"%s.%s\": %d"), printer->dnssd_name, "_printer._tcp", error);
     return (0);
@@ -6867,14 +7294,17 @@ register_printer(
   * advertise our IPP printer...
   */
 
+  if (printer->ipp_ref)
+    DNSServiceRefDeallocate(printer->ipp_ref);
+
   printer->ipp_ref = DNSSDMaster;
 
-  if (subtypes && *subtypes)
-    snprintf(regtype, sizeof(regtype), "_ipp._tcp,%s", subtypes);
+  if (printer->dnssd_subtypes && *(printer->dnssd_subtypes))
+    snprintf(regtype, sizeof(regtype), "_ipp._tcp,%s", printer->dnssd_subtypes);
   else
     strlcpy(regtype, "_ipp._tcp", sizeof(regtype));
 
-  if ((error = DNSServiceRegister(&(printer->ipp_ref), kDNSServiceFlagsShareConnection, interface, printer->dnssd_name, regtype, NULL /* domain */, NULL /* host */, htons(printer->port), TXTRecordGetLength(&ipp_txt), TXTRecordGetBytesPtr(&ipp_txt), (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError)
+  if ((error = DNSServiceRegister(&(printer->ipp_ref), kDNSServiceFlagsShareConnection | kDNSServiceFlagsNoAutoRename, ifindex, printer->dnssd_name, regtype, NULL /* domain */, NULL /* host */, htons(printer->port), TXTRecordGetLength(&ipp_txt), TXTRecordGetBytesPtr(&ipp_txt), (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError)
   {
     _cupsLangPrintf(stderr, _("Unable to register \"%s.%s\": %d"), printer->dnssd_name, regtype, error);
     return (0);
@@ -6886,14 +7316,17 @@ register_printer(
   * advertise our IPPS printer...
   */
 
+  if (printer->ipps_ref)
+    DNSServiceRefDeallocate(printer->ipps_ref);
+
   printer->ipps_ref = DNSSDMaster;
 
-  if (subtypes && *subtypes)
-    snprintf(regtype, sizeof(regtype), "_ipps._tcp,%s", subtypes);
+  if (printer->dnssd_subtypes && *(printer->dnssd_subtypes))
+    snprintf(regtype, sizeof(regtype), "_ipps._tcp,%s", printer->dnssd_subtypes);
   else
     strlcpy(regtype, "_ipps._tcp", sizeof(regtype));
 
-  if ((error = DNSServiceRegister(&(printer->ipps_ref), kDNSServiceFlagsShareConnection, interface, printer->dnssd_name, regtype, NULL /* domain */, NULL /* host */, htons(printer->port), TXTRecordGetLength(&ipp_txt), TXTRecordGetBytesPtr(&ipp_txt), (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError)
+  if ((error = DNSServiceRegister(&(printer->ipps_ref), kDNSServiceFlagsShareConnection | kDNSServiceFlagsNoAutoRename, ifindex, printer->dnssd_name, regtype, NULL /* domain */, NULL /* host */, htons(printer->port), TXTRecordGetLength(&ipp_txt), TXTRecordGetBytesPtr(&ipp_txt), (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError)
   {
     _cupsLangPrintf(stderr, _("Unable to register \"%s.%s\": %d"), printer->dnssd_name, regtype, error);
     return (0);
@@ -6905,9 +7338,12 @@ register_printer(
   * real port number to advertise our IPP printer...
   */
 
+  if (printer->http_ref)
+    DNSServiceRefDeallocate(printer->http_ref);
+
   printer->http_ref = DNSSDMaster;
 
-  if ((error = DNSServiceRegister(&(printer->http_ref), kDNSServiceFlagsShareConnection, interface, printer->dnssd_name, "_http._tcp,_printer", NULL /* domain */, NULL /* host */, htons(printer->port), 0 /* txtLen */, NULL /* txtRecord */, (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError)
+  if ((error = DNSServiceRegister(&(printer->http_ref), kDNSServiceFlagsShareConnection | kDNSServiceFlagsNoAutoRename, ifindex, printer->dnssd_name, "_http._tcp,_printer", NULL /* domain */, NULL /* host */, htons(printer->port), 0 /* txtLen */, NULL /* txtRecord */, (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError)
   {
     _cupsLangPrintf(stderr, _("Unable to register \"%s.%s\": %d"), printer->dnssd_name, "_http._tcp,_printer", error);
     return (0);
@@ -6926,8 +7362,7 @@ register_printer(
   ipp_txt = avahi_string_list_add_printf(ipp_txt, "rp=ipp/print");
   if ((value = ippGetString(printer_make_and_model, 0, NULL)) != NULL)
     ipp_txt = avahi_string_list_add_printf(ipp_txt, "ty=%s", value);
-  if ((value = ippGetString(printer_more_info, 0, NULL)) != NULL)
-    ipp_txt = avahi_string_list_add_printf(ipp_txt, "adminurl=%s", value);
+  ipp_txt = avahi_string_list_add_printf(ipp_txt, "adminurl=%s", adminurl);
   if ((value = ippGetString(printer_location, 0, NULL)) != NULL)
     ipp_txt = avahi_string_list_add_printf(ipp_txt, "note=%s", value);
   ipp_txt = avahi_string_list_add_printf(ipp_txt, "pdl=%s", formats);
@@ -6949,18 +7384,21 @@ register_printer(
 
   avahi_threaded_poll_lock(DNSSDMaster);
 
-  printer->ipp_ref = avahi_entry_group_new(DNSSDClient, dnssd_callback, NULL);
+  if (printer->dnssd_ref)
+    avahi_entry_group_free(printer->dnssd_ref);
+
+  printer->dnssd_ref = avahi_entry_group_new(DNSSDClient, dnssd_callback, printer);
 
-  avahi_entry_group_add_service_strlst(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_printer._tcp", NULL, NULL, 0, NULL);
+  avahi_entry_group_add_service_strlst(printer->dnssd_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_printer._tcp", NULL, NULL, 0, NULL);
 
  /*
   * Then register the _ipp._tcp (IPP)...
   */
 
-  avahi_entry_group_add_service_strlst(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipp._tcp", NULL, NULL, printer->port, ipp_txt);
-  if (subtypes && *subtypes)
+  avahi_entry_group_add_service_strlst(printer->dnssd_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipp._tcp", NULL, NULL, printer->port, ipp_txt);
+  if (printer->dnssd_subtypes && *(printer->dnssd_subtypes))
   {
-    char *temptypes = strdup(subtypes), *start, *end;
+    char *temptypes = strdup(printer->dnssd_subtypes), *start, *end;
 
     for (start = temptypes; *start; start = end)
     {
@@ -6970,7 +7408,7 @@ register_printer(
         end = start + strlen(start);
 
       snprintf(temp, sizeof(temp), "%s._sub._ipp._tcp", start);
-      avahi_entry_group_add_service_subtype(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipp._tcp", NULL, temp);
+      avahi_entry_group_add_service_subtype(printer->dnssd_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipp._tcp", NULL, temp);
     }
 
     free(temptypes);
@@ -6981,10 +7419,10 @@ register_printer(
   * _ipps._tcp (IPPS) for secure printing...
   */
 
-  avahi_entry_group_add_service_strlst(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipps._tcp", NULL, NULL, printer->port, ipp_txt);
-  if (subtypes && *subtypes)
+  avahi_entry_group_add_service_strlst(printer->dnssd_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipps._tcp", NULL, NULL, printer->port, ipp_txt);
+  if (printer->dnssd_subtypes && *(printer->dnssd_subtypes))
   {
-    char *temptypes = strdup(subtypes), *start, *end;
+    char *temptypes = strdup(printer->dnssd_subtypes), *start, *end;
 
     for (start = temptypes; *start; start = end)
     {
@@ -6994,7 +7432,7 @@ register_printer(
         end = start + strlen(start);
 
       snprintf(temp, sizeof(temp), "%s._sub._ipps._tcp", start);
-      avahi_entry_group_add_service_subtype(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipps._tcp", NULL, temp);
+      avahi_entry_group_add_service_subtype(printer->dnssd_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipps._tcp", NULL, temp);
     }
 
     free(temptypes);
@@ -7005,14 +7443,14 @@ register_printer(
   * Finally _http.tcp (HTTP) for the web interface...
   */
 
-  avahi_entry_group_add_service_strlst(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_http._tcp", NULL, NULL, printer->port, NULL);
-  avahi_entry_group_add_service_subtype(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_http._tcp", NULL, "_printer._sub._http._tcp");
+  avahi_entry_group_add_service_strlst(printer->dnssd_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_http._tcp", NULL, NULL, printer->port, NULL);
+  avahi_entry_group_add_service_subtype(printer->dnssd_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_http._tcp", NULL, "_printer._sub._http._tcp");
 
  /*
   * Commit it...
   */
 
-  avahi_entry_group_commit(printer->ipp_ref);
+  avahi_entry_group_commit(printer->dnssd_ref);
   avahi_threaded_poll_unlock(DNSSDMaster);
 
   avahi_string_list_free(ipp_txt);
@@ -7194,14 +7632,13 @@ respond_unsupported(
 static void
 run_printer(ippeve_printer_t *printer) /* I - Printer */
 {
-  int          num_fds;                /* Number of file descriptors */
-  struct pollfd        polldata[3];            /* poll() data */
-  int          timeout;                /* Timeout for poll() */
-  ippeve_client_t      *client;                /* New client */
+  int                  num_fds;        /* Number of file descriptors */
+  struct pollfd                polldata[3];    /* poll() data */
+  ippeve_client_t      *client;        /* New client */
 
 
  /*
-  * Setup poll() data for the Bonjour service socket and IPv4/6 listeners...
+  * Setup poll() data for the DNS-SD service socket and IPv4/6 listeners...
   */
 
   polldata[0].fd     = printer->ipv4;
@@ -7223,12 +7660,7 @@ run_printer(ippeve_printer_t *printer)   /* I - Printer */
 
   for (;;)
   {
-    if (cupsArrayCount(printer->jobs))
-      timeout = 10;
-    else
-      timeout = -1;
-
-    if (poll(polldata, (nfds_t)num_fds, timeout) < 0 && errno != EINTR)
+    if (poll(polldata, (nfds_t)num_fds, 1000) < 0 && errno != EINTR)
     {
       perror("poll() failed");
       break;
@@ -7270,11 +7702,20 @@ run_printer(ippeve_printer_t *printer)  /* I - Printer */
       }
     }
 
+   /*
+    * Process DNS-SD messages...
+    */
+
 #ifdef HAVE_DNSSD
     if (polldata[2].revents & POLLIN)
       DNSServiceProcessResult(DNSSDMaster);
 #endif /* HAVE_DNSSD */
 
+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
+    if (printer->dnssd_collision)
+      register_printer(printer);
+#endif /* HAVE_DNSSD || HAVE_AVAHI */
+
    /*
     * Clean out old jobs...
     */
@@ -7932,13 +8373,16 @@ usage(int status)                       /* O - Exit status */
   _cupsLangPuts(stdout, _("-K keypath              Set location of server X.509 certificates and keys."));
 #endif /* HAVE_SSL */
   _cupsLangPuts(stdout, _("-M manufacturer         Set manufacturer name (default=Test)"));
+#if !CUPS_LITE
   _cupsLangPuts(stdout, _("-P filename.ppd         Load printer attributes from PPD file"));
+#endif /* !CUPS_LITE */
+  _cupsLangPuts(stdout, _("-S filename.strings     Set strings file"));
   _cupsLangPuts(stdout, _("-V version              Set default IPP version"));
   _cupsLangPuts(stdout, _("-a filename.conf        Load printer attributes from conf file"));
   _cupsLangPuts(stdout, _("-c command              Set print command"));
   _cupsLangPuts(stdout, _("-d spool-directory      Set spool directory"));
   _cupsLangPuts(stdout, _("-f type/subtype[,...]   Set supported file types"));
-  _cupsLangPuts(stdout, _("-i iconfile.png         Set icon file"));
+  _cupsLangPuts(stdout, _("-i iconfile.png[,...]   Set icon file(s)"));
   _cupsLangPuts(stdout, _("-k                      Keep job spool files"));
   _cupsLangPuts(stdout, _("-l location             Set location of printer"));
   _cupsLangPuts(stdout, _("-m model                Set model name (default=Printer)"));
@@ -8056,6 +8500,7 @@ valid_doc_attributes(
     memset(header, 0, sizeof(header));
     httpPeek(client->http, (char *)header, sizeof(header));
 
+    fprintf(stderr, "%s %s Auto-type header: %02X%02X%02X%02X%02X%02X%02X%02X\n", client->hostname, op_name, header[0], header[1], header[2], header[3], header[4], header[5], header[6], header[7]);
     if (!memcmp(header, "%PDF", 4))
       format = "application/pdf";
     else if (!memcmp(header, "%!", 2))
@@ -8064,7 +8509,7 @@ valid_doc_attributes(
       format = "image/jpeg";
     else if (!memcmp(header, "\211PNG", 4))
       format = "image/png";
-    else if (!memcmp(header, "RAS2", 4))
+    else if (!memcmp(header, "RaS2PwgR", 8))
       format = "image/pwg-raster";
     else if (!memcmp(header, "UNIRAST", 8))
       format = "image/urf";
index 246ab4dba87363dd3a09e58fc41c09916a842f5c..ae5af7d40dd2196b5f4267f36ba5cb33b5253281 100644 (file)
@@ -3,6 +3,8 @@
  * commands such as IPP and Bonjour conformance tests.  This tool is
  * inspired by the UNIX "find" command, thus its name.
  *
+ * Copyright © 2021 by OpenPrinting.
+ * Copyright © 2020 by the IEEE-ISTO Printer Working Group
  * Copyright © 2008-2018 by Apple Inc.
  *
  * Licensed under Apache License v2.0.  See the file "LICENSE" for more
@@ -159,7 +161,7 @@ static void         browse_callback(AvahiServiceBrowser *browser,
 static void            client_callback(AvahiClient *client,
                                        AvahiClientState state,
                                        void *context);
-#endif /* HAVE_AVAHI */
+#endif /* HAVE_DNSSD */
 
 static int             compare_services(ippfind_srv_t *a, ippfind_srv_t *b);
 static const char      *dnssd_error_string(int error);
@@ -1273,6 +1275,16 @@ main(int  argc,                          /* I - Number of command-line args */
       }
 
 #elif defined(HAVE_AVAHI)
+      char     *subtype,               /* Sub-type, if any */
+               subtype_buf[256];       /* Sub-type buffer */
+
+      if ((subtype = strstr(regtype, ",_")) != NULL)
+      {
+        *subtype++ = '\0';
+        snprintf(subtype_buf, sizeof(subtype_buf), "%s._sub.%s", subtype, regtype);
+        regtype = subtype_buf;
+      }
+
       if (avahi_service_browser_new(avahi_client, AVAHI_IF_UNSPEC,
                                     AVAHI_PROTO_UNSPEC, regtype, domain, 0,
                                     browse_callback, services))
@@ -2774,6 +2786,7 @@ show_usage(void)
   _cupsLangPuts(stderr, _("-h regex                Match hostname to regular expression"));
   _cupsLangPuts(stderr, _("-l                      List attributes"));
   _cupsLangPuts(stderr, _("-n regex                Match service name to regular expression"));
+  _cupsLangPuts(stderr, _("-N name                 Match service name to literal name value"));
   _cupsLangPuts(stderr, _("-p                      Print URI if true"));
   _cupsLangPuts(stderr, _("-q                      Quietly report match via exit code"));
   _cupsLangPuts(stderr, _("-r                      True if service is remote"));
@@ -2786,8 +2799,9 @@ show_usage(void)
   _cupsLangPuts(stderr, _("--exec utility [argument ...] ;\n"
                           "                        Execute program if true"));
   _cupsLangPuts(stderr, _("--host regex            Match hostname to regular expression"));
-  _cupsLangPuts(stderr, _("--ls                    List attributes"));
+  _cupsLangPuts(stderr, _("--literal-name name     Match service name to literal name value"));
   _cupsLangPuts(stderr, _("--local                 True if service is local"));
+  _cupsLangPuts(stderr, _("--ls                    List attributes"));
   _cupsLangPuts(stderr, _("--name regex            Match service name to regular expression"));
   _cupsLangPuts(stderr, _("--path regex            Match resource path to regular expression"));
   _cupsLangPuts(stderr, _("--port number[-number]  Match port to number or range"));
index a3a694d5fa4e312b3f3323d1930f886ac38ad5c8..e3692524ca9ea236fb220450ba0b978c19bafa64 100644 (file)
@@ -1,7 +1,9 @@
 /*
  * ipptool command for CUPS.
  *
- * Copyright © 2007-2019 by Apple Inc.
+ * Copyright © 2021 by OpenPrinting.
+ * Copyright © 2020 by The Printer Working Group.
+ * Copyright © 2007-2021 by Apple Inc.
  * Copyright © 1997-2007 by Easy Software Products.
  *
  * Licensed under Apache License v2.0.  See the file "LICENSE" for more
  * Types...
  */
 
-typedef enum _cups_transfer_e          /**** How to send request data ****/
+typedef enum ipptool_transfer_e                /**** How to send request data ****/
 {
-  _CUPS_TRANSFER_AUTO,                 /* Chunk for files, length for static */
-  _CUPS_TRANSFER_CHUNKED,              /* Chunk always */
-  _CUPS_TRANSFER_LENGTH                        /* Length always */
-} _cups_transfer_t;
+  IPPTOOL_TRANSFER_AUTO,               /* Chunk for files, length for static */
+  IPPTOOL_TRANSFER_CHUNKED,            /* Chunk always */
+  IPPTOOL_TRANSFER_LENGTH              /* Length always */
+} ipptool_transfer_t;
 
-typedef enum _cups_output_e            /**** Output mode ****/
+typedef enum ipptool_output_e          /**** Output mode ****/
 {
-  _CUPS_OUTPUT_QUIET,                  /* No output */
-  _CUPS_OUTPUT_TEST,                   /* Traditional CUPS test output */
-  _CUPS_OUTPUT_PLIST,                  /* XML plist test output */
-  _CUPS_OUTPUT_IPPSERVER,              /* ippserver attribute file output */
-  _CUPS_OUTPUT_LIST,                   /* Tabular list output */
-  _CUPS_OUTPUT_CSV                     /* Comma-separated values output */
-} _cups_output_t;
-
-typedef enum _cups_with_e              /**** WITH flags ****/
+  IPPTOOL_OUTPUT_QUIET,                        /* No output */
+  IPPTOOL_OUTPUT_TEST,                 /* Traditional CUPS test output */
+  IPPTOOL_OUTPUT_PLIST,                        /* XML plist test output */
+  IPPTOOL_OUTPUT_IPPSERVER,            /* ippserver attribute file output */
+  IPPTOOL_OUTPUT_LIST,                 /* Tabular list output */
+  IPPTOOL_OUTPUT_CSV                   /* Comma-separated values output */
+} ipptool_output_t;
+
+typedef enum ipptool_with_e            /**** WITH flags ****/
 {
-  _CUPS_WITH_LITERAL = 0,              /* Match string is a literal value */
-  _CUPS_WITH_ALL = 1,                  /* Must match all values */
-  _CUPS_WITH_REGEX = 2,                        /* Match string is a regular expression */
-  _CUPS_WITH_HOSTNAME = 4,             /* Match string is a URI hostname */
-  _CUPS_WITH_RESOURCE = 8,             /* Match string is a URI resource */
-  _CUPS_WITH_SCHEME = 16               /* Match string is a URI scheme */
-} _cups_with_t;
-
-typedef struct _cups_expect_s          /**** Expected attribute info ****/
+  IPPTOOL_WITH_LITERAL = 0,            /* Match string is a literal value */
+  IPPTOOL_WITH_ALL = 1,                        /* Must match all values */
+  IPPTOOL_WITH_REGEX = 2,              /* Match string is a regular expression */
+  IPPTOOL_WITH_HOSTNAME = 4,           /* Match string is a URI hostname */
+  IPPTOOL_WITH_RESOURCE = 8,           /* Match string is a URI resource */
+  IPPTOOL_WITH_SCHEME = 16             /* Match string is a URI scheme */
+} ipptool_with_t;
+
+typedef struct ipptool_expect_s                /**** Expected attribute info ****/
 {
   int          optional,               /* Optional attribute? */
                not_expect,             /* Don't expect attribute? */
@@ -78,12 +80,13 @@ typedef struct _cups_expect_s               /**** Expected attribute info ****/
   int          repeat_limit,           /* Maximum number of times to repeat */
                repeat_match,           /* Repeat test on match */
                repeat_no_match,        /* Repeat test on no match */
-               with_flags,             /* WITH flags  */
+               with_distinct,          /* WITH-DISTINCT-VALUES? */
+               with_flags,             /* WITH flags */
                count;                  /* Expected count if > 0 */
   ipp_tag_t    in_group;               /* IN-GROUP value */
-} _cups_expect_t;
+} ipptool_expect_t;
 
-typedef struct _cups_status_s          /**** Status info ****/
+typedef struct ipptool_status_s                /**** Status info ****/
 {
   ipp_status_t status;                 /* Expected status code */
   char         *if_defined,            /* Only if variable is defined */
@@ -94,14 +97,16 @@ typedef struct _cups_status_s               /**** Status info ****/
   int          repeat_limit,           /* Maximum number of times to repeat */
                repeat_match,           /* Repeat the test when it does not match */
                repeat_no_match;        /* Repeat the test when it matches */
-} _cups_status_t;
+} ipptool_status_t;
 
-typedef struct _cups_testdata_s                /**** Test Data ****/
+typedef struct ipptool_test_s          /**** Test Data ****/
 {
   /* Global Options */
+  _ipp_vars_t  *vars;                  /* Variables */
   http_encryption_t encryption;                /* Encryption for connection */
   int          family;                 /* Address family */
-  _cups_output_t output;               /* Output mode */
+  ipptool_output_t output;             /* Output mode */
+  int          repeat_on_busy;         /* Repeat tests on server-error-busy */
   int          stop_after_include_error;
                                        /* Stop after include errors? */
   double       timeout;                /* Timeout for connection */
@@ -110,7 +115,7 @@ typedef struct _cups_testdata_s             /**** Test Data ****/
 
   /* Test Defaults */
   int          def_ignore_errors;      /* Default IGNORE-ERRORS value */
-  _cups_transfer_t def_transfer;       /* Default TRANSFER value */
+  ipptool_transfer_t def_transfer;     /* Default TRANSFER value */
   int          def_version;            /* Default IPP version */
 
   /* Global State */
@@ -133,24 +138,32 @@ typedef struct _cups_testdata_s           /**** Test Data ****/
   int          num_displayed;          /* Number of displayed attributes */
   char         *displayed[200];        /* Displayed attributes */
   int          num_expects;            /* Number of expected attributes */
-  _cups_expect_t expects[200],         /* Expected attributes */
+  ipptool_expect_t expects[200],       /* Expected attributes */
                *expect,                /* Current expected attribute */
                *last_expect;           /* Last EXPECT (for predicates) */
   char         file[1024],             /* Data filename */
                file_id[1024];          /* File identifier */
   int          ignore_errors;          /* Ignore test failures? */
   char         name[1024];             /* Test name */
+  char         pause[1024];            /* PAUSE value */
   useconds_t   repeat_interval;        /* Repeat interval (delay) */
   int          request_id;             /* Current request ID */
   char         resource[512];          /* Resource for request */
   int          skip_test,              /* Skip this test? */
                num_statuses;           /* Number of valid status codes */
-  _cups_status_t statuses[100],                /* Valid status codes */
+  ipptool_status_t statuses[100],      /* Valid status codes */
                *last_status;           /* Last STATUS (for predicates) */
   char         test_id[1024];          /* Test identifier */
-  _cups_transfer_t transfer;           /* To chunk or not to chunk */
+  ipptool_transfer_t transfer;         /* To chunk or not to chunk */
   int          version;                /* IPP version number to use */
-} _cups_testdata_t;
+  _cups_thread_t monitor_thread;       /* Monitoring thread ID */
+  int          monitor_done;           /* Set to 1 to stop monitor thread */
+  char         *monitor_uri;           /* MONITOR-PRINTER-STATE URI */
+  useconds_t   monitor_delay,          /* MONITOR-PRINTER-STATE DELAY value, if any */
+               monitor_interval;       /* MONITOR-PRINTER-STATE DELAY interval */
+  int          num_monitor_expects;    /* Number MONITOR-PRINTER-STATE EXPECTs */
+  ipptool_expect_t monitor_expects[10];        /* MONITOR-PRINTER-STATE EXPECTs */
+} ipptool_test_t;
 
 
 /*
@@ -167,32 +180,35 @@ static int        Cancel = 0;             /* Cancel test? */
 static void    add_stringf(cups_array_t *a, const char *s, ...) _CUPS_FORMAT(2, 3);
 static int      compare_uris(const char *a, const char *b);
 static void    copy_hex_string(char *buffer, unsigned char *data, int datalen, size_t bufsize);
-static int     do_test(_ipp_file_t *f, _ipp_vars_t *vars, _cups_testdata_t *data);
-static int     do_tests(const char *testfile, _ipp_vars_t *vars, _cups_testdata_t *data);
-static int     error_cb(_ipp_file_t *f, _cups_testdata_t *data, const char *error);
-static int      expect_matches(_cups_expect_t *expect, ipp_tag_t value_tag);
+static void    *do_monitor_printer_state(ipptool_test_t *data);
+static int     do_test(_ipp_file_t *f, ipptool_test_t *data);
+static int     do_tests(const char *testfile, ipptool_test_t *data);
+static int     error_cb(_ipp_file_t *f, ipptool_test_t *data, const char *error);
+static int      expect_matches(ipptool_expect_t *expect, ipp_attribute_t *attr);
 static char    *get_filename(const char *testfile, char *dst, const char *src, size_t dstsize);
 static const char *get_string(ipp_attribute_t *attr, int element, int flags, char *buffer, size_t bufsize);
-static void    init_data(_cups_testdata_t *data);
+static void    init_data(ipptool_test_t *data);
 static char    *iso_date(const ipp_uchar_t *date);
+static int     parse_monitor_printer_state(_ipp_file_t *f, ipptool_test_t *data);
 static void    pause_message(const char *message);
-static void    print_attr(cups_file_t *outfile, _cups_output_t output, ipp_attribute_t *attr, ipp_tag_t *group);
-static void    print_csv(_cups_testdata_t *data, ipp_t *ipp, ipp_attribute_t *attr, int num_displayed, char **displayed, size_t *widths);
-static void    print_fatal_error(_cups_testdata_t *data, const char *s, ...) _CUPS_FORMAT(2, 3);
-static void    print_ippserver_attr(_cups_testdata_t *data, ipp_attribute_t *attr, int indent);
-static void    print_ippserver_string(_cups_testdata_t *data, const char *s, size_t len);
-static void    print_line(_cups_testdata_t *data, ipp_t *ipp, ipp_attribute_t *attr, int num_displayed, char **displayed, size_t *widths);
-static void    print_xml_header(_cups_testdata_t *data);
+static void    print_attr(cups_file_t *outfile, ipptool_output_t output, ipp_attribute_t *attr, ipp_tag_t *group);
+static void    print_csv(ipptool_test_t *data, ipp_t *ipp, ipp_attribute_t *attr, int num_displayed, char **displayed, size_t *widths);
+static void    print_fatal_error(ipptool_test_t *data, const char *s, ...) _CUPS_FORMAT(2, 3);
+static void    print_ippserver_attr(ipptool_test_t *data, ipp_attribute_t *attr, int indent);
+static void    print_ippserver_string(ipptool_test_t *data, const char *s, size_t len);
+static void    print_line(ipptool_test_t *data, ipp_t *ipp, ipp_attribute_t *attr, int num_displayed, char **displayed, size_t *widths);
+static void    print_xml_header(ipptool_test_t *data);
 static void    print_xml_string(cups_file_t *outfile, const char *element, const char *s);
-static void    print_xml_trailer(_cups_testdata_t *data, int success, const char *message);
+static void    print_xml_trailer(ipptool_test_t *data, int success, const char *message);
 #ifndef _WIN32
 static void    sigterm_handler(int sig);
 #endif /* _WIN32 */
 static int     timeout_cb(http_t *http, void *user_data);
-static int     token_cb(_ipp_file_t *f, _ipp_vars_t *vars, _cups_testdata_t *data, const char *token);
+static int     token_cb(_ipp_file_t *f, _ipp_vars_t *vars, ipptool_test_t *data, const char *token);
 static void    usage(void) _CUPS_NORETURN;
+static int     with_distinct_values(cups_array_t *errors, ipp_attribute_t *attr);
 static const char *with_flags_string(int flags);
-static int      with_value(_cups_testdata_t *data, cups_array_t *errors, char *value, int flags, ipp_attribute_t *attr, char *matchbuf, size_t matchlen);
+static int      with_value(ipptool_test_t *data, cups_array_t *errors, char *value, int flags, ipp_attribute_t *attr, char *matchbuf, size_t matchlen);
 static int      with_value_from(cups_array_t *errors, ipp_attribute_t *fromattr, ipp_attribute_t *attr, char *matchbuf, size_t matchlen);
 
 
@@ -215,8 +231,8 @@ main(int  argc,                             /* I - Number of command-line args */
                        *testfile;      /* Test file to use */
   int                  interval,       /* Test interval in microseconds */
                        repeat;         /* Repeat count */
-  _cups_testdata_t     data;           /* Test data */
   _ipp_vars_t          vars;           /* Variables */
+  ipptool_test_t       data;           /* Test data */
   _cups_globals_t      *cg = _cupsGlobals();
                                        /* Global data */
 
@@ -239,8 +255,9 @@ main(int  argc,                             /* I - Number of command-line args */
   init_data(&data);
 
   _ippVarsInit(&vars, NULL, (_ipp_ferror_cb_t)error_cb, (_ipp_ftoken_cb_t)token_cb);
+  data.vars = &vars;
 
-  _ippVarsSet(&vars, "date-start", iso_date(ippTimeToDate(time(NULL))));
+  _ippVarsSet(data.vars, "date-start", iso_date(ippTimeToDate(time(NULL))));
 
  /*
   * We need at least:
@@ -278,7 +295,7 @@ main(int  argc,                             /* I - Number of command-line args */
        exit(1);
       }
 
-      data.output = _CUPS_OUTPUT_IPPSERVER;
+      data.output = IPPTOOL_OUTPUT_IPPSERVER;
     }
     else if (!strcmp(argv[i], "--stop-after-include-error"))
     {
@@ -306,7 +323,7 @@ main(int  argc,                             /* I - Number of command-line args */
 #endif /* AF_INET6 */
 
           case 'C' : /* Enable HTTP chunking */
-              data.def_transfer = _CUPS_TRANSFER_CHUNKED;
+              data.def_transfer = IPPTOOL_TRANSFER_CHUNKED;
               break;
 
          case 'E' : /* Encrypt with TLS */
@@ -323,7 +340,7 @@ main(int  argc,                             /* I - Number of command-line args */
              break;
 
           case 'L' : /* Disable HTTP chunking */
-              data.def_transfer = _CUPS_TRANSFER_LENGTH;
+              data.def_transfer = IPPTOOL_TRANSFER_LENGTH;
               break;
 
           case 'P' : /* Output to plist file */
@@ -344,7 +361,7 @@ main(int  argc,                             /* I - Number of command-line args */
                 exit(1);
               }
 
-             data.output = _CUPS_OUTPUT_PLIST;
+             data.output = IPPTOOL_OUTPUT_PLIST;
 
               if (interval || repeat)
              {
@@ -353,12 +370,15 @@ main(int  argc,                           /* I - Number of command-line args */
              }
               break;
 
+          case 'R' : /* Repeat on server-error-busy */
+              data.repeat_on_busy = 1;
+              break;
+
          case 'S' : /* Encrypt with SSL */
 #ifdef HAVE_SSL
              data.encryption = HTTP_ENCRYPT_ALWAYS;
 #else
-             _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."),
-                             argv[0]);
+             _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), "ipptool");
 #endif /* HAVE_SSL */
              break;
 
@@ -367,9 +387,7 @@ main(int  argc,                             /* I - Number of command-line args */
 
              if (i >= argc)
              {
-               _cupsLangPrintf(stderr,
-                               _("%s: Missing timeout for \"-T\"."),
-                               "ipptool");
+               _cupsLangPrintf(stderr, _("%s: Missing timeout for \"-T\"."), "ipptool");
                usage();
               }
 
@@ -381,9 +399,7 @@ main(int  argc,                             /* I - Number of command-line args */
 
              if (i >= argc)
              {
-               _cupsLangPrintf(stderr,
-                               _("%s: Missing version for \"-V\"."),
-                               "ipptool");
+               _cupsLangPrintf(stderr, _("%s: Missing version for \"-V\"."), "ipptool");
                usage();
               }
 
@@ -415,7 +431,7 @@ main(int  argc,                             /* I - Number of command-line args */
              break;
 
           case 'X' : /* Produce XML output */
-             data.output = _CUPS_OUTPUT_PLIST;
+             data.output = IPPTOOL_OUTPUT_PLIST;
 
               if (interval || repeat)
              {
@@ -425,7 +441,7 @@ main(int  argc,                             /* I - Number of command-line args */
              break;
 
           case 'c' : /* CSV output */
-              data.output = _CUPS_OUTPUT_CSV;
+              data.output = IPPTOOL_OUTPUT_CSV;
               break;
 
           case 'd' : /* Define a variable */
@@ -433,8 +449,7 @@ main(int  argc,                             /* I - Number of command-line args */
 
              if (i >= argc)
              {
-               _cupsLangPuts(stderr,
-                             _("ipptool: Missing name=value for \"-d\"."));
+               _cupsLangPuts(stderr, _("ipptool: Missing name=value for \"-d\"."));
                usage();
               }
 
@@ -444,7 +459,7 @@ main(int  argc,                             /* I - Number of command-line args */
              else
                value = name + strlen(name);
 
-             _ippVarsSet(&vars, name, value);
+             _ippVarsSet(data.vars, name, value);
              break;
 
           case 'f' : /* Set the default test filename */
@@ -452,8 +467,7 @@ main(int  argc,                             /* I - Number of command-line args */
 
              if (i >= argc)
              {
-               _cupsLangPuts(stderr,
-                             _("ipptool: Missing filename for \"-f\"."));
+               _cupsLangPuts(stderr, _("ipptool: Missing filename for \"-f\"."));
                usage();
               }
 
@@ -482,7 +496,7 @@ main(int  argc,                             /* I - Number of command-line args */
               else
                strlcpy(filename, argv[i], sizeof(filename));
 
-             _ippVarsSet(&vars, "filename", filename);
+             _ippVarsSet(data.vars, "filename", filename);
 
               if ((ext = strrchr(filename, '.')) != NULL)
               {
@@ -491,43 +505,43 @@ main(int  argc,                           /* I - Number of command-line args */
                 */
 
                 if (!_cups_strcasecmp(ext, ".gif"))
-                  _ippVarsSet(&vars, "filetype", "image/gif");
+                  _ippVarsSet(data.vars, "filetype", "image/gif");
                 else if (!_cups_strcasecmp(ext, ".htm") ||
                          !_cups_strcasecmp(ext, ".htm.gz") ||
                          !_cups_strcasecmp(ext, ".html") ||
                          !_cups_strcasecmp(ext, ".html.gz"))
-                  _ippVarsSet(&vars, "filetype", "text/html");
+                  _ippVarsSet(data.vars, "filetype", "text/html");
                 else if (!_cups_strcasecmp(ext, ".jpg") ||
                          !_cups_strcasecmp(ext, ".jpeg"))
-                  _ippVarsSet(&vars, "filetype", "image/jpeg");
+                  _ippVarsSet(data.vars, "filetype", "image/jpeg");
                 else if (!_cups_strcasecmp(ext, ".pcl") ||
                          !_cups_strcasecmp(ext, ".pcl.gz"))
-                  _ippVarsSet(&vars, "filetype", "application/vnd.hp-PCL");
+                  _ippVarsSet(data.vars, "filetype", "application/vnd.hp-PCL");
                 else if (!_cups_strcasecmp(ext, ".pdf"))
-                  _ippVarsSet(&vars, "filetype", "application/pdf");
+                  _ippVarsSet(data.vars, "filetype", "application/pdf");
                 else if (!_cups_strcasecmp(ext, ".png"))
-                  _ippVarsSet(&vars, "filetype", "image/png");
+                  _ippVarsSet(data.vars, "filetype", "image/png");
                 else if (!_cups_strcasecmp(ext, ".ps") ||
                          !_cups_strcasecmp(ext, ".ps.gz"))
-                  _ippVarsSet(&vars, "filetype", "application/postscript");
+                  _ippVarsSet(data.vars, "filetype", "application/postscript");
                 else if (!_cups_strcasecmp(ext, ".pwg") ||
                          !_cups_strcasecmp(ext, ".pwg.gz") ||
                          !_cups_strcasecmp(ext, ".ras") ||
                          !_cups_strcasecmp(ext, ".ras.gz"))
-                  _ippVarsSet(&vars, "filetype", "image/pwg-raster");
+                  _ippVarsSet(data.vars, "filetype", "image/pwg-raster");
                 else if (!_cups_strcasecmp(ext, ".tif") ||
                          !_cups_strcasecmp(ext, ".tiff"))
-                  _ippVarsSet(&vars, "filetype", "image/tiff");
+                  _ippVarsSet(data.vars, "filetype", "image/tiff");
                 else if (!_cups_strcasecmp(ext, ".txt") ||
                          !_cups_strcasecmp(ext, ".txt.gz"))
-                  _ippVarsSet(&vars, "filetype", "text/plain");
+                  _ippVarsSet(data.vars, "filetype", "text/plain");
                 else if (!_cups_strcasecmp(ext, ".urf") ||
                          !_cups_strcasecmp(ext, ".urf.gz"))
-                  _ippVarsSet(&vars, "filetype", "image/urf");
+                  _ippVarsSet(data.vars, "filetype", "image/urf");
                 else if (!_cups_strcasecmp(ext, ".xps"))
-                  _ippVarsSet(&vars, "filetype", "application/openxps");
+                  _ippVarsSet(data.vars, "filetype", "application/openxps");
                 else
-                 _ippVarsSet(&vars, "filetype", "application/octet-stream");
+                 _ippVarsSet(data.vars, "filetype", "application/octet-stream");
               }
               else
               {
@@ -535,7 +549,7 @@ main(int  argc,                             /* I - Number of command-line args */
                 * Use the "auto-type" MIME media type...
                 */
 
-               _ippVarsSet(&vars, "filetype", "application/octet-stream");
+               _ippVarsSet(data.vars, "filetype", "application/octet-stream");
               }
              break;
 
@@ -561,7 +575,7 @@ main(int  argc,                             /* I - Number of command-line args */
                }
               }
 
-              if ((data.output == _CUPS_OUTPUT_PLIST || data.output == _CUPS_OUTPUT_IPPSERVER) && interval)
+              if ((data.output == IPPTOOL_OUTPUT_PLIST || data.output == IPPTOOL_OUTPUT_IPPSERVER) && interval)
              {
                _cupsLangPuts(stderr, _("ipptool: \"-i\" and \"-n\" are incompatible with \"--ippserver\", \"-P\", and \"-X\"."));
                usage();
@@ -569,7 +583,7 @@ main(int  argc,                             /* I - Number of command-line args */
              break;
 
           case 'l' : /* List as a table */
-              data.output = _CUPS_OUTPUT_LIST;
+              data.output = IPPTOOL_OUTPUT_LIST;
               break;
 
           case 'n' : /* Repeat count */
@@ -583,7 +597,7 @@ main(int  argc,                             /* I - Number of command-line args */
              else
                repeat = atoi(argv[i]);
 
-              if ((data.output == _CUPS_OUTPUT_PLIST || data.output == _CUPS_OUTPUT_IPPSERVER) && repeat)
+              if ((data.output == IPPTOOL_OUTPUT_PLIST || data.output == IPPTOOL_OUTPUT_IPPSERVER) && repeat)
              {
                _cupsLangPuts(stderr, _("ipptool: \"-i\" and \"-n\" are incompatible with \"--ippserver\", \"-P\", and \"-X\"."));
                usage();
@@ -591,11 +605,11 @@ main(int  argc,                           /* I - Number of command-line args */
              break;
 
           case 'q' : /* Be quiet */
-              data.output = _CUPS_OUTPUT_QUIET;
+              data.output = IPPTOOL_OUTPUT_QUIET;
               break;
 
           case 't' : /* CUPS test output */
-              data.output = _CUPS_OUTPUT_TEST;
+              data.output = IPPTOOL_OUTPUT_TEST;
               break;
 
           case 'v' : /* Be verbose */
@@ -618,7 +632,7 @@ main(int  argc,                             /* I - Number of command-line args */
       * Set URI...
       */
 
-      if (vars.uri)
+      if (data.vars->uri)
       {
         _cupsLangPuts(stderr, _("ipptool: May only specify a single URI."));
         usage();
@@ -629,14 +643,14 @@ main(int  argc,                           /* I - Number of command-line args */
         data.encryption = HTTP_ENCRYPT_ALWAYS;
 #endif /* HAVE_SSL */
 
-      if (!_ippVarsSet(&vars, "uri", argv[i]))
+      if (!_ippVarsSet(data.vars, "uri", argv[i]))
       {
         _cupsLangPrintf(stderr, _("ipptool: Bad URI \"%s\"."), argv[i]);
         return (1);
       }
 
-      if (vars.username[0] && vars.password)
-       cupsSetPasswordCB2(_ippVarsPasswordCB, &vars);
+      if (data.vars->username[0] && data.vars->password)
+       cupsSetPasswordCB2(_ippVarsPasswordCB, data.vars);
     }
     else
     {
@@ -644,7 +658,7 @@ main(int  argc,                             /* I - Number of command-line args */
       * Run test...
       */
 
-      if (!vars.uri)
+      if (!data.vars->uri)
       {
         _cupsLangPuts(stderr, _("ipptool: URI required before test file."));
         _cupsLangPuts(stderr, argv[i]);
@@ -666,26 +680,26 @@ main(int  argc,                           /* I - Number of command-line args */
       else
         testfile = argv[i];
 
-      if (!do_tests(testfile, &vars, &data))
+      if (!do_tests(testfile, &data))
         status = 1;
     }
   }
 
-  if (!vars.uri || !testfile)
+  if (!data.vars->uri || !testfile)
     usage();
 
  /*
   * Loop if the interval is set...
   */
 
-  if (data.output == _CUPS_OUTPUT_PLIST)
+  if (data.output == IPPTOOL_OUTPUT_PLIST)
     print_xml_trailer(&data, !status, NULL);
   else if (interval > 0 && repeat > 0)
   {
     while (repeat > 1)
     {
       usleep((useconds_t)interval);
-      do_tests(testfile, &vars, &data);
+      do_tests(testfile, &data);
       repeat --;
     }
   }
@@ -694,11 +708,11 @@ main(int  argc,                           /* I - Number of command-line args */
     for (;;)
     {
       usleep((useconds_t)interval);
-      do_tests(testfile, &vars, &data);
+      do_tests(testfile, &data);
     }
   }
 
-  if ((data.output == _CUPS_OUTPUT_TEST || (data.output == _CUPS_OUTPUT_PLIST && data.outfile)) && data.test_count > 1)
+  if ((data.output == IPPTOOL_OUTPUT_TEST || (data.output == IPPTOOL_OUTPUT_PLIST && data.outfile)) && data.test_count > 1)
   {
    /*
     * Show a summary report if there were multiple tests...
@@ -709,7 +723,7 @@ main(int  argc,                             /* I - Number of command-line args */
 
   cupsFileClose(data.outfile);
 
-/*
+ /*
   * Exit...
   */
 
@@ -881,21 +895,277 @@ copy_hex_string(char          *buffer,   /* I - String buffer */
 }
 
 
+/*
+ * 'do_monitor_printer_state()' - Do the MONITOR-PRINTER-STATE tests in the background.
+ */
+
+static void *                          // O - Thread exit status
+do_monitor_printer_state(
+    ipptool_test_t *data)              // I - Test data
+{
+  int          i;                      // Looping var
+  char         scheme[32],             // URI scheme
+               userpass[32],           // URI username:password
+               host[256],              // URI hostname/IP address
+               resource[256];          // URI resource path
+  int          port;                   // URI port number
+  http_encryption_t encryption;                // Encryption to use
+  http_t       *http;                  // Connection to printer
+  ipp_t                *request,               // IPP request
+               *response = NULL;       // IPP response
+  http_status_t        status;                 // Request status
+  ipp_attribute_t *found;              // Found attribute
+  ipptool_expect_t *expect;            // Current EXPECT test
+  char         buffer[131072];         // Copy buffer
+  static const char *pattrs[] =                // List of attributes we care about
+  {
+    "marker-change-time",              // "marker-xxx" are a CUPS/AirPrint extension
+    "marker-colors",
+    "marker-high-levels",
+    "marker-levels",
+    "marker-low-levels",
+    "marker-message",
+    "marker-names",
+    "marker-types",
+    "printer-alert",
+    "printer-alert-description",
+    "printer-config-change-date-time",
+    "printer-config-change-time",
+    "printer-config-changes",
+    "printer-current-time",
+    "printer-finisher",
+    "printer-finisher-description",
+    "printer-finisher-supplies",
+    "printer-finisher-supplies-description",
+    "printer-impressions-completed",
+    "printer-impressions-completed-col",
+    "printer-input-tray",
+    "printer-is-accepting-jobs",
+    "printer-media-sheets-completed",
+    "printer-media-sheets-completed-col",
+    "printer-message-date-time",
+    "printer-message-from-operator",
+    "printer-message-time",
+    "printer-output-tray",
+    "printer-pages-completed",
+    "printer-pages-completed-col",
+    "printer-state",
+    "printer-state-change-date-time",
+    "printer-state-change-time",
+    "printer-state-reasons",
+    "printer-supply",
+    "printer-supply-description",
+    "printer-up-time",
+    "queued-job-count"
+  };
+
+
+  // Connect to the printer...
+  if (httpSeparateURI(HTTP_URI_CODING_ALL, data->monitor_uri, scheme, sizeof(scheme), userpass, sizeof(userpass), host, sizeof(host), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK)
+  {
+    print_fatal_error(data, "Bad printer URI \"%s\".", data->monitor_uri);
+    return (NULL);
+  }
+
+  if (!_cups_strcasecmp(scheme, "https") || !_cups_strcasecmp(scheme, "ipps") || port == 443)
+    encryption = HTTP_ENCRYPTION_ALWAYS;
+  else
+    encryption = data->encryption;
+
+  if ((http = httpConnect2(host, port, NULL, data->family, encryption, 1, 30000, NULL)) == NULL)
+  {
+    print_fatal_error(data, "Unable to connect to \"%s\" on port %d - %s", host, port, cupsLastErrorString());
+    return (0);
+  }
+
+#ifdef HAVE_LIBZ
+  httpSetDefaultField(http, HTTP_FIELD_ACCEPT_ENCODING, "deflate, gzip, identity");
+#else
+  httpSetDefaultField(http, HTTP_FIELD_ACCEPT_ENCODING, "identity");
+#endif /* HAVE_LIBZ */
+
+  if (data->timeout > 0.0)
+    httpSetTimeout(http, data->timeout, timeout_cb, NULL);
+
+  // Wait for the initial delay as needed...
+  if (data->monitor_delay)
+    usleep(data->monitor_delay);
+
+  // Create a query request that we'll reuse...
+  request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES);
+  ippSetVersion(request, data->version / 10, data->version % 10);
+  ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, data->monitor_uri);
+  ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser());
+  ippAddStrings(request, IPP_TAG_OPERATION, IPP_CONST_TAG(IPP_TAG_KEYWORD), "requested-attributes", (int)(sizeof(pattrs) / sizeof(pattrs[0])), NULL, pattrs);
+
+  // Loop until we need to stop...
+  while (!data->monitor_done && !Cancel)
+  {
+    // Poll the printer state...
+    if ((status = cupsSendRequest(http, request, resource, ippLength(request))) != HTTP_STATUS_ERROR)
+    {
+      response = cupsGetResponse(http, resource);
+      status   = httpGetStatus(http);
+    }
+
+    if (!data->monitor_done && !Cancel && status == HTTP_STATUS_ERROR && httpError(data->http) != EINVAL &&
+#ifdef _WIN32
+       httpError(data->http) != WSAETIMEDOUT)
+#else
+       httpError(data->http) != ETIMEDOUT)
+#endif // _WIN32
+    {
+      if (httpReconnect2(http, 30000, NULL))
+       break;
+    }
+    else if (status == HTTP_STATUS_ERROR || status == HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED)
+    {
+      break;
+    }
+    else if (status != HTTP_STATUS_OK)
+    {
+      httpFlush(http);
+
+      if (status == HTTP_STATUS_UNAUTHORIZED)
+       continue;
+
+      break;
+    }
+
+    for (i = data->num_monitor_expects, expect = data->monitor_expects; i > 0; i --, expect ++)
+    {
+      if (expect->if_defined && !_ippVarsGet(data->vars, expect->if_defined))
+       continue;
+
+      if (expect->if_not_defined && _ippVarsGet(data->vars, expect->if_not_defined))
+       continue;
+
+      found = ippFindAttribute(response, expect->name, IPP_TAG_ZERO);
+
+      if ((found && expect->not_expect) ||
+         (!found && !(expect->not_expect || expect->optional)) ||
+         (found && !expect_matches(expect, found)) ||
+         (expect->in_group && ippGetGroupTag(found) != expect->in_group) ||
+         (expect->with_distinct && !with_distinct_values(NULL, found)))
+      {
+       if (expect->define_no_match)
+       {
+         _ippVarsSet(data->vars, expect->define_no_match, "1");
+         data->monitor_done = 1;
+       }
+       break;
+      }
+
+      if (found)
+       ippAttributeString(found, buffer, sizeof(buffer));
+
+      if (found && !with_value(data, NULL, expect->with_value, expect->with_flags, found, buffer, sizeof(buffer)))
+      {
+       if (expect->define_no_match)
+       {
+         _ippVarsSet(data->vars, expect->define_no_match, "1");
+         data->monitor_done = 1;
+       }
+       break;
+      }
+
+      if (found && expect->count > 0 && ippGetCount(found) != expect->count)
+      {
+       if (expect->define_no_match)
+       {
+         _ippVarsSet(data->vars, expect->define_no_match, "1");
+         data->monitor_done = 1;
+       }
+       break;
+      }
+
+      if (found && expect->define_match)
+      {
+       _ippVarsSet(data->vars, expect->define_match, "1");
+       data->monitor_done = 1;
+      }
+
+      if (found && expect->define_value)
+      {
+       if (!expect->with_value)
+       {
+         int last = ippGetCount(found) - 1;
+                                       // Last element in attribute
+
+         switch (ippGetValueTag(found))
+         {
+           case IPP_TAG_ENUM :
+           case IPP_TAG_INTEGER :
+               snprintf(buffer, sizeof(buffer), "%d", ippGetInteger(found, last));
+               break;
+
+           case IPP_TAG_BOOLEAN :
+               if (ippGetBoolean(found, last))
+                 strlcpy(buffer, "true", sizeof(buffer));
+               else
+                 strlcpy(buffer, "false", sizeof(buffer));
+               break;
+
+           case IPP_TAG_CHARSET :
+           case IPP_TAG_KEYWORD :
+           case IPP_TAG_LANGUAGE :
+           case IPP_TAG_MIMETYPE :
+           case IPP_TAG_NAME :
+           case IPP_TAG_NAMELANG :
+           case IPP_TAG_TEXT :
+           case IPP_TAG_TEXTLANG :
+           case IPP_TAG_URI :
+           case IPP_TAG_URISCHEME :
+               strlcpy(buffer, ippGetString(found, last, NULL), sizeof(buffer));
+               break;
+
+           default :
+               ippAttributeString(found, buffer, sizeof(buffer));
+               break;
+         }
+       }
+
+       _ippVarsSet(data->vars, expect->define_value, buffer);
+       data->monitor_done = 1;
+      }
+    }
+
+    if (i == 0)
+      data->monitor_done = 1;          // All tests passed
+
+    ippDelete(response);
+    response = NULL;
+
+    // Sleep between requests...
+    if (data->monitor_done || Cancel)
+      break;
+
+    usleep(data->monitor_interval);
+  }
+
+  // Close the connection to the printer and return...
+  httpClose(http);
+  ippDelete(request);
+  ippDelete(response);
+
+  return (NULL);
+}
+
+
 /*
  * 'do_test()' - Do a single test from the test file.
  */
 
 static int                             /* O - 1 on success, 0 on failure */
-do_test(_ipp_file_t      *f,           /* I - IPP data file */
-        _ipp_vars_t      *vars,                /* I - IPP variables */
-        _cups_testdata_t *data)                /* I - Test data */
+do_test(_ipp_file_t    *f,             /* I - IPP data file */
+        ipptool_test_t *data)          /* I - Test data */
 
 {
   int          i,                      /* Looping var */
                status_ok,              /* Did we get a matching status? */
                repeat_count = 0,       /* Repeat count */
                repeat_test;            /* Repeat the test? */
-  _cups_expect_t *expect;              /* Current expected attribute */
+  ipptool_expect_t *expect;            /* Current expected attribute */
   ipp_t                *request,               /* IPP request */
                *response;              /* IPP response */
   size_t       length;                 /* Length of IPP request */
@@ -915,6 +1185,25 @@ do_test(_ipp_file_t      *f,              /* I - IPP data file */
   if (Cancel)
     return (0);
 
+ /*
+  * Show any PAUSE message, as needed...
+  */
+
+  if (data->pause[0])
+  {
+    if (!data->skip_test)
+      pause_message(data->pause);
+
+    data->pause[0] = '\0';
+  }
+
+ /*
+  * Start the background thread as needed...
+  */
+
+  if (data->monitor_uri)
+    data->monitor_thread = _cupsThreadCreate((_cups_thread_func_t)do_monitor_printer_state, data);
+
  /*
   * Take over control of the attributes in the request...
   */
@@ -931,7 +1220,7 @@ do_test(_ipp_file_t      *f,               /* I - IPP data file */
   ippSetVersion(request, data->version / 10, data->version % 10);
   ippSetRequestId(request, data->request_id);
 
-  if (data->output == _CUPS_OUTPUT_PLIST)
+  if (data->output == IPPTOOL_OUTPUT_PLIST)
   {
     cupsFilePuts(data->outfile, "<dict>\n");
     cupsFilePuts(data->outfile, "<key>Name</key>\n");
@@ -964,14 +1253,14 @@ do_test(_ipp_file_t      *f,             /* I - IPP data file */
     cupsFilePuts(data->outfile, "</array>\n");
   }
 
-  if (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout()))
+  if (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout()))
   {
     if (data->verbosity)
     {
       cupsFilePrintf(cupsFileStdout(), "    %s:\n", ippOpString(ippGetOperation(request)));
 
       for (attrptr = ippFirstAttribute(request); attrptr; attrptr = ippNextAttribute(request))
-       print_attr(cupsFileStdout(), _CUPS_OUTPUT_TEST, attrptr, NULL);
+       print_attr(cupsFileStdout(), IPPTOOL_OUTPUT_TEST, attrptr, NULL);
     }
 
     cupsFilePrintf(cupsFileStdout(), "    %-68.68s [", data->name);
@@ -985,7 +1274,7 @@ do_test(_ipp_file_t      *f,               /* I - IPP data file */
     request  = NULL;
     response = NULL;
 
-    if (data->output == _CUPS_OUTPUT_PLIST)
+    if (data->output == IPPTOOL_OUTPUT_PLIST)
     {
       cupsFilePuts(data->outfile, "<key>Successful</key>\n");
       cupsFilePuts(data->outfile, "<true />\n");
@@ -997,13 +1286,13 @@ do_test(_ipp_file_t      *f,             /* I - IPP data file */
       cupsFilePuts(data->outfile, "<dict />\n");
     }
 
-    if (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout()))
+    if (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout()))
       cupsFilePuts(cupsFileStdout(), "SKIP]\n");
 
     goto skip_error;
   }
 
-  vars->password_tries = 0;
+  data->vars->password_tries = 0;
 
   do
   {
@@ -1015,7 +1304,7 @@ do_test(_ipp_file_t      *f,              /* I - IPP data file */
 
     status = HTTP_STATUS_OK;
 
-    if (data->transfer == _CUPS_TRANSFER_CHUNKED || (data->transfer == _CUPS_TRANSFER_AUTO && data->file[0]))
+    if (data->transfer == IPPTOOL_TRANSFER_CHUNKED || (data->transfer == IPPTOOL_TRANSFER_AUTO && data->file[0]))
     {
      /*
       * Send request using chunking - a 0 length means "chunk".
@@ -1056,6 +1345,8 @@ do_test(_ipp_file_t      *f,              /* I - IPP data file */
     {
       while (!response && !Cancel && data->prev_pass)
       {
+        ippSetRequestId(request, ++ data->request_id);
+
        status = cupsSendRequest(data->http, request, data->resource, length);
 
 #ifdef HAVE_LIBZ
@@ -1185,16 +1476,16 @@ do_test(_ipp_file_t      *f,            /* I - IPP data file */
       if ((attrptr = ippFindAttribute(response, "job-id", IPP_TAG_INTEGER)) != NULL)
       {
        snprintf(temp, sizeof(temp), "%d", ippGetInteger(attrptr, 0));
-       _ippVarsSet(vars, "job-id", temp);
+       _ippVarsSet(data->vars, "job-id", temp);
       }
 
       if ((attrptr = ippFindAttribute(response, "job-uri", IPP_TAG_URI)) != NULL)
-       _ippVarsSet(vars, "job-uri", ippGetString(attrptr, 0, NULL));
+       _ippVarsSet(data->vars, "job-uri", ippGetString(attrptr, 0, NULL));
 
       if ((attrptr = ippFindAttribute(response, "notify-subscription-id", IPP_TAG_INTEGER)) != NULL)
       {
        snprintf(temp, sizeof(temp), "%d", ippGetInteger(attrptr, 0));
-       _ippVarsSet(vars, "notify-subscription-id", temp);
+       _ippVarsSet(data->vars, "notify-subscription-id", temp);
       }
 
      /*
@@ -1212,27 +1503,27 @@ do_test(_ipp_file_t      *f,            /* I - IPP data file */
         major = ippGetVersion(response, &minor);
 
         if (major != (data->version / 10) || minor != (data->version % 10))
-         add_stringf(data->errors, "Bad version %d.%d in response - expected %d.%d (RFC 2911 section 3.1.8).", major, minor, data->version / 10, data->version % 10);
+         add_stringf(data->errors, "Bad version %d.%d in response - expected %d.%d (RFC 8011 section 4.1.8).", major, minor, data->version / 10, data->version % 10);
       }
 
       if (ippGetRequestId(response) != data->request_id)
-       add_stringf(data->errors, "Bad request ID %d in response - expected %d (RFC 2911 section 3.1.1)", ippGetRequestId(response), data->request_id);
+       add_stringf(data->errors, "Bad request ID %d in response - expected %d (RFC 8011 section 4.1.1)", ippGetRequestId(response), data->request_id);
 
       attrptr = ippFirstAttribute(response);
       if (!attrptr)
       {
-       add_stringf(data->errors, "Missing first attribute \"attributes-charset (charset)\" in group operation-attributes-tag (RFC 2911 section 3.1.4).");
+       add_stringf(data->errors, "Missing first attribute \"attributes-charset (charset)\" in group operation-attributes-tag (RFC 8011 section 4.1.4).");
       }
       else
       {
        if (!ippGetName(attrptr) || ippGetValueTag(attrptr) != IPP_TAG_CHARSET || ippGetGroupTag(attrptr) != IPP_TAG_OPERATION || ippGetCount(attrptr) != 1 ||strcmp(ippGetName(attrptr), "attributes-charset"))
-         add_stringf(data->errors, "Bad first attribute \"%s (%s%s)\" in group %s, expected \"attributes-charset (charset)\" in group operation-attributes-tag (RFC 2911 section 3.1.4).", ippGetName(attrptr) ? ippGetName(attrptr) : "(null)", ippGetCount(attrptr) > 1 ? "1setOf " : "", ippTagString(ippGetValueTag(attrptr)), ippTagString(ippGetGroupTag(attrptr)));
+         add_stringf(data->errors, "Bad first attribute \"%s (%s%s)\" in group %s, expected \"attributes-charset (charset)\" in group operation-attributes-tag (RFC 8011 section 4.1.4).", ippGetName(attrptr) ? ippGetName(attrptr) : "(null)", ippGetCount(attrptr) > 1 ? "1setOf " : "", ippTagString(ippGetValueTag(attrptr)), ippTagString(ippGetGroupTag(attrptr)));
 
        attrptr = ippNextAttribute(response);
        if (!attrptr)
-         add_stringf(data->errors, "Missing second attribute \"attributes-natural-language (naturalLanguage)\" in group operation-attributes-tag (RFC 2911 section 3.1.4).");
+         add_stringf(data->errors, "Missing second attribute \"attributes-natural-language (naturalLanguage)\" in group operation-attributes-tag (RFC 8011 section 4.1.4).");
        else if (!ippGetName(attrptr) || ippGetValueTag(attrptr) != IPP_TAG_LANGUAGE || ippGetGroupTag(attrptr) != IPP_TAG_OPERATION || ippGetCount(attrptr) != 1 || strcmp(ippGetName(attrptr), "attributes-natural-language"))
-         add_stringf(data->errors, "Bad first attribute \"%s (%s%s)\" in group %s, expected \"attributes-natural-language (naturalLanguage)\" in group operation-attributes-tag (RFC 2911 section 3.1.4).", ippGetName(attrptr) ? ippGetName(attrptr) : "(null)", ippGetCount(attrptr) > 1 ? "1setOf " : "", ippTagString(ippGetValueTag(attrptr)), ippTagString(ippGetGroupTag(attrptr)));
+         add_stringf(data->errors, "Bad first attribute \"%s (%s%s)\" in group %s, expected \"attributes-natural-language (naturalLanguage)\" in group operation-attributes-tag (RFC 8011 section 4.1.4).", ippGetName(attrptr) ? ippGetName(attrptr) : "(null)", ippGetCount(attrptr) > 1 ? "1setOf " : "", ippTagString(ippGetValueTag(attrptr)), ippTagString(ippGetGroupTag(attrptr)));
       }
 
       if ((attrptr = ippFindAttribute(response, "status-message", IPP_TAG_ZERO)) != NULL)
@@ -1241,13 +1532,13 @@ do_test(_ipp_file_t      *f,            /* I - IPP data file */
                                                /* String value */
 
        if (ippGetValueTag(attrptr) != IPP_TAG_TEXT)
-         add_stringf(data->errors, "status-message (text(255)) has wrong value tag %s (RFC 2911 section 3.1.6.2).", ippTagString(ippGetValueTag(attrptr)));
+         add_stringf(data->errors, "status-message (text(255)) has wrong value tag %s (RFC 8011 section 4.1.6.2).", ippTagString(ippGetValueTag(attrptr)));
        if (ippGetGroupTag(attrptr) != IPP_TAG_OPERATION)
-         add_stringf(data->errors, "status-message (text(255)) has wrong group tag %s (RFC 2911 section 3.1.6.2).", ippTagString(ippGetGroupTag(attrptr)));
+         add_stringf(data->errors, "status-message (text(255)) has wrong group tag %s (RFC 8011 section 4.1.6.2).", ippTagString(ippGetGroupTag(attrptr)));
        if (ippGetCount(attrptr) != 1)
-         add_stringf(data->errors, "status-message (text(255)) has %d values (RFC 2911 section 3.1.6.2).", ippGetCount(attrptr));
+         add_stringf(data->errors, "status-message (text(255)) has %d values (RFC 8011 section 4.1.6.2).", ippGetCount(attrptr));
        if (status_message && strlen(status_message) > 255)
-         add_stringf(data->errors, "status-message (text(255)) has bad length %d (RFC 2911 section 3.1.6.2).", (int)strlen(status_message));
+         add_stringf(data->errors, "status-message (text(255)) has bad length %d (RFC 8011 section 4.1.6.2).", (int)strlen(status_message));
       }
 
       if ((attrptr = ippFindAttribute(response, "detailed-status-message",
@@ -1257,25 +1548,13 @@ do_test(_ipp_file_t      *f,            /* I - IPP data file */
                                                /* String value */
 
        if (ippGetValueTag(attrptr) != IPP_TAG_TEXT)
-         add_stringf(data->errors,
-                     "detailed-status-message (text(MAX)) has wrong "
-                     "value tag %s (RFC 2911 section 3.1.6.3).",
-                     ippTagString(ippGetValueTag(attrptr)));
+         add_stringf(data->errors, "detailed-status-message (text(MAX)) has wrong value tag %s (RFC 8011 section 4.1.6.3).", ippTagString(ippGetValueTag(attrptr)));
        if (ippGetGroupTag(attrptr) != IPP_TAG_OPERATION)
-         add_stringf(data->errors,
-                     "detailed-status-message (text(MAX)) has wrong "
-                     "group tag %s (RFC 2911 section 3.1.6.3).",
-                     ippTagString(ippGetGroupTag(attrptr)));
+         add_stringf(data->errors, "detailed-status-message (text(MAX)) has wrong group tag %s (RFC 8011 section 4.1.6.3).", ippTagString(ippGetGroupTag(attrptr)));
        if (ippGetCount(attrptr) != 1)
-         add_stringf(data->errors,
-                     "detailed-status-message (text(MAX)) has %d values"
-                     " (RFC 2911 section 3.1.6.3).",
-                     ippGetCount(attrptr));
+         add_stringf(data->errors, "detailed-status-message (text(MAX)) has %d values (RFC 8011 section 4.1.6.3).", ippGetCount(attrptr));
        if (detailed_status_message && strlen(detailed_status_message) > 1023)
-         add_stringf(data->errors,
-                     "detailed-status-message (text(MAX)) has bad "
-                     "length %d (RFC 2911 section 3.1.6.3).",
-                     (int)strlen(detailed_status_message));
+         add_stringf(data->errors, "detailed-status-message (text(MAX)) has bad length %d (RFC 8011 section 4.1.6.3).", (int)strlen(detailed_status_message));
       }
 
       a = cupsArrayNew((cups_array_func_t)strcmp, NULL);
@@ -1321,9 +1600,7 @@ do_test(_ipp_file_t      *f,              /* I - IPP data file */
          }
 
          if (out_of_order)
-           add_stringf(data->errors, "Attribute groups out of order (%s < %s)",
-                       ippTagString(ippGetGroupTag(attrptr)),
-                       ippTagString(group));
+           add_stringf(data->errors, "Attribute groups out of order (%s < %s)", ippTagString(ippGetGroupTag(attrptr)), ippTagString(group));
 
          if (ippGetGroupTag(attrptr) != IPP_TAG_ZERO)
            group = ippGetGroupTag(attrptr);
@@ -1334,9 +1611,8 @@ do_test(_ipp_file_t      *f,              /* I - IPP data file */
 
        if (ippGetName(attrptr))
        {
-         if (cupsArrayFind(a, (void *)ippGetName(attrptr)) && data->output < _CUPS_OUTPUT_LIST)
-           add_stringf(data->errors, "Duplicate \"%s\" attribute in %s group",
-                       ippGetName(attrptr), ippTagString(group));
+         if (cupsArrayFind(a, (void *)ippGetName(attrptr)) && data->output < IPPTOOL_OUTPUT_LIST)
+           add_stringf(data->errors, "Duplicate \"%s\" attribute in %s group", ippGetName(attrptr), ippTagString(group));
 
          cupsArrayAdd(a, (void *)ippGetName(attrptr));
        }
@@ -1349,14 +1625,21 @@ do_test(_ipp_file_t      *f,            /* I - IPP data file */
       * values...
       */
 
+      if (ippGetStatusCode(response) == IPP_STATUS_ERROR_BUSY && data->repeat_on_busy)
+      {
+        // Repeat on a server-error-busy status code...
+        status_ok   = 1;
+        repeat_test = 1;
+      }
+
       for (i = 0, status_ok = 0; i < data->num_statuses; i ++)
       {
        if (data->statuses[i].if_defined &&
-           !_ippVarsGet(vars, data->statuses[i].if_defined))
+           !_ippVarsGet(data->vars, data->statuses[i].if_defined))
          continue;
 
        if (data->statuses[i].if_not_defined &&
-           _ippVarsGet(vars, data->statuses[i].if_not_defined))
+           _ippVarsGet(data->vars, data->statuses[i].if_not_defined))
          continue;
 
        if (ippGetStatusCode(response) == data->statuses[i].status)
@@ -1367,7 +1650,7 @@ do_test(_ipp_file_t      *f,              /* I - IPP data file */
            repeat_test = 1;
 
          if (data->statuses[i].define_match)
-           _ippVarsSet(vars, data->statuses[i].define_match, "1");
+           _ippVarsSet(data->vars, data->statuses[i].define_match, "1");
        }
        else
        {
@@ -1376,7 +1659,7 @@ do_test(_ipp_file_t      *f,              /* I - IPP data file */
 
          if (data->statuses[i].define_no_match)
          {
-           _ippVarsSet(vars, data->statuses[i].define_no_match, "1");
+           _ippVarsSet(data->vars, data->statuses[i].define_no_match, "1");
            status_ok = 1;
          }
        }
@@ -1387,21 +1670,18 @@ do_test(_ipp_file_t      *f,            /* I - IPP data file */
        for (i = 0; i < data->num_statuses; i ++)
        {
          if (data->statuses[i].if_defined &&
-             !_ippVarsGet(vars, data->statuses[i].if_defined))
+             !_ippVarsGet(data->vars, data->statuses[i].if_defined))
            continue;
 
          if (data->statuses[i].if_not_defined &&
-             _ippVarsGet(vars, data->statuses[i].if_not_defined))
+             _ippVarsGet(data->vars, data->statuses[i].if_not_defined))
            continue;
 
          if (!data->statuses[i].repeat_match || repeat_count >= data->statuses[i].repeat_limit)
-           add_stringf(data->errors, "EXPECTED: STATUS %s (got %s)",
-                       ippErrorString(data->statuses[i].status),
-                       ippErrorString(cupsLastError()));
+           add_stringf(data->errors, "EXPECTED: STATUS %s (got %s)", ippErrorString(data->statuses[i].status), ippErrorString(cupsLastError()));
        }
 
-       if ((attrptr = ippFindAttribute(response, "status-message",
-                                       IPP_TAG_TEXT)) != NULL)
+       if ((attrptr = ippFindAttribute(response, "status-message", IPP_TAG_TEXT)) != NULL)
          add_stringf(data->errors, "status-message=\"%s\"", ippGetString(attrptr, 0, NULL));
       }
 
@@ -1409,11 +1689,11 @@ do_test(_ipp_file_t      *f,            /* I - IPP data file */
       {
        ipp_attribute_t *group_found;   /* Found parent attribute for group tests */
 
-       if (expect->if_defined && !_ippVarsGet(vars, expect->if_defined))
+       if (expect->if_defined && !_ippVarsGet(data->vars, expect->if_defined))
          continue;
 
        if (expect->if_not_defined &&
-           _ippVarsGet(vars, expect->if_not_defined))
+           _ippVarsGet(data->vars, expect->if_not_defined))
          continue;
 
        if ((found = ippFindAttribute(response, expect->name, IPP_TAG_ZERO)) != NULL && expect->in_group && expect->in_group != ippGetGroupTag(found))
@@ -1441,11 +1721,12 @@ do_test(_ipp_file_t      *f,            /* I - IPP data file */
 
          if ((found && expect->not_expect) ||
              (!found && !(expect->not_expect || expect->optional)) ||
-             (found && !expect_matches(expect, ippGetValueTag(found))) ||
-             (group_found && expect->in_group && ippGetGroupTag(group_found) != expect->in_group))
+             (found && !expect_matches(expect, found)) ||
+             (group_found && expect->in_group && ippGetGroupTag(group_found) != expect->in_group) ||
+             (expect->with_distinct && !with_distinct_values(NULL, found)))
          {
            if (expect->define_no_match)
-             _ippVarsSet(vars, expect->define_no_match, "1");
+             _ippVarsSet(data->vars, expect->define_no_match, "1");
            else if (!expect->define_match && !expect->define_value)
            {
              if (found && expect->not_expect && !expect->with_value && !expect->with_value_from)
@@ -1454,7 +1735,7 @@ do_test(_ipp_file_t      *f,              /* I - IPP data file */
                add_stringf(data->errors, "EXPECTED: %s", expect->name);
              else if (found)
              {
-               if (!expect_matches(expect, ippGetValueTag(found)))
+               if (!expect_matches(expect, found))
                  add_stringf(data->errors, "EXPECTED: %s OF-TYPE %s (got %s)",
                              expect->name, expect->of_type,
                              ippTagString(ippGetValueTag(found)));
@@ -1463,6 +1744,9 @@ do_test(_ipp_file_t      *f,              /* I - IPP data file */
                  add_stringf(data->errors, "EXPECTED: %s IN-GROUP %s (got %s).",
                              expect->name, ippTagString(expect->in_group),
                              ippTagString(ippGetGroupTag(group_found)));
+
+                if (expect->with_distinct)
+                  with_distinct_values(data->errors, found);
              }
            }
 
@@ -1477,7 +1761,7 @@ do_test(_ipp_file_t      *f,              /* I - IPP data file */
          if (found && expect->with_value_from && !with_value_from(NULL, ippFindAttribute(response, expect->with_value_from, IPP_TAG_ZERO), found, buffer, sizeof(buffer)))
          {
            if (expect->define_no_match)
-             _ippVarsSet(vars, expect->define_no_match, "1");
+             _ippVarsSet(data->vars, expect->define_no_match, "1");
            else if (!expect->define_match && !expect->define_value && ((!expect->repeat_match && !expect->repeat_no_match) || repeat_count >= expect->repeat_limit))
            {
              add_stringf(data->errors, "EXPECTED: %s WITH-VALUES-FROM %s", expect->name, expect->with_value_from);
@@ -1493,11 +1777,11 @@ do_test(_ipp_file_t      *f,            /* I - IPP data file */
          else if (found && !with_value(data, NULL, expect->with_value, expect->with_flags, found, buffer, sizeof(buffer)))
          {
            if (expect->define_no_match)
-             _ippVarsSet(vars, expect->define_no_match, "1");
+             _ippVarsSet(data->vars, expect->define_no_match, "1");
            else if (!expect->define_match && !expect->define_value &&
                     !expect->repeat_match && (!expect->repeat_no_match || repeat_count >= expect->repeat_limit))
            {
-             if (expect->with_flags & _CUPS_WITH_REGEX)
+             if (expect->with_flags & IPPTOOL_WITH_REGEX)
                add_stringf(data->errors, "EXPECTED: %s %s /%s/", expect->name, with_flags_string(expect->with_flags), expect->with_value);
              else
                add_stringf(data->errors, "EXPECTED: %s %s \"%s\"", expect->name, with_flags_string(expect->with_flags), expect->with_value);
@@ -1515,11 +1799,10 @@ do_test(_ipp_file_t      *f,            /* I - IPP data file */
          if (found && expect->count > 0 && ippGetCount(found) != expect->count)
          {
            if (expect->define_no_match)
-             _ippVarsSet(vars, expect->define_no_match, "1");
+             _ippVarsSet(data->vars, expect->define_no_match, "1");
            else if (!expect->define_match && !expect->define_value)
            {
-             add_stringf(data->errors, "EXPECTED: %s COUNT %d (got %d)", expect->name,
-                         expect->count, ippGetCount(found));
+             add_stringf(data->errors, "EXPECTED: %s COUNT %d (got %d)", expect->name, expect->count, ippGetCount(found));
            }
 
            if (expect->repeat_no_match &&
@@ -1537,19 +1820,13 @@ do_test(_ipp_file_t      *f,            /* I - IPP data file */
            if (!attrptr || ippGetCount(attrptr) != ippGetCount(found))
            {
              if (expect->define_no_match)
-               _ippVarsSet(vars, expect->define_no_match, "1");
+               _ippVarsSet(data->vars, expect->define_no_match, "1");
              else if (!expect->define_match && !expect->define_value)
              {
                if (!attrptr)
-                 add_stringf(data->errors,
-                             "EXPECTED: %s (%d values) SAME-COUNT-AS %s "
-                             "(not returned)", expect->name,
-                             ippGetCount(found), expect->same_count_as);
+                 add_stringf(data->errors, "EXPECTED: %s (%d values) SAME-COUNT-AS %s (not returned)", expect->name, ippGetCount(found), expect->same_count_as);
                else if (ippGetCount(attrptr) != ippGetCount(found))
-                 add_stringf(data->errors,
-                             "EXPECTED: %s (%d values) SAME-COUNT-AS %s "
-                             "(%d values)", expect->name, ippGetCount(found),
-                             expect->same_count_as, ippGetCount(attrptr));
+                 add_stringf(data->errors, "EXPECTED: %s (%d values) SAME-COUNT-AS %s (%d values)", expect->name, ippGetCount(found), expect->same_count_as, ippGetCount(attrptr));
              }
 
              if (expect->repeat_no_match &&
@@ -1561,7 +1838,7 @@ do_test(_ipp_file_t      *f,              /* I - IPP data file */
          }
 
          if (found && expect->define_match)
-           _ippVarsSet(vars, expect->define_match, "1");
+           _ippVarsSet(data->vars, expect->define_match, "1");
 
          if (found && expect->define_value)
          {
@@ -1618,7 +1895,7 @@ do_test(_ipp_file_t      *f,              /* I - IPP data file */
              }
            }
 
-           _ippVarsSet(vars, expect->define_value, buffer);
+           _ippVarsSet(data->vars, expect->define_value, buffer);
          }
 
          if (found && expect->repeat_match &&
@@ -1635,7 +1912,7 @@ do_test(_ipp_file_t      *f,              /* I - IPP data file */
 
     if (repeat_test)
     {
-      if (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout()))
+      if (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout()))
       {
        cupsFilePrintf(cupsFileStdout(), "%04d]\n", repeat_count);
 \
@@ -1650,7 +1927,7 @@ do_test(_ipp_file_t      *f,              /* I - IPP data file */
              {
                if (!strcmp(data->displayed[i], attrname))
                {
-                 print_attr(cupsFileStdout(), _CUPS_OUTPUT_TEST, attrptr, NULL);
+                 print_attr(cupsFileStdout(), IPPTOOL_OUTPUT_TEST, attrptr, NULL);
                  break;
                }
              }
@@ -1659,7 +1936,7 @@ do_test(_ipp_file_t      *f,              /* I - IPP data file */
        }
       }
 
-      if (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout()))
+      if (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout()))
       {
        cupsFilePrintf(cupsFileStdout(), "    %-68.68s [", data->name);
       }
@@ -1682,7 +1959,7 @@ do_test(_ipp_file_t      *f,              /* I - IPP data file */
   else
     data->fail_count ++;
 
-  if (data->output == _CUPS_OUTPUT_PLIST)
+  if (data->output == IPPTOOL_OUTPUT_PLIST)
   {
     cupsFilePuts(data->outfile, "<key>Successful</key>\n");
     cupsFilePuts(data->outfile, data->prev_pass ? "<true />\n" : "<false />\n");
@@ -1698,7 +1975,7 @@ do_test(_ipp_file_t      *f,              /* I - IPP data file */
     cupsFilePuts(data->outfile, "</dict>\n");
     cupsFilePuts(data->outfile, "</array>\n");
   }
-  else if (data->output == _CUPS_OUTPUT_IPPSERVER && response)
+  else if (data->output == IPPTOOL_OUTPUT_IPPSERVER && response)
   {
     for (attrptr = ippFirstAttribute(response); attrptr; attrptr = ippNextAttribute(response))
     {
@@ -1709,7 +1986,7 @@ do_test(_ipp_file_t      *f,              /* I - IPP data file */
     }
   }
 
-  if (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout()))
+  if (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout()))
   {
     cupsFilePuts(cupsFileStdout(), data->prev_pass ? "PASS]\n" : "FAIL]\n");
 
@@ -1721,14 +1998,14 @@ do_test(_ipp_file_t      *f,            /* I - IPP data file */
       if (data->verbosity && response)
       {
        for (attrptr = ippFirstAttribute(response); attrptr; attrptr = ippNextAttribute(response))
-         print_attr(cupsFileStdout(), _CUPS_OUTPUT_TEST, attrptr, NULL);
+         print_attr(cupsFileStdout(), IPPTOOL_OUTPUT_TEST, attrptr, NULL);
       }
     }
   }
-  else if (!data->prev_pass && data->output != _CUPS_OUTPUT_QUIET)
+  else if (!data->prev_pass && data->output != IPPTOOL_OUTPUT_QUIET)
     fprintf(stderr, "%s\n", cupsLastErrorString());
 
-  if (data->prev_pass && data->output >= _CUPS_OUTPUT_LIST && !data->verbosity && data->num_displayed > 0)
+  if (data->prev_pass && data->output >= IPPTOOL_OUTPUT_LIST && !data->verbosity && data->num_displayed > 0)
   {
     size_t     width;                  /* Length of value */
 
@@ -1746,7 +2023,7 @@ do_test(_ipp_file_t      *f,              /* I - IPP data file */
       }
     }
 
-    if (data->output == _CUPS_OUTPUT_CSV)
+    if (data->output == IPPTOOL_OUTPUT_CSV)
       print_csv(data, NULL, NULL, data->num_displayed, data->displayed, widths);
     else
       print_line(data, NULL, NULL, data->num_displayed, data->displayed, widths);
@@ -1760,7 +2037,7 @@ do_test(_ipp_file_t      *f,              /* I - IPP data file */
 
       if (attrptr)
       {
-       if (data->output == _CUPS_OUTPUT_CSV)
+       if (data->output == IPPTOOL_OUTPUT_CSV)
          print_csv(data, response, attrptr, data->num_displayed, data->displayed, widths);
        else
          print_line(data, response, attrptr, data->num_displayed, data->displayed, widths);
@@ -1772,7 +2049,7 @@ do_test(_ipp_file_t      *f,              /* I - IPP data file */
   }
   else if (!data->prev_pass)
   {
-    if (data->output == _CUPS_OUTPUT_PLIST)
+    if (data->output == IPPTOOL_OUTPUT_PLIST)
     {
       cupsFilePuts(data->outfile, "<key>Errors</key>\n");
       cupsFilePuts(data->outfile, "<array>\n");
@@ -1785,7 +2062,7 @@ do_test(_ipp_file_t      *f,              /* I - IPP data file */
       cupsFilePuts(data->outfile, "</array>\n");
     }
 
-    if (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout()))
+    if (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout()))
     {
       for (error = (char *)cupsArrayFirst(data->errors);
           error;
@@ -1794,7 +2071,7 @@ do_test(_ipp_file_t      *f,              /* I - IPP data file */
     }
   }
 
-  if (data->num_displayed > 0 && !data->verbosity && response && (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout())))
+  if (data->num_displayed > 0 && !data->verbosity && response && (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout())))
   {
     for (attrptr = ippFirstAttribute(response); attrptr; attrptr = ippNextAttribute(response))
     {
@@ -1814,7 +2091,13 @@ do_test(_ipp_file_t      *f,             /* I - IPP data file */
 
   skip_error:
 
-  if (data->output == _CUPS_OUTPUT_PLIST)
+  if (data->monitor_thread)
+  {
+    data->monitor_done = 1;
+    _cupsThreadWait(data->monitor_thread);
+  }
+
+  if (data->output == IPPTOOL_OUTPUT_PLIST)
     cupsFilePuts(data->outfile, "</dict>\n");
 
   ippDelete(response);
@@ -1859,6 +2142,31 @@ do_test(_ipp_file_t      *f,             /* I - IPP data file */
     free(data->displayed[i]);
   data->num_displayed = 0;
 
+  free(data->monitor_uri);
+  data->monitor_uri = NULL;
+
+  for (i = data->num_monitor_expects, expect = data->monitor_expects; i > 0; i --, expect ++)
+  {
+    free(expect->name);
+    if (expect->of_type)
+      free(expect->of_type);
+    if (expect->same_count_as)
+      free(expect->same_count_as);
+    if (expect->if_defined)
+      free(expect->if_defined);
+    if (expect->if_not_defined)
+      free(expect->if_not_defined);
+    if (expect->with_value)
+      free(expect->with_value);
+    if (expect->define_match)
+      free(expect->define_match);
+    if (expect->define_no_match)
+      free(expect->define_no_match);
+    if (expect->define_value)
+      free(expect->define_value);
+  }
+  data->num_monitor_expects = 0;
+
   return (data->ignore_errors || data->prev_pass);
 }
 
@@ -1868,9 +2176,8 @@ do_test(_ipp_file_t      *f,              /* I - IPP data file */
  */
 
 static int                             /* O - 1 on success, 0 on failure */
-do_tests(const char       *testfile,   /* I - Test file to use */
-         _ipp_vars_t      *vars,       /* I - Variables */
-         _cups_testdata_t *data)       /* I - Test data */
+do_tests(const char     *testfile,     /* I - Test file to use */
+         ipptool_test_t *data)         /* I - Test data */
 {
   http_encryption_t encryption;                /* Encryption mode */
 
@@ -1879,14 +2186,14 @@ do_tests(const char       *testfile,    /* I - Test file to use */
   * Connect to the printer/server...
   */
 
-  if (!_cups_strcasecmp(vars->scheme, "https") || !_cups_strcasecmp(vars->scheme, "ipps"))
+  if (!_cups_strcasecmp(data->vars->scheme, "https") || !_cups_strcasecmp(data->vars->scheme, "ipps") || data->vars->port == 443)
     encryption = HTTP_ENCRYPTION_ALWAYS;
   else
     encryption = data->encryption;
 
-  if ((data->http = httpConnect2(vars->host, vars->port, NULL, data->family, encryption, 1, 30000, NULL)) == NULL)
+  if ((data->http = httpConnect2(data->vars->host, data->vars->port, NULL, data->family, encryption, 1, 30000, NULL)) == NULL)
   {
-    print_fatal_error(data, "Unable to connect to \"%s\" on port %d - %s", vars->host, vars->port, cupsLastErrorString());
+    print_fatal_error(data, "Unable to connect to \"%s\" on port %d - %s", data->vars->host, data->vars->port, cupsLastErrorString());
     return (0);
   }
 
@@ -1903,7 +2210,7 @@ do_tests(const char       *testfile,      /* I - Test file to use */
   * Run tests...
   */
 
-  _ippFileParse(vars, testfile, (void *)data);
+  _ippFileParse(data->vars, testfile, (void *)data);
 
  /*
   * Close connection and return...
@@ -1922,7 +2229,7 @@ do_tests(const char       *testfile,      /* I - Test file to use */
 
 static int                             /* O - 1 to continue, 0 to stop */
 error_cb(_ipp_file_t      *f,          /* I - IPP file data */
-         _cups_testdata_t *data,       /* I - Test data */
+         ipptool_test_t *data, /* I - Test data */
          const char       *error)      /* I - Error message */
 {
   (void)f;
@@ -1939,13 +2246,18 @@ error_cb(_ipp_file_t      *f,           /* I - IPP file data */
 
 static int                             /* O - 1 if matches, 0 otherwise */
 expect_matches(
-    _cups_expect_t *expect,            /* I - Expected attribute */
-    ipp_tag_t      value_tag)          /* I - Value tag for attribute */
+    ipptool_expect_t *expect,          /* I - Expected attribute */
+    ipp_attribute_t  *attr)            /* I - Attribute */
 {
-  int  match;                          /* Match? */
-  char *of_type,                       /* Type name to match */
-       *next,                          /* Next name to match */
-       sep;                            /* Separator character */
+  int          i,                      /* Looping var */
+               count,                  /* Number of values */
+               match;                  /* Match? */
+  char         *of_type,               /* Type name to match */
+               *paren,                 /* Pointer to opening parenthesis */
+               *next,                  /* Next name to match */
+               sep;                    /* Separator character */
+  ipp_tag_t    value_tag;              /* Syntax/value tag */
+  int          lower, upper;           /* Lower and upper bounds for syntax */
 
 
  /*
@@ -1960,6 +2272,9 @@ expect_matches(
   * types separated by "," or "|"...
   */
 
+  value_tag = ippGetValueTag(attr);
+  count     = ippGetCount(attr);
+
   for (of_type = expect->of_type, match = 0; !match && *of_type; of_type = next)
   {
    /*
@@ -1975,19 +2290,154 @@ expect_matches(
     * Support some meta-types to make it easier to write the test file.
     */
 
+    if ((paren = strchr(of_type, '(')) != NULL)
+    {
+      char *ptr;                       // Pointer into syntax string
+
+      *paren = '\0';
+
+      if (!strncmp(paren + 1, "MIN:", 4))
+      {
+        lower = INT_MIN;
+        ptr   = paren + 5;
+      }
+      else if ((ptr = strchr(paren + 1, ':')) != NULL)
+      {
+        lower = atoi(paren + 1);
+      }
+      else
+      {
+        lower = 0;
+        ptr   = paren + 1;
+      }
+
+      if (!strcmp(ptr, "MAX)"))
+        upper = INT_MAX;
+      else
+        upper = atoi(ptr);
+    }
+    else
+    {
+      lower = INT_MIN;
+      upper = INT_MAX;
+    }
+
     if (!strcmp(of_type, "text"))
-      match = value_tag == IPP_TAG_TEXTLANG || value_tag == IPP_TAG_TEXT;
+    {
+      if (upper == INT_MAX)
+        upper = 1023;
+
+      if (value_tag == IPP_TAG_TEXTLANG || value_tag == IPP_TAG_TEXT)
+      {
+        for (i = 0; i < count; i ++)
+       {
+         if (strlen(ippGetString(attr, i, NULL)) > (size_t)upper)
+           break;
+       }
+
+       match = (i == count);
+      }
+    }
     else if (!strcmp(of_type, "name"))
-      match = value_tag == IPP_TAG_NAMELANG || value_tag == IPP_TAG_NAME;
+    {
+      if (upper == INT_MAX)
+        upper = 255;
+
+      if (value_tag == IPP_TAG_NAMELANG || value_tag == IPP_TAG_NAME)
+      {
+        for (i = 0; i < count; i ++)
+       {
+         if (strlen(ippGetString(attr, i, NULL)) > (size_t)upper)
+           break;
+       }
+
+       match = (i == count);
+      }
+    }
     else if (!strcmp(of_type, "collection"))
+    {
       match = value_tag == IPP_TAG_BEGIN_COLLECTION;
-    else
-      match = value_tag == ippTagValue(of_type);
+    }
+    else if (value_tag == ippTagValue(of_type))
+    {
+      switch (value_tag)
+      {
+        case IPP_TAG_KEYWORD :
+        case IPP_TAG_URI :
+            if (upper == INT_MAX)
+            {
+              if (value_tag == IPP_TAG_KEYWORD)
+               upper = 255;
+             else
+               upper = 1023;
+           }
+
+           for (i = 0; i < count; i ++)
+           {
+             if (strlen(ippGetString(attr, i, NULL)) > (size_t)upper)
+               break;
+           }
+
+           match = (i == count);
+           break;
+
+        case IPP_TAG_STRING :
+            if (upper == INT_MAX)
+             upper = 1023;
+
+           for (i = 0; i < count; i ++)
+           {
+             int       datalen;        // Length of octetString value
+
+             ippGetOctetString(attr, i, &datalen);
+
+             if (datalen > upper)
+               break;
+           }
+
+           match = (i == count);
+           break;
+
+       case IPP_TAG_INTEGER :
+           for (i = 0; i < count; i ++)
+           {
+             int value = ippGetInteger(attr, i);
+                                       // Integer value
+
+             if (value < lower || value > upper)
+               break;
+           }
+
+           match = (i == count);
+           break;
+
+       case IPP_TAG_RANGE :
+           for (i = 0; i < count; i ++)
+           {
+             int vupper, vlower = ippGetRange(attr, i, &vupper);
+                                       // Range value
+
+             if (vlower < lower || vlower > upper || vupper < lower || vupper > upper)
+               break;
+           }
+
+           match = (i == count);
+           break;
+
+       default :
+           // No other constraints, so this is a match
+           match = 1;
+           break;
+      }
+    }
 
    /*
-    * Restore the separator if we have one...
+    * Restore the separators if we have them...
     */
 
+    if (paren)
+      *paren = '(';
+
     if (sep)
       *next++ = sep;
   }
@@ -2047,6 +2497,21 @@ get_filename(const char *testfile,       /* I - Current test file */
       dstptr = dst; /* Should never happen */
 
     strlcpy(dstptr, src, dstsize - (size_t)(dstptr - dst));
+
+#if _WIN32
+    if (_access(dst, 0))
+    {
+     /*
+      * Not available relative to the testfile, see if it can be found on the
+      * desktop...
+      */
+      const char *userprofile = getenv("USERPROFILE");
+                                       /* User home directory */
+
+      if (userprofile)
+        snprintf(dst, dstsize, "%s/Desktop/%s", userprofile, src);
+    }
+#endif /* _WIN32 */
   }
 
   return (dst);
@@ -2075,7 +2540,7 @@ get_string(ipp_attribute_t *attr, /* I - IPP attribute */
 
   value = ippGetString(attr, element, NULL);
 
-  if (flags & _CUPS_WITH_HOSTNAME)
+  if (flags & IPPTOOL_WITH_HOSTNAME)
   {
     if (httpSeparateURI(HTTP_URI_CODING_ALL, value, scheme, sizeof(scheme), userpass, sizeof(userpass), buffer, (int)bufsize, &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK)
       buffer[0] = '\0';
@@ -2086,14 +2551,14 @@ get_string(ipp_attribute_t *attr,       /* I - IPP attribute */
 
     return (buffer);
   }
-  else if (flags & _CUPS_WITH_RESOURCE)
+  else if (flags & IPPTOOL_WITH_RESOURCE)
   {
     if (httpSeparateURI(HTTP_URI_CODING_ALL, value, scheme, sizeof(scheme), userpass, sizeof(userpass), hostname, sizeof(hostname), &port, buffer, (int)bufsize) < HTTP_URI_STATUS_OK)
       buffer[0] = '\0';
 
     return (buffer);
   }
-  else if (flags & _CUPS_WITH_SCHEME)
+  else if (flags & IPPTOOL_WITH_SCHEME)
   {
     if (httpSeparateURI(HTTP_URI_CODING_ALL, value, buffer, (int)bufsize, userpass, sizeof(userpass), hostname, sizeof(hostname), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK)
       buffer[0] = '\0';
@@ -2104,76 +2569,492 @@ get_string(ipp_attribute_t *attr,      /* I - IPP attribute */
   {
     http_uri_status_t status = httpSeparateURI(HTTP_URI_CODING_ALL, value, scheme, sizeof(scheme), userpass, sizeof(userpass), hostname, sizeof(hostname), &port, resource, sizeof(resource));
 
-    if (status < HTTP_URI_STATUS_OK)
+    if (status < HTTP_URI_STATUS_OK)
+    {
+     /*
+      * Bad URI...
+      */
+
+      buffer[0] = '\0';
+    }
+    else
+    {
+     /*
+      * Normalize URI with no trailing dot...
+      */
+
+      if ((ptr = hostname + strlen(hostname) - 1) >= hostname && *ptr == '.')
+       *ptr = '\0';
+
+      httpAssembleURI(HTTP_URI_CODING_ALL, buffer, (int)bufsize, scheme, userpass, hostname, port, resource);
+    }
+
+    return (buffer);
+  }
+  else
+    return (value);
+}
+
+
+/*
+ * 'init_data()' - Initialize test data.
+ */
+
+static void
+init_data(ipptool_test_t *data)        /* I - Data */
+{
+  memset(data, 0, sizeof(ipptool_test_t));
+
+  data->output       = IPPTOOL_OUTPUT_LIST;
+  data->outfile      = cupsFileStdout();
+  data->family       = AF_UNSPEC;
+  data->def_transfer = IPPTOOL_TRANSFER_AUTO;
+  data->def_version  = 11;
+  data->errors       = cupsArrayNew3(NULL, NULL, NULL, 0, (cups_acopy_func_t)strdup, (cups_afree_func_t)free);
+  data->pass         = 1;
+  data->prev_pass    = 1;
+  data->request_id   = (CUPS_RAND() % 1000) * 137;
+  data->show_header  = 1;
+}
+
+
+/*
+ * 'iso_date()' - Return an ISO 8601 date/time string for the given IPP dateTime
+ *                value.
+ */
+
+static char *                          /* O - ISO 8601 date/time string */
+iso_date(const ipp_uchar_t *date)      /* I - IPP (RFC 1903) date/time value */
+{
+  time_t       utctime;                /* UTC time since 1970 */
+  struct tm    utcdate;                /* UTC date/time */
+  static char  buffer[255];            /* String buffer */
+
+
+  utctime = ippDateToTime(date);
+  gmtime_r(&utctime, &utcdate);
+
+  snprintf(buffer, sizeof(buffer), "%04d-%02d-%02dT%02d:%02d:%02dZ",
+          utcdate.tm_year + 1900, utcdate.tm_mon + 1, utcdate.tm_mday,
+          utcdate.tm_hour, utcdate.tm_min, utcdate.tm_sec);
+
+  return (buffer);
+}
+
+
+/*
+ * 'parse_monitor_printer_state()' - Parse the MONITOR-PRINTER-STATE directive.
+ *
+ * MONITOR-PRINTER-STATE [printer-uri] {
+ *     DELAY nnn
+ *     EXPECT attribute-name ...
+ * }
+ */
+
+static int                             /* O - 1 to continue, 0 to stop */
+parse_monitor_printer_state(
+    _ipp_file_t    *f,                 /* I - IPP file data */
+    ipptool_test_t *data)              /* I - Test data */
+{
+  char token[256],                     /* Token string */
+       name[1024],                     /* Name string */
+       temp[1024],                     /* Temporary string */
+       value[1024],                    /* Value string */
+       *ptr;                           /* Pointer into value */
+
+
+  if (!_ippFileReadToken(f, temp, sizeof(temp)))
+  {
+    print_fatal_error(data, "Missing printer URI on line %d of \"%s\".", f->linenum, f->filename);
+    return (0);
+  }
+
+  if (strcmp(temp, "{"))
+  {
+    // Got a printer URI so copy it...
+    data->monitor_uri = strdup(temp);
+
+    // Then see if we have an opening brace...
+    if (!_ippFileReadToken(f, temp, sizeof(temp)) || strcmp(temp, "{"))
+    {
+      print_fatal_error(data, "Missing opening brace on line %d of \"%s\".", f->linenum, f->filename);
+      return (0);
+    }
+  }
+  else
+  {
+    // Use the default printer URI...
+    data->monitor_uri = strdup(data->vars->uri);
+  }
+
+  // Loop until we get a closing brace...
+  while (_ippFileReadToken(f, token, sizeof(token)))
+  {
+    if (_cups_strcasecmp(token, "COUNT") &&
+       _cups_strcasecmp(token, "DEFINE-MATCH") &&
+       _cups_strcasecmp(token, "DEFINE-NO-MATCH") &&
+       _cups_strcasecmp(token, "DEFINE-VALUE") &&
+       _cups_strcasecmp(token, "IF-DEFINED") &&
+       _cups_strcasecmp(token, "IF-NOT-DEFINED") &&
+       _cups_strcasecmp(token, "IN-GROUP") &&
+       _cups_strcasecmp(token, "OF-TYPE") &&
+       _cups_strcasecmp(token, "WITH-DISTINCT-VALUES") &&
+       _cups_strcasecmp(token, "WITH-VALUE"))
+      data->last_expect = NULL;
+
+    if (!strcmp(token, "}"))
+      return (1);
+    else if (!_cups_strcasecmp(token, "EXPECT"))
+    {
+     /*
+      * Expected attributes...
+      */
+
+      if (data->num_monitor_expects >= (int)(sizeof(data->monitor_expects) / sizeof(data->monitor_expects[0])))
+      {
+       print_fatal_error(data, "Too many EXPECT's on line %d of \"%s\".", f->linenum, f->filename);
+       return (0);
+      }
+
+      if (!_ippFileReadToken(f, name, sizeof(name)))
+      {
+       print_fatal_error(data, "Missing EXPECT name on line %d of \"%s\".", f->linenum, f->filename);
+       return (0);
+      }
+
+      data->last_expect = data->monitor_expects + data->num_monitor_expects;
+      data->num_monitor_expects ++;
+
+      memset(data->last_expect, 0, sizeof(ipptool_expect_t));
+      data->last_expect->repeat_limit = 1000;
+
+      if (name[0] == '!')
+      {
+       data->last_expect->not_expect = 1;
+       data->last_expect->name       = strdup(name + 1);
+      }
+      else if (name[0] == '?')
+      {
+       data->last_expect->optional = 1;
+       data->last_expect->name     = strdup(name + 1);
+      }
+      else
+       data->last_expect->name = strdup(name);
+    }
+    else if (!_cups_strcasecmp(token, "COUNT"))
+    {
+      int      count;                  /* Count value */
+
+      if (!_ippFileReadToken(f, temp, sizeof(temp)))
+      {
+       print_fatal_error(data, "Missing COUNT number on line %d of \"%s\".", f->linenum, f->filename);
+       return (0);
+      }
+
+      if ((count = atoi(temp)) <= 0)
+      {
+       print_fatal_error(data, "Bad COUNT \"%s\" on line %d of \"%s\".", temp, f->linenum, f->filename);
+       return (0);
+      }
+
+      if (data->last_expect)
+      {
+       data->last_expect->count = count;
+      }
+      else
+      {
+       print_fatal_error(data, "COUNT without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename);
+       return (0);
+      }
+    }
+    else if (!_cups_strcasecmp(token, "DEFINE-MATCH"))
+    {
+      if (!_ippFileReadToken(f, temp, sizeof(temp)))
+      {
+       print_fatal_error(data, "Missing DEFINE-MATCH variable on line %d of \"%s\".", f->linenum, f->filename);
+       return (0);
+      }
+
+      if (data->last_expect)
+      {
+       data->last_expect->define_match = strdup(temp);
+      }
+      else
+      {
+       print_fatal_error(data, "DEFINE-MATCH without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename);
+       return (0);
+      }
+    }
+    else if (!_cups_strcasecmp(token, "DEFINE-NO-MATCH"))
+    {
+      if (!_ippFileReadToken(f, temp, sizeof(temp)))
+      {
+       print_fatal_error(data, "Missing DEFINE-NO-MATCH variable on line %d of \"%s\".", f->linenum, f->filename);
+       return (0);
+      }
+
+      if (data->last_expect)
+      {
+       data->last_expect->define_no_match = strdup(temp);
+      }
+      else
+      {
+       print_fatal_error(data, "DEFINE-NO-MATCH without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename);
+       return (0);
+      }
+    }
+    else if (!_cups_strcasecmp(token, "DEFINE-VALUE"))
+    {
+      if (!_ippFileReadToken(f, temp, sizeof(temp)))
+      {
+       print_fatal_error(data, "Missing DEFINE-VALUE variable on line %d of \"%s\".", f->linenum, f->filename);
+       return (0);
+      }
+
+      if (data->last_expect)
+      {
+       data->last_expect->define_value = strdup(temp);
+      }
+      else
+      {
+       print_fatal_error(data, "DEFINE-VALUE without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename);
+       return (0);
+      }
+    }
+    else if (!_cups_strcasecmp(token, "DELAY"))
+    {
+     /*
+      * Delay before operation...
+      */
+
+      double dval;                    /* Delay value */
+
+      if (!_ippFileReadToken(f, temp, sizeof(temp)))
+      {
+       print_fatal_error(data, "Missing DELAY value on line %d of \"%s\".", f->linenum, f->filename);
+       return (0);
+      }
+
+      _ippVarsExpand(data->vars, value, temp, sizeof(value));
+
+      if ((dval = _cupsStrScand(value, &ptr, localeconv())) < 0.0 || (*ptr && *ptr != ','))
+      {
+       print_fatal_error(data, "Bad DELAY value \"%s\" on line %d of \"%s\".", value, f->linenum, f->filename);
+       return (0);
+      }
+
+      data->monitor_delay = (useconds_t)(1000000.0 * dval);
+
+      if (*ptr == ',')
+      {
+       if ((dval = _cupsStrScand(ptr + 1, &ptr, localeconv())) <= 0.0 || *ptr)
+       {
+         print_fatal_error(data, "Bad DELAY value \"%s\" on line %d of \"%s\".", value, f->linenum, f->filename);
+         return (0);
+       }
+
+       data->monitor_interval = (useconds_t)(1000000.0 * dval);
+      }
+      else
+       data->monitor_interval = data->monitor_delay;
+    }
+    else if (!_cups_strcasecmp(token, "OF-TYPE"))
+    {
+      if (!_ippFileReadToken(f, temp, sizeof(temp)))
+      {
+       print_fatal_error(data, "Missing OF-TYPE value tag(s) on line %d of \"%s\".", f->linenum, f->filename);
+       return (0);
+      }
+
+      if (data->last_expect)
+      {
+       data->last_expect->of_type = strdup(temp);
+      }
+      else
+      {
+       print_fatal_error(data, "OF-TYPE without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename);
+       return (0);
+      }
+    }
+    else if (!_cups_strcasecmp(token, "IN-GROUP"))
+    {
+      ipp_tag_t        in_group;               /* IN-GROUP value */
+
+      if (!_ippFileReadToken(f, temp, sizeof(temp)))
+      {
+       print_fatal_error(data, "Missing IN-GROUP group tag on line %d of \"%s\".", f->linenum, f->filename);
+       return (0);
+      }
+
+      if ((in_group = ippTagValue(temp)) == IPP_TAG_ZERO || in_group >= IPP_TAG_UNSUPPORTED_VALUE)
+      {
+       print_fatal_error(data, "Bad IN-GROUP group tag \"%s\" on line %d of \"%s\".", temp, f->linenum, f->filename);
+       return (0);
+      }
+      else if (data->last_expect)
+      {
+       data->last_expect->in_group = in_group;
+      }
+      else
+      {
+       print_fatal_error(data, "IN-GROUP without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename);
+       return (0);
+      }
+    }
+    else if (!_cups_strcasecmp(token, "IF-DEFINED"))
+    {
+      if (!_ippFileReadToken(f, temp, sizeof(temp)))
+      {
+       print_fatal_error(data, "Missing IF-DEFINED name on line %d of \"%s\".", f->linenum, f->filename);
+       return (0);
+      }
+
+      if (data->last_expect)
+      {
+       data->last_expect->if_defined = strdup(temp);
+      }
+      else
+      {
+       print_fatal_error(data, "IF-DEFINED without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename);
+       return (0);
+      }
+    }
+    else if (!_cups_strcasecmp(token, "IF-NOT-DEFINED"))
     {
-     /*
-      * Bad URI...
-      */
+      if (!_ippFileReadToken(f, temp, sizeof(temp)))
+      {
+       print_fatal_error(data, "Missing IF-NOT-DEFINED name on line %d of \"%s\".", f->linenum, f->filename);
+       return (0);
+      }
 
-      buffer[0] = '\0';
+      if (data->last_expect)
+      {
+       data->last_expect->if_not_defined = strdup(temp);
+      }
+      else
+      {
+       print_fatal_error(data, "IF-NOT-DEFINED without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename);
+       return (0);
+      }
     }
-    else
+    else if (!_cups_strcasecmp(token, "WITH-DISTINCT-VALUES"))
+    {
+      if (data->last_expect)
+      {
+        data->last_expect->with_distinct = 1;
+      }
+      else
+      {
+       print_fatal_error(data, "%s without a preceding EXPECT on line %d of \"%s\".", token, f->linenum, f->filename);
+       return (0);
+      }
+    }
+    else if (!_cups_strcasecmp(token, "WITH-VALUE"))
     {
+      off_t    lastpos;                /* Last file position */
+      int      lastline;               /* Last line number */
+
+      if (!_ippFileReadToken(f, temp, sizeof(temp)))
+      {
+       print_fatal_error(data, "Missing %s value on line %d of \"%s\".", token, f->linenum, f->filename);
+       return (0);
+      }
+
      /*
-      * Normalize URI with no trailing dot...
+      * Read additional comma-delimited values - needed since legacy test files
+      * will have unquoted WITH-VALUE values with commas...
       */
 
-      if ((ptr = hostname + strlen(hostname) - 1) >= hostname && *ptr == '.')
-       *ptr = '\0';
+      ptr = temp + strlen(temp);
 
-      httpAssembleURI(HTTP_URI_CODING_ALL, buffer, (int)bufsize, scheme, userpass, hostname, port, resource);
-    }
+      for (;;)
+      {
+        lastpos  = cupsFileTell(f->fp);
+        lastline = f->linenum;
+        ptr      += strlen(ptr);
 
-    return (buffer);
-  }
-  else
-    return (value);
-}
+       if (!_ippFileReadToken(f, ptr, (sizeof(temp) - (size_t)(ptr - temp))))
+         break;
 
+        if (!strcmp(ptr, ","))
+        {
+         /*
+          * Append a value...
+          */
 
-/*
- * 'init_data()' - Initialize test data.
- */
+         ptr += strlen(ptr);
 
-static void
-init_data(_cups_testdata_t *data)      /* I - Data */
-{
-  memset(data, 0, sizeof(_cups_testdata_t));
+         if (!_ippFileReadToken(f, ptr, (sizeof(temp) - (size_t)(ptr - temp))))
+           break;
+        }
+        else
+        {
+         /*
+          * Not another value, stop here...
+          */
 
-  data->output       = _CUPS_OUTPUT_LIST;
-  data->outfile      = cupsFileStdout();
-  data->family       = AF_UNSPEC;
-  data->def_transfer = _CUPS_TRANSFER_AUTO;
-  data->def_version  = 11;
-  data->errors       = cupsArrayNew3(NULL, NULL, NULL, 0, (cups_acopy_func_t)strdup, (cups_afree_func_t)free);
-  data->pass         = 1;
-  data->prev_pass    = 1;
-  data->request_id   = (CUPS_RAND() % 1000) * 137 + 1;
-  data->show_header  = 1;
-}
+          cupsFileSeek(f->fp, lastpos);
+          f->linenum = lastline;
+          *ptr = '\0';
+          break;
+       }
+      }
 
+      if (data->last_expect)
+      {
+       /*
+       * Expand any variables in the value and then save it.
+       */
 
-/*
- * 'iso_date()' - Return an ISO 8601 date/time string for the given IPP dateTime
- *                value.
- */
+       _ippVarsExpand(data->vars, value, temp, sizeof(value));
 
-static char *                          /* O - ISO 8601 date/time string */
-iso_date(const ipp_uchar_t *date)      /* I - IPP (RFC 1903) date/time value */
-{
-  time_t       utctime;                /* UTC time since 1970 */
-  struct tm    utcdate;                /* UTC date/time */
-  static char  buffer[255];            /* String buffer */
+       ptr = value + strlen(value) - 1;
 
+       if (value[0] == '/' && ptr > value && *ptr == '/')
+       {
+        /*
+         * WITH-VALUE is a POSIX extended regular expression.
+         */
 
-  utctime = ippDateToTime(date);
-  gmtime_r(&utctime, &utcdate);
+         data->last_expect->with_value = calloc(1, (size_t)(ptr - value));
+         data->last_expect->with_flags |= IPPTOOL_WITH_REGEX;
 
-  snprintf(buffer, sizeof(buffer), "%04d-%02d-%02dT%02d:%02d:%02dZ",
-          utcdate.tm_year + 1900, utcdate.tm_mon + 1, utcdate.tm_mday,
-          utcdate.tm_hour, utcdate.tm_min, utcdate.tm_sec);
+         if (data->last_expect->with_value)
+           memcpy(data->last_expect->with_value, value + 1, (size_t)(ptr - value - 1));
+       }
+       else
+       {
+        /*
+         * WITH-VALUE is a literal value...
+         */
 
-  return (buffer);
+         for (ptr = value; *ptr; ptr ++)
+         {
+           if (*ptr == '\\' && ptr[1])
+           {
+            /*
+             * Remove \ from \foo...
+             */
+
+             _cups_strcpy(ptr, ptr + 1);
+           }
+         }
+
+         data->last_expect->with_value = strdup(value);
+         data->last_expect->with_flags |= IPPTOOL_WITH_LITERAL;
+       }
+      }
+      else
+      {
+       print_fatal_error(data, "%s without a preceding EXPECT on line %d of \"%s\".", token, f->linenum, f->filename);
+       return (0);
+      }
+    }
+  }
+
+  print_fatal_error(data, "Missing closing brace on line %d of \"%s\".", f->linenum, f->filename);
+
+  return (0);
 }
 
 
@@ -2282,7 +3163,7 @@ pause_message(const char *message)        /* I - Message */
 
 static void
 print_attr(cups_file_t     *outfile,   /* I  - Output file */
-           _cups_output_t  output,     /* I  - Output format */
+           ipptool_output_t  output,   /* I  - Output format */
            ipp_attribute_t *attr,      /* I  - Attribute to print */
            ipp_tag_t       *group)     /* IO - Current group */
 {
@@ -2291,7 +3172,7 @@ print_attr(cups_file_t     *outfile,      /* I  - Output file */
   ipp_attribute_t      *colattr;       /* Collection attribute */
 
 
-  if (output == _CUPS_OUTPUT_PLIST)
+  if (output == IPPTOOL_OUTPUT_PLIST)
   {
     if (!ippGetName(attr) || (group && *group != ippGetGroupTag(attr)))
     {
@@ -2417,7 +3298,7 @@ print_attr(cups_file_t     *outfile,      /* I  - Output file */
   {
     char       buffer[131072];         /* Value buffer */
 
-    if (output == _CUPS_OUTPUT_TEST)
+    if (output == IPPTOOL_OUTPUT_TEST)
     {
       if (!ippGetName(attr))
       {
@@ -2440,7 +3321,7 @@ print_attr(cups_file_t     *outfile,      /* I  - Output file */
 
 static void
 print_csv(
-    _cups_testdata_t *data,            /* I - Test data */
+    ipptool_test_t *data,              /* I - Test data */
     ipp_t            *ipp,             /* I - Response message */
     ipp_attribute_t  *attr,            /* I - First attribute for line */
     int              num_displayed,    /* I - Number of attributes to display */
@@ -2530,7 +3411,7 @@ print_csv(
 
 static void
 print_fatal_error(
-    _cups_testdata_t *data,            /* I - Test data */
+    ipptool_test_t *data,              /* I - Test data */
     const char       *s,               /* I - Printf-style format string */
     ...)                               /* I - Additional arguments as needed */
 {
@@ -2550,7 +3431,7 @@ print_fatal_error(
   * Then output it...
   */
 
-  if (data->output == _CUPS_OUTPUT_PLIST)
+  if (data->output == IPPTOOL_OUTPUT_PLIST)
   {
     print_xml_header(data);
     print_xml_trailer(data, 0, buffer);
@@ -2566,7 +3447,7 @@ print_fatal_error(
 
 static void
 print_ippserver_attr(
-    _cups_testdata_t *data,            /* I - Test data */
+    ipptool_test_t *data,              /* I - Test data */
     ipp_attribute_t  *attr,            /* I - Attribute to print */
     int              indent)           /* I - Indentation level */
 {
@@ -2677,7 +3558,7 @@ print_ippserver_attr(
 
 static void
 print_ippserver_string(
-    _cups_testdata_t *data,            /* I - Test data */
+    ipptool_test_t *data,              /* I - Test data */
     const char       *s,               /* I - String to print */
     size_t           len)              /* I - Length of string */
 {
@@ -2701,7 +3582,7 @@ print_ippserver_string(
 
 static void
 print_line(
-    _cups_testdata_t *data,            /* I - Test data */
+    ipptool_test_t *data,              /* I - Test data */
     ipp_t            *ipp,             /* I - Response message */
     ipp_attribute_t  *attr,            /* I - First attribute for line */
     int              num_displayed,    /* I - Number of attributes to display */
@@ -2787,7 +3668,7 @@ print_line(
  */
 
 static void
-print_xml_header(_cups_testdata_t *data)/* I - Test data */
+print_xml_header(ipptool_test_t *data)/* I - Test data */
 {
   if (!data->xml_header)
   {
@@ -2798,7 +3679,7 @@ print_xml_header(_cups_testdata_t *data)/* I - Test data */
     cupsFilePuts(data->outfile, "<key>ipptoolVersion</key>\n");
     cupsFilePuts(data->outfile, "<string>" CUPS_SVERSION "</string>\n");
     cupsFilePuts(data->outfile, "<key>Transfer</key>\n");
-    cupsFilePrintf(data->outfile, "<string>%s</string>\n", data->transfer == _CUPS_TRANSFER_AUTO ? "auto" : data->transfer == _CUPS_TRANSFER_CHUNKED ? "chunked" : "length");
+    cupsFilePrintf(data->outfile, "<string>%s</string>\n", data->transfer == IPPTOOL_TRANSFER_AUTO ? "auto" : data->transfer == IPPTOOL_TRANSFER_CHUNKED ? "chunked" : "length");
     cupsFilePuts(data->outfile, "<key>Tests</key>\n");
     cupsFilePuts(data->outfile, "<array>\n");
 
@@ -2907,7 +3788,7 @@ print_xml_string(cups_file_t *outfile,    /* I - Test data */
 
 static void
 print_xml_trailer(
-    _cups_testdata_t *data,            /* I - Test data */
+    ipptool_test_t *data,              /* I - Test data */
     int              success,          /* I - 1 on success, 0 on failure */
     const char       *message)         /* I - Error message or NULL */
 {
@@ -2989,10 +3870,10 @@ timeout_cb(http_t *http,                /* I - Connection to server */
  */
 
 static int                             /* O - 1 to continue, 0 to stop */
-token_cb(_ipp_file_t      *f,          /* I - IPP file data */
-         _ipp_vars_t      *vars,       /* I - IPP variables */
-         _cups_testdata_t *data,       /* I - Test data */
-         const char       *token)      /* I - Current token */
+token_cb(_ipp_file_t    *f,            /* I - IPP file data */
+         _ipp_vars_t    *vars,         /* I - IPP variables */
+         ipptool_test_t *data,         /* I - Test data */
+         const char     *token)                /* I - Current token */
 {
   char name[1024],                     /* Name string */
        temp[1024],                     /* Temporary string */
@@ -3030,6 +3911,7 @@ token_cb(_ipp_file_t      *f,             /* I - IPP file data */
        _cups_strcasecmp(token, "WITH-ALL-HOSTNAMES") &&
        _cups_strcasecmp(token, "WITH-ALL-RESOURCES") &&
        _cups_strcasecmp(token, "WITH-ALL-SCHEMES") &&
+       _cups_strcasecmp(token, "WITH-DISTINCT-VALUES") &&
        _cups_strcasecmp(token, "WITH-HOSTNAME") &&
        _cups_strcasecmp(token, "WITH-RESOURCE") &&
        _cups_strcasecmp(token, "WITH-SCHEME") &&
@@ -3048,7 +3930,17 @@ token_cb(_ipp_file_t      *f,            /* I - IPP file data */
 
     if (!strcmp(token, "}"))
     {
-      return (do_test(f, vars, data));
+      return (do_test(f, data));
+    }
+    else if (!strcmp(token, "MONITOR-PRINTER-STATE"))
+    {
+      if (data->monitor_uri)
+      {
+       print_fatal_error(data, "Extra MONITOR-PRINTER-STATE seen on line %d of \"%s\".", f->linenum, f->filename);
+       return (0);
+      }
+
+      return (parse_monitor_printer_state(f, data));
     }
     else if (!strcmp(token, "COMPRESSION"))
     {
@@ -3132,7 +4024,7 @@ token_cb(_ipp_file_t      *f,             /* I - IPP file data */
 
       if (_ippFileReadToken(f, temp, sizeof(temp)))
       {
-        pause_message(temp);
+        strlcpy(data->pause, temp, sizeof(data->pause));
       }
       else
       {
@@ -3151,11 +4043,11 @@ token_cb(_ipp_file_t      *f,           /* I - IPP file data */
       {
        if (isdigit(temp[0] & 255))
        {
-         data->request_id = atoi(temp);
+         data->request_id = atoi(temp) - 1;
        }
        else if (!_cups_strcasecmp(temp, "random"))
        {
-         data->request_id = (CUPS_RAND() % 1000) * 137 + 1;
+         data->request_id = (CUPS_RAND() % 1000) * 137;
        }
        else
        {
@@ -3270,15 +4162,15 @@ token_cb(_ipp_file_t      *f,           /* I - IPP file data */
       {
        if (!strcmp(temp, "auto"))
        {
-         data->transfer = _CUPS_TRANSFER_AUTO;
+         data->transfer = IPPTOOL_TRANSFER_AUTO;
        }
        else if (!strcmp(temp, "chunked"))
        {
-         data->transfer = _CUPS_TRANSFER_CHUNKED;
+         data->transfer = IPPTOOL_TRANSFER_CHUNKED;
        }
        else if (!strcmp(temp, "length"))
        {
-         data->transfer = _CUPS_TRANSFER_LENGTH;
+         data->transfer = IPPTOOL_TRANSFER_LENGTH;
        }
        else
        {
@@ -3509,7 +4401,7 @@ token_cb(_ipp_file_t      *f,             /* I - IPP file data */
       data->last_expect = data->expects + data->num_expects;
       data->num_expects ++;
 
-      memset(data->last_expect, 0, sizeof(_cups_expect_t));
+      memset(data->last_expect, 0, sizeof(ipptool_expect_t));
       data->last_expect->repeat_limit = 1000;
       data->last_expect->expect_all   = expect_all;
 
@@ -3778,6 +4670,18 @@ token_cb(_ipp_file_t      *f,            /* I - IPP file data */
        return (0);
       }
     }
+    else if (!_cups_strcasecmp(token, "WITH-DISTINCT-VALUES"))
+    {
+      if (data->last_expect)
+      {
+        data->last_expect->with_distinct = 1;
+      }
+      else
+      {
+       print_fatal_error(data, "%s without a preceding EXPECT on line %d of \"%s\".", token, f->linenum, f->filename);
+       return (0);
+      }
+    }
     else if (!_cups_strcasecmp(token, "WITH-ALL-VALUES") ||
             !_cups_strcasecmp(token, "WITH-ALL-HOSTNAMES") ||
             !_cups_strcasecmp(token, "WITH-ALL-RESOURCES") ||
@@ -3793,14 +4697,14 @@ token_cb(_ipp_file_t      *f,           /* I - IPP file data */
       if (data->last_expect)
       {
        if (!_cups_strcasecmp(token, "WITH-ALL-HOSTNAMES") || !_cups_strcasecmp(token, "WITH-HOSTNAME"))
-         data->last_expect->with_flags = _CUPS_WITH_HOSTNAME;
+         data->last_expect->with_flags = IPPTOOL_WITH_HOSTNAME;
        else if (!_cups_strcasecmp(token, "WITH-ALL-RESOURCES") || !_cups_strcasecmp(token, "WITH-RESOURCE"))
-         data->last_expect->with_flags = _CUPS_WITH_RESOURCE;
+         data->last_expect->with_flags = IPPTOOL_WITH_RESOURCE;
        else if (!_cups_strcasecmp(token, "WITH-ALL-SCHEMES") || !_cups_strcasecmp(token, "WITH-SCHEME"))
-         data->last_expect->with_flags = _CUPS_WITH_SCHEME;
+         data->last_expect->with_flags = IPPTOOL_WITH_SCHEME;
 
        if (!_cups_strncasecmp(token, "WITH-ALL-", 9))
-         data->last_expect->with_flags |= _CUPS_WITH_ALL;
+         data->last_expect->with_flags |= IPPTOOL_WITH_ALL;
       }
 
       if (!_ippFileReadToken(f, temp, sizeof(temp)))
@@ -3866,7 +4770,7 @@ token_cb(_ipp_file_t      *f,             /* I - IPP file data */
          */
 
          data->last_expect->with_value = calloc(1, (size_t)(ptr - value));
-         data->last_expect->with_flags |= _CUPS_WITH_REGEX;
+         data->last_expect->with_flags |= IPPTOOL_WITH_REGEX;
 
          if (data->last_expect->with_value)
            memcpy(data->last_expect->with_value, value + 1, (size_t)(ptr - value - 1));
@@ -3890,7 +4794,7 @@ token_cb(_ipp_file_t      *f,             /* I - IPP file data */
          }
 
          data->last_expect->with_value = strdup(value);
-         data->last_expect->with_flags |= _CUPS_WITH_LITERAL;
+         data->last_expect->with_flags |= IPPTOOL_WITH_LITERAL;
        }
       }
       else
@@ -3916,7 +4820,7 @@ token_cb(_ipp_file_t      *f,             /* I - IPP file data */
        _ippVarsExpand(vars, value, temp, sizeof(value));
 
        data->last_expect->with_value_from = strdup(value);
-       data->last_expect->with_flags      = _CUPS_WITH_LITERAL;
+       data->last_expect->with_flags      = IPPTOOL_WITH_LITERAL;
       }
       else
       {
@@ -3965,10 +4869,10 @@ token_cb(_ipp_file_t      *f,           /* I - IPP file data */
 
       if (data->show_header)
       {
-       if (data->output == _CUPS_OUTPUT_PLIST)
+       if (data->output == IPPTOOL_OUTPUT_PLIST)
          print_xml_header(data);
 
-       if (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout()))
+       if (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout()))
          cupsFilePrintf(cupsFileStdout(), "\"%s\":\n", f->filename);
 
        data->show_header = 0;
@@ -3984,8 +4888,7 @@ token_cb(_ipp_file_t      *f,             /* I - IPP file data */
       if ((ptr = strrchr(data->name, '.')) != NULL)
         *ptr = '\0';
       data->repeat_interval = 5000000;
-      data->request_id ++;
-      strlcpy(data->resource, vars->resource, sizeof(data->resource));
+      strlcpy(data->resource, data->vars->resource, sizeof(data->resource));
       data->skip_previous = 0;
       data->skip_test     = 0;
       data->num_statuses  = 0;
@@ -3994,6 +4897,12 @@ token_cb(_ipp_file_t      *f,            /* I - IPP file data */
       data->transfer      = data->def_transfer;
       data->version       = data->def_version;
 
+      free(data->monitor_uri);
+      data->monitor_uri         = NULL;
+      data->monitor_delay       = 0;
+      data->monitor_interval    = 5000000;
+      data->num_monitor_expects = 0;
+
       _ippVarsSet(vars, "date-current", iso_date(ippTimeToDate(time(NULL))));
 
       f->attrs     = ippNew();
@@ -4085,7 +4994,7 @@ token_cb(_ipp_file_t      *f,             /* I - IPP file data */
         * Map the filename to and then run the tests...
        */
 
-        _cups_testdata_t inc_data;     /* Data for included file */
+        ipptool_test_t inc_data;       /* Data for included file */
         char           filename[1024]; /* Mapped filename */
 
         memcpy(&inc_data, data, sizeof(inc_data));
@@ -4094,7 +5003,7 @@ token_cb(_ipp_file_t      *f,             /* I - IPP file data */
        inc_data.prev_pass   = 1;
        inc_data.show_header = 1;
 
-        if (!do_tests(get_filename(f->filename, filename, temp, sizeof(filename)), vars, &inc_data) && data->stop_after_include_error)
+        if (!do_tests(get_filename(f->filename, filename, temp, sizeof(filename)), &inc_data) && data->stop_after_include_error)
         {
           data->pass = data->prev_pass = 0;
           return (0);
@@ -4121,7 +5030,7 @@ token_cb(_ipp_file_t      *f,             /* I - IPP file data */
         * Map the filename to and then run the tests...
        */
 
-        _cups_testdata_t inc_data;     /* Data for included file */
+        ipptool_test_t inc_data;       /* Data for included file */
         char           filename[1024]; /* Mapped filename */
 
         memcpy(&inc_data, data, sizeof(inc_data));
@@ -4130,7 +5039,7 @@ token_cb(_ipp_file_t      *f,             /* I - IPP file data */
        inc_data.prev_pass   = 1;
        inc_data.show_header = 1;
 
-        if (!do_tests(get_filename(f->filename, filename, temp, sizeof(filename)), vars, &inc_data) && data->stop_after_include_error)
+        if (!do_tests(get_filename(f->filename, filename, temp, sizeof(filename)), &inc_data) && data->stop_after_include_error)
         {
           data->pass = data->prev_pass = 0;
           return (0);
@@ -4157,7 +5066,7 @@ token_cb(_ipp_file_t      *f,             /* I - IPP file data */
         * Map the filename to and then run the tests...
        */
 
-        _cups_testdata_t inc_data;     /* Data for included file */
+        ipptool_test_t inc_data;       /* Data for included file */
         char           filename[1024]; /* Mapped filename */
 
         memcpy(&inc_data, data, sizeof(inc_data));
@@ -4166,7 +5075,7 @@ token_cb(_ipp_file_t      *f,             /* I - IPP file data */
        inc_data.prev_pass   = 1;
        inc_data.show_header = 1;
 
-        if (!do_tests(get_filename(f->filename, filename, temp, sizeof(filename)), vars, &inc_data) && data->stop_after_include_error)
+        if (!do_tests(get_filename(f->filename, filename, temp, sizeof(filename)), &inc_data) && data->stop_after_include_error)
         {
           data->pass = data->prev_pass = 0;
           return (0);
@@ -4242,11 +5151,11 @@ token_cb(_ipp_file_t      *f,           /* I - IPP file data */
       if (_ippFileReadToken(f, temp, sizeof(temp)))
       {
         if (!strcmp(temp, "auto"))
-         data->def_transfer = _CUPS_TRANSFER_AUTO;
+         data->def_transfer = IPPTOOL_TRANSFER_AUTO;
        else if (!strcmp(temp, "chunked"))
-         data->def_transfer = _CUPS_TRANSFER_CHUNKED;
+         data->def_transfer = IPPTOOL_TRANSFER_CHUNKED;
        else if (!strcmp(temp, "length"))
-         data->def_transfer = _CUPS_TRANSFER_LENGTH;
+         data->def_transfer = IPPTOOL_TRANSFER_LENGTH;
        else
        {
          print_fatal_error(data, "Bad TRANSFER value \"%s\" on line %d of \"%s\".", temp, f->linenum, f->filename);
@@ -4316,6 +5225,7 @@ usage(void)
   _cupsLangPuts(stderr, _("-I                      Ignore errors"));
   _cupsLangPuts(stderr, _("-L                      Send requests using content-length"));
   _cupsLangPuts(stderr, _("-P filename.plist       Produce XML plist to a file and test report to standard output"));
+  _cupsLangPuts(stderr, _("-R                      Repeat tests on server-error-busy"));
   _cupsLangPuts(stderr, _("-S                      Test with encryption using HTTPS"));
   _cupsLangPuts(stderr, _("-T seconds              Set the receive/send timeout in seconds"));
   _cupsLangPuts(stderr, _("-V version              Set default IPP version"));
@@ -4335,30 +5245,155 @@ usage(void)
 }
 
 
+/*
+ * 'with_distinct_values()' - Verify that an attribute contains unique values.
+ */
+
+static int                             // O - 1 if distinct, 0 if duplicate
+with_distinct_values(
+    cups_array_t    *errors,           // I - Array of errors
+    ipp_attribute_t *attr)             // I - Attribute to test
+{
+  int          i,                      // Looping var
+               count;                  // Number of values
+  ipp_tag_t    value_tag;              // Value syntax
+  const char   *value;                 // Current value
+  char         buffer[8192];           // Temporary buffer
+  cups_array_t *values;                // Array of values as strings
+
+
+  // If there is only 1 value, it must be distinct
+  if ((count = ippGetCount(attr)) == 1)
+    return (1);
+
+  // Only check integers, enums, rangeOfInteger, resolution, and nul-terminated
+  // strings...
+  switch (value_tag = ippGetValueTag(attr))
+  {
+    case IPP_TAG_INTEGER :
+    case IPP_TAG_ENUM :
+    case IPP_TAG_RANGE :
+    case IPP_TAG_RESOLUTION :
+    case IPP_TAG_KEYWORD :
+    case IPP_TAG_URISCHEME :
+    case IPP_TAG_CHARSET :
+    case IPP_TAG_LANGUAGE :
+    case IPP_TAG_MIMETYPE :
+    case IPP_TAG_BEGIN_COLLECTION :
+        break;
+
+    default :
+        add_stringf(errors, "WITH-DISTINCT-VALUES %s not supported for 1setOf %s", ippGetName(attr), ippTagString(value_tag));
+        return (0);
+  }
+
+  // Collect values and determine they are all unique...
+  values = cupsArrayNew3((cups_array_func_t)strcmp, NULL, NULL, 0, (cups_acopy_func_t)strdup, (cups_afree_func_t)free);
+
+  for (i = 0; i < count; i ++)
+  {
+    switch (value_tag)
+    {
+      case IPP_TAG_INTEGER :
+      case IPP_TAG_ENUM :
+          snprintf(buffer, sizeof(buffer), "%d", ippGetInteger(attr, i));
+          value = buffer;
+          break;
+      case IPP_TAG_RANGE :
+          {
+            int upper, lower = ippGetRange(attr, i, &upper);
+                                       // Range values
+
+            snprintf(buffer, sizeof(buffer), "%d-%d", lower, upper);
+            value = buffer;
+         }
+          break;
+      case IPP_TAG_RESOLUTION :
+          {
+            ipp_res_t units;           // Resolution units
+            int yres, xres = ippGetResolution(attr, i, &yres, &units);
+                                       // Resolution values
+
+            if (xres == yres)
+              snprintf(buffer, sizeof(buffer), "%d%s", xres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm");
+           else
+              snprintf(buffer, sizeof(buffer), "%dx%d%s", xres, yres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm");
+            value = buffer;
+         }
+          break;
+      case IPP_TAG_KEYWORD :
+      case IPP_TAG_URISCHEME :
+      case IPP_TAG_CHARSET :
+      case IPP_TAG_LANGUAGE :
+      case IPP_TAG_MIMETYPE :
+          value = ippGetString(attr, i, NULL);
+          break;
+      case IPP_TAG_BEGIN_COLLECTION :
+          {
+            ipp_t      *col = ippGetCollection(attr, i);
+                                       // Collection value
+            ipp_attribute_t *member;   // Member attribute
+            char       *bufptr,        // Pointer into buffer
+                       *bufend,        // End of buffer
+                       prefix;         // Prefix character
+
+            for (prefix = '{', bufptr = buffer, bufend = buffer + sizeof(buffer) - 2, member = ippFirstAttribute(col); member && bufptr < bufend; member = ippNextAttribute(col))
+            {
+              *bufptr++ = prefix;
+              prefix    = ' ';
+
+              ippAttributeString(member, bufptr, (size_t)(bufend - bufptr));
+              bufptr += strlen(bufptr);
+            }
+
+            *bufptr++ = '}';
+            *bufptr   = '\0';
+            value     = buffer;
+          }
+          break;
+      default : // Should never happen
+          value = "unsupported";
+          break;
+    }
+
+    if (cupsArrayFind(values, (void *)value))
+      add_stringf(errors, "DUPLICATE: %s=%s", ippGetName(attr), value);
+    else
+      cupsArrayAdd(values, (void *)value);
+  }
+
+  // Cleanup...
+  i = cupsArrayCount(values) == count;
+  cupsArrayDelete(values);
+
+  return (i);
+}
+
+
 /*
  * 'with_flags_string()' - Return the "WITH-xxx" predicate that corresponds to
                          the flags.
*                         the flags.
  */
 
 static const char *                     /* O - WITH-xxx string */
 with_flags_string(int flags)            /* I - WITH flags */
 {
-  if (flags & _CUPS_WITH_ALL)
+  if (flags & IPPTOOL_WITH_ALL)
   {
-    if (flags & _CUPS_WITH_HOSTNAME)
+    if (flags & IPPTOOL_WITH_HOSTNAME)
       return ("WITH-ALL-HOSTNAMES");
-    else if (flags & _CUPS_WITH_RESOURCE)
+    else if (flags & IPPTOOL_WITH_RESOURCE)
       return ("WITH-ALL-RESOURCES");
-    else if (flags & _CUPS_WITH_SCHEME)
+    else if (flags & IPPTOOL_WITH_SCHEME)
       return ("WITH-ALL-SCHEMES");
     else
       return ("WITH-ALL-VALUES");
   }
-  else if (flags & _CUPS_WITH_HOSTNAME)
+  else if (flags & IPPTOOL_WITH_HOSTNAME)
     return ("WITH-HOSTNAME");
-  else if (flags & _CUPS_WITH_RESOURCE)
+  else if (flags & IPPTOOL_WITH_RESOURCE)
     return ("WITH-RESOURCE");
-  else if (flags & _CUPS_WITH_SCHEME)
+  else if (flags & IPPTOOL_WITH_SCHEME)
     return ("WITH-SCHEME");
   else
     return ("WITH-VALUE");
@@ -4370,7 +5405,7 @@ with_flags_string(int flags)            /* I - WITH flags */
  */
 
 static int                             /* O - 1 on match, 0 on non-match */
-with_value(_cups_testdata_t *data,     /* I - Test data */
+with_value(ipptool_test_t *data,       /* I - Test data */
            cups_array_t     *errors,   /* I - Errors array */
            char             *value,    /* I - Value string */
            int              flags,     /* I - Flags for match */
@@ -4387,7 +5422,7 @@ with_value(_cups_testdata_t *data,        /* I - Test data */
 
 
   *matchbuf = '\0';
-  match     = (flags & _CUPS_WITH_ALL) ? 1 : 0;
+  match     = (flags & IPPTOOL_WITH_ALL) ? 1 : 0;
 
  /*
   * NULL matches everything.
@@ -4450,7 +5485,7 @@ with_value(_cups_testdata_t *data,        /* I - Test data */
            }
          }
 
-          if (flags & _CUPS_WITH_ALL)
+          if (flags & IPPTOOL_WITH_ALL)
           {
             if (!valmatch)
             {
@@ -4517,7 +5552,7 @@ with_value(_cups_testdata_t *data,        /* I - Test data */
            }
          }
 
-          if (flags & _CUPS_WITH_ALL)
+          if (flags & IPPTOOL_WITH_ALL)
           {
             if (!valmatch)
             {
@@ -4552,13 +5587,13 @@ with_value(_cups_testdata_t *data,      /* I - Test data */
             if (!matchbuf[0])
              strlcpy(matchbuf, value, matchlen);
 
-           if (!(flags & _CUPS_WITH_ALL))
+           if (!(flags & IPPTOOL_WITH_ALL))
            {
              match = 1;
              break;
            }
          }
-         else if (flags & _CUPS_WITH_ALL)
+         else if (flags & IPPTOOL_WITH_ALL)
          {
            match = 0;
            break;
@@ -4589,13 +5624,13 @@ with_value(_cups_testdata_t *data,      /* I - Test data */
             if (!matchbuf[0])
              strlcpy(matchbuf, value, matchlen);
 
-           if (!(flags & _CUPS_WITH_ALL))
+           if (!(flags & IPPTOOL_WITH_ALL))
            {
              match = 1;
              break;
            }
          }
-         else if (flags & _CUPS_WITH_ALL)
+         else if (flags & IPPTOOL_WITH_ALL)
          {
            match = 0;
            break;
@@ -4635,7 +5670,7 @@ with_value(_cups_testdata_t *data,        /* I - Test data */
     case IPP_TAG_TEXTLANG :
     case IPP_TAG_URI :
     case IPP_TAG_URISCHEME :
-        if (flags & _CUPS_WITH_REGEX)
+        if (flags & IPPTOOL_WITH_REGEX)
        {
         /*
          * Value is an extended, case-sensitive POSIX regular expression...
@@ -4663,13 +5698,13 @@ with_value(_cups_testdata_t *data,      /* I - Test data */
              if (!matchbuf[0])
                strlcpy(matchbuf, get_string(attr, i, flags, temp, sizeof(temp)), matchlen);
 
-             if (!(flags & _CUPS_WITH_ALL))
+             if (!(flags & IPPTOOL_WITH_ALL))
              {
                match = 1;
                break;
              }
            }
-           else if (flags & _CUPS_WITH_ALL)
+           else if (flags & IPPTOOL_WITH_ALL)
            {
              match = 0;
              break;
@@ -4678,7 +5713,7 @@ with_value(_cups_testdata_t *data,        /* I - Test data */
 
          regfree(&re);
        }
-       else if (ippGetValueTag(attr) == IPP_TAG_URI && !(flags & (_CUPS_WITH_SCHEME | _CUPS_WITH_HOSTNAME | _CUPS_WITH_RESOURCE)))
+       else if (ippGetValueTag(attr) == IPP_TAG_URI && !(flags & (IPPTOOL_WITH_SCHEME | IPPTOOL_WITH_HOSTNAME | IPPTOOL_WITH_RESOURCE)))
        {
         /*
          * Value is a literal URI string, see if the value(s) match...
@@ -4691,13 +5726,13 @@ with_value(_cups_testdata_t *data,      /* I - Test data */
              if (!matchbuf[0])
                strlcpy(matchbuf, get_string(attr, i, flags, temp, sizeof(temp)), matchlen);
 
-             if (!(flags & _CUPS_WITH_ALL))
+             if (!(flags & IPPTOOL_WITH_ALL))
              {
                match = 1;
                break;
              }
            }
-           else if (flags & _CUPS_WITH_ALL)
+           else if (flags & IPPTOOL_WITH_ALL)
            {
              match = 0;
              break;
@@ -4721,7 +5756,7 @@ with_value(_cups_testdata_t *data,        /* I - Test data */
                   * Some URI components are case-sensitive, some not...
                   */
 
-                  if (flags & (_CUPS_WITH_SCHEME | _CUPS_WITH_HOSTNAME))
+                  if (flags & (IPPTOOL_WITH_SCHEME | IPPTOOL_WITH_HOSTNAME))
                     result = _cups_strcasecmp(value, get_string(attr, i, flags, temp, sizeof(temp)));
                   else
                     result = strcmp(value, get_string(attr, i, flags, temp, sizeof(temp)));
@@ -4756,13 +5791,13 @@ with_value(_cups_testdata_t *data,      /* I - Test data */
              if (!matchbuf[0])
                strlcpy(matchbuf, get_string(attr, i, flags, temp, sizeof(temp)), matchlen);
 
-             if (!(flags & _CUPS_WITH_ALL))
+             if (!(flags & IPPTOOL_WITH_ALL))
              {
                match = 1;
                break;
              }
            }
-           else if (flags & _CUPS_WITH_ALL)
+           else if (flags & IPPTOOL_WITH_ALL)
            {
              match = 0;
              break;
@@ -4778,7 +5813,7 @@ with_value(_cups_testdata_t *data,        /* I - Test data */
        break;
 
     case IPP_TAG_STRING :
-        if (flags & _CUPS_WITH_REGEX)
+        if (flags & IPPTOOL_WITH_REGEX)
        {
         /*
          * Value is an extended, case-sensitive POSIX regular expression...
@@ -4815,13 +5850,13 @@ with_value(_cups_testdata_t *data,      /* I - Test data */
              if (!matchbuf[0])
                strlcpy(matchbuf, temp, matchlen);
 
-             if (!(flags & _CUPS_WITH_ALL))
+             if (!(flags & IPPTOOL_WITH_ALL))
              {
                match = 1;
                break;
              }
            }
-           else if (flags & _CUPS_WITH_ALL)
+           else if (flags & IPPTOOL_WITH_ALL)
            {
              match = 0;
              break;
@@ -4912,13 +5947,13 @@ with_value(_cups_testdata_t *data,      /* I - Test data */
              if (!matchbuf[0])
                 copy_hex_string(matchbuf, adata, adatalen, matchlen);
 
-             if (!(flags & _CUPS_WITH_ALL))
+             if (!(flags & IPPTOOL_WITH_ALL))
              {
                match = 1;
                break;
              }
            }
-           else if (flags & _CUPS_WITH_ALL)
+           else if (flags & IPPTOOL_WITH_ALL)
            {
              match = 0;
              break;
diff --git a/tools/printer-lg-png.h b/tools/printer-lg-png.h
new file mode 100644 (file)
index 0000000..a7d328d
--- /dev/null
@@ -0,0 +1,1850 @@
+static const unsigned char printer_lg_png[] =
+{
+  0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,
+  0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x08,0x06,0x00,0x00,0x00,0xf4,0x78,0xd4,
+  0xfa,0x00,0x00,0x04,0x19,0x69,0x43,0x43,0x50,0x6b,0x43,0x47,0x43,0x6f,0x6c,0x6f,
+  0x72,0x53,0x70,0x61,0x63,0x65,0x47,0x65,0x6e,0x65,0x72,0x69,0x63,0x52,0x47,0x42,
+  0x00,0x00,0x38,0x8d,0x8d,0x55,0x5d,0x68,0x1c,0x55,0x14,0x3e,0xbb,0x73,0x67,0x23,
+  0x24,0xce,0x53,0x6c,0x34,0x85,0x74,0xa8,0x3f,0x0d,0x25,0x0d,0x93,0x56,0x34,0xa1,
+  0xb4,0xba,0x7f,0xdd,0xdd,0x36,0x6e,0x96,0x49,0x36,0xda,0x22,0xe8,0x64,0xf6,0xee,
+  0xce,0x98,0xc9,0xce,0x38,0x33,0xbb,0xfd,0xa1,0x4f,0x45,0x50,0x7c,0x31,0xea,0x9b,
+  0x14,0xc4,0xbf,0xb7,0x80,0x20,0x28,0xf5,0x0f,0xdb,0x3e,0xb4,0x2f,0x95,0x0a,0x25,
+  0xda,0xd4,0x20,0x28,0x3e,0xb4,0xf8,0x83,0x50,0xe8,0x8b,0xa6,0xeb,0x99,0x3b,0x33,
+  0x99,0x69,0xba,0xb1,0xde,0x65,0xee,0x7c,0xf3,0x9d,0xef,0x9e,0x7b,0xee,0xb9,0x67,
+  0xef,0x05,0xe8,0xb9,0xaa,0x58,0x96,0x91,0x14,0x01,0x16,0x9a,0xae,0x2d,0x17,0x32,
+  0xe2,0x73,0x87,0x8f,0x88,0x3d,0x2b,0x90,0x84,0x87,0xa0,0x17,0x06,0xa1,0x57,0x51,
+  0x1d,0x2b,0x5d,0xa9,0x4c,0x02,0x36,0x4f,0x0b,0x77,0xb5,0x5b,0xdf,0x43,0xc2,0x7b,
+  0x5f,0xd9,0xd5,0xdd,0xfe,0x9f,0xad,0xb7,0x46,0x1d,0x15,0x20,0x71,0x1f,0x62,0xb3,
+  0xe6,0xa8,0x0b,0x88,0x8f,0x01,0xf0,0xa7,0x55,0xcb,0x76,0x01,0x7a,0xfa,0x91,0x1f,
+  0x3f,0xea,0x5a,0x1e,0xf6,0x62,0xe8,0xb7,0x31,0x40,0xc4,0x2f,0x7a,0xb8,0xe1,0x63,
+  0xd7,0xc3,0x73,0x3e,0x7e,0x8d,0x69,0x66,0xe4,0x2c,0xe2,0xd3,0x88,0x05,0x55,0x53,
+  0x6a,0x88,0x97,0x10,0x8f,0xcc,0xc5,0xf8,0x46,0x0c,0xfb,0x31,0xb0,0xd6,0x5f,0xa0,
+  0x4d,0x6a,0xeb,0xaa,0xe8,0xe5,0xa2,0x62,0x9b,0x75,0xdd,0xa0,0xb1,0x70,0xef,0x61,
+  0xfe,0x9f,0x6d,0xc1,0x68,0x85,0xf3,0x6d,0xc3,0xa7,0xcf,0x99,0x9f,0x3e,0x84,0xef,
+  0x61,0x5c,0xfb,0x2b,0x35,0x25,0xe7,0xe1,0x51,0xc4,0x4b,0xaa,0x92,0x9f,0x46,0xfc,
+  0x08,0xe2,0x6b,0x6d,0x7d,0xb6,0x1c,0xe0,0xdb,0x96,0x9b,0x91,0x11,0x3f,0x06,0x90,
+  0xdc,0xde,0x9a,0xaf,0xa6,0x11,0xef,0x44,0x5c,0xac,0xdb,0x07,0xaa,0xbe,0x9f,0xa4,
+  0xad,0xb5,0x8a,0x21,0x7e,0xe7,0x84,0x36,0xf3,0x2c,0xe2,0x2d,0x88,0xcf,0x37,0xe7,
+  0xca,0x53,0xc1,0xd8,0xab,0xaa,0x93,0xc5,0x9c,0xc1,0x76,0xc4,0xb7,0x35,0x5a,0xf2,
+  0xf2,0x3b,0x04,0xc0,0x89,0xba,0x5b,0x9a,0xf1,0xc7,0x72,0xfb,0x6d,0x53,0x9e,0xf2,
+  0xe7,0xe5,0xea,0x35,0x9a,0xcb,0x7b,0x79,0x44,0xfc,0xfa,0xbc,0x79,0x48,0xf6,0x7d,
+  0x72,0x9f,0x39,0xed,0xe9,0x7c,0xe8,0xf3,0x84,0x96,0x2d,0x07,0xfc,0xa5,0x97,0x94,
+  0x83,0x15,0xc4,0x83,0x88,0x7f,0xa1,0x46,0x41,0xf6,0xe7,0xe2,0xfe,0xb1,0xdc,0x4a,
+  0x10,0x03,0x19,0x6a,0x1a,0xe5,0x49,0x7f,0x2e,0x92,0xa3,0x0e,0x5b,0x2f,0xe3,0x5d,
+  0x6d,0xa6,0xe8,0xcf,0x4b,0x0c,0x17,0x37,0xd4,0x1f,0x4b,0x16,0xeb,0xfa,0x81,0x52,
+  0xa0,0xff,0x44,0xb3,0x8b,0x72,0x80,0xaf,0x59,0x06,0xab,0x51,0x8c,0x8d,0x4f,0xda,
+  0x2d,0xb9,0xea,0xeb,0xf9,0x51,0xc5,0xce,0x17,0x7c,0x9f,0x7c,0x85,0x36,0xab,0x81,
+  0x7f,0xbe,0x0d,0xb3,0x09,0x05,0x28,0x98,0x30,0x87,0xbd,0x0a,0x4d,0x58,0x03,0x11,
+  0x64,0x28,0x40,0x06,0xdf,0x16,0xd8,0x68,0xa9,0x83,0x0e,0x06,0x32,0x14,0xad,0x14,
+  0x19,0x8a,0x5f,0xa1,0x66,0x17,0x1b,0xe7,0xc0,0x3c,0xf2,0x3a,0xb4,0x99,0xcd,0xc1,
+  0xbe,0xc2,0x94,0xfe,0xc8,0xc8,0x5f,0x83,0xf9,0xb8,0xce,0xb4,0x2a,0x64,0x87,0x3e,
+  0x82,0x16,0xb2,0x1a,0xfc,0x8e,0xac,0x16,0xd3,0x65,0xf1,0xab,0x85,0x5c,0x63,0x13,
+  0x3f,0x7e,0x2c,0x37,0x02,0x3f,0x26,0x19,0x20,0x12,0xd9,0x83,0xcf,0x5e,0x32,0x49,
+  0xf6,0x91,0x71,0x32,0x01,0x22,0x79,0x8a,0x3c,0x4d,0xf6,0x93,0x1c,0xb2,0x13,0x64,
+  0xef,0xfa,0xd8,0x4a,0x6c,0x45,0x5e,0x3c,0x37,0xd6,0xfd,0xbc,0x8c,0x33,0x52,0xa6,
+  0x9b,0x45,0xdd,0x39,0xb4,0xbb,0xa0,0x60,0xff,0x33,0x2a,0x4c,0x5c,0x53,0xd7,0xac,
+  0x2c,0x0e,0xb6,0x86,0x23,0xcb,0x29,0xfb,0x05,0x5d,0xbd,0xfc,0xc6,0x5f,0xb1,0x5c,
+  0xe9,0x2c,0x37,0x51,0xb6,0xe2,0x19,0x9d,0xba,0x57,0xce,0xf9,0x5f,0xf9,0xeb,0xfc,
+  0x32,0xf6,0x2b,0xfc,0x6a,0xa4,0xe0,0x7f,0xe4,0x57,0xf1,0xb7,0x72,0xc7,0x5a,0xcc,
+  0xbb,0xb2,0x4c,0xc3,0xec,0x6c,0x58,0x73,0x77,0x55,0x1a,0x6d,0x06,0xe3,0x16,0xf0,
+  0xd1,0x99,0xc5,0x89,0xc5,0x1d,0xf3,0x71,0xf1,0xe4,0x57,0x0f,0x46,0x7e,0x96,0xc9,
+  0x99,0xe7,0xaf,0xf4,0x5d,0x3c,0x59,0x6f,0x2e,0x0e,0x46,0xac,0x97,0x05,0xfa,0x6a,
+  0xf9,0x56,0x19,0x4e,0x8d,0x44,0xac,0xf4,0x83,0xf4,0x87,0xb4,0x2c,0xbd,0x27,0x7d,
+  0x28,0xfd,0xc6,0xbd,0xcd,0x7d,0xca,0x7d,0xcd,0x7d,0xce,0x7d,0xc1,0x5d,0x02,0x91,
+  0x3b,0xcb,0x9d,0xe3,0xbe,0xe1,0x2e,0x70,0x1f,0x73,0x5f,0xc6,0xf6,0x6a,0xf3,0x1a,
+  0x5a,0xdf,0x7b,0x16,0x79,0x18,0xb7,0x67,0xe9,0x96,0x6b,0xac,0x4a,0x21,0x23,0x6c,
+  0x15,0x1e,0x16,0x72,0xc2,0x36,0xe1,0x51,0x61,0x32,0xf2,0x27,0x0c,0x08,0x63,0x42,
+  0x51,0xd8,0x81,0x96,0xad,0xeb,0xfb,0x16,0x9f,0x2f,0x9e,0x3d,0x1d,0x0e,0x63,0x1f,
+  0xe6,0xa7,0xfb,0x5c,0xbe,0x2e,0x56,0x01,0x89,0xfb,0xb1,0x02,0xf4,0x4d,0xfe,0x55,
+  0x55,0x54,0xe9,0x70,0x94,0x29,0x1d,0x56,0x6f,0x4d,0x38,0xbe,0x41,0x13,0x8c,0x24,
+  0x43,0x64,0x8c,0x94,0x36,0x54,0xf7,0xb8,0x57,0xf3,0xa1,0x22,0x95,0x4f,0xe5,0x52,
+  0x69,0x10,0x53,0x3b,0x53,0x13,0xa9,0xb1,0xd4,0x41,0x0f,0x87,0xb3,0xa6,0x76,0xa0,
+  0x6d,0x02,0xfb,0xfc,0x1d,0xd5,0xa9,0x6e,0xb2,0x52,0xea,0xd2,0x63,0xde,0x7d,0x02,
+  0x59,0xd3,0x3a,0x6e,0xeb,0x0d,0xcd,0x15,0x77,0x4b,0xd2,0x93,0x62,0x1a,0xaf,0x36,
+  0x2a,0x96,0x9a,0xea,0xe8,0x88,0xa8,0x18,0x86,0xc8,0x4c,0x8e,0x68,0x53,0x87,0xda,
+  0x6d,0x5a,0x1b,0x05,0xef,0xde,0xf4,0x8f,0xf4,0x9b,0x32,0xbb,0x0f,0x13,0x5b,0x2e,
+  0x47,0x9c,0xfb,0x0c,0xc0,0xbe,0x3f,0xf1,0xec,0xfb,0x2e,0xe2,0x8e,0xb4,0x00,0x96,
+  0x1c,0x80,0x81,0xc7,0x23,0x6e,0x18,0xcf,0xca,0x07,0xde,0x05,0x38,0xf3,0x84,0xda,
+  0xb2,0xdb,0xc1,0x1d,0x91,0x48,0x7c,0x0b,0xe0,0xd4,0xf7,0xec,0xf6,0xbf,0xfa,0x32,
+  0x78,0x7e,0xfd,0xd4,0xe9,0xdc,0xc4,0x73,0xac,0xe7,0x2d,0x80,0xb5,0x37,0x3b,0x9d,
+  0xbf,0xdf,0xef,0x74,0xd6,0x3e,0x40,0xff,0xab,0x00,0x67,0x8d,0x7f,0x01,0xa0,0x9f,
+  0x7c,0x55,0x03,0x5c,0x0b,0xef,0x00,0x00,0x00,0x38,0x65,0x58,0x49,0x66,0x4d,0x4d,
+  0x00,0x2a,0x00,0x00,0x00,0x08,0x00,0x01,0x87,0x69,0x00,0x04,0x00,0x00,0x00,0x01,
+  0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x00,0x00,0x02,0xa0,0x02,0x00,0x04,0x00,0x00,
+  0x00,0x01,0x00,0x00,0x02,0x00,0xa0,0x03,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,
+  0x02,0x00,0x00,0x00,0x00,0x00,0x28,0x30,0x97,0xbf,0x00,0x00,0x03,0x62,0x69,0x54,
+  0x58,0x74,0x58,0x4d,0x4c,0x3a,0x63,0x6f,0x6d,0x2e,0x61,0x64,0x6f,0x62,0x65,0x2e,
+  0x78,0x6d,0x70,0x00,0x00,0x00,0x00,0x00,0x3c,0x78,0x3a,0x78,0x6d,0x70,0x6d,0x65,
+  0x74,0x61,0x20,0x78,0x6d,0x6c,0x6e,0x73,0x3a,0x78,0x3d,0x22,0x61,0x64,0x6f,0x62,
+  0x65,0x3a,0x6e,0x73,0x3a,0x6d,0x65,0x74,0x61,0x2f,0x22,0x20,0x78,0x3a,0x78,0x6d,
+  0x70,0x74,0x6b,0x3d,0x22,0x58,0x4d,0x50,0x20,0x43,0x6f,0x72,0x65,0x20,0x35,0x2e,
+  0x34,0x2e,0x30,0x22,0x3e,0x0a,0x20,0x20,0x20,0x3c,0x72,0x64,0x66,0x3a,0x52,0x44,
+  0x46,0x20,0x78,0x6d,0x6c,0x6e,0x73,0x3a,0x72,0x64,0x66,0x3d,0x22,0x68,0x74,0x74,
+  0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x77,0x33,0x2e,0x6f,0x72,0x67,0x2f,0x31,
+  0x39,0x39,0x39,0x2f,0x30,0x32,0x2f,0x32,0x32,0x2d,0x72,0x64,0x66,0x2d,0x73,0x79,
+  0x6e,0x74,0x61,0x78,0x2d,0x6e,0x73,0x23,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
+  0x20,0x3c,0x72,0x64,0x66,0x3a,0x44,0x65,0x73,0x63,0x72,0x69,0x70,0x74,0x69,0x6f,
+  0x6e,0x20,0x72,0x64,0x66,0x3a,0x61,0x62,0x6f,0x75,0x74,0x3d,0x22,0x22,0x0a,0x20,
+  0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x6d,0x6c,0x6e,0x73,
+  0x3a,0x64,0x63,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x70,0x75,0x72,0x6c,
+  0x2e,0x6f,0x72,0x67,0x2f,0x64,0x63,0x2f,0x65,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x73,
+  0x2f,0x31,0x2e,0x31,0x2f,0x22,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+  0x20,0x20,0x20,0x78,0x6d,0x6c,0x6e,0x73,0x3a,0x49,0x70,0x74,0x63,0x34,0x78,0x6d,
+  0x70,0x45,0x78,0x74,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x69,0x70,0x74,
+  0x63,0x2e,0x6f,0x72,0x67,0x2f,0x73,0x74,0x64,0x2f,0x49,0x70,0x74,0x63,0x34,0x78,
+  0x6d,0x70,0x45,0x78,0x74,0x2f,0x32,0x30,0x30,0x38,0x2d,0x30,0x32,0x2d,0x32,0x39,
+  0x2f,0x22,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,
+  0x6d,0x6c,0x6e,0x73,0x3a,0x70,0x68,0x6f,0x74,0x6f,0x73,0x68,0x6f,0x70,0x3d,0x22,
+  0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x6e,0x73,0x2e,0x61,0x64,0x6f,0x62,0x65,0x2e,
+  0x63,0x6f,0x6d,0x2f,0x70,0x68,0x6f,0x74,0x6f,0x73,0x68,0x6f,0x70,0x2f,0x31,0x2e,
+  0x30,0x2f,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,
+  0x63,0x3a,0x63,0x72,0x65,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
+  0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x72,0x64,0x66,0x3a,0x53,0x65,0x71,0x3e,
+  0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+  0x3c,0x72,0x64,0x66,0x3a,0x6c,0x69,0x3e,0x4d,0x69,0x63,0x68,0x61,0x65,0x6c,0x20,
+  0x53,0x77,0x65,0x65,0x74,0x3c,0x2f,0x72,0x64,0x66,0x3a,0x6c,0x69,0x3e,0x0a,0x20,
+  0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x72,0x64,0x66,
+  0x3a,0x53,0x65,0x71,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
+  0x2f,0x64,0x63,0x3a,0x63,0x72,0x65,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,
+  0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x63,0x3a,0x72,0x69,0x67,0x68,0x74,0x73,
+  0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x72,
+  0x64,0x66,0x3a,0x41,0x6c,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+  0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x72,0x64,0x66,0x3a,0x6c,0x69,0x20,0x78,
+  0x6d,0x6c,0x3a,0x6c,0x61,0x6e,0x67,0x3d,0x22,0x78,0x2d,0x64,0x65,0x66,0x61,0x75,
+  0x6c,0x74,0x22,0x3e,0x43,0x6f,0x70,0x79,0x72,0x69,0x67,0x68,0x74,0x20,0x32,0x30,
+  0x31,0x30,0x20,0x41,0x70,0x70,0x6c,0x65,0x20,0x49,0x6e,0x63,0x2e,0x3c,0x2f,0x72,
+  0x64,0x66,0x3a,0x6c,0x69,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+  0x20,0x20,0x20,0x3c,0x2f,0x72,0x64,0x66,0x3a,0x41,0x6c,0x74,0x3e,0x0a,0x20,0x20,
+  0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x63,0x3a,0x72,0x69,0x67,0x68,
+  0x74,0x73,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x70,
+  0x74,0x63,0x34,0x78,0x6d,0x70,0x45,0x78,0x74,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69,
+  0x6e,0x65,0x3e,0x4e,0x65,0x77,0x20,0x49,0x6d,0x61,0x67,0x65,0x3c,0x2f,0x49,0x70,
+  0x74,0x63,0x34,0x78,0x6d,0x70,0x45,0x78,0x74,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69,
+  0x6e,0x65,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x68,
+  0x6f,0x74,0x6f,0x73,0x68,0x6f,0x70,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69,0x6e,0x65,
+  0x3e,0x4e,0x65,0x77,0x20,0x49,0x6d,0x61,0x67,0x65,0x3c,0x2f,0x70,0x68,0x6f,0x74,
+  0x6f,0x73,0x68,0x6f,0x70,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69,0x6e,0x65,0x3e,0x0a,
+  0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x72,0x64,0x66,0x3a,0x44,0x65,0x73,0x63,
+  0x72,0x69,0x70,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x3c,0x2f,0x72,0x64,
+  0x66,0x3a,0x52,0x44,0x46,0x3e,0x0a,0x3c,0x2f,0x78,0x3a,0x78,0x6d,0x70,0x6d,0x65,
+  0x74,0x61,0x3e,0x0a,0xa0,0x50,0x98,0x64,0x00,0x00,0x6b,0x41,0x49,0x44,0x41,0x54,
+  0x78,0xda,0xed,0x9d,0x07,0xfc,0x1c,0x55,0xb9,0xb0,0x4f,0x7a,0xef,0x40,0x0a,0x49,
+  0x20,0x10,0x9a,0x54,0xe9,0x46,0x7a,0x13,0x14,0x2e,0x52,0x42,0x53,0x54,0x04,0x2f,
+  0x28,0x02,0xf7,0x7e,0x82,0x15,0x51,0x51,0x11,0x14,0x6c,0x28,0xc2,0xfd,0x79,0x51,
+  0x41,0x41,0xa4,0x37,0xf9,0x40,0x3a,0x48,0x07,0x29,0x86,0x96,0x90,0x00,0x09,0x24,
+  0x90,0x46,0x7a,0xcf,0x7e,0xe7,0x1d,0x32,0xff,0x6f,0x72,0x72,0xce,0x9c,0x33,0xbb,
+  0x33,0xbb,0xb3,0xbb,0xcf,0x93,0xdf,0xc9,0xee,0x7f,0x77,0x76,0x66,0xce,0xb4,0xb7,
+  0x9c,0xf7,0x7d,0x4f,0x27,0x55,0x52,0x2a,0x95,0x4a,0x1f,0xfd,0xb2,0xad,0x6e,0xdb,
+  0xe9,0x36,0x56,0xb7,0x31,0xba,0x8d,0xd4,0x6d,0x3d,0xdd,0x06,0xeb,0xd6,0x4b,0xb7,
+  0xee,0xba,0x75,0x51,0x00,0x00,0x00,0xf5,0x67,0x95,0x6e,0xcb,0x75,0x5b,0xa2,0xdb,
+  0x1c,0xdd,0x66,0xe9,0x36,0x4d,0xb7,0x29,0xba,0x4d,0xd2,0xed,0x45,0xdd,0x5e,0xea,
+  0xd4,0xa9,0xd3,0xa2,0x32,0xee,0x7c,0xa7,0x12,0x09,0xfc,0x7e,0xfa,0x65,0x7f,0xdd,
+  0x0e,0xd0,0x6d,0x8f,0x35,0xc2,0xbf,0x33,0xd7,0x17,0x00,0x00,0x34,0x31,0xab,0x45,
+  0x09,0xd0,0xed,0x51,0xdd,0xee,0xd5,0xed,0x3e,0xad,0x10,0x2c,0x68,0x7b,0x05,0x40,
+  0x0b,0xfd,0x41,0xfa,0xe5,0x08,0xdd,0x8e,0xd5,0x6d,0x5f,0xdd,0xba,0x71,0xad,0x00,
+  0x00,0x40,0x0b,0xb3,0x42,0xb7,0x07,0x74,0xbb,0x4e,0xb7,0x9b,0xb5,0x32,0x30,0xb7,
+  0xad,0x14,0x00,0x2d,0xf8,0xf7,0xd4,0x2f,0xa7,0xea,0x76,0xb4,0x6e,0x3d,0xb8,0x1e,
+  0x00,0x00,0xa0,0x0d,0x59,0xaa,0xdb,0x8d,0xba,0x5d,0xa1,0x15,0x81,0x47,0x5a,0x56,
+  0x01,0xd0,0x42,0x5f,0xdc,0xf9,0xe3,0x75,0x3b,0x5b,0xb7,0x9d,0x39,0xef,0x00,0x00,
+  0x00,0x1d,0x3c,0xa3,0xdb,0xc5,0xba,0x5d,0xaf,0x95,0x81,0xd5,0x2d,0xa3,0x00,0x68,
+  0xe1,0x7f,0xa4,0x7e,0x39,0x5f,0xb7,0xad,0x39,0xc7,0x00,0x00,0x00,0x4e,0x26,0xe8,
+  0x76,0x9e,0x56,0x02,0x6e,0x6a,0x6a,0x05,0x40,0x0b,0xfe,0x2d,0xf5,0xcb,0x65,0xea,
+  0xc3,0xf1,0x7d,0x00,0x00,0x00,0x08,0x43,0xe2,0x04,0xbe,0xa2,0x15,0x81,0x57,0x8b,
+  0xda,0x40,0x21,0x51,0xf6,0x5a,0xf0,0xf7,0xd6,0xed,0x02,0xfd,0xf6,0x05,0x84,0x3f,
+  0x00,0x00,0x40,0x66,0x44,0x76,0xbe,0x20,0xb2,0x54,0x64,0x6a,0x53,0x78,0x00,0xf4,
+  0x8e,0xee,0xae,0x5f,0xae,0x51,0x1f,0xe6,0xed,0x03,0x00,0x00,0x40,0x6d,0x48,0x5d,
+  0x81,0x13,0xb4,0x37,0xe0,0x89,0xd2,0x7a,0x00,0xb4,0xf0,0xff,0x9a,0x7e,0x79,0x18,
+  0xe1,0x0f,0x00,0x00,0x90,0x1b,0x22,0x53,0x1f,0x5e,0x23,0x63,0xcb,0xe5,0x01,0xd0,
+  0x3b,0x25,0x95,0xf9,0xfe,0xa8,0xdb,0x61,0x9c,0x27,0x00,0x00,0x80,0xc2,0xb8,0x5d,
+  0xb7,0x2f,0x68,0x6f,0xc0,0x9c,0x86,0x2b,0x00,0x5a,0xf8,0x8b,0x66,0x72,0x8f,0xfa,
+  0xb0,0x5c,0x2f,0x00,0x00,0x00,0x14,0x8b,0x94,0x19,0x3e,0x48,0x2b,0x01,0x53,0x6a,
+  0x59,0x49,0x4d,0x43,0x00,0x5a,0xf8,0x6f,0xaf,0x5f,0x1e,0x43,0xf8,0x03,0x00,0x00,
+  0xd4,0x0d,0x91,0xb9,0x8f,0xad,0x91,0xc1,0xf5,0x57,0x00,0xf4,0x86,0xf7,0xd6,0x2f,
+  0x0f,0xe9,0x36,0x8c,0x73,0x01,0x00,0x00,0x50,0x57,0x44,0xf6,0x3e,0xb4,0x46,0x16,
+  0x57,0x45,0x55,0x43,0x00,0x6b,0x36,0xf8,0x7f,0x75,0xeb,0xc9,0x39,0x00,0x00,0x00,
+  0x68,0x18,0x52,0x4e,0xf8,0x60,0x3d,0x1c,0xf0,0x50,0xe1,0x0a,0xc0,0x1a,0x97,0x83,
+  0x6c,0x68,0x00,0xc7,0x1d,0x00,0x00,0xa0,0xe1,0xcc,0xd3,0x6d,0x6f,0xad,0x04,0xbc,
+  0x50,0x98,0x02,0xb0,0x26,0xe0,0x4f,0xc6,0xfc,0x71,0xfb,0x03,0x00,0x00,0x94,0x87,
+  0x19,0xba,0x8d,0xcb,0x12,0x18,0x18,0xac,0x00,0xac,0x49,0xf5,0x7b,0x52,0x11,0xf0,
+  0x07,0x00,0x00,0x50,0x46,0x24,0x3b,0x60,0xb7,0xd0,0x14,0xc1,0x2c,0x41,0x80,0x7f,
+  0x44,0xf8,0x03,0x00,0x00,0x94,0x96,0xb1,0x6b,0x64,0x75,0x10,0x41,0x0a,0xc0,0x9a,
+  0xea,0x43,0x14,0xf9,0x01,0x00,0x00,0x28,0x37,0x87,0x85,0x56,0x0c,0xf4,0x0e,0x01,
+  0xac,0xa9,0xed,0x2f,0xe5,0x7d,0xbb,0x71,0x5c,0x01,0x00,0x00,0x4a,0xcf,0x0a,0xdd,
+  0xf6,0xf2,0xcd,0x1d,0xd0,0xc9,0x23,0xfc,0x65,0x06,0xa2,0x7f,0x2b,0x6a,0xfb,0x03,
+  0x00,0x00,0x34,0x13,0x12,0x0c,0xb8,0x8d,0x56,0x02,0x16,0xbb,0x16,0xf0,0x0d,0x01,
+  0x9c,0x8b,0xf0,0x07,0x00,0x00,0x68,0x3a,0xc6,0xac,0x91,0xe1,0xd9,0x3d,0x00,0xda,
+  0xfa,0xdf,0x52,0xbf,0x48,0x4e,0x61,0x77,0x8e,0x23,0x00,0x00,0x40,0xd3,0xb1,0x5c,
+  0xb7,0xed,0xb5,0x17,0xe0,0xd5,0xac,0x0a,0xc0,0xfd,0xfa,0x65,0xdf,0x5a,0xb7,0xbe,
+  0x72,0xe5,0x4a,0x35,0x77,0xee,0xdc,0xd4,0x65,0xba,0x75,0xeb,0xa6,0x06,0x0e,0x1c,
+  0xc8,0xa9,0x02,0x00,0x00,0xc8,0x97,0x07,0xb4,0x02,0xb0,0x5f,0xb0,0x02,0xa0,0x85,
+  0xff,0x51,0xfa,0xe5,0x86,0x3c,0xb6,0x7c,0xe9,0xa5,0x97,0xaa,0x33,0xcf,0x3c,0x33,
+  0x75,0x99,0xee,0xdd,0xbb,0xab,0x65,0xcb,0x96,0x71,0x9a,0x00,0x00,0x00,0xf2,0xe7,
+  0x68,0xad,0x04,0xdc,0x68,0x7e,0xd8,0xd9,0x22,0xfc,0xe5,0xb3,0x1f,0xe4,0xb5,0xd5,
+  0xe5,0xcb,0x97,0xe7,0xb2,0x0c,0x00,0x00,0x00,0x54,0xc5,0x0f,0xd6,0xc8,0xf6,0x74,
+  0x05,0x40,0x33,0x5e,0xb7,0xad,0x39,0x5e,0x00,0x00,0x00,0x2d,0xc1,0xd6,0x6b,0x64,
+  0xbb,0x57,0x01,0x38,0x9b,0x63,0x05,0x00,0x00,0xd0,0x52,0x9c,0x9d,0xaa,0x00,0x68,
+  0x17,0xc1,0x9e,0xfa,0x65,0x67,0x8e,0x13,0x00,0x00,0x40,0x4b,0xb1,0xf3,0x1a,0x19,
+  0xef,0xf4,0x00,0x9c,0xca,0x31,0x02,0x00,0x00,0x68,0x49,0x4e,0xb5,0x2a,0x00,0x5a,
+  0x33,0x18,0xa4,0x5f,0x8e,0xe2,0xf8,0x00,0x00,0x00,0xb4,0x24,0x47,0xad,0x91,0xf5,
+  0xeb,0x78,0x00,0x8e,0xd0,0xad,0x27,0xc7,0x07,0x00,0x00,0xa0,0x25,0xe9,0xb9,0x46,
+  0xd6,0xaf,0xa3,0x00,0x1c,0xcb,0xb1,0x01,0x00,0x00,0x68,0x69,0x3a,0x64,0x7d,0x57,
+  0xf9,0x4f,0xbb,0x04,0xfa,0xa9,0x1c,0xaa,0xfe,0xd9,0x18,0x3f,0x7e,0xbc,0xda,0x60,
+  0x83,0x0d,0x52,0x97,0xe9,0xdb,0xb7,0x2f,0xa7,0x04,0x00,0x00,0xa0,0x78,0xf6,0x15,
+  0x99,0xaf,0x0b,0x03,0x2d,0xe8,0xb4,0x46,0x01,0x10,0x97,0xc0,0x4d,0x1c,0x17,0x00,
+  0x00,0x80,0x96,0xe7,0x08,0xad,0x00,0xdc,0x12,0x0f,0x01,0xec,0xcf,0xf1,0x00,0x00,
+  0x00,0x68,0x0b,0x0e,0x90,0xff,0x62,0x05,0x60,0x0f,0x8e,0x07,0x00,0x00,0x40,0x5b,
+  0x10,0xc9,0xfc,0x4e,0xda,0xfd,0x2f,0x03,0xf0,0xf3,0x94,0xbd,0x2a,0x20,0x00,0x00,
+  0x00,0xb4,0x16,0xab,0x75,0xeb,0x2f,0x42,0x7f,0x1b,0x84,0x3f,0x00,0x00,0x40,0xdb,
+  0x20,0x32,0x7f,0x5b,0xf9,0x6f,0x3b,0x8e,0x05,0x00,0x00,0x40,0x5b,0xb1,0x9d,0xa4,
+  0x01,0x8e,0xe5,0x38,0xb8,0x99,0x37,0x6f,0x9e,0x7a,0xf3,0xcd,0x37,0xa3,0xf6,0xd6,
+  0x5b,0x6f,0xa9,0xd5,0xab,0x57,0xab,0xa1,0x43,0x87,0xaa,0xe1,0xc3,0x87,0xab,0x61,
+  0xc3,0x86,0xa9,0x51,0xa3,0x46,0xa9,0x3e,0x7d,0xfa,0xd0,0xcf,0x12,0xb0,0x68,0xd1,
+  0x22,0x35,0x75,0xea,0x54,0x35,0x7d,0xfa,0x74,0xf5,0xee,0xbb,0xef,0x46,0xaf,0x0b,
+  0x17,0x2e,0x54,0x43,0x86,0x0c,0x89,0xfa,0x20,0x6d,0xc4,0x88,0x11,0x6a,0x93,0x4d,
+  0x36,0x51,0x3a,0x02,0x96,0x8b,0x9b,0x73,0x01,0xd0,0xce,0x8c,0x15,0x05,0x60,0x4c,
+  0x91,0x5b,0x98,0x32,0x65,0x8a,0x7a,0xe0,0x81,0x07,0x52,0x97,0x11,0xc1,0x72,0xec,
+  0xb1,0xc7,0x96,0x62,0x3b,0x2b,0x57,0xae,0x54,0x37,0xde,0x78,0xa3,0xfa,0xdd,0xef,
+  0x7e,0xa7,0x5e,0x78,0xe1,0x05,0xf5,0xc1,0x07,0x1f,0xa4,0x2e,0xdf,0xb5,0x6b,0x57,
+  0xb5,0xef,0xbe,0xfb,0xaa,0xa3,0x8e,0x3a,0x4a,0x1d,0x71,0xc4,0x11,0xde,0x9a,0x07,
+  0x65,0x39,0x9e,0x65,0xef,0x67,0x28,0xb3,0x67,0xcf,0x56,0xb7,0xde,0x7a,0xab,0xba,
+  0xfe,0xfa,0xeb,0xd5,0x7d,0xf7,0xdd,0xa7,0x56,0xac,0x58,0xe1,0xfd,0x8d,0x28,0x33,
+  0xd2,0x87,0x23,0x8f,0x3c,0x52,0xed,0xb1,0xc7,0x1e,0xaa,0x4b,0x97,0x2e,0x35,0xed,
+  0xc3,0x8b,0x2f,0xbe,0xa8,0x9e,0x79,0xe6,0x99,0xd4,0x65,0x06,0x0c,0x18,0x10,0x1d,
+  0xbb,0x7a,0x72,0xd7,0x5d,0x77,0x45,0x82,0xd7,0x45,0xe7,0xce,0x9d,0xd5,0xe7,0x3e,
+  0xf7,0xb9,0xe8,0xb5,0x55,0xce,0x05,0x00,0x04,0x33,0x46,0x6a,0x00,0x3c,0x5e,0x29,
+  0x90,0x8b,0x2f,0xbe,0xb8,0xa2,0x37,0xe4,0x6d,0x8d,0xde,0x8e,0x7e,0x78,0x55,0x7e,
+  0xf2,0x93,0x9f,0x54,0x46,0x8e,0x1c,0x19,0xb4,0x1e,0x5b,0xd3,0x0f,0xd2,0xca,0xf1,
+  0xc7,0x1f,0x5f,0xd1,0x0f,0xdd,0xd2,0x1e,0xcf,0x66,0xe9,0xa7,0x8f,0x89,0x13,0x27,
+  0x56,0x0e,0x3f,0xfc,0xf0,0x8a,0x56,0x4c,0xaa,0xee,0x87,0xb4,0x8d,0x37,0xde,0xb8,
+  0x72,0xc7,0x1d,0x77,0xd4,0xb4,0x2f,0xe7,0x9c,0x73,0x4e,0xd0,0x31,0x7b,0xfb,0xed,
+  0xb7,0xeb,0x76,0x7c,0xb4,0x47,0xa7,0xd2,0xbb,0x77,0xef,0xd4,0x7d,0x92,0x63,0x37,
+  0x73,0xe6,0xcc,0x96,0x3a,0x17,0x00,0x10,0xcc,0xe3,0x22,0x29,0x26,0xb6,0xbb,0x02,
+  0x70,0xd3,0x4d,0x37,0x55,0xb4,0xd5,0x5c,0xd3,0xc3,0x2b,0xd9,0xb4,0xb5,0x57,0xb9,
+  0xec,0xb2,0xcb,0x2a,0xab,0x56,0xad,0x2a,0xd5,0xf1,0x6c,0xa6,0x7e,0xba,0x58,0xba,
+  0x74,0x69,0xe5,0x7b,0xdf,0xfb,0x5e,0xa5,0x47,0x8f,0x1e,0xb9,0xf5,0x43,0x9a,0xb6,
+  0x40,0x2b,0xd3,0xa6,0x4d,0xab,0x6a,0x9f,0x9e,0x7b,0xee,0xb9,0xa0,0x6d,0x5c,0x70,
+  0xc1,0x05,0x75,0x3b,0x4e,0x97,0x5f,0x7e,0xb9,0x77,0x7f,0x44,0x68,0xb7,0xda,0xb9,
+  0x00,0x80,0x70,0xdd,0x5d,0x24,0xc5,0xec,0x76,0x56,0x00,0xe4,0x77,0x62,0x9d,0xe5,
+  0xf9,0x00,0x8b,0xdb,0x21,0x87,0x1c,0x12,0x3d,0x24,0xcb,0x70,0x3c,0x9b,0xad,0x9f,
+  0x36,0x9e,0x7d,0xf6,0xd9,0xca,0xd8,0xb1,0x63,0x0b,0xe9,0x83,0xb4,0xf5,0xd6,0x5b,
+  0xaf,0xf2,0xd2,0x4b,0x2f,0x55,0xb5,0x6f,0xdb,0x6d,0xb7,0x9d,0x77,0xfd,0x5b,0x6e,
+  0xb9,0x65,0xdd,0xee,0xec,0x5d,0x76,0xd9,0xc5,0xbb,0x3f,0xb5,0x58,0xdb,0x65,0x3e,
+  0x17,0x00,0x10,0xc4,0x6c,0x19,0xfc,0xeb,0xd5,0x8e,0x83,0x1f,0x32,0x06,0x7e,0xda,
+  0x69,0xa7,0xa9,0xb3,0xcf,0x3e,0x3b,0x0a,0x78,0x2b,0x6a,0x0c,0x56,0xc6,0x7d,0x97,
+  0x2f,0x5f,0x4e,0x3f,0x6b,0xe4,0x89,0x27,0x9e,0x50,0xfb,0xed,0xb7,0x9f,0x9a,0x34,
+  0x69,0x52,0x61,0xdb,0x98,0x35,0x6b,0x96,0x3a,0xe0,0x80,0x03,0xd4,0x6b,0xaf,0xbd,
+  0x96,0xf9,0xb7,0x9f,0xff,0xfc,0xe7,0xbd,0xcb,0xbc,0xfa,0xea,0xab,0xea,0xa9,0xa7,
+  0x9e,0x2a,0xfc,0x9c,0x4b,0x4c,0xc2,0xd3,0x4f,0x3f,0x9d,0xba,0x8c,0x1e,0x02,0x52,
+  0x07,0x1f,0x7c,0x70,0x4b,0x9e,0x0b,0x00,0x08,0xa2,0x97,0x28,0x00,0xdd,0xdb,0xb1,
+  0xe7,0x9f,0xfd,0xec,0x67,0xd5,0x15,0x57,0x5c,0x51,0xf8,0x76,0xee,0xbc,0xf3,0x4e,
+  0x75,0xcc,0x31,0xc7,0x04,0x05,0x44,0xd1,0x4f,0x3b,0x0f,0x3f,0xfc,0xb0,0x3a,0xe8,
+  0xa0,0x83,0xa2,0x4c,0x85,0xa2,0x79,0xef,0xbd,0xf7,0xd4,0xfe,0xfb,0xef,0x1f,0x65,
+  0x43,0x64,0xe1,0x84,0x13,0x4e,0x88,0x02,0x25,0x7d,0xfc,0xe9,0x4f,0x7f,0x2a,0xbc,
+  0x0f,0xff,0xfb,0xbf,0xff,0xeb,0x5d,0xe6,0x8b,0x5f,0xfc,0x62,0x55,0x01,0x77,0xcd,
+  0x70,0x2e,0x00,0x20,0x88,0xee,0xa2,0x00,0xb4,0x5d,0xd8,0xed,0xd5,0x57,0x5f,0xad,
+  0xae,0xbb,0xee,0xba,0xba,0x6d,0x4f,0x22,0xa3,0x7f,0xf4,0xa3,0x1f,0xd1,0xcf,0x2a,
+  0x78,0xf4,0xd1,0x47,0x95,0x1e,0x62,0x50,0x0b,0x16,0x2c,0x08,0xfe,0x4d,0xb7,0x6e,
+  0xdd,0xd4,0xe8,0xd1,0xa3,0xd5,0x8e,0x3b,0xee,0xa8,0xb6,0xde,0x7a,0xeb,0x28,0xf5,
+  0x2c,0x0b,0xef,0xbc,0xf3,0x8e,0x3a,0xf9,0xe4,0x93,0x33,0xfd,0x46,0xd2,0xda,0x42,
+  0x2c,0xea,0xbf,0xfe,0xf5,0xaf,0x85,0x7a,0x4a,0x96,0x2d,0x5b,0xa6,0xfe,0xfc,0xe7,
+  0x3f,0xa7,0x2e,0x23,0x51,0xff,0x59,0xfb,0xd7,0x4c,0xe7,0x02,0x00,0x82,0xe8,0xa2,
+  0x8a,0x1e,0x64,0x28,0x5b,0x0c,0x80,0xce,0x4d,0xae,0x0c,0x1c,0x38,0x30,0x73,0xd4,
+  0xbb,0xaa,0x71,0x4c,0xb3,0x7b,0xf7,0xee,0x95,0x97,0x5f,0x7e,0x99,0x7e,0x66,0x40,
+  0xa7,0x26,0x56,0x74,0x9a,0x58,0xd0,0x76,0x75,0x2e,0x79,0x45,0x5b,0xe1,0x15,0xad,
+  0x84,0x54,0x74,0x0e,0xfa,0x3a,0xeb,0xd2,0xae,0xe4,0xca,0x4f,0x7f,0xfa,0xd3,0xca,
+  0x86,0x1b,0x6e,0x18,0xdc,0x97,0x6b,0xae,0xb9,0x26,0xd3,0xfe,0xea,0xf4,0xb7,0xa0,
+  0xf5,0xea,0xf4,0xcb,0xc2,0xee,0xb7,0x6b,0xaf,0xbd,0xd6,0xbb,0x7d,0xad,0xa8,0xb4,
+  0xfc,0xb9,0x00,0x00,0x3f,0x6d,0xa7,0x00,0x68,0xf7,0xa5,0x77,0x19,0x79,0xd0,0x9d,
+  0x7f,0xfe,0xf9,0x95,0x7f,0xfc,0xe3,0x1f,0x95,0xc9,0x93,0x27,0x57,0xf4,0x38,0x7a,
+  0x47,0xd4,0xf3,0x2b,0xaf,0xbc,0x12,0x45,0x73,0x6f,0xb3,0xcd,0x36,0x99,0x85,0xe3,
+  0x9e,0x7b,0xee,0x59,0xd1,0xe3,0xf0,0xf4,0x33,0x90,0x13,0x4f,0x3c,0x31,0x68,0x7b,
+  0x3b,0xec,0xb0,0x43,0x45,0x8f,0x79,0x07,0xad,0x53,0x5b,0xaf,0x95,0x33,0xce,0x38,
+  0x23,0x68,0xbd,0xba,0x08,0x52,0x94,0x4e,0x97,0x25,0x2a,0x7e,0xd0,0xa0,0x41,0x85,
+  0x47,0xdf,0xa7,0xa1,0x5d,0xe6,0x85,0x28,0x20,0xcd,0x76,0x2e,0x00,0x00,0x05,0x20,
+  0x53,0x3b,0xf0,0xc0,0x03,0x2b,0xb7,0xdc,0x72,0x4b,0x87,0x20,0xf4,0xa1,0x8b,0xe8,
+  0x64,0x4e,0xab,0xd3,0x6e,0x79,0xfa,0x19,0xc0,0x0d,0x37,0xdc,0x10,0xb4,0x1d,0x5d,
+  0x3c,0xa6,0x2a,0xc1,0xf0,0x9d,0xef,0x7c,0x27,0x68,0xfd,0xdf,0xff,0xfe,0xf7,0x33,
+  0xad,0xf7,0xcb,0x5f,0xfe,0xb2,0x77,0x9d,0xda,0x2d,0x9e,0x4b,0xfe,0xbd,0xc9,0x1b,
+  0x6f,0xbc,0x11,0x59,0xdf,0x69,0xdb,0xd6,0xd5,0x1d,0x2b,0x3a,0x4e,0xa3,0x2d,0xce,
+  0x05,0x00,0xa0,0x00,0x78,0x9b,0x1e,0x97,0xac,0xda,0x2d,0xab,0x23,0xbb,0x2b,0xeb,
+  0xaf,0xbf,0x7e,0xf0,0xb6,0x3e,0xf6,0xb1,0x8f,0xd1,0xcf,0x00,0xcb,0x50,0xd2,0xc0,
+  0x7c,0xdb,0xd0,0x65,0x64,0xa3,0x65,0xab,0xe5,0xb0,0xc3,0x0e,0x0b,0xda,0x46,0x16,
+  0x9e,0x7c,0xf2,0xc9,0xa0,0xe3,0xf3,0xeb,0x5f,0xff,0x3a,0xf7,0x7b,0xed,0xdc,0x73,
+  0xcf,0xf5,0x6e,0xf7,0x9b,0xdf,0xfc,0x66,0xdb,0x9c,0x0b,0x00,0x40,0x01,0xf0,0x8e,
+  0x87,0xea,0x5a,0xe5,0x35,0x6d,0xfb,0x9f,0xff,0xfc,0x67,0xa6,0x62,0x28,0xb5,0x8c,
+  0x91,0xb7,0x43,0x3f,0x2f,0xbd,0xf4,0xd2,0xa0,0x71,0xe6,0x87,0x1e,0x7a,0xa8,0xa6,
+  0xfe,0x48,0x05,0x3b,0x89,0x59,0xf0,0x6d,0x4b,0x07,0xbf,0x65,0x5a,0xaf,0xe4,0xfb,
+  0xfb,0xd6,0xb9,0xd3,0x4e,0x3b,0xe5,0x7a,0x9f,0x89,0x37,0xc7,0x57,0xdd,0x51,0x8e,
+  0x99,0x4e,0xdd,0x6b,0xab,0x73,0x01,0x00,0x6e,0xda,0x7a,0x1a,0xe0,0x8b,0x2e,0xba,
+  0x28,0xca,0x61,0x97,0x09,0x6f,0x6a,0x61,0xdc,0xb8,0x71,0x4a,0xbb,0x27,0x83,0x97,
+  0xbf,0xf2,0xca,0x2b,0xe9,0xa7,0x03,0x51,0x4a,0xb5,0x75,0xec,0x5d,0x4e,0xea,0xc7,
+  0xef,0xb5,0xd7,0x5e,0x35,0xf5,0x47,0x17,0xb2,0x51,0xe3,0xc7,0x8f,0xf7,0x2e,0x77,
+  0xd5,0x55,0x57,0x65,0x5a,0x6f,0x48,0x4d,0x00,0x5d,0x48,0x47,0x69,0x05,0x29,0xb7,
+  0x73,0x7c,0xf7,0xdd,0x77,0x2b,0x5d,0x3d,0x2f,0x75,0x19,0x99,0xcb,0x61,0xd3,0x4d,
+  0x37,0x6d,0xab,0x73,0x01,0x00,0xe9,0x37,0x79,0x5b,0x7a,0x00,0xf2,0x76,0xc1,0xea,
+  0x99,0xce,0x2a,0x7a,0x82,0x9c,0xa0,0x6d,0xcb,0x38,0x6c,0xb5,0x41,0x72,0xad,0xde,
+  0xcf,0xdb,0x6f,0xbf,0x3d,0x68,0xdd,0x7a,0x42,0xa4,0x5c,0xfa,0x73,0xdb,0x6d,0xb7,
+  0x79,0xb7,0x35,0x78,0xf0,0xe0,0x4c,0xfd,0x90,0x0c,0x8c,0x90,0x8c,0x8a,0xaf,0x7f,
+  0xfd,0xeb,0xb9,0x9d,0x17,0x2d,0x84,0xbd,0xdb,0x93,0x0c,0x81,0x76,0x3b,0x17,0x00,
+  0x80,0x07,0x60,0x2d,0x7e,0xf3,0x9b,0xdf,0x28,0x1d,0x7d,0x9c,0xeb,0x3a,0x65,0x06,
+  0xbe,0xaf,0x7d,0xed,0x6b,0x41,0xcb,0x4a,0x81,0x13,0x1d,0xb0,0x45,0x3f,0x2d,0x68,
+  0x97,0xb3,0x77,0x99,0xcd,0x36,0xdb,0x4c,0xed,0xb3,0xcf,0x3e,0xb9,0xf4,0xe7,0x13,
+  0x9f,0xf8,0x84,0xea,0xd9,0xb3,0x67,0xea,0x32,0x73,0xe6,0xcc,0x89,0x66,0x61,0x0c,
+  0x45,0xaa,0xec,0x49,0x01,0x1b,0x1f,0x7f,0xf9,0xcb,0x5f,0x72,0xa9,0xce,0x28,0xc7,
+  0x59,0x97,0xf5,0x4d,0x5d,0x46,0xf2,0xef,0xc5,0x52,0x6f,0xb7,0x73,0x01,0x00,0x6e,
+  0xda,0x4e,0x01,0xd0,0x93,0xd7,0xa8,0xd3,0x4f,0x3f,0xbd,0x90,0x75,0x4b,0x25,0xbc,
+  0x50,0x7c,0xd3,0xc7,0xb6,0x63,0x3f,0x75,0x1a,0x9d,0x7a,0xf0,0xc1,0x07,0xbd,0xcb,
+  0xe9,0x2c,0x86,0xdc,0xfa,0xa2,0xc7,0x9d,0xd5,0x56,0x5b,0x6d,0xe5,0x5d,0xee,0xf9,
+  0xe7,0x9f,0xcf,0xb4,0xde,0x2f,0x7c,0xe1,0x0b,0xde,0x65,0xa4,0xc8,0xcd,0xbd,0xf7,
+  0xde,0x5b,0x73,0x1f,0xc4,0x2d,0xee,0xab,0xc0,0x28,0xd3,0xfe,0xea,0xf8,0x8d,0xb6,
+  0x3c,0x17,0x00,0x80,0x02,0x10,0xa1,0xd3,0xb4,0x0a,0x5b,0xb7,0x9e,0xce,0x54,0xe9,
+  0xbc,0xf9,0x52,0x28,0x00,0xcd,0xd8,0x4f,0xa9,0x5f,0x1f,0x52,0x25,0x2f,0xc4,0xba,
+  0xce,0x42,0x48,0x5f,0xb2,0x0a,0x9d,0x4f,0x7f,0xfa,0xd3,0xaa,0x7f,0xff,0xfe,0x41,
+  0xc2,0xbb,0x56,0x42,0x4a,0xff,0x7e,0xe9,0x4b,0x5f,0xca,0xb4,0xce,0x56,0x3a,0x17,
+  0x00,0x80,0x02,0x50,0x17,0x42,0x27,0x58,0x29,0x5a,0x01,0x68,0xc6,0x7e,0x4a,0xa9,
+  0xd9,0x10,0x76,0xdb,0x6d,0xb7,0x5c,0xfb,0x32,0x66,0xcc,0x98,0xdc,0x85,0x4e,0xef,
+  0xde,0xbd,0x83,0x82,0xda,0x6e,0xbe,0xf9,0xe6,0x4c,0xa5,0x75,0x6d,0xc7,0xcc,0x37,
+  0x61,0x8e,0xce,0xcf,0x0f,0xb2,0xac,0x5b,0xf5,0x5c,0x00,0x00,0x0a,0x40,0x5d,0x08,
+  0xb5,0x8c,0x75,0xa5,0x3d,0xfa,0x59,0x85,0xd0,0x91,0x31,0xe2,0x11,0x23,0x46,0xe4,
+  0xda,0x97,0x7e,0xfd,0xfa,0x79,0x97,0x79,0xfd,0xf5,0xd7,0x33,0xaf,0x37,0x24,0x1b,
+  0x60,0xf1,0xe2,0xc5,0x4a,0x17,0xda,0xa9,0x7a,0xdf,0x7f,0xff,0xfb,0xdf,0xe7,0x6e,
+  0xfd,0xb7,0xe2,0xb9,0x00,0x80,0x75,0xe9,0xca,0x21,0xc8,0x97,0x2d,0xb6,0xd8,0x22,
+  0x68,0xb9,0xb9,0x73,0xe7,0xd2,0x4f,0x83,0x90,0xa9,0x72,0x57,0xad,0x5a,0x15,0xcd,
+  0x48,0x97,0x27,0x13,0x26,0x4c,0xf0,0x2e,0x53,0xcd,0xec,0x77,0x62,0x79,0xeb,0xe2,
+  0x35,0x4a,0x97,0x59,0x4e,0x5d,0x4e,0x66,0x08,0x3c,0xe9,0xa4,0x93,0x32,0xaf,0x7f,
+  0xfe,0xfc,0xf9,0x4a,0xcf,0x3f,0x90,0xba,0xcc,0x80,0x01,0x03,0x82,0x3c,0x11,0xad,
+  0x7e,0x2e,0xfe,0xfe,0xf7,0xbf,0xab,0xc7,0x1e,0x7b,0xac,0xb4,0xf7,0x93,0x78,0x3e,
+  0x98,0xf4,0x08,0x50,0x00,0xda,0x44,0x01,0x90,0xa0,0xad,0x25,0x4b,0x96,0xa8,0x5e,
+  0xbd,0x7a,0xd1,0x4f,0x8d,0x2e,0x64,0xa3,0x66,0xcf,0x9e,0x1d,0xb4,0xbe,0xbc,0xa2,
+  0xce,0xb3,0x0a,0xdb,0xac,0xe8,0x02,0x39,0x51,0xf0,0x9d,0xaf,0x76,0x82,0x08,0x51,
+  0x99,0xf2,0x56,0x62,0x2b,0xb2,0xa0,0xd3,0xfa,0x22,0x0f,0x42,0x1a,0x32,0x1d,0x74,
+  0xd6,0x6b,0xac,0x15,0xcf,0x85,0xcc,0x90,0x28,0xc7,0xab,0xac,0xc8,0x10,0x0d,0x0a,
+  0x00,0xd4,0x1b,0x86,0x00,0x72,0x46,0x4f,0x06,0x13,0x1c,0x6d,0x5d,0x8f,0x39,0xd5,
+  0x9b,0xa5,0x9f,0x7a,0xb6,0xb9,0xa8,0xf0,0x4c,0x59,0x11,0x41,0x2b,0x16,0x6f,0x56,
+  0xf4,0x24,0x3a,0x91,0x22,0x90,0x86,0xf4,0x5b,0xa6,0x6e,0xce,0x4a,0x11,0xc1,0x7f,
+  0xad,0x7c,0x2e,0x00,0x00,0x05,0xa0,0x70,0x24,0x57,0x3e,0xf4,0x41,0x4b,0x3f,0x3f,
+  0x24,0xc4,0xe2,0x6c,0x34,0xd5,0x58,0x9e,0x32,0x04,0x10,0x52,0x25,0x2f,0xab,0x02,
+  0xf0,0xe2,0x8b,0x2f,0x46,0x91,0xfa,0x69,0xec,0xb2,0xcb,0x2e,0x6a,0xfb,0xed,0xb7,
+  0xcf,0xbc,0xcf,0xad,0x7a,0x2e,0x00,0x00,0x05,0xa0,0x34,0x82,0xb1,0x96,0xe8,0xef,
+  0x56,0xeb,0xa7,0x14,0x78,0x29,0x3b,0xd5,0x9e,0xaf,0x90,0x60,0x40,0x5d,0x0b,0x3f,
+  0xd3,0x18,0x75,0x51,0xd6,0x7f,0xab,0x9f,0x0b,0x00,0x40,0x01,0x28,0x14,0x49,0x01,
+  0x0b,0xa1,0x6b,0xd7,0xae,0xf4,0x73,0x0d,0xcd,0x10,0x14,0x59,0x6d,0xd5,0xbe,0xa3,
+  0x8f,0x3e,0x3a,0xe8,0x58,0x85,0xd6,0x04,0x58,0xb6,0x6c,0x59,0x34,0xa6,0x9d,0x46,
+  0xdf,0xbe,0x7d,0xd5,0xf1,0xc7,0x1f,0x5f,0xd5,0xfe,0xb6,0xf2,0xb9,0x00,0x00,0x14,
+  0x80,0x42,0xf1,0x55,0x65,0x8b,0x91,0x08,0x6d,0xfa,0xd9,0x3c,0x0f,0xf4,0x6a,0x15,
+  0x36,0x49,0x6d,0x3b,0xf2,0xc8,0x23,0xbd,0xcb,0x5d,0x77,0xdd,0x75,0x91,0x70,0xf7,
+  0x71,0xd3,0x4d,0x37,0x79,0xad,0x74,0x11,0xfe,0xa2,0x04,0xb4,0xaa,0x70,0x6d,0x76,
+  0xe5,0x19,0xa0,0x14,0xf7,0x11,0x87,0x20,0x7f,0x16,0x2d,0x5a,0x14,0xb4,0xdc,0xc0,
+  0x81,0x03,0xe9,0xe7,0x1a,0xf4,0x24,0x2f,0x2d,0x2d,0x74,0xa4,0x34,0xb0,0xcf,0x6a,
+  0x97,0x58,0x09,0x3d,0x21,0x8e,0x37,0x6d,0xaf,0x48,0xf7,0x7f,0xab,0x9e,0x8b,0xdd,
+  0x77,0xdf,0x5d,0xcd,0x9a,0x35,0xab,0xb4,0xfd,0xc9,0x5a,0xa8,0x09,0x00,0x05,0xa0,
+  0xc9,0x05,0x63,0xb3,0x7b,0x00,0xf2,0xec,0xe7,0x7a,0xeb,0xad,0x17,0xb4,0xae,0xef,
+  0x7d,0xef,0x7b,0x99,0xa6,0x24,0x2e,0x0b,0x32,0x15,0xef,0xa8,0x51,0xa3,0x94,0x9e,
+  0x29,0x30,0x75,0x39,0xa9,0x09,0x90,0xa6,0x00,0x48,0x4d,0x81,0xfb,0xef,0xbf,0x3f,
+  0x75,0x1d,0x12,0xf8,0x27,0x01,0x80,0xd5,0xd2,0x8a,0xe7,0xe2,0xcc,0x33,0xcf,0x8c,
+  0x1a,0x00,0xfc,0x7f,0x18,0x02,0x28,0x00,0x5f,0x6e,0xb6,0x20,0x6e,0xe1,0x2e,0x5d,
+  0xba,0xd0,0xcf,0x8c,0x42,0x27,0xa4,0x50,0x4c,0x29,0x6f,0xb4,0xce,0x9d,0xa3,0x94,
+  0x40,0x1f,0x77,0xdf,0x7d,0xb7,0x7a,0xff,0xfd,0xf7,0x9d,0xdf,0xff,0xe1,0x0f,0x7f,
+  0xf0,0xa6,0xe8,0xd5,0x62,0xfd,0xb7,0xc3,0xb9,0x00,0x00,0x14,0x80,0x42,0x90,0xa9,
+  0x59,0x43,0xc6,0x50,0x9b,0xdd,0xfd,0x9f,0x77,0x3f,0xa5,0xae,0x40,0x88,0xa2,0xd0,
+  0xcc,0x42,0x47,0x8a,0x02,0xf9,0x90,0x22,0x3c,0x32,0x4d,0xb0,0x0d,0xc9,0x7d,0x17,
+  0x05,0x20,0x0d,0x29,0xfa,0xf3,0x99,0xcf,0x7c,0xa6,0xa6,0xfd,0x6c,0x87,0x73,0x01,
+  0x00,0x28,0x00,0xb9,0xe3,0x9b,0x98,0x25,0x66,0xf3,0xcd,0x37,0xa7,0x9f,0x09,0xa4,
+  0x58,0x8e,0xcc,0x59,0xef,0x43,0xd2,0xe5,0x42,0x87,0x1e,0xca,0x86,0x54,0x4f,0x94,
+  0xb1,0x68,0x1f,0xae,0x6c,0x00,0xf1,0x0e,0xc8,0x14,0xc2,0x69,0xc8,0xf0,0x41,0xad,
+  0xca,0x65,0x3b,0x9c,0x0b,0x00,0x40,0x01,0x68,0x98,0x60,0xac,0x65,0x8c,0xb6,0x55,
+  0xfb,0xb9,0xd3,0x4e,0x3b,0x05,0x59,0xc8,0x22,0x08,0x9b,0x15,0x09,0x06,0xf4,0x21,
+  0xb3,0xdd,0x49,0xa1,0x1f,0x93,0xa2,0x26,0xfe,0x69,0xd7,0x73,0x01,0x80,0x02,0x00,
+  0x28,0x00,0x25,0xe9,0x67,0xe8,0xdc,0xf2,0xb7,0xdc,0x72,0x4b,0xd3,0x1e,0xb7,0x63,
+  0x8e,0x39,0x26,0xa8,0x84,0xb2,0xe9,0x05,0x90,0x21,0x97,0x3b,0xee,0xb8,0x23,0xf5,
+  0x37,0x12,0x49,0x2e,0x13,0x10,0xe5,0x41,0x3b,0x9c,0x0b,0x00,0x14,0x00,0xc8,0x95,
+  0xd0,0x79,0xd4,0x9b,0x5d,0x01,0x28,0xa2,0x9f,0xfb,0xed,0xb7,0x5f,0xd0,0x72,0x77,
+  0xde,0x79,0x67,0x64,0x7d,0x36,0x23,0x32,0xbe,0x7e,0xf8,0xe1,0x87,0x7b,0x97,0x93,
+  0x38,0x80,0x64,0xbd,0x7b,0x51,0x08,0x7c,0x75,0x17,0xf2,0xb2,0xfe,0xdb,0xe5,0x5c,
+  0x00,0xa0,0x00,0x40,0x6e,0x48,0xf4,0xb6,0xaf,0x3e,0xbb,0x30,0x74,0xe8,0xd0,0x28,
+  0x25,0x8c,0x7e,0xae,0x8d,0xa4,0xaf,0x85,0x8c,0x3d,0x4b,0x11,0x9c,0xbf,0xfd,0xed,
+  0x6f,0x4d,0x7b,0xfc,0x42,0x4a,0x03,0xcf,0x98,0x31,0x43,0xdd,0x73,0xcf,0x3d,0x1d,
+  0x7f,0xfb,0x72,0xff,0xc5,0xab,0x10,0x12,0x64,0xc8,0xb9,0x00,0x00,0x14,0x80,0x02,
+  0x90,0x39,0xc7,0x43,0x22,0xe3,0x0f,0x39,0xe4,0x10,0xfa,0x69,0xbb,0x18,0x75,0xaa,
+  0x5c,0xa8,0xe5,0x79,0xfe,0xf9,0xe7,0x37,0xed,0x8c,0x70,0x07,0x1d,0x74,0x90,0x1a,
+  0x36,0x6c,0x98,0x77,0x39,0xa9,0x09,0x20,0x88,0xb7,0xc5,0x37,0xe4,0x72,0xc4,0x11,
+  0x47,0x04,0x09,0x6c,0xce,0x05,0x00,0xa0,0x00,0x14,0x80,0x2b,0x7d,0xcb,0xe4,0x94,
+  0x53,0x4e,0xa1,0x9f,0x0e,0xce,0x38,0xe3,0x8c,0xa0,0xe5,0x44,0x20,0x5e,0x73,0xcd,
+  0x35,0x4d,0x79,0xfc,0xa4,0x8a,0x5d,0x48,0xaa,0xde,0xad,0xb7,0xde,0x1a,0x4d,0xa5,
+  0x5c,0xcf,0xe0,0xbf,0x76,0x3b,0x17,0x00,0x28,0x00,0x6d,0xc4,0xd2,0xa5,0x4b,0x0b,
+  0x59,0xaf,0x58,0x69,0xf7,0xde,0x7b,0xaf,0x77,0xb9,0x2d,0xb7,0xdc,0x52,0x7d,0xfc,
+  0xe3,0x1f,0xa7,0x9f,0x0e,0xf6,0xdc,0x73,0x4f,0xb5,0xf7,0xde,0x7b,0x07,0x2d,0x7b,
+  0xce,0x39,0xe7,0xa8,0x77,0xdf,0x7d,0xb7,0x29,0xaf,0xc3,0x10,0x77,0xbd,0x9c,0x43,
+  0x11,0xfe,0xd7,0x5f,0x7f,0x7d,0xea,0x72,0x9b,0x6e,0xba,0x69,0x54,0x69,0x30,0x6f,
+  0xda,0xe5,0x5c,0x00,0xa0,0x00,0xb4,0x09,0x22,0x94,0xde,0x7a,0xeb,0xad,0xdc,0xd7,
+  0x7b,0xde,0x79,0xe7,0x05,0x2d,0x77,0xf2,0xc9,0x27,0xd3,0x4f,0x0f,0xe7,0x9e,0x7b,
+  0x6e,0xd0,0x72,0x12,0x19,0x2f,0x33,0xed,0x2d,0x5f,0xbe,0xbc,0xe9,0xae,0xc3,0xed,
+  0xb6,0xdb,0x4e,0xed,0xb8,0xe3,0x8e,0xde,0xe5,0xce,0x3e,0xfb,0x6c,0x6f,0xc5,0x45,
+  0xf1,0xb4,0x48,0xee,0x7e,0x11,0xb4,0xc3,0xb9,0x00,0x40,0x01,0x68,0x13,0x9e,0x7b,
+  0xee,0xb9,0x28,0xc7,0x39,0xc4,0x8a,0x0d,0xe5,0xb2,0xcb,0x2e,0x53,0x0f,0x3c,0xf0,
+  0x80,0x77,0xb9,0x9e,0x3d,0x7b,0xe6,0x1a,0xa8,0xd5,0xaa,0xfd,0x3c,0xe0,0x80,0x03,
+  0xd4,0x6e,0xbb,0xed,0x16,0xb4,0xec,0xe3,0x8f,0x3f,0x1e,0x09,0xc0,0xd0,0x99,0x09,
+  0xcb,0x44,0x48,0x30,0xa0,0x0f,0x19,0x4e,0x08,0xa9,0x2d,0xc0,0xb9,0x00,0x80,0xb6,
+  0x57,0x00,0x84,0xd9,0xb3,0x67,0xab,0x83,0x0f,0x3e,0x38,0x9a,0xc8,0xa4,0x56,0x57,
+  0xb9,0x44,0x6a,0x9f,0x75,0xd6,0x59,0xc1,0xd6,0xd4,0x06,0x1b,0x6c,0x40,0x3f,0x03,
+  0xb8,0xf4,0xd2,0x4b,0x55,0xf7,0xee,0xdd,0x83,0x96,0xbd,0xfa,0xea,0xab,0x23,0x41,
+  0x35,0x73,0xe6,0xcc,0x42,0x8e,0xa3,0x04,0xb8,0xf9,0xa6,0xdf,0xad,0x06,0x99,0xb2,
+  0xb7,0x5b,0xb7,0x6e,0x35,0xad,0xe3,0xb0,0xc3,0x0e,0x0b,0x0a,0x28,0xe4,0x5c,0x00,
+  0xc0,0x3a,0x54,0x0a,0xe6,0xe2,0x8b,0x2f,0x96,0x99,0x4b,0xbc,0xad,0x5e,0xdb,0x31,
+  0xdb,0x46,0x1b,0x6d,0x54,0xd1,0x63,0xac,0x55,0x6d,0x53,0xd7,0x65,0xaf,0xe8,0x39,
+  0xd7,0x83,0xb6,0xf3,0x91,0x8f,0x7c,0xa4,0xa2,0xdd,0xa3,0xf4,0x33,0x03,0xda,0xe3,
+  0x90,0xa9,0x8f,0xa3,0x47,0x8f,0xae,0xe8,0x60,0xb4,0x8a,0x16,0x12,0x35,0x6f,0x5b,
+  0x4f,0xcd,0x5b,0xb9,0xee,0xba,0xeb,0x2a,0x9f,0xfd,0xec,0x67,0x2b,0x3a,0xba,0xbe,
+  0xb2,0xe1,0x86,0x1b,0x16,0x72,0x7f,0xe8,0x9a,0x00,0x55,0x9d,0xcf,0xb8,0xdd,0x75,
+  0xd7,0x5d,0x95,0x7a,0xd0,0x0e,0xe7,0x02,0xa0,0xdd,0x68,0x7b,0x05,0x20,0x6e,0xba,
+  0x82,0x5a,0x45,0xcf,0xd7,0x5e,0x59,0xb8,0x70,0xa1,0x77,0x5b,0x2f,0xbf,0xfc,0x72,
+  0x45,0xa7,0x5d,0x05,0xaf,0x5b,0x8f,0xcf,0x56,0x1e,0x79,0xe4,0x91,0xba,0x1e,0xcf,
+  0x66,0xef,0x67,0x8c,0x9e,0x41,0x2f,0x73,0x1f,0x75,0xcd,0xfd,0x48,0x69,0xd1,0x56,
+  0x68,0xa6,0x6d,0x4d,0x9a,0x34,0xa9,0xf2,0x8b,0x5f,0xfc,0xa2,0xa2,0xab,0xe0,0x55,
+  0xb4,0x65,0xbe,0xd6,0x3a,0x75,0x4d,0x83,0x42,0xee,0x8f,0x9b,0x6f,0xbe,0xb9,0xea,
+  0x73,0x29,0x42,0x36,0x0f,0x01,0xcb,0xb9,0x00,0x68,0x4f,0xba,0xe2,0x03,0xf9,0x10,
+  0x89,0x6e,0x97,0xd6,0xa7,0x4f,0x9f,0xa8,0x52,0x9b,0x8c,0x7b,0x6a,0xab,0x59,0x69,
+  0x6b,0x23,0x72,0x9f,0x4b,0x84,0xb3,0x7e,0x28,0x45,0x11,0xd9,0x52,0xab,0x3d,0x0b,
+  0xa7,0x9e,0x7a,0x6a,0x6e,0x25,0x5a,0xdb,0xad,0x9f,0x97,0x5f,0x7e,0x79,0xb4,0x1f,
+  0x2f,0xbd,0xf4,0x52,0xf0,0x6f,0x24,0x2d,0xed,0xa4,0x93,0x4e,0x8a,0x02,0xe3,0x24,
+  0xd8,0x6e,0x9f,0x7d,0xf6,0x51,0x9b,0x6c,0xb2,0x49,0x94,0x27,0xdf,0xbb,0x77,0xef,
+  0x68,0x02,0x9b,0xb9,0x73,0xe7,0x46,0x41,0x92,0xd2,0xde,0x7e,0xfb,0xed,0xe8,0x55,
+  0x02,0xd9,0xea,0xcd,0x27,0x3f,0xf9,0xc9,0x68,0xfa,0xdd,0x59,0xb3,0x66,0x65,0xfe,
+  0xad,0x04,0x5a,0x4a,0xbe,0x7e,0xbd,0x68,0xf5,0x73,0x01,0xc0,0x10,0x40,0x9b,0x7a,
+  0x00,0x8a,0x6a,0x87,0x1e,0x7a,0x68,0x6e,0x2e,0xf1,0x76,0xea,0x67,0x12,0x5d,0x15,
+  0xaf,0xb2,0xeb,0xae,0xbb,0x36,0xb4,0x7f,0x45,0x5a,0x9d,0x3a,0xdf,0x3e,0xf3,0xfe,
+  0xe8,0xe9,0x7a,0x2b,0x53,0xa7,0x4e,0xad,0xbb,0xc5,0xd0,0xea,0xe7,0x02,0xa0,0x9d,
+  0x68,0xbb,0x20,0xc0,0x6f,0x7f,0xfb,0xdb,0x75,0xdb,0x96,0x54,0x52,0x13,0x4b,0xba,
+  0xd6,0x40,0xaf,0x76,0xef,0xa7,0x94,0x14,0x7e,0xf0,0xc1,0x07,0xd5,0x51,0x47,0x1d,
+  0xd5,0x92,0xd7,0x64,0x35,0xd9,0x00,0x12,0xdc,0x39,0x72,0xe4,0xc8,0xba,0xef,0x6b,
+  0xab,0x9f,0x0b,0x80,0x76,0xa2,0xed,0x14,0x80,0x1f,0xff,0xf8,0xc7,0xea,0x82,0x0b,
+  0x2e,0x28,0x7c,0x3b,0xe3,0xc6,0x8d,0x53,0xb7,0xdd,0x76,0x5b,0x94,0x12,0x47,0x3f,
+  0x6b,0xa7,0x57,0xaf,0x5e,0x91,0x92,0x21,0x05,0x67,0x5a,0x0d,0x49,0xd7,0xdc,0x7a,
+  0xeb,0xad,0x33,0xfd,0xa6,0x88,0xca,0x7f,0x9c,0x0b,0x00,0x14,0x80,0x96,0xe7,0x5b,
+  0xdf,0xfa,0x96,0xd2,0x81,0x49,0xd1,0xcc,0x6c,0x79,0xa3,0x5d,0xb3,0xea,0x1b,0xdf,
+  0xf8,0x86,0xba,0xef,0xbe,0xfb,0xa2,0x71,0x76,0xfa,0x99,0x1f,0x32,0x8e,0xfc,0xd3,
+  0x9f,0xfe,0x54,0xe9,0xc8,0xf7,0x68,0x3c,0xb9,0x95,0xc8,0x92,0xcb,0x3f,0x7c,0xf8,
+  0x70,0xf5,0xa9,0x4f,0x7d,0xaa,0xa1,0xfb,0xdb,0xca,0xe7,0x02,0x00,0x05,0xa0,0xc5,
+  0x91,0x07,0xae,0x04,0x28,0xc9,0x6b,0x5e,0x55,0xd4,0xb6,0xdd,0x76,0x5b,0xf5,0xe4,
+  0x93,0x4f,0xaa,0x0b,0x2f,0xbc,0xb0,0x61,0x96,0x7f,0x3b,0xf4,0x53,0xdc,0xdf,0xff,
+  0xfa,0xd7,0xbf,0xa2,0x29,0x72,0x25,0x80,0xb1,0x48,0x64,0x58,0x43,0xbc,0x1c,0xa7,
+  0x9f,0x7e,0x7a,0xa1,0xdb,0x39,0xe1,0x84,0x13,0x22,0xa5,0x2a,0x04,0x09,0xaa,0x93,
+  0x02,0x40,0x65,0xa0,0x15,0xcf,0x05,0x40,0xdb,0x50,0x74,0x90,0x81,0x8e,0x1c,0xf6,
+  0x06,0xf5,0x68,0x0b,0xb2,0xa1,0xc1,0x86,0x3a,0x2a,0xbe,0x32,0x7e,0xfc,0xf8,0x68,
+  0x3f,0x54,0xc6,0x80,0x24,0x1d,0x85,0x5d,0xd1,0x63,0xe0,0x15,0x5d,0xb3,0xbd,0xb0,
+  0x20,0xb8,0x76,0xec,0x67,0x28,0x3a,0x73,0xa1,0x72,0xe5,0x95,0x57,0x46,0xe9,0x8a,
+  0xfd,0xfa,0xf5,0xab,0x39,0xc0,0x4c,0x2b,0x34,0x15,0x5d,0xff,0xbe,0xa2,0x4b,0x1e,
+  0x57,0x74,0x15,0xc5,0x8a,0x8e,0x52,0xaf,0x5b,0x5f,0xf4,0xec,0x89,0x41,0xa9,0x96,
+  0x93,0x27,0x4f,0x2e,0x65,0x40,0x51,0x2b,0x9d,0x0b,0x80,0x76,0xa0,0x93,0xfc,0xd7,
+  0x0a,0x8a,0xcc,0x25,0x97,0x5c,0x12,0xd5,0x4d,0x0f,0x50,0x78,0x9c,0xdf,0x2d,0x59,
+  0xb2,0x24,0x72,0x69,0xea,0xdc,0xec,0xc8,0x6a,0x96,0x94,0x38,0x49,0x47,0x5a,0xb9,
+  0x72,0x65,0x34,0xdf,0xba,0x94,0x38,0x95,0x0a,0x77,0x23,0x46,0x8c,0x88,0x02,0xb0,
+  0x24,0xf8,0xed,0x98,0x63,0x8e,0x89,0x5c,0xb2,0xf4,0xb3,0xf1,0xc8,0x7e,0xeb,0x3a,
+  0x04,0xd1,0x74,0xc5,0x92,0xaa,0xf6,0xfe,0xfb,0xef,0x47,0x4d,0xaa,0xd2,0xc9,0x77,
+  0xd2,0xb7,0x65,0xcb,0x96,0x29,0x2d,0x9c,0xa2,0xbe,0x48,0x05,0x3d,0x79,0x95,0x26,
+  0x69,0x90,0x92,0x12,0xa9,0x23,0xdc,0xa3,0xe5,0x80,0x73,0x01,0xd0,0xea,0xa0,0x00,
+  0x78,0x90,0x79,0xef,0x25,0x4f,0x59,0x5c,0xae,0x32,0xd6,0xdd,0x68,0xd7,0x6b,0xbb,
+  0xf4,0x33,0x67,0x2f,0x57,0xd4,0x37,0x71,0xb1,0xc7,0xfd,0x03,0xce,0x05,0x40,0xbb,
+  0x43,0x21,0x20,0x0f,0x52,0x68,0x45,0x8a,0x96,0xd0,0xcf,0x26,0xd6,0x72,0x75,0xec,
+  0xc3,0xe0,0xc1,0x83,0xb9,0x98,0x39,0x17,0x00,0x90,0x7c,0xee,0x73,0x08,0x00,0x00,
+  0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,
+  0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,
+  0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x50,0x00,0x00,
+  0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x05,0x00,
+  0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x20,0x23,0x2d,0x33,0x1d,0xf0,0x56,0x5b,
+  0x6d,0xa5,0xf6,0xdd,0x77,0xdf,0xd4,0x65,0xfa,0xf6,0xed,0x4b,0x3f,0x01,0x00,0x00,
+  0x34,0x9d,0x2a,0x1a,0x0e,0x03,0x00,0x00,0x40,0x7b,0xc1,0x10,0x00,0x00,0x00,0x00,
+  0x0a,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,
+  0xa0,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,
+  0x00,0x0a,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,
+  0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,
+  0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,
+  0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,
+  0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,
+  0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,
+  0x00,0x00,0x00,0x94,0x8a,0xae,0x1c,0x02,0x00,0x28,0x33,0x2b,0x57,0xae,0x54,0x73,
+  0xe7,0xce,0x4d,0x5d,0xa6,0x5b,0xb7,0x6e,0x6a,0xe0,0xc0,0x81,0x1c,0x2c,0x00,0x14,
+  0x00,0x00,0x68,0x15,0x7e,0xf7,0xbb,0xdf,0xa9,0x33,0xcf,0x3c,0x33,0x75,0x99,0xee,
+  0xdd,0xbb,0xab,0x65,0xcb,0x96,0x71,0xb0,0x00,0x32,0xc0,0x10,0x00,0x00,0x94,0x9a,
+  0xe5,0xcb,0x97,0xe7,0xb2,0x0c,0x00,0xa0,0x00,0x00,0x00,0x00,0xa0,0x00,0x70,0x08,
+  0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x50,0x00,
+  0x00,0x00,0x00,0xa0,0x25,0x20,0x0d,0x10,0x00,0xa0,0x4d,0x59,0xb0,0x60,0x81,0x7a,
+  0xf3,0xcd,0x37,0xa3,0x36,0x65,0xca,0x94,0xe8,0x75,0xda,0xb4,0x69,0xea,0xdc,0x73,
+  0xcf,0x55,0xdb,0x6d,0xb7,0x1d,0x07,0x08,0x05,0x00,0x00,0x00,0x5a,0x81,0xf9,0xf3,
+  0xe7,0xab,0x93,0x4f,0x3e,0xb9,0x43,0xe0,0xcf,0x9e,0x3d,0xdb,0xba,0xdc,0xe1,0x87,
+  0x1f,0x8e,0x02,0x80,0x02,0x00,0x00,0xd0,0x58,0xc6,0x8f,0x1f,0xaf,0x36,0xd8,0x60,
+  0x83,0xd4,0x65,0xfa,0xf6,0xed,0xcb,0x81,0x0a,0x60,0xc9,0x92,0x25,0xea,0x86,0x1b,
+  0x6e,0xe0,0x40,0x00,0x0a,0x00,0x00,0x94,0x9f,0xd1,0xa3,0x47,0xab,0x13,0x4f,0x3c,
+  0x91,0x03,0x01,0x90,0x33,0x04,0x01,0x02,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,
+  0x0a,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,
+  0x34,0x29,0x64,0x01,0x00,0x34,0x88,0x79,0xf3,0xe6,0x75,0x14,0x61,0x79,0xeb,0xad,
+  0xb7,0xd4,0xea,0xd5,0xab,0xd5,0xd0,0xa1,0x43,0xd5,0xf0,0xe1,0xc3,0xd5,0xb0,0x61,
+  0xc3,0xd4,0xa8,0x51,0xa3,0x54,0x9f,0x3e,0x7d,0x9a,0xba,0x8f,0x92,0x76,0x36,0x79,
+  0xf2,0xe4,0xa8,0x49,0xde,0xf9,0xaa,0x55,0xab,0xd4,0x7a,0xeb,0xad,0x17,0xb5,0xfd,
+  0xf7,0xdf,0x5f,0x75,0xef,0xde,0xbd,0x6d,0xce,0x75,0x7c,0x1c,0xde,0x7e,0xfb,0x6d,
+  0xd5,0xb9,0x73,0x67,0xb5,0xfe,0xfa,0xeb,0x47,0xe9,0x8d,0x5b,0x6c,0xb1,0x45,0x74,
+  0xae,0xc1,0xcf,0xa2,0x45,0x8b,0xd4,0xd4,0xa9,0x53,0xd5,0xf4,0xe9,0xd3,0xd5,0xbb,
+  0xef,0xbe,0x1b,0xbd,0x2e,0x5c,0xb8,0x50,0x0d,0x19,0x32,0x24,0xba,0x67,0xa4,0x8d,
+  0x18,0x31,0x42,0x6d,0xb2,0xc9,0x26,0xaa,0x53,0xa7,0x4e,0xdc,0x3b,0x28,0x00,0x00,
+  0xb5,0x21,0x37,0xdf,0x03,0x0f,0x3c,0x90,0xba,0x8c,0x08,0xea,0x63,0x8f,0x3d,0x36,
+  0x75,0x99,0x95,0x2b,0x57,0xaa,0x1b,0x6f,0xbc,0x51,0xfd,0xee,0x77,0xbf,0x53,0x2f,
+  0xbc,0xf0,0x82,0xfa,0xe0,0x83,0x0f,0xd2,0x6f,0xce,0xae,0x5d,0xd5,0xbe,0xfb,0xee,
+  0xab,0x8e,0x3a,0xea,0x28,0x75,0xc4,0x11,0x47,0x78,0x73,0xe1,0xcb,0xd2,0xcf,0xd7,
+  0x5f,0x7f,0x5d,0xfd,0xec,0x67,0x3f,0x53,0x7f,0xff,0xfb,0xdf,0xa3,0x07,0x74,0xa5,
+  0x52,0xb1,0x2e,0xf7,0xce,0x3b,0xef,0x44,0x0f,0xeb,0x7a,0xed,0x57,0x3d,0xb7,0x23,
+  0x0f,0xeb,0xdb,0x6e,0xbb,0x4d,0x5d,0x76,0xd9,0x65,0xea,0xd9,0x67,0x9f,0x55,0x73,
+  0xe7,0xce,0x4d,0x5d,0x7e,0xab,0xad,0xb6,0x52,0x07,0x1f,0x7c,0xb0,0xfa,0xea,0x57,
+  0xbf,0x1a,0x09,0xaf,0x3c,0x84,0xc7,0x5f,0xff,0xfa,0xd7,0x75,0x8e,0xfd,0xcc,0x99,
+  0x33,0x83,0x7e,0x7f,0xe7,0x9d,0x77,0xaa,0x65,0xcb,0x96,0x65,0xda,0xe6,0xae,0xbb,
+  0xee,0xaa,0xb6,0xd9,0x66,0x9b,0xdc,0xaf,0x4b,0x29,0x56,0x74,0xeb,0xad,0xb7,0xaa,
+  0xeb,0xaf,0xbf,0x5e,0xdd,0x77,0xdf,0x7d,0x6a,0xc5,0x8a,0x15,0xde,0xdf,0x88,0x42,
+  0x25,0xf7,0xcc,0x91,0x47,0x1e,0xa9,0xf6,0xd8,0x63,0x0f,0xd5,0xa5,0x4b,0x97,0xb6,
+  0xbc,0x77,0xbc,0x54,0x00,0x20,0x95,0x8b,0x2f,0xbe,0x58,0xee,0x42,0x6f,0x73,0xa1,
+  0x1f,0x60,0x95,0x9f,0xfc,0xe4,0x27,0x95,0x91,0x23,0x47,0x06,0xad,0xc7,0xd6,0xb4,
+  0xc5,0x58,0x39,0xfe,0xf8,0xe3,0x2b,0xfa,0xa1,0x50,0xda,0x7e,0x3e,0xf5,0xd4,0x53,
+  0x15,0xad,0xac,0x44,0xfb,0x1a,0xb2,0x1e,0xfd,0x10,0xab,0xcb,0x7e,0xd5,0xab,0xff,
+  0xf1,0xb9,0xbe,0xe8,0xa2,0x8b,0x2a,0x1b,0x6d,0xb4,0x51,0x55,0xe7,0xb9,0x5b,0xb7,
+  0x6e,0x95,0xaf,0x7c,0xe5,0x2b,0x15,0x2d,0xa8,0x6b,0xea,0xcb,0x33,0xcf,0x3c,0x53,
+  0xf5,0xb5,0x56,0x6d,0x3b,0xeb,0xac,0xb3,0x72,0xbd,0x1e,0x27,0x4e,0x9c,0x58,0xd1,
+  0x15,0x09,0x2b,0x5a,0x11,0xae,0x69,0xbf,0x36,0xde,0x78,0xe3,0xca,0x1d,0x77,0xdc,
+  0x51,0xea,0x67,0x44,0x51,0xf7,0x8e,0x0f,0x62,0x00,0x00,0x0a,0xe4,0xe6,0x9b,0x6f,
+  0x8e,0x0a,0xd9,0x7c,0xeb,0x5b,0xdf,0x8a,0x6a,0xac,0x57,0x8b,0x0c,0x0f,0x5c,0x7b,
+  0xed,0xb5,0x6a,0xcb,0x2d,0xb7,0x8c,0x3c,0x08,0xf2,0x77,0x59,0x90,0x7d,0x39,0xfd,
+  0xf4,0xd3,0x23,0x0b,0x50,0x3c,0x1c,0x65,0xda,0xb7,0x7a,0xf2,0xe7,0x3f,0xff,0x39,
+  0x3a,0xd7,0xdf,0xf8,0xc6,0x37,0xa2,0x21,0x9d,0x6a,0x10,0xeb,0x56,0xbc,0x06,0xbb,
+  0xec,0xb2,0x8b,0x7a,0xf9,0xe5,0x97,0xdb,0xf2,0x38,0x8a,0xe7,0xe1,0xfb,0xdf,0xff,
+  0x7e,0xe4,0x4d,0x10,0xcb,0x5f,0x3c,0x67,0xb5,0x20,0x43,0x6c,0x87,0x1e,0x7a,0x68,
+  0xe4,0x49,0x13,0xcb,0xb9,0x4c,0x34,0xfa,0xde,0x41,0x01,0x00,0x28,0x88,0x4b,0x2e,
+  0xb9,0x44,0x1d,0x7d,0xf4,0xd1,0xd1,0xb8,0x65,0x5e,0xc8,0x58,0xb2,0xb6,0x10,0xa3,
+  0x07,0x5a,0x56,0x17,0x6d,0x51,0x0f,0x6b,0x71,0x6b,0x8a,0xd0,0x6a,0x57,0x44,0x68,
+  0x8b,0xeb,0x5e,0xaa,0x15,0xe6,0x75,0xae,0x45,0x68,0x8d,0x1b,0x37,0x4e,0x3d,0xfe,
+  0xf8,0xe3,0x6d,0x75,0x2c,0x9f,0x7b,0xee,0xb9,0x48,0xf0,0xff,0xe0,0x07,0x3f,0xc8,
+  0xfd,0xfa,0xbe,0xe9,0xa6,0x9b,0xd4,0x0e,0x3b,0xec,0xa0,0xfe,0xfd,0xef,0x7f,0x97,
+  0x46,0xd1,0x69,0xf4,0xbd,0x83,0x02,0x00,0x90,0x33,0x62,0xb1,0x9c,0x76,0xda,0x69,
+  0xea,0xec,0xb3,0xcf,0x2e,0x4c,0xa3,0xbf,0xeb,0xae,0xbb,0x22,0x8b,0x66,0xf9,0xf2,
+  0xe5,0x0d,0xeb,0xa7,0x4c,0x2c,0x73,0xc8,0x21,0x87,0xb4,0x75,0x6d,0x79,0xb1,0x28,
+  0xf7,0xde,0x7b,0x6f,0xf5,0xdb,0xdf,0xfe,0x36,0xf7,0x75,0x8b,0xb2,0x27,0x0a,0x64,
+  0xe8,0xb8,0x7d,0xb3,0xf3,0xc4,0x13,0x4f,0xa8,0xfd,0xf6,0xdb,0x4f,0x4d,0x9a,0x34,
+  0xa9,0xb0,0x6d,0xcc,0x9a,0x35,0x4b,0x1d,0x70,0xc0,0x01,0xea,0xb5,0xd7,0x5e,0x6b,
+  0x68,0x5f,0xcb,0x72,0xef,0xa0,0x00,0x00,0xe4,0xcc,0x67,0x3f,0xfb,0x59,0x75,0xc5,
+  0x15,0x57,0x14,0xbe,0x1d,0x09,0xd4,0x3a,0xe6,0x98,0x63,0x82,0x82,0xa2,0xf2,0x46,
+  0x82,0xdc,0x24,0x68,0xcd,0x17,0xf8,0xd4,0xca,0xbc,0xf1,0xc6,0x1b,0x6a,0xa7,0x9d,
+  0x76,0x2a,0xd4,0x4a,0x97,0x48,0x77,0xb9,0x9e,0x5a,0x9d,0x87,0x1f,0x7e,0x58,0x1d,
+  0x74,0xd0,0x41,0x91,0xd2,0x53,0x34,0xef,0xbd,0xf7,0x5e,0x14,0x45,0x2f,0x5e,0x96,
+  0x46,0x50,0xa6,0x7b,0x07,0x05,0x00,0x20,0x47,0xae,0xbe,0xfa,0x6a,0x75,0xdd,0x75,
+  0xd7,0xd5,0x6d,0x7b,0x32,0x46,0xfa,0xa3,0x1f,0xfd,0xa8,0xee,0xfd,0xfc,0xf9,0xcf,
+  0x7f,0xde,0x76,0xee,0x69,0xd3,0x82,0x3b,0xec,0xb0,0xc3,0x22,0x61,0x52,0x34,0xf7,
+  0xdc,0x73,0x8f,0xfa,0xc7,0x3f,0xfe,0xd1,0xb2,0xc7,0xf2,0xd1,0x47,0x1f,0x8d,0xac,
+  0xe1,0x05,0x0b,0x16,0x04,0xff,0x46,0x07,0x4b,0x46,0xf1,0x16,0x3b,0xee,0xb8,0xa3,
+  0xda,0x7a,0xeb,0xad,0xa3,0x34,0xc0,0x2c,0x88,0xe7,0x46,0xa6,0x45,0x6e,0x04,0x65,
+  0xba,0x77,0x48,0x03,0x04,0xc8,0x09,0x09,0xf2,0x3b,0xf3,0xcc,0x33,0xb3,0x69,0xe0,
+  0x3a,0x1f,0xbc,0xd6,0x61,0x82,0x0b,0x2f,0xbc,0x50,0x1d,0x77,0xdc,0x71,0x51,0x2a,
+  0x59,0x3d,0xd0,0xd1,0xd9,0xea,0xbc,0xf3,0xce,0xcb,0xf4,0x1b,0xc9,0x59,0x6e,0xe4,
+  0x70,0x45,0x9e,0xc8,0xf9,0xd2,0x19,0x19,0xea,0x95,0x57,0x5e,0xc9,0xf4,0x3b,0xc9,
+  0xfb,0x97,0xdf,0x4a,0x5a,0x5b,0x35,0xe7,0xf8,0xc0,0x03,0x0f,0x0c,0x5e,0x7e,0xd0,
+  0xa0,0x41,0x6a,0xec,0xd8,0xb1,0xeb,0xa4,0x91,0x2d,0x5e,0xbc,0x38,0x4a,0x2f,0xf3,
+  0xd1,0xbb,0x77,0xef,0xa8,0x1e,0x45,0x16,0x74,0xe6,0x43,0xe6,0x7e,0x89,0xc5,0x7f,
+  0xc2,0x09,0x27,0x44,0xfb,0xe5,0x43,0xf2,0xfa,0xe5,0xb8,0xcb,0xb8,0xb9,0xb8,0xf1,
+  0x65,0x1f,0x93,0x48,0x0a,0x9d,0x28,0xc4,0xbf,0xfa,0xd5,0xaf,0x82,0x82,0xfd,0xee,
+  0xbf,0xff,0xfe,0x28,0xb0,0x56,0xd6,0x59,0x2f,0x4a,0x77,0xef,0x90,0xe4,0x05,0x90,
+  0x4f,0x8a,0x8f,0x76,0x61,0x7a,0x97,0xd1,0xf9,0xc9,0x95,0xf3,0xcf,0x3f,0xbf,0xa2,
+  0x2d,0xba,0x8a,0x2e,0xf0,0x51,0xd1,0xf1,0x02,0xd1,0x36,0x96,0x2e,0x5d,0x5a,0xd1,
+  0x02,0xa5,0x72,0xc1,0x05,0x17,0x54,0x74,0x10,0x54,0xe6,0x54,0xa7,0x3d,0xf7,0xdc,
+  0xb3,0xa2,0x85,0x4b,0x5d,0xfa,0x29,0xdb,0xf2,0x2d,0xb3,0xd7,0x5e,0x7b,0x55,0xf4,
+  0xb8,0x78,0x45,0xe7,0x6d,0x77,0xa4,0x2c,0xe9,0x5c,0xf8,0xca,0x83,0x0f,0x3e,0x58,
+  0xf9,0xc5,0x2f,0x7e,0x51,0x39,0xe7,0x9c,0x73,0x2a,0xfa,0xa1,0xdf,0x94,0x69,0x80,
+  0x3a,0xb6,0x23,0x68,0x39,0x9d,0xb1,0x51,0xb9,0xf4,0xd2,0x4b,0x2b,0xda,0xbd,0x5d,
+  0xd1,0x63,0xcf,0x1d,0xdb,0xd1,0x6e,0xfd,0x8a,0xce,0xf3,0xae,0x6c,0xbf,0xfd,0xf6,
+  0x99,0xce,0xb1,0x16,0x70,0x35,0xf7,0x71,0xc6,0x8c,0x19,0x41,0xdb,0xd2,0x19,0x0d,
+  0x75,0xb9,0xb7,0x74,0xe0,0x64,0xd0,0xfe,0xe8,0xe0,0xbd,0xca,0xd3,0x4f,0x3f,0x1d,
+  0xb4,0x4e,0xed,0x49,0xa8,0x9c,0x71,0xc6,0x19,0x41,0xeb,0xd5,0x4a,0x4e,0x45,0x2b,
+  0x21,0x75,0xbb,0x76,0xea,0x7d,0xef,0xf8,0x40,0x01,0x00,0xc8,0xe9,0xe6,0x4e,0x6b,
+  0xda,0x7a,0xab,0xdc,0x72,0xcb,0x2d,0x1d,0x02,0xdf,0x87,0x4e,0xf5,0xab,0xe8,0xc2,
+  0x21,0x99,0xb6,0xa1,0x87,0x1f,0x1a,0xde,0x4f,0x1d,0xb9,0x5e,0xb9,0xf7,0xde,0x7b,
+  0x4b,0x95,0x63,0x5d,0xcf,0xfe,0x4b,0xd3,0x85,0x7c,0x2a,0x7f,0xfa,0xd3,0x9f,0xbc,
+  0xe7,0x5a,0x57,0xb0,0x8b,0x72,0xbf,0x43,0xd7,0xab,0xe3,0x4a,0x5a,0x4a,0x01,0xd0,
+  0x01,0x70,0x41,0xfb,0xa2,0x0b,0xf9,0x54,0x25,0xa4,0xbf,0xf3,0x9d,0xef,0x04,0xad,
+  0x5f,0xa7,0x1c,0x96,0xe2,0xda,0x29,0xe2,0xde,0xa1,0x0e,0x00,0x40,0x03,0x91,0xb1,
+  0x49,0xc9,0xef,0x95,0x71,0x5c,0x5d,0xd4,0x24,0xb8,0x22,0x99,0x64,0x11,0x48,0x05,
+  0x39,0x71,0x1b,0x87,0xd2,0xc8,0x74,0xa2,0xfe,0xfd,0xfb,0x47,0x95,0xef,0xfe,0xf9,
+  0xcf,0x7f,0x46,0x01,0x56,0xed,0x88,0x8c,0x4b,0xff,0xfa,0xd7,0xbf,0x8e,0x22,0xcc,
+  0x3f,0xf7,0xb9,0xcf,0x79,0xcf,0xb5,0x54,0x86,0x93,0xea,0x76,0x52,0xdb,0x21,0x84,
+  0x87,0x1e,0x7a,0xa8,0x65,0x8e,0x95,0x94,0xef,0x95,0x6b,0xdc,0x87,0x54,0x45,0x94,
+  0x8c,0x17,0xb9,0xbe,0xb2,0x22,0xb1,0x31,0x12,0xa7,0xe1,0xe3,0xaa,0xab,0xae,0x6a,
+  0xe8,0xb1,0x68,0xe4,0xbd,0x83,0x02,0x00,0x50,0x10,0x12,0xe9,0xfb,0xd2,0x4b,0x2f,
+  0x45,0xe5,0x48,0xab,0x41,0x6a,0xc4,0x6b,0xaf,0x81,0xea,0xd1,0xa3,0x47,0xd0,0xf2,
+  0x12,0x58,0x94,0x75,0x5c,0x3a,0x0f,0xa4,0x36,0xb9,0x44,0x34,0x87,0x3c,0x6c,0x5b,
+  0x95,0x7e,0xfd,0xfa,0x45,0x59,0x19,0xda,0xf5,0x1c,0x95,0x70,0x0e,0x45,0xc6,0xb5,
+  0xbf,0xf8,0xc5,0x2f,0x06,0x2d,0x2b,0xe5,0xa3,0x5b,0x85,0x3f,0xfe,0xf1,0x8f,0x51,
+  0x4a,0x9e,0xef,0xd8,0xfc,0xe1,0x0f,0x7f,0x50,0x7d,0xfb,0xf6,0xad,0x7a,0x3b,0x12,
+  0x70,0xe7,0xab,0x99,0x2f,0xb5,0xf6,0x45,0xf8,0x36,0x82,0x46,0xdf,0x3b,0x28,0x00,
+  0x00,0x05,0xa0,0xcb,0xc1,0x46,0x96,0x4b,0xd6,0x40,0x2a,0x13,0x29,0x06,0x23,0x55,
+  0xd1,0x42,0xb9,0xf2,0xca,0x2b,0xeb,0xda,0x4f,0x5d,0xde,0x58,0x3d,0xf2,0xc8,0x23,
+  0x51,0x34,0x76,0xbb,0x22,0x35,0xd9,0xe5,0x18,0x64,0x09,0xd2,0x4b,0x22,0xde,0x82,
+  0x10,0xa5,0xa1,0x9a,0xe0,0xc1,0x32,0x22,0x43,0xcf,0xe2,0x29,0xf1,0x21,0xb5,0xfc,
+  0xf5,0x78,0x78,0x4d,0xdb,0x92,0x40,0xc8,0xf1,0xe3,0xc7,0x97,0xd2,0x0b,0x50,0x86,
+  0x7b,0x07,0x05,0x00,0x20,0x67,0xe4,0xe1,0xf6,0xf5,0xaf,0x7f,0x3d,0xb7,0xf5,0x89,
+  0x55,0x19,0x3a,0x11,0x90,0xa4,0x21,0x56,0x1c,0x13,0x88,0xe4,0x8d,0xcc,0xbc,0x26,
+  0x96,0x53,0xa8,0x0b,0xbb,0x15,0x91,0xbe,0x4b,0x01,0x1b,0x1d,0xd0,0x57,0xf5,0x3a,
+  0x64,0x06,0xc8,0x10,0x21,0x30,0x67,0xce,0x9c,0x96,0x38,0x66,0xe2,0x29,0x91,0x68,
+  0xf8,0x90,0xeb,0x3e,0x0f,0x42,0x26,0x6f,0x92,0x82,0x3c,0xf5,0xba,0x6f,0xca,0x74,
+  0xef,0xa0,0x00,0x00,0xe4,0xc8,0x6f,0x7e,0xf3,0x9b,0xdc,0x1e,0x5c,0x31,0x32,0x56,
+  0xfc,0xb5,0xaf,0x7d,0x2d,0x68,0x59,0xc9,0x4b,0x97,0x02,0x35,0xf5,0xe0,0xf7,0xbf,
+  0xff,0x7d,0x94,0x8b,0xdd,0xae,0x0c,0x1c,0x38,0x50,0xe9,0x49,0x66,0x72,0x99,0xca,
+  0x57,0x04,0x82,0x0f,0x49,0x05,0x93,0x59,0xfe,0x9a,0x1d,0x9d,0x19,0xe1,0x5d,0x66,
+  0xb3,0xcd,0x36,0x53,0xfb,0xec,0xb3,0x4f,0x2e,0xdb,0xfb,0xc4,0x27,0x3e,0xa1,0x7a,
+  0xf6,0xec,0xe9,0x55,0xae,0x64,0x46,0xbf,0x7a,0x51,0x96,0x7b,0x07,0x05,0x00,0x20,
+  0x27,0x24,0x08,0x4f,0x26,0xf6,0x28,0x02,0xa9,0xf8,0x17,0x8a,0x9e,0x09,0xae,0xf0,
+  0xbe,0x9e,0x72,0xca,0x29,0xea,0x53,0x9f,0xfa,0x54,0xdb,0x9e,0x6b,0x19,0x9f,0x96,
+  0xc9,0x7f,0x36,0xdd,0x74,0xd3,0x5c,0xd6,0x17,0x1a,0xec,0x59,0x4f,0x2b,0xb5,0x08,
+  0x74,0xba,0xab,0xd2,0xe9,0x6c,0xde,0xe5,0xaa,0x1d,0x4e,0xb1,0x21,0x31,0x00,0x21,
+  0x35,0x32,0x9e,0x7f,0xfe,0xf9,0xba,0x1c,0x83,0x32,0xdd,0x3b,0x28,0x00,0x00,0x39,
+  0xf1,0xe5,0x2f,0x7f,0xb9,0xb0,0x75,0xeb,0x29,0x4d,0x83,0xe7,0x5a,0x2f,0x5a,0x01,
+  0x18,0x33,0x66,0x8c,0xd2,0xf9,0xc8,0x6d,0x7d,0xae,0xbf,0xfb,0xdd,0xef,0xe6,0xfa,
+  0x10,0x0f,0x1d,0xe2,0x69,0x76,0x74,0x2e,0x7f,0x50,0x51,0x9b,0xbc,0xa3,0xe1,0x43,
+  0xee,0x9d,0x7a,0x28,0x00,0x65,0xbb,0x77,0x50,0x00,0x00,0x9a,0x04,0xc9,0x2a,0x28,
+  0x83,0x02,0xa0,0x73,0xdc,0x6b,0x8a,0xcc,0x6e,0x76,0xa4,0x6c,0xed,0xf7,0xbe,0xf7,
+  0xbd,0x5c,0xd7,0xd9,0x2e,0x0a,0x80,0x94,0xfd,0x0d,0x61,0xb7,0xdd,0x76,0xcb,0x5d,
+  0xf0,0x96,0x41,0x01,0x28,0xdb,0xbd,0x83,0x02,0x00,0xd0,0x24,0x84,0x7a,0x00,0x8a,
+  0x4e,0x05,0xd4,0xd5,0xcc,0xda,0xfa,0x3c,0xfc,0xe5,0x2f,0x7f,0x89,0x4a,0x38,0xe7,
+  0x89,0x6f,0x8c,0xba,0x9d,0x14,0x00,0x39,0x16,0x92,0x59,0x91,0x27,0x92,0xa6,0xe9,
+  0x43,0x4a,0x09,0x17,0x4d,0xd9,0xee,0x1d,0xe6,0x02,0x00,0x68,0x12,0xa4,0x2e,0x40,
+  0x08,0xba,0x6c,0x28,0x07,0xab,0x40,0xa4,0xce,0x3e,0x54,0xc7,0x53,0x4f,0x3d,0xe5,
+  0x5d,0x46,0x66,0xcb,0x93,0xd9,0x01,0xf3,0x64,0xc2,0x84,0x09,0xde,0x65,0xea,0x31,
+  0x13,0x61,0xd9,0x40,0x01,0x00,0x68,0x31,0x05,0x40,0xa6,0x07,0x96,0x68,0xf1,0x5e,
+  0xbd,0x7a,0x71,0xd0,0xa0,0x34,0xe8,0xd2,0xc8,0x41,0xb5,0x0c,0xe4,0xfa,0xcd,0x2b,
+  0x03,0x20,0x0b,0x32,0xc3,0x63,0xbb,0xc1,0x10,0x00,0x40,0x13,0x59,0x9e,0xa1,0x55,
+  0x01,0xdb,0xd1,0x9a,0x81,0x72,0xf3,0xc1,0x07,0x1f,0x94,0x3a,0x8b,0x41,0x66,0x24,
+  0x14,0xef,0x03,0x0a,0x00,0x00,0x94,0x12,0xa9,0x09,0x10,0xfa,0xb0,0x05,0x28,0x13,
+  0xcd,0x50,0xc9,0xb0,0xdd,0xbc,0x00,0x28,0x00,0x00,0x2d,0xa8,0x00,0xe8,0x29,0x51,
+  0x39,0x58,0x50,0x2a,0x9a,0xa1,0x92,0x61,0xbb,0xdd,0x37,0x28,0x00,0x00,0x4d,0x44,
+  0xef,0xde,0xbd,0x83,0x96,0xcb,0x32,0x21,0x0d,0x40,0x3d,0x68,0x86,0xe0,0xd4,0xd5,
+  0xab,0x57,0xa3,0x00,0x00,0x40,0x39,0x91,0x00,0xa9,0x10,0x06,0x0c,0x18,0xc0,0xc1,
+  0x02,0x84,0x6b,0x46,0xda,0x4d,0x71,0x46,0x01,0x00,0x68,0x22,0x16,0x2d,0x5a,0x14,
+  0xb4,0x9c,0xd4,0xa9,0x07,0x28,0x13,0x83,0x07,0x0f,0x46,0x01,0x40,0x01,0x00,0x80,
+  0xa2,0x15,0x00,0x3c,0x00,0x50,0x36,0xd6,0x5b,0x6f,0xbd,0xa0,0xe5,0xa4,0xca,0xa2,
+  0x64,0x0b,0x34,0xa2,0x85,0x4c,0xca,0x84,0x02,0x00,0x00,0x0d,0x41,0x52,0x95,0x7c,
+  0x48,0xd5,0xb3,0x2e,0x5d,0xba,0x70,0xb0,0xa0,0x29,0x15,0x80,0x90,0xa2,0x3d,0x80,
+  0x02,0x00,0xd0,0x56,0xc8,0x54,0xbf,0x21,0xe3,0xa8,0xb8,0xff,0xa1,0x8c,0x48,0x1d,
+  0x8b,0x10,0xc5,0x14,0x05,0x00,0x05,0x00,0x00,0x0c,0x5e,0x7b,0xed,0xb5,0xa0,0xe5,
+  0x36,0xdf,0x7c,0x73,0x0e,0x16,0x94,0x0e,0x99,0x42,0x79,0xc8,0x90,0x21,0xde,0xe5,
+  0x26,0x4e,0x9c,0x18,0x3c,0xd4,0x05,0x28,0x00,0x00,0x28,0x00,0x09,0x76,0xd9,0x65,
+  0x17,0x0e,0x16,0x94,0x92,0x9d,0x76,0xda,0xc9,0xbb,0x8c,0x94,0x0c,0xbe,0xfb,0xee,
+  0xbb,0x39,0x58,0x28,0x00,0x00,0x80,0x02,0x00,0xad,0xc2,0xfe,0xfb,0xef,0x1f,0xb4,
+  0xdc,0x2d,0xb7,0xdc,0xc2,0xc1,0x42,0x01,0x00,0x80,0x98,0xd0,0xb9,0xd4,0x51,0x00,
+  0xa0,0xac,0xec,0xb7,0xdf,0x7e,0x41,0xcb,0xdd,0x79,0xe7,0x9d,0x91,0x27,0x00,0x50,
+  0x00,0x00,0xda,0x9e,0xf7,0xdf,0x7f,0x5f,0x3d,0xfd,0xf4,0xd3,0xde,0xe5,0x86,0x0e,
+  0x1d,0xaa,0x46,0x8d,0x1a,0xc5,0x01,0x83,0x9a,0x58,0xb6,0x6c,0x59,0x21,0xeb,0xdd,
+  0x7e,0xfb,0xed,0x83,0xe2,0x00,0xa4,0x6c,0xf0,0xdf,0xfe,0xf6,0x37,0x4e,0x04,0x0a,
+  0x00,0x00,0xfc,0xfd,0xef,0x7f,0x0f,0xca,0x00,0x38,0xe4,0x90,0x43,0x38,0x58,0x50,
+  0x33,0xef,0xbe,0xfb,0x6e,0x31,0x02,0xa7,0x73,0xe7,0x60,0x2f,0xc0,0xf9,0xe7,0x9f,
+  0xdf,0x76,0xb3,0xf3,0xa1,0x00,0x00,0xc0,0x3a,0xfc,0xe5,0x2f,0x7f,0x09,0x5a,0xee,
+  0x94,0x53,0x4e,0xe1,0x60,0x81,0x93,0xd0,0xfa,0x10,0xd3,0xa6,0x4d,0x2b,0x6c,0x1f,
+  0xce,0x38,0xe3,0x8c,0xa0,0xe5,0x24,0xe6,0xe5,0x9a,0x6b,0xae,0xe1,0xa4,0xa1,0x00,
+  0x00,0x94,0x9f,0xa5,0x4b,0x97,0x16,0xb2,0x5e,0x19,0xfb,0xbf,0xf7,0xde,0x7b,0xbd,
+  0xcb,0x6d,0xb9,0xe5,0x96,0xea,0xe3,0x1f,0xff,0x38,0x27,0x02,0x9c,0x48,0x8d,0x08,
+  0x49,0xc7,0xf3,0xf1,0xce,0x3b,0xef,0x14,0xb6,0x0f,0x7b,0xee,0xb9,0xa7,0xda,0x7b,
+  0xef,0xbd,0x83,0x96,0x3d,0xe7,0x9c,0x73,0x0a,0xf3,0x46,0x00,0x0a,0x00,0x40,0x6e,
+  0x88,0xf0,0x7d,0xeb,0xad,0xb7,0x72,0x5f,0xef,0x79,0xe7,0x9d,0x17,0xb4,0xdc,0xc9,
+  0x27,0x9f,0xcc,0x49,0x80,0x54,0xa4,0xd6,0xbd,0x14,0xe4,0xf1,0xf1,0xe6,0x9b,0x6f,
+  0x16,0xba,0x1f,0xe7,0x9e,0x7b,0x6e,0xd0,0x72,0x52,0xfc,0xea,0xe8,0xa3,0x8f,0x56,
+  0xcb,0x97,0x2f,0xe7,0xe4,0xa1,0x00,0x00,0x94,0x97,0xe7,0x9e,0x7b,0x2e,0xca,0x73,
+  0x0e,0xb1,0xd6,0x43,0xb9,0xec,0xb2,0xcb,0xd4,0x03,0x0f,0x3c,0xe0,0x5d,0xae,0x67,
+  0xcf,0x9e,0xea,0x73,0x9f,0xfb,0x1c,0x27,0x01,0xbc,0xac,0xbf,0xfe,0xfa,0xde,0x65,
+  0xfe,0xfd,0xef,0x7f,0xab,0x27,0x9f,0x7c,0xb2,0xb0,0x7d,0x38,0xe0,0x80,0x03,0xd4,
+  0x6e,0xbb,0xed,0x16,0xb4,0xec,0xe3,0x8f,0x3f,0x1e,0x0d,0x6d,0x85,0xce,0x84,0x09,
+  0x28,0x00,0x00,0x0d,0x61,0xf6,0xec,0xd9,0xea,0xe0,0x83,0x0f,0x56,0xdf,0xff,0xfe,
+  0xf7,0x6b,0x1e,0x12,0xb8,0xe7,0x9e,0x7b,0xd4,0x59,0x67,0x9d,0x15,0x6c,0x51,0x6d,
+  0xb0,0xc1,0x06,0x9c,0x00,0xf0,0xb2,0xd9,0x66,0x9b,0x05,0x2d,0xf7,0xa3,0x1f,0xfd,
+  0xa8,0xd0,0xfd,0xb8,0xf4,0xd2,0x4b,0x55,0xf7,0xee,0xdd,0x83,0x96,0xbd,0xfa,0xea,
+  0xab,0x23,0xa5,0x61,0xe6,0xcc,0x99,0x85,0xec,0x8b,0x04,0x1b,0x4a,0xe6,0x01,0x0a,
+  0x00,0x00,0xd4,0xfc,0x30,0xf9,0xc1,0x0f,0x7e,0x10,0x8d,0xc9,0xdf,0x70,0xc3,0x0d,
+  0x55,0xad,0xe3,0x8f,0x7f,0xfc,0xa3,0x3a,0xea,0xa8,0xa3,0x82,0x72,0xa1,0x3f,0xf2,
+  0x91,0x8f,0xa8,0xaf,0x7f,0xfd,0xeb,0x1c,0x78,0x08,0x22,0x34,0x53,0xe4,0x8e,0x3b,
+  0xee,0x50,0xf7,0xdf,0x7f,0x7f,0x61,0xfb,0x21,0xf5,0x2a,0x7e,0xf9,0xcb,0x5f,0x06,
+  0x2f,0xff,0xf0,0xc3,0x0f,0xab,0x9d,0x77,0xde,0x59,0x5d,0x7b,0xed,0xb5,0x41,0x19,
+  0x31,0x3e,0xe6,0xcd,0x9b,0x17,0xa5,0x1a,0x9e,0x78,0xe2,0x89,0x51,0xfa,0xec,0x76,
+  0xdb,0x6d,0xd7,0x76,0xd7,0x42,0x57,0x6e,0x87,0xe6,0x44,0xdc,0x73,0x7f,0xfd,0xeb,
+  0x5f,0xd5,0xeb,0xaf,0xbf,0xae,0xfa,0xf4,0xe9,0xa3,0x7a,0xf7,0xee,0xad,0x7a,0xf5,
+  0xea,0x15,0xbd,0x97,0x57,0xf9,0x3b,0xd9,0x42,0xbe,0x93,0x14,0x1d,0xc8,0x0f,0x89,
+  0x07,0x18,0x3f,0x7e,0xbc,0xda,0x63,0x8f,0x3d,0xd4,0x69,0xa7,0x9d,0xa6,0x3e,0xfd,
+  0xe9,0x4f,0x47,0xc7,0x39,0x8d,0x57,0x5e,0x79,0x45,0x7d,0xe7,0x3b,0xdf,0x51,0x37,
+  0xdf,0x7c,0x73,0xd0,0x36,0x24,0xa0,0xeb,0x8a,0x2b,0xae,0x50,0xdd,0xba,0x75,0xe3,
+  0x80,0x43,0x10,0x9f,0xfc,0xe4,0x27,0x83,0x97,0x3d,0xf0,0xc0,0x03,0xa3,0xa8,0xfd,
+  0x1f,0xff,0xf8,0xc7,0xde,0x6b,0xb7,0x1a,0xbe,0xfc,0xe5,0x2f,0x47,0x2e,0x7e,0xb1,
+  0xf0,0x43,0x78,0xfb,0xed,0xb7,0xd5,0x09,0x27,0x9c,0x10,0x29,0xd8,0xdf,0xfc,0xe6,
+  0x37,0xd5,0xa1,0x87,0x1e,0x1a,0x3c,0xcb,0xa0,0xf0,0xc6,0x1b,0x6f,0xa8,0xdb,0x6f,
+  0xbf,0x3d,0x52,0x6e,0x44,0xa1,0x48,0x0e,0x2b,0x88,0x12,0x80,0x02,0x00,0xa5,0x45,
+  0xb4,0x5e,0x19,0x0f,0xbe,0xee,0xba,0xeb,0xd4,0x94,0x29,0x53,0xa2,0x87,0xbf,0xcc,
+  0x61,0x2d,0x17,0xf1,0x07,0x1f,0x7c,0x10,0xbd,0x8f,0x3f,0x8b,0x85,0x43,0xfc,0x59,
+  0x08,0xb2,0xac,0x6c,0x43,0xac,0x4e,0xb1,0x62,0xa5,0xc9,0xba,0xe3,0x57,0x69,0xb1,
+  0x45,0x2a,0xcb,0xc5,0xdb,0x49,0x6e,0x43,0xd2,0x8c,0x7a,0xf4,0xe8,0x11,0xb9,0xf6,
+  0x64,0x5c,0x3a,0x56,0x38,0x62,0x25,0x45,0xa6,0xaa,0xed,0xdb,0xb7,0x6f,0xf4,0x2a,
+  0x4d,0xe6,0xad,0x8f,0x9b,0x44,0x28,0x4b,0x80,0x92,0x34,0xf9,0x2e,0x74,0xbf,0xcb,
+  0x8e,0x44,0xf1,0x4b,0x93,0x63,0x70,0xf8,0xe1,0x87,0x47,0x63,0x9f,0x1b,0x6d,0xb4,
+  0x91,0xda,0x70,0xc3,0x0d,0xa3,0x61,0x02,0x89,0x72,0x9e,0x34,0x69,0x92,0xba,0xfe,
+  0xfa,0xeb,0xd5,0xf3,0xcf,0x3f,0x9f,0x69,0xdd,0xa7,0x9e,0x7a,0x6a,0xa4,0x60,0x00,
+  0x84,0xb2,0xf1,0xc6,0x1b,0x47,0xd6,0x77,0x48,0x61,0x29,0xb9,0xcf,0x7f,0xf5,0xab,
+  0x5f,0x45,0x0a,0xe9,0x41,0x07,0x1d,0x14,0x79,0xb5,0xb6,0xd8,0x62,0x8b,0x68,0x1d,
+  0xe2,0x8e,0x7f,0xf9,0xe5,0x97,0x23,0xa5,0x55,0x84,0xe7,0x77,0xbf,0xfb,0xdd,0xaa,
+  0xf6,0xe7,0xf2,0xcb,0x2f,0x8f,0xae,0xfb,0x97,0x5e,0x7a,0x29,0xf8,0x37,0x92,0x22,
+  0x78,0xd2,0x49,0x27,0x45,0xcf,0x08,0xb1,0xdc,0xf7,0xd9,0x67,0x1f,0xb5,0xc9,0x26,
+  0x9b,0x44,0x45,0x86,0xe4,0x39,0x23,0x93,0x09,0xcd,0x9d,0x3b,0x37,0x52,0xc2,0xa5,
+  0x89,0xe2,0x20,0xaf,0x12,0x54,0x08,0x28,0x00,0x4d,0x41,0x2c,0x60,0xa5,0x2a,0x97,
+  0x4c,0x8e,0x21,0xee,0x64,0xa9,0x08,0x97,0x14,0xb8,0x49,0x21,0x29,0x16,0xbc,0x7c,
+  0x17,0x5b,0xf2,0xf1,0xfb,0x78,0x3d,0x3e,0x64,0x59,0x59,0x9f,0x44,0x0a,0x27,0x05,
+  0x7b,0xa8,0x42,0x91,0x5c,0x5e,0x9a,0x28,0x0b,0xd2,0xe4,0x46,0x94,0x87,0x85,0x28,
+  0x12,0xf1,0x67,0xf1,0x7b,0xf3,0xb3,0x58,0xe1,0x90,0xdf,0xf7,0xef,0xdf,0xbf,0x43,
+  0x29,0x10,0x2d,0x5f,0x9a,0x04,0x30,0x49,0x93,0x07,0x8e,0x8c,0x79,0xcb,0xeb,0xb0,
+  0x61,0xc3,0xa2,0xef,0xca,0xee,0xc1,0x90,0x87,0x92,0xe4,0x35,0xe7,0x95,0xdb,0x2c,
+  0xd6,0xcf,0xaf,0x7f,0xfd,0x6b,0x6e,0x14,0xc8,0xcc,0x25,0x97,0x5c,0xa2,0xf6,0xda,
+  0x6b,0xaf,0xe0,0xe5,0x45,0x80,0xfe,0xfe,0xf7,0xbf,0x77,0x7e,0x2f,0xca,0x6c,0xb5,
+  0x0a,0x80,0x08,0xec,0x7f,0xfc,0xe3,0x1f,0xea,0x3f,0xfe,0xe3,0x3f,0xd4,0x53,0x4f,
+  0x3d,0x95,0xf9,0x19,0xf9,0xc2,0x0b,0x2f,0x44,0x0d,0x50,0x00,0x5a,0x4a,0xf0,0x2f,
+  0x58,0xb0,0x40,0xdd,0x7a,0xeb,0xad,0x91,0xf6,0x9d,0x9c,0x1e,0x33,0xcd,0x32,0x4e,
+  0x7e,0x67,0x53,0x12,0x7c,0xf8,0x7e,0x1f,0xb2,0x6d,0x79,0x95,0x26,0x5e,0x80,0xd0,
+  0x20,0x1f,0xdf,0xf1,0x98,0x3f,0x7f,0x7e,0x14,0xa4,0x23,0xd6,0x46,0xac,0x30,0x24,
+  0x15,0x08,0xb1,0x54,0xc4,0xdb,0x20,0x9e,0x03,0x51,0x1a,0xc4,0x12,0x10,0x05,0x61,
+  0xc4,0x88,0x11,0x6a,0xf4,0xe8,0xd1,0x91,0xc5,0x3d,0x76,0xec,0xd8,0xe8,0xbb,0xa2,
+  0xf8,0xf6,0xb7,0xbf,0xad,0x2e,0xb8,0xe0,0x82,0xba,0x5c,0x23,0x52,0x4d,0x4d,0x3c,
+  0x06,0xb8,0xfe,0xa1,0x1a,0x24,0x17,0xff,0xd8,0x63,0x8f,0x8d,0xbc,0x89,0x65,0x40,
+  0x14,0xf9,0x07,0x1f,0x7c,0x30,0x1a,0x8f,0xbf,0xf1,0xc6,0x1b,0x39,0x41,0x28,0x00,
+  0xed,0x29,0xf4,0x45,0xa0,0x89,0x36,0x2c,0xd6,0xbe,0x54,0xe3,0x4a,0x5a,0xe0,0x36,
+  0x81,0x9b,0xb4,0xc8,0x4d,0x8b,0x3d,0xeb,0xf2,0xd5,0x0c,0x19,0xd4,0xf2,0xfb,0xd0,
+  0xf5,0x0b,0x22,0xe8,0x4c,0x61,0xe7,0xea,0x8f,0x78,0x11,0x66,0xcc,0x98,0x11,0xb5,
+  0x17,0x5f,0x7c,0x31,0xfa,0x4e,0x14,0x08,0x19,0x92,0x88,0x83,0x9a,0x8a,0x18,0x5e,
+  0x90,0x71,0x52,0x19,0xde,0x10,0x45,0xa0,0x48,0xc6,0x8d,0x1b,0xa7,0x6e,0xbb,0xed,
+  0xb6,0xa8,0x3f,0x00,0xd5,0x22,0x51,0xf8,0x13,0x26,0x4c,0x88,0x52,0xfe,0xca,0x80,
+  0x28,0xf0,0xa2,0xd4,0x7e,0xe3,0x1b,0xdf,0x50,0x3f,0xfb,0xd9,0xcf,0x38,0x41,0x75,
+  0x80,0xa8,0xaf,0x12,0x08,0xfe,0x25,0x4b,0x96,0x44,0x17,0xfe,0x71,0xc7,0x1d,0xa7,
+  0x3e,0xf6,0xb1,0x8f,0x45,0x91,0xb1,0x52,0x89,0x2b,0x76,0x69,0xcb,0x6b,0xec,0x9e,
+  0x8f,0x5f,0x5d,0x43,0x00,0xb5,0x2c,0x9f,0xfc,0xcc,0x66,0xd1,0x67,0xfd,0x7d,0xcd,
+  0x17,0x67,0x0e,0xfd,0x17,0x2f,0xca,0xc2,0x85,0x0b,0xd5,0xc8,0x91,0x23,0x23,0xaf,
+  0x40,0x32,0x6e,0x21,0x6e,0x79,0xf2,0xad,0x6f,0x7d,0x4b,0xfd,0xe1,0x0f,0x7f,0x08,
+  0x2a,0xb6,0x92,0x15,0x89,0xaf,0x90,0x87,0xe3,0x7d,0xf7,0xdd,0x57,0x48,0x40,0x16,
+  0xb4,0x17,0x32,0x94,0x26,0x0a,0xf1,0xb6,0xdb,0x6e,0x5b,0x9a,0x7d,0x92,0x7b,0xf6,
+  0xa7,0x3f,0xfd,0xa9,0xba,0xeb,0xae,0xbb,0xda,0x32,0x2a,0x1f,0x05,0xa0,0x4d,0x84,
+  0xbe,0xb4,0x7f,0xfe,0xf3,0x9f,0xea,0x8b,0x5f,0xfc,0xa2,0xda,0x7c,0xf3,0xcd,0xd5,
+  0x45,0x17,0x5d,0x14,0x59,0xa9,0xf1,0x58,0x76,0x9a,0xfb,0x3d,0x16,0x80,0x66,0xcb,
+  0x7b,0xf9,0x5a,0xbf,0xaf,0xb5,0xd5,0xd2,0x1f,0x09,0x8a,0x94,0x21,0x83,0xe1,0xc3,
+  0x87,0x47,0xc3,0x00,0xe6,0xb1,0x4f,0x0a,0xfe,0xbc,0x95,0x80,0x2f,0x7c,0xe1,0x0b,
+  0x51,0x90,0x92,0xbc,0xe6,0xe5,0x69,0x90,0x87,0xb4,0x64,0x7e,0x5c,0x78,0xe1,0x85,
+  0x58,0xfe,0x90,0xab,0x12,0x20,0x81,0xc5,0x5f,0xf9,0xca,0x57,0x72,0x19,0xae,0xcb,
+  0x0b,0xa9,0xa5,0xf1,0xaf,0x7f,0xfd,0x4b,0x5d,0x75,0xd5,0x55,0xd1,0xf0,0x5d,0x91,
+  0x88,0x67,0x51,0xbc,0x6a,0xa7,0x9f,0x7e,0x3a,0x0a,0x00,0x14,0x2b,0xf4,0xc5,0xc5,
+  0x2f,0xb9,0xa7,0x62,0xe9,0x1f,0x79,0xe4,0x91,0xea,0xd5,0x57,0x5f,0x8d,0x1e,0xee,
+  0x32,0x06,0x66,0x0a,0xb4,0xa4,0xd5,0x6b,0xb3,0x80,0xf3,0x6e,0xb5,0x6e,0x2f,0xef,
+  0xfd,0xad,0x66,0x7d,0x12,0x70,0x38,0x7d,0xfa,0xf4,0x68,0xfc,0x5f,0xc6,0xfe,0x93,
+  0x41,0x89,0xf1,0x79,0x88,0x33,0x18,0xcc,0xcf,0xf3,0x54,0x04,0xe4,0xc1,0x2a,0x9e,
+  0x80,0x47,0x1e,0x79,0x24,0x4a,0x05,0xac,0xc6,0x62,0x8f,0x67,0x4e,0x93,0xe0,0xab,
+  0x67,0x9f,0x7d,0x36,0xaa,0x32,0x58,0x24,0x32,0x7c,0xe1,0xa3,0x11,0x9e,0x87,0x7a,
+  0xed,0x57,0x23,0xfb,0x1f,0xb2,0x5e,0x51,0xfc,0x42,0x27,0xf3,0xc9,0x82,0x78,0xc6,
+  0x7e,0xfb,0xdb,0xdf,0x46,0x29,0xc5,0x62,0x90,0x14,0xb1,0x8d,0x6a,0x3d,0x80,0x12,
+  0x13,0x20,0xca,0xf4,0x95,0x57,0x5e,0xa9,0x8e,0x38,0xe2,0x88,0x28,0xc6,0xa7,0x56,
+  0xe4,0x38,0xca,0x5c,0x04,0x52,0x62,0x5b,0xaa,0x76,0x8a,0xb1,0x20,0xc6,0x58,0xb5,
+  0x41,0x8c,0x65,0xbe,0x77,0xbc,0x1e,0x97,0x4a,0xde,0xe6,0x0f,0xac,0x23,0xf8,0x63,
+  0x64,0x6c,0x5f,0x5c,0xc4,0x92,0x8a,0xb2,0xe9,0xa6,0x9b,0x06,0x5d,0x34,0xf5,0xde,
+  0xd7,0x6a,0xa3,0xfe,0x43,0x96,0x2f,0x12,0xb1,0xf6,0xc5,0x83,0x22,0xd6,0x42,0x7c,
+  0xa3,0xd9,0x62,0x22,0x24,0x02,0xdf,0xe6,0x35,0x48,0x0b,0x74,0x94,0x88,0xe9,0xb3,
+  0xcf,0x3e,0x3b,0xd3,0xb9,0x36,0x91,0x61,0x1e,0x71,0x6b,0x4a,0x40,0xa7,0x3c,0xd0,
+  0x24,0xf5,0x4f,0xae,0x03,0x09,0x60,0x94,0xb4,0x49,0x89,0x5b,0x88,0x83,0x16,0x65,
+  0xb8,0x42,0x04,0xff,0x31,0xc7,0x1c,0x13,0x79,0x30,0x00,0xea,0xc9,0xc4,0x89,0x13,
+  0xa3,0x40,0x3c,0xc9,0x99,0x97,0xf4,0x54,0x69,0x32,0x24,0x29,0x1e,0x02,0xc9,0x48,
+  0x12,0x05,0x61,0xf0,0xe0,0xc1,0x6a,0xcc,0x98,0x31,0x51,0x61,0x1e,0x49,0x43,0x95,
+  0x34,0xbc,0x7a,0x5c,0xab,0x72,0x9f,0x88,0x52,0x2d,0xd3,0x63,0x4b,0xda,0xa0,0x64,
+  0x45,0x49,0x93,0x2c,0x23,0xf9,0x4e,0xee,0x25,0xd9,0x47,0x51,0x14,0x64,0x7f,0x24,
+  0x43,0x48,0x5e,0xa5,0x49,0xa6,0x82,0xa4,0xe0,0xee,0xba,0xeb,0xae,0xd1,0x72,0x80,
+  0x02,0x50,0x17,0xc1,0x2f,0x0f,0xfa,0xaf,0x7e,0xf5,0xab,0x91,0x15,0x27,0xb9,0xaa,
+  0xb1,0x0b,0xb7,0xd6,0xa0,0x3c,0xdf,0xf2,0x59,0x83,0x02,0x6b,0x5d,0x7f,0xbd,0x83,
+  0x12,0xe5,0xbb,0x38,0xc5,0x50,0xf2,0x92,0xa5,0x96,0x80,0x0f,0x29,0x38,0x92,0xe6,
+  0x45,0x28,0x4a,0x01,0xb0,0x21,0x9e,0x08,0xd9,0x7f,0x49,0xbb,0x14,0xa5,0x25,0x4e,
+  0xbf,0x04,0x28,0x1b,0x52,0xaf,0x42,0x04,0xab,0x5c,0xb3,0xa1,0x33,0x0a,0xd6,0xfb,
+  0x79,0x2b,0xf7,0x92,0x28,0x27,0xf1,0xfd,0x04,0x7e,0x78,0xe2,0x14,0x28,0xf8,0xe5,
+  0xfd,0x2d,0xb7,0xdc,0xa2,0x7e,0xf8,0xc3,0x1f,0x46,0xd6,0xdd,0x36,0xdb,0x6c,0xb3,
+  0x8e,0xc0,0x4b,0xe6,0xe9,0x9b,0x02,0xc8,0x7c,0xb5,0x09,0xc8,0xb4,0x57,0x9b,0x30,
+  0xb3,0x09,0x61,0xdf,0x77,0xae,0xf5,0x65,0xfd,0xde,0x26,0xf0,0xab,0xed,0xbf,0x58,
+  0xfc,0x62,0x95,0x88,0x9b,0x7f,0xfb,0xed,0xb7,0xcf,0x24,0x74,0xe3,0x75,0xda,0x02,
+  0x16,0xeb,0xe9,0xc5,0x90,0xed,0x8b,0xfb,0x15,0xa0,0xec,0x88,0xd1,0x52,0xe6,0xd8,
+  0x13,0xb9,0x5f,0xc5,0x2b,0x01,0x28,0x00,0xa5,0x10,0xfc,0x62,0x95,0x4a,0x49,0x57,
+  0x71,0xf5,0x8a,0x4b,0x37,0x54,0xe0,0x9a,0xc2,0x27,0x4b,0x5e,0x7f,0xde,0x16,0x7b,
+  0x11,0x69,0x81,0xb5,0xf6,0x5f,0x04,0xbf,0x54,0xf4,0x12,0x57,0xb9,0x54,0x33,0x33,
+  0x8f,0xbb,0xaf,0x7f,0x71,0x91,0x21,0x33,0x6b,0xc1,0x3c,0x06,0x00,0x00,0x28,0x00,
+  0x10,0x2c,0xfc,0xe5,0x55,0x2a,0x66,0xdd,0x74,0xd3,0x4d,0x51,0x51,0x0b,0x41,0x5c,
+  0x52,0xd5,0x16,0xee,0xa9,0x46,0x20,0x9b,0xdf,0xf9,0x2c,0xf2,0x5a,0x3c,0x08,0xd5,
+  0x78,0x24,0xaa,0xed,0xbf,0x08,0xfe,0xc9,0x93,0x27,0x47,0x9e,0x14,0x11,0xfc,0x49,
+  0xcf,0x41,0x16,0x85,0x46,0xc6,0xdc,0xcd,0x20,0x27,0x9b,0x17,0x02,0x45,0x00,0x00,
+  0x50,0x00,0x20,0x48,0xf0,0x4b,0x60,0x97,0x08,0xfe,0xb8,0x94,0x65,0x2c,0x78,0xd2,
+  0x4a,0xf1,0xd6,0xea,0x62,0x0f,0x59,0x9f,0x8f,0x5a,0x84,0x5c,0x56,0x17,0x7f,0x35,
+  0xfd,0x97,0xe9,0x75,0x25,0x08,0x49,0xc6,0x1d,0x45,0xf0,0x27,0x8b,0x01,0x85,0xc4,
+  0x1c,0x98,0xdb,0xb6,0xcd,0xae,0x67,0xfe,0x06,0xc1,0x0f,0x00,0x28,0x00,0x90,0x2a,
+  0xf8,0x85,0x67,0x9e,0x79,0x26,0x12,0xfc,0x32,0x29,0x46,0x1e,0x02,0x39,0xeb,0x7e,
+  0x14,0xe9,0xd2,0xaf,0x45,0x29,0xa8,0xb5,0xff,0x22,0xf8,0x45,0xa9,0x92,0x3a,0xe1,
+  0x92,0xfe,0x26,0x55,0xc2,0xd2,0x14,0x30,0xdb,0xb9,0xb1,0x1d,0x0f,0x51,0x00,0xcc,
+  0xe8,0x7f,0x89,0x0b,0x70,0x29,0x31,0x00,0x00,0x28,0x00,0xd0,0x21,0x5c,0x44,0x60,
+  0xc8,0x54,0x92,0x92,0xd2,0x25,0xe3,0xd1,0x59,0x2c,0x52,0x9f,0xf0,0xcc,0x1a,0x45,
+  0x9f,0x66,0x41,0xfb,0x26,0x07,0xaa,0x75,0x7f,0x6b,0xdd,0x7f,0xdb,0xef,0x67,0xcd,
+  0x9a,0x15,0x09,0x7e,0x71,0xd3,0x4b,0x70,0x5f,0x48,0x64,0x7f,0x88,0x87,0x26,0xe9,
+  0x01,0xb0,0x15,0x14,0x92,0x73,0x2a,0xdb,0x44,0xf8,0x03,0x00,0x0a,0x00,0xac,0x23,
+  0x48,0x96,0x2f,0x5f,0x1e,0xe5,0xf2,0x4b,0x1d,0x76,0x09,0xf2,0xb3,0xb9,0xb8,0x8b,
+  0x9e,0x8c,0x27,0xab,0xc0,0xad,0x25,0x6a,0xbf,0x88,0xed,0xa5,0x59,0xfc,0x52,0x14,
+  0x49,0x04,0xb4,0x64,0x4b,0xc8,0x58,0x7f,0x11,0xc8,0xfa,0x93,0x45,0x85,0x62,0xeb,
+  0x1f,0xcb,0x1f,0x00,0x50,0x00,0x60,0x1d,0xab,0x51,0xea,0xc9,0x4b,0xe1,0x09,0x29,
+  0xe4,0x32,0x6f,0xde,0xbc,0x60,0x01,0x19,0xb2,0x8d,0x5a,0x5d,0xf4,0x59,0xa3,0xea,
+  0xb3,0x1e,0x83,0x5a,0x3c,0x18,0x21,0xeb,0x8f,0x67,0xf8,0x5b,0xbc,0x78,0xb1,0xda,
+  0x7a,0xeb,0xad,0xa3,0x8c,0x89,0x22,0xb3,0x12,0x92,0x0a,0x80,0x58,0xfc,0xa2,0x00,
+  0xc4,0x4a,0x9c,0x59,0x1d,0x10,0x65,0x00,0x00,0x50,0x00,0xda,0x54,0xf0,0x8b,0x3b,
+  0xfa,0xf6,0xdb,0x6f,0x8f,0xac,0x7e,0x29,0x84,0xe1,0x2a,0x18,0x93,0x25,0xe8,0x2d,
+  0xcf,0x34,0x3f,0x13,0x9f,0xcb,0xbf,0x1a,0x01,0x9e,0x25,0x8b,0x20,0x4b,0xff,0xe5,
+  0xd8,0x8a,0xc5,0x2f,0x0a,0xd5,0x16,0x5b,0x6c,0x11,0x55,0x46,0x34,0xf3,0xf2,0x7d,
+  0x1e,0x8b,0x6a,0x14,0x04,0x49,0x03,0x94,0x26,0xc2,0x5f,0x5e,0x63,0x2f,0x40,0x96,
+  0xe3,0x04,0x00,0x80,0x02,0xd0,0xa2,0x82,0x7f,0xea,0xd4,0xa9,0xea,0xd6,0x5b,0x6f,
+  0x8d,0xc6,0xf9,0x45,0x48,0x84,0x08,0xe7,0xac,0xcb,0x84,0x08,0xb8,0x22,0xd6,0x9f,
+  0xc5,0xa3,0x50,0xc4,0xfe,0xc5,0xae,0x7e,0xb1,0xfc,0xa5,0x2a,0xe2,0xee,0xbb,0xef,
+  0xde,0x51,0x01,0x2f,0xab,0x00,0xce,0x9a,0x05,0x10,0x07,0x01,0xc6,0xc2,0x3f,0x1e,
+  0xf3,0x37,0xe7,0x04,0x00,0x00,0x40,0x01,0x68,0x33,0xc1,0x2f,0x82,0x49,0x2a,0xf7,
+  0x49,0xc9,0xde,0x32,0xb8,0x81,0x8b,0xae,0xcd,0x5f,0xcf,0x2c,0x01,0xb1,0xf8,0xc5,
+  0xd5,0x2f,0xaf,0xa3,0x46,0x8d,0x52,0x07,0x1e,0x78,0x60,0x14,0xe1,0x5f,0x4b,0xa1,
+  0xa2,0xb4,0x2c,0x00,0x89,0xd7,0x88,0x67,0x57,0x4c,0x2a,0x0c,0xb1,0x07,0x20,0x9e,
+  0x10,0xc8,0x35,0x31,0x10,0x31,0x01,0x00,0x80,0x02,0xd0,0x06,0x82,0x5f,0x04,0xbe,
+  0x08,0x7e,0x51,0x00,0x42,0x2c,0xdd,0x7a,0x91,0x87,0x05,0x9e,0xe7,0xf2,0xd5,0x0a,
+  0x7e,0x49,0x91,0x94,0xa0,0x49,0x09,0xec,0x93,0x49,0x6e,0xfa,0xf7,0xef,0xef,0x15,
+  0xe0,0x21,0xdf,0xdb,0xfa,0x23,0x13,0x82,0xc8,0xb0,0xc2,0xa2,0x45,0x8b,0xd6,0x0a,
+  0xee,0x8b,0x7f,0x1b,0x0b,0xff,0xb8,0xe5,0x3d,0x0b,0x20,0x00,0x00,0x0a,0x40,0xc9,
+  0x05,0xbf,0x3c,0xfc,0x1f,0x7d,0xf4,0xd1,0xc8,0xd5,0x2f,0xd5,0xfb,0xaa,0xb1,0x80,
+  0xeb,0x9d,0x67,0x9f,0x77,0x50,0x9c,0x4d,0x80,0xe6,0xd5,0xff,0x58,0xf0,0xcb,0x4c,
+  0x5d,0x52,0xc4,0x47,0x66,0x0c,0x13,0x6b,0xbc,0xa8,0xe3,0x25,0x82,0x5d,0x2c,0x7e,
+  0x09,0xd8,0x4c,0x4e,0x01,0x6c,0xf6,0xd5,0x26,0xfc,0x6d,0x01,0x80,0x00,0x00,0x28,
+  0x00,0x2d,0x26,0xf8,0x65,0x5a,0xd6,0xeb,0xaf,0xbf,0x3e,0x2a,0xd5,0xbb,0x70,0xe1,
+  0x42,0xab,0x25,0x5c,0x6d,0x1e,0x7e,0xd6,0xdf,0x87,0x78,0x00,0x7c,0xb5,0xf4,0xab,
+  0x19,0xdf,0x4f,0xcb,0x62,0xa8,0xb5,0xff,0x49,0xc1,0x2f,0x2e,0x7e,0x99,0x2e,0x54,
+  0x5c,0xfe,0xb6,0xdf,0xe5,0x31,0x5b,0xa0,0x08,0x7e,0x11,0xfa,0x62,0xf1,0xbb,0x84,
+  0x7a,0x72,0x7d,0xc9,0x65,0xf0,0x00,0x00,0x00,0x0a,0x40,0x0b,0x0b,0x7d,0x79,0xc8,
+  0xbf,0xf8,0xe2,0x8b,0xea,0xf1,0xc7,0x1f,0x8f,0xca,0xf4,0x8a,0xd0,0x37,0x27,0x80,
+  0x71,0x09,0xd4,0x5a,0xa3,0xf2,0xf3,0xa8,0x04,0x98,0x57,0x65,0xbd,0x22,0xb6,0x97,
+  0xec,0x7f,0x52,0xf0,0xcb,0xbc,0xe1,0x92,0xcb,0x2f,0x91,0xfd,0xb5,0x44,0xed,0xa7,
+  0x05,0xf5,0xc9,0x79,0x15,0xa1,0x2f,0xe7,0x33,0x2e,0xef,0x1b,0x9f,0xef,0xe4,0x72,
+  0xb6,0xdf,0xc7,0x82,0x3f,0xb9,0x9c,0xa9,0x08,0x30,0xfe,0x0f,0x00,0x28,0x00,0x4d,
+  0x28,0xf4,0x25,0x00,0xec,0xa1,0x87,0x1e,0x52,0x0f,0x3c,0xf0,0x80,0x7a,0xf2,0xc9,
+  0x27,0xa3,0x68,0xef,0x78,0x0e,0xeb,0x64,0xaa,0x59,0x1e,0x41,0x72,0x59,0x26,0xf3,
+  0xa9,0xc6,0xc2,0xad,0x65,0xff,0x6a,0x75,0xf9,0x87,0xec,0x8f,0x08,0xfe,0x09,0x13,
+  0x26,0x44,0x82,0x5f,0x8e,0xf3,0x66,0x9b,0x6d,0xa6,0x36,0xdf,0x7c,0xf3,0xb5,0x6a,
+  0xf6,0xe7,0x55,0xaa,0x38,0xb6,0xe0,0xa5,0x66,0x80,0x8c,0xf3,0x8b,0xf5,0x9f,0x74,
+  0xf7,0x9b,0x0a,0x42,0xf2,0xef,0xa4,0x90,0xf7,0x45,0xfe,0x9b,0xfb,0xb0,0xd5,0x56,
+  0x5b,0xa9,0x7d,0xf7,0xdd,0x37,0xf5,0xba,0xeb,0xdb,0xb7,0x2f,0x4f,0x13,0x00,0x40,
+  0x01,0x68,0x84,0xd0,0x17,0x9e,0x7f,0xfe,0xf9,0xa8,0x3c,0xef,0xfd,0xf7,0xdf,0x1f,
+  0x05,0x83,0xc9,0xfc,0xd0,0xeb,0xaf,0xbf,0x7e,0xb0,0xc5,0x6b,0xe2,0xcb,0xab,0x0f,
+  0x29,0xb5,0x6b,0xbe,0xa6,0x4d,0x96,0x93,0x75,0x48,0xa1,0xd6,0xd9,0xfc,0x6a,0xe9,
+  0xbf,0x08,0x61,0x49,0xe9,0x13,0xcf,0x8a,0xac,0x63,0xf4,0xe8,0xd1,0x91,0xa0,0xb4,
+  0xd5,0xec,0x37,0xcf,0x53,0xb5,0x41,0x7f,0x62,0xf1,0xcb,0x38,0xbf,0x9c,0xdb,0xa4,
+  0xe0,0x77,0x59,0xf4,0x2e,0x85,0xc7,0x54,0x06,0x6c,0xfb,0x98,0xe4,0x93,0x9f,0xfc,
+  0x64,0xd4,0x00,0x00,0x50,0x00,0x4a,0x24,0xf4,0xe5,0xe1,0x7f,0xef,0xbd,0xf7,0xaa,
+  0xab,0xaf,0xbe,0x3a,0xb2,0x44,0x45,0x00,0x0d,0x19,0x32,0x44,0xf5,0xe9,0xd3,0xa7,
+  0x2a,0x8b,0x36,0x4d,0x40,0x56,0x13,0x65,0xef,0x1b,0xc3,0xcf,0xb2,0x7c,0x9e,0xd3,
+  0xeb,0x56,0xdb,0x7f,0x11,0xfc,0x62,0xf5,0x4b,0x2c,0x85,0x20,0x91,0xfd,0x52,0xc1,
+  0xcf,0x56,0xb3,0x3f,0xaf,0x20,0x49,0x29,0xc2,0x24,0x16,0xbf,0xb8,0xfa,0xd3,0x82,
+  0xf7,0x62,0x65,0x20,0xf6,0x14,0x98,0xa4,0x8d,0xf9,0x13,0x07,0x00,0x00,0x28,0x00,
+  0x4d,0x22,0xf8,0x05,0xb1,0x3e,0x7f,0xf5,0xab,0x5f,0xa9,0xd7,0x5f,0x7f,0xbd,0xe3,
+  0x33,0x11,0x4c,0xd3,0xa6,0x4d,0xe3,0xcc,0xd6,0x89,0x71,0xe3,0xc6,0x79,0x95,0x87,
+  0x6a,0x2b,0xf9,0x2d,0x5b,0xb6,0x2c,0x12,0xfc,0x32,0xa4,0x63,0x0a,0xf1,0xa4,0x90,
+  0xb7,0x8d,0xfd,0xbb,0x3c,0x00,0x00,0x00,0xd0,0x64,0x0a,0x40,0xf2,0x81,0x2e,0xae,
+  0xe7,0x0b,0x2f,0xbc,0x50,0xdd,0x77,0xdf,0x7d,0x9c,0xc1,0x12,0x9c,0x97,0x6a,0x63,
+  0x0e,0x5c,0x1e,0x8a,0xb8,0x88,0x8f,0x28,0x00,0xb6,0x31,0x7d,0x9b,0xb5,0x1f,0xbf,
+  0x4f,0x7e,0x67,0x5e,0x37,0x28,0x00,0x00,0x00,0x4d,0xa4,0x00,0x98,0xe3,0xc1,0x92,
+  0xbb,0x7f,0xde,0x79,0xe7,0x45,0x96,0x21,0x94,0x9b,0xac,0x41,0x89,0x71,0x2e,0xbf,
+  0x78,0x71,0x4c,0x57,0xbe,0x29,0xf8,0x93,0x9f,0x99,0x55,0xfd,0xd2,0x66,0x28,0x04,
+  0x00,0x80,0x92,0x2b,0x00,0xb6,0x40,0xb0,0x2b,0xae,0xb8,0x42,0xfd,0xcf,0xff,0xfc,
+  0x0f,0x67,0xad,0x84,0x42,0x3e,0x44,0xe0,0xbb,0xbe,0x97,0xb1,0x7d,0x49,0xe7,0x93,
+  0x20,0xbf,0xd8,0xda,0xb7,0x09,0xfa,0xf8,0xbd,0x4d,0x39,0x30,0x3d,0x00,0x71,0xd5,
+  0x3f,0xf3,0x5a,0x02,0x00,0x80,0x12,0x2b,0x00,0xe6,0x38,0xae,0x3c,0xc8,0x7f,0xf8,
+  0xc3,0x1f,0x46,0x33,0xf3,0x41,0xf9,0x15,0xb5,0xd0,0xd2,0xbd,0xc9,0x5c,0x7e,0x9b,
+  0x90,0x37,0xd7,0xe9,0x1a,0xe7,0x4f,0x0b,0x0a,0x4c,0x7a,0x00,0x50,0x04,0x00,0x00,
+  0x4a,0xac,0x00,0x98,0x0f,0x75,0xb1,0x0e,0xbf,0xfb,0xdd,0xef,0x46,0x53,0xf2,0x42,
+  0x6b,0x28,0x0b,0xa2,0xd0,0x25,0x05,0x7f,0xd2,0xa2,0x4f,0xcb,0xe7,0xb7,0xb9,0xfe,
+  0x6d,0xd5,0xfd,0x5c,0xb5,0x01,0x00,0x00,0xa0,0x84,0x0a,0x80,0xab,0x60,0xcb,0x45,
+  0x17,0x5d,0x84,0xf0,0x6f,0x22,0x01,0xef,0x73,0xf9,0x4b,0x1a,0xa1,0x08,0xfe,0x78,
+  0x52,0x1e,0x57,0xe0,0x9e,0xcd,0xda,0x4f,0x2a,0x05,0xbe,0x3a,0x00,0x71,0x60,0x20,
+  0x00,0x00,0x94,0x58,0x01,0x70,0xb9,0x74,0xaf,0xbd,0xf6,0xda,0xa8,0xb0,0x0f,0x34,
+  0x07,0x69,0x75,0x07,0x24,0xb0,0x2f,0x59,0xb6,0xd7,0x96,0xcf,0xef,0xf2,0x04,0xb8,
+  0x14,0x04,0xd7,0xf0,0x80,0xd9,0x18,0x02,0x00,0x09,0x2e,0x9d,0x31,0x63,0x46,0xd4,
+  0xde,0x7b,0xef,0xbd,0x8e,0xf7,0x71,0x93,0xcc,0x93,0xe3,0x8f,0x3f,0x5e,0x1d,0x77,
+  0xdc,0x71,0xd1,0x1c,0x16,0x00,0x28,0x00,0x0d,0x12,0xfe,0xf2,0x30,0x7f,0xec,0xb1,
+  0xc7,0xd4,0x2f,0x7f,0xf9,0x4b,0xce,0x50,0x93,0x7b,0x00,0x44,0xf0,0x8b,0xbb,0x3f,
+  0xce,0xe5,0x4f,0x5a,0xef,0xf1,0xfb,0xb8,0xa4,0x6f,0x52,0x80,0xbb,0xb2,0x00,0x4c,
+  0x21,0x9f,0x54,0x26,0x4c,0x0f,0x80,0x29,0xf0,0xc9,0x06,0x68,0x2d,0xe4,0x9a,0x32,
+  0x05,0xb9,0xab,0xc5,0x85,0xab,0x4c,0x06,0x0d,0x1a,0xa4,0xfe,0xcf,0xff,0xf9,0x3f,
+  0xea,0xcc,0x33,0xcf,0x54,0xfd,0xfa,0xf5,0xe3,0x1a,0x01,0x14,0x80,0x46,0x08,0xff,
+  0x64,0x93,0xb9,0xe3,0x65,0xdc,0x1f,0x17,0x6e,0x73,0x08,0x7d,0xdb,0xdf,0xf2,0x70,
+  0x16,0x8b,0x5f,0xca,0xf6,0x26,0xdd,0xf1,0xb6,0x68,0x7d,0x53,0x60,0xbb,0xaa,0xfd,
+  0x99,0xc3,0x02,0xbe,0x21,0x83,0xe4,0xb6,0xa0,0x39,0x90,0x73,0x26,0x95,0x26,0x43,
+  0x84,0xfa,0xdc,0xb9,0x73,0xab,0xde,0x8e,0x08,0xfe,0xff,0xfe,0xef,0xff,0x5e,0x47,
+  0xf0,0x93,0x3e,0x0a,0x28,0x00,0x0d,0x14,0xfe,0xf2,0x00,0x90,0x88,0x7f,0x99,0xe2,
+  0x15,0x9a,0x03,0xd3,0xe5,0x2f,0xe7,0x70,0xce,0x9c,0x39,0xce,0x40,0x3c,0x9b,0x80,
+  0x77,0x09,0x74,0xdb,0xb0,0x80,0x29,0xd8,0x6d,0xf1,0x01,0xb1,0xd2,0xc1,0x10,0x40,
+  0x39,0x48,0xba,0xe0,0xd3,0x9a,0x4c,0x2a,0x15,0xa7,0x6f,0x16,0x41,0x2c,0xf8,0xbf,
+  0xfa,0xd5,0xaf,0xaa,0xfe,0xfd,0xfb,0xaf,0xf3,0x3c,0xb2,0x55,0xaa,0x04,0x40,0x01,
+  0x28,0x48,0xf8,0x27,0x1f,0xe0,0xf2,0xc0,0x96,0xea,0x7e,0x4f,0x3c,0xf1,0x04,0x67,
+  0xa6,0x49,0xbd,0x00,0xbe,0x4a,0x7d,0x49,0xc1,0x6e,0x73,0xf3,0x9b,0x02,0xdd,0xe7,
+  0x11,0xf0,0xa5,0x04,0x22,0xf8,0x8b,0x23,0x0f,0x17,0x7c,0xbd,0x10,0xc1,0xff,0x5f,
+  0xff,0xf5,0x5f,0xea,0xf4,0xd3,0x4f,0xef,0x10,0xfc,0x69,0xd7,0x85,0xa9,0xd4,0x02,
+  0xa0,0x00,0x14,0xe8,0x01,0x90,0x87,0xb9,0x3c,0x24,0x18,0xf7,0x6f,0x5e,0x05,0x20,
+  0x39,0xb6,0x6f,0x56,0xe7,0xf3,0xa5,0xe9,0xb9,0x82,0xf7,0x42,0x32,0x03,0xd2,0xd6,
+  0x05,0xd9,0xa8,0x97,0x0b,0xbe,0xde,0x82,0xff,0xb4,0xd3,0x4e,0xeb,0x10,0xfc,0xc9,
+  0x6b,0x30,0xf9,0x6a,0xfb,0x0c,0x25,0x00,0x50,0x00,0x0a,0xb4,0x16,0x63,0x61,0x21,
+  0xed,0xa6,0x9b,0x6e,0x8a,0xc6,0xff,0xa1,0xb9,0x30,0x1f,0x94,0xe2,0xc2,0xb5,0x59,
+  0xe8,0x36,0xeb,0xdd,0x54,0x0a,0x6c,0x31,0x02,0xae,0xc0,0xc0,0xb4,0xba,0x01,0xb6,
+  0x99,0xff,0xda,0xf9,0x21,0x5e,0x16,0x17,0x7c,0xe8,0xf5,0x24,0xd3,0x4e,0xbb,0x9a,
+  0x7c,0x2f,0x33,0x44,0x26,0xe7,0x8a,0xb0,0x09,0xfe,0xb3,0xce,0x3a,0x4b,0x9d,0x7a,
+  0xea,0xa9,0xaa,0x6f,0xdf,0xbe,0x6b,0x05,0x9b,0xc6,0x2d,0xde,0x96,0x39,0x59,0x95,
+  0x4d,0x09,0x00,0x40,0x01,0xc8,0xd9,0xea,0x4f,0x36,0xb9,0xa1,0xff,0xfc,0xe7,0x3f,
+  0x73,0x46,0x5a,0x40,0x11,0xb0,0x09,0x77,0x5b,0x10,0xa0,0x2b,0x9f,0xdf,0x15,0x1f,
+  0x10,0x62,0xed,0xb7,0x53,0x10,0x60,0x33,0xb9,0xe0,0x85,0x58,0x80,0x77,0xe9,0xd2,
+  0x65,0x1d,0xa1,0x2e,0x9f,0xc5,0x82,0xdf,0x14,0xba,0xc9,0x6b,0x44,0xea,0x48,0x48,
+  0x4b,0x13,0xfc,0x12,0xd8,0x77,0xca,0x29,0xa7,0x38,0x05,0xbf,0xa9,0x04,0xd8,0xae,
+  0x63,0x53,0xf8,0xa3,0x0c,0x00,0x0a,0x40,0x4e,0x4a,0x40,0xf2,0x81,0x2f,0x4d,0x6e,
+  0xd0,0x7b,0xee,0xb9,0xa7,0x29,0x5c,0x8a,0xe0,0xf6,0xe8,0xc4,0xc4,0x45,0x7e,0x4c,
+  0x45,0x20,0x79,0xfe,0x5d,0x13,0xf8,0xd8,0xd2,0xfe,0xd2,0x84,0xbd,0x2b,0x33,0x20,
+  0xb9,0xed,0x66,0x0a,0x02,0x6c,0x36,0x17,0xbc,0x29,0xc4,0x6d,0x7f,0xcb,0xf1,0x97,
+  0xf7,0xae,0x02,0x51,0xb6,0x6b,0xca,0x0c,0xf2,0x94,0x54,0x52,0x9f,0xe0,0x3f,0xe3,
+  0x8c,0x33,0xd4,0x49,0x27,0x9d,0xa4,0xfa,0xf4,0xe9,0xd3,0x31,0xc7,0x84,0x4b,0xf0,
+  0xc7,0xfb,0x15,0xbf,0xf7,0x79,0xb5,0x00,0x50,0x00,0x72,0x12,0x14,0x36,0x25,0x80,
+  0x82,0x3f,0xad,0xe1,0x01,0xc8,0x9a,0xba,0x67,0xfb,0x4d,0xda,0xf2,0x49,0x2f,0x82,
+  0x99,0x19,0x60,0x7a,0x18,0x7c,0xb3,0x0f,0xd6,0x93,0x66,0x73,0xc1,0x27,0x85,0xb9,
+  0xeb,0x7d,0x52,0x88,0x86,0x4c,0x02,0x15,0x0b,0xda,0xf8,0x7d,0xda,0xb4,0xd1,0x49,
+  0xc1,0x2f,0x2d,0x4d,0xf0,0x4b,0x60,0xdf,0x89,0x27,0x9e,0x18,0x59,0xfc,0x42,0x5c,
+  0x6c,0x2a,0x4d,0xe0,0xc7,0xfb,0x20,0x4d,0xae,0x99,0xa4,0x12,0x80,0xf0,0x07,0x14,
+  0x80,0x3a,0x59,0xff,0xd2,0x26,0x4f,0x9e,0xac,0x5e,0x7b,0xed,0x35,0xce,0x46,0x8b,
+  0x78,0x03,0xe4,0x01,0x9c,0xf4,0x00,0x98,0x82,0xd9,0xb4,0xd0,0x6d,0x4a,0x81,0x4d,
+  0x71,0x08,0xcd,0x02,0xb0,0x0d,0x17,0x14,0x41,0x33,0xb9,0xe0,0x63,0xc1,0x17,0x0b,
+  0x70,0x79,0x75,0xbd,0x77,0xb9,0xe0,0x43,0xa7,0x75,0xce,0xe3,0x3a,0x92,0x34,0x60,
+  0x69,0x69,0x82,0xff,0x2b,0x5f,0xf9,0x8a,0x3a,0xe1,0x84,0x13,0x3a,0x2a,0xf7,0x49,
+  0xcd,0x09,0x53,0xf0,0xc7,0xfd,0x8e,0x85,0x7c,0x2c,0xe8,0x93,0x7d,0x4c,0x2a,0x23,
+  0xa6,0xe2,0x02,0x80,0x02,0x90,0xa3,0xe0,0x37,0x1f,0xe0,0x62,0xed,0x3c,0xfc,0xf0,
+  0xc3,0x9c,0x89,0x16,0x22,0x1e,0x02,0xf0,0x95,0xe8,0x75,0x55,0xef,0x73,0x95,0x05,
+  0x0e,0x59,0x97,0x4d,0x29,0xc8,0x7a,0xad,0x8a,0x15,0x2e,0xc1,0xa8,0x52,0x32,0xd6,
+  0x56,0x36,0xb6,0x6c,0x2e,0xf8,0x58,0x80,0xc7,0x42,0xbc,0x6b,0xd7,0xae,0xd6,0xcf,
+  0x6b,0xb9,0x7f,0x93,0x42,0x32,0x69,0x41,0xe7,0x89,0x9c,0x3b,0x11,0xfa,0xe2,0x2d,
+  0x49,0x13,0xfc,0x12,0xd1,0x7f,0xcc,0x31,0xc7,0x74,0x08,0x7e,0x51,0xc4,0x92,0x63,
+  0xfa,0xa6,0xb5,0x1f,0x0b,0xff,0xe4,0xb5,0x12,0x0f,0x49,0x98,0x59,0x27,0x21,0x43,
+  0x13,0x00,0x28,0x00,0x35,0x2a,0x03,0x49,0x0f,0xc0,0xa3,0x8f,0x3e,0xca,0x99,0x68,
+  0x01,0xcb,0x3f,0x7e,0x80,0xda,0xb2,0x00,0x7c,0x56,0x7e,0x5a,0xb3,0xb9,0xfe,0x4d,
+  0x61,0x6f,0x0b,0x2e,0x4c,0x56,0x92,0x14,0xeb,0x50,0x02,0x4d,0x27,0x4e,0x9c,0x18,
+  0x55,0x28,0xfc,0xe0,0x83,0x0f,0xa2,0x62,0x45,0x32,0xde,0x2e,0x02,0x3f,0x16,0xf6,
+  0x65,0x70,0xc1,0xc7,0x96,0xaa,0x08,0x72,0x9f,0x50,0xaf,0x87,0x40,0x32,0xe7,0x78,
+  0xc8,0xdb,0x3a,0x96,0xf3,0x24,0x42,0x5f,0x84,0xbf,0xab,0xfa,0xa7,0x08,0xfe,0xff,
+  0xfc,0xcf,0xff,0x54,0x47,0x1e,0x79,0xa4,0xea,0xd5,0xab,0x57,0x87,0xe0,0xb7,0x59,
+  0xfc,0xc9,0x2c,0x02,0x59,0x9f,0x1c,0x2b,0xb3,0x3f,0xae,0xe1,0x27,0x02,0x00,0x01,
+  0x05,0xa0,0x00,0xe1,0xe0,0x0a,0xfe,0x93,0x07,0xf1,0xeb,0xaf,0xbf,0xce,0x99,0x68,
+  0x62,0x4c,0xd7,0x70,0x5c,0xfe,0xd7,0x67,0xe5,0xa7,0x05,0xf5,0xa5,0xcd,0x01,0xe0,
+  0xca,0x24,0x48,0x2e,0x23,0x81,0x60,0xa3,0x46,0x8d,0x52,0xaf,0xbe,0xfa,0xaa,0x7a,
+  0xeb,0xad,0xb7,0x3a,0x84,0xc5,0x83,0x0f,0x3e,0xd8,0xb0,0x63,0x94,0x14,0xde,0x66,
+  0x4b,0x0a,0xf8,0xd8,0x5a,0x6d,0x94,0xd0,0x09,0x99,0xd5,0x31,0xed,0xfb,0x2c,0x82,
+  0x7f,0xde,0xbc,0x79,0x91,0xf0,0x4f,0x13,0xfc,0x5f,0xfa,0xd2,0x97,0xd4,0x61,0x87,
+  0x1d,0xa6,0x7a,0xf6,0xec,0x19,0x24,0xf8,0x93,0x0a,0x80,0x4d,0xf8,0x53,0x2b,0x02,
+  0xa0,0x8e,0x1e,0x80,0x34,0x25,0xe0,0x95,0x57,0x5e,0xe1,0x2c,0x34,0xb9,0xf5,0x6f,
+  0x5a,0x88,0xb1,0x07,0xc0,0x1c,0x8f,0xb7,0x59,0xfb,0xa6,0x65,0xef,0x8a,0x15,0x48,
+  0x2e,0x17,0xbf,0xb7,0x15,0x19,0xea,0xd6,0xad,0x9b,0x1a,0x3e,0x7c,0x78,0x24,0x54,
+  0x9e,0x7d,0xf6,0xd9,0xc2,0x1f,0xf0,0x36,0x41,0x6e,0x7e,0x26,0xfb,0x94,0x74,0x51,
+  0x87,0x8c,0xa1,0x67,0x11,0xa6,0x79,0x8f,0xd1,0xfb,0x2c,0xfe,0xac,0x1e,0x01,0x73,
+  0xff,0xe4,0xfa,0x10,0xc1,0x2f,0x2d,0x4d,0xf0,0x9f,0x7c,0xf2,0xc9,0xea,0x90,0x43,
+  0x0e,0x51,0x3d,0x7a,0xf4,0x58,0x47,0xf0,0xc7,0xaf,0x49,0x81,0x9f,0x14,0xfc,0xb6,
+  0x7d,0xb5,0x15,0xa0,0x4a,0xbe,0xe6,0x71,0x2e,0x00,0x50,0x00,0x02,0x04,0x7f,0xec,
+  0x01,0x98,0x34,0x69,0x12,0x67,0xa1,0xc5,0x94,0x81,0x38,0x08,0x30,0xc4,0xca,0x4f,
+  0x2b,0xfa,0x13,0xe2,0x01,0x48,0x5a,0xa1,0x43,0x86,0x0c,0x89,0xdc,0xc8,0x2f,0xbf,
+  0xfc,0x72,0x4d,0xfd,0x88,0x2d,0xc7,0xa4,0x30,0x37,0xdf,0xc7,0x6e,0xf9,0x10,0xe1,
+  0x60,0x0a,0xe4,0xbc,0xc7,0xd0,0xcd,0x31,0x7a,0x53,0x40,0x67,0x4d,0xbb,0xcb,0xdb,
+  0xe2,0x8f,0xf7,0x2f,0xf6,0xf8,0xf9,0x04,0xbf,0xa4,0xf2,0x1d,0x70,0xc0,0x01,0x1d,
+  0x82,0x5f,0x0a,0xfe,0x98,0xc5,0x7b,0x6c,0x82,0x3f,0x69,0xed,0x27,0x05,0x7e,0x16,
+  0x45,0x07,0x45,0x00,0x50,0x00,0xea,0xa0,0x04,0xc8,0xc3,0x40,0xda,0xdb,0x6f,0xbf,
+  0xcd,0x59,0x68,0x01,0xc1,0x9f,0x7c,0x2f,0x0a,0x40,0x5a,0x0c,0x40,0x68,0xb3,0x29,
+  0x0c,0xb6,0x6b,0x49,0x66,0x73,0x13,0x8b,0xff,0xcd,0x37,0xdf,0x4c,0x7d,0x78,0x27,
+  0x05,0x79,0xda,0x6b,0xde,0x0f,0xfa,0xa2,0xc7,0xd0,0x7d,0x02,0x3f,0x34,0xed,0x2e,
+  0x2f,0x8b,0xdf,0x44,0xce,0x91,0x08,0x7e,0x09,0x9a,0x4c,0x13,0xfc,0x9f,0xff,0xfc,
+  0xe7,0xd5,0x3e,0xfb,0xec,0xa3,0xba,0x77,0xef,0xbe,0x8e,0xc5,0xef,0x1a,0xe3,0x4f,
+  0x2a,0x52,0x66,0xff,0x43,0x5c,0xfc,0xb6,0x8a,0x80,0x08,0x7a,0x40,0x01,0xc8,0x59,
+  0x40,0x98,0xd6,0x7f,0xac,0x04,0x4c,0x9f,0x3e,0x9d,0xb3,0xd0,0x62,0x24,0x3d,0x00,
+  0x69,0x2e,0xfd,0xac,0xb9,0xfe,0xe6,0xb5,0x24,0x82,0x42,0x72,0xc4,0x25,0x22,0xdf,
+  0x85,0xb8,0xdf,0x45,0xb8,0x48,0x1d,0xf8,0xd8,0x42,0xcc,0x6b,0x0c,0xbb,0x5a,0x0b,
+  0xda,0x26,0x84,0xf2,0x1c,0xf3,0xf7,0x45,0xed,0xe7,0x39,0x86,0x2f,0xe7,0x5a,0x9a,
+  0xdc,0xcb,0xf1,0x6b,0xfc,0x3e,0xf9,0x79,0x5a,0x54,0xbf,0xe4,0xf0,0xef,0xb1,0xc7,
+  0x1e,0xd1,0xb9,0x92,0xe5,0x5c,0x82,0x3f,0x69,0xed,0x9b,0x25,0x9e,0x6d,0x65,0x9f,
+  0xb3,0x34,0xac,0x7c,0x40,0x01,0x28,0xd8,0xf2,0x37,0x03,0x00,0xa5,0x49,0x14,0x36,
+  0xb4,0x96,0x37,0x20,0x8e,0xa2,0x77,0x4d,0x02,0x64,0xcb,0x02,0xb0,0x59,0xf7,0xae,
+  0xef,0x44,0x00,0x88,0x5b,0x58,0x84,0xbf,0x0b,0x49,0x11,0x13,0xe1,0x12,0x97,0x83,
+  0x2d,0xd2,0x22,0xaf,0xc6,0x82,0x4e,0x53,0x00,0x1a,0x39,0x86,0x1f,0x0b,0x75,0x9b,
+  0x10,0x37,0xdf,0xd7,0x12,0x5f,0x21,0xe7,0xe6,0x33,0x9f,0xf9,0x8c,0xda,0x7d,0xf7,
+  0xdd,0x3b,0x04,0x7f,0x5a,0x1e,0x7f,0xac,0xbc,0x98,0xe9,0x7c,0x36,0x81,0x6f,0xa6,
+  0x01,0xa6,0xcd,0x2d,0x60,0x53,0x04,0x7c,0xa5,0x82,0x01,0x50,0x00,0x32,0x28,0x01,
+  0x69,0x5e,0x00,0x19,0xb3,0x85,0xe6,0x16,0xf8,0xc9,0x07,0x65,0x32,0x05,0x30,0x69,
+  0xc9,0x87,0xb8,0xfa,0xcd,0xc0,0xc0,0xe4,0xe7,0xf1,0x67,0x62,0x1d,0xa6,0x09,0x9f,
+  0x01,0x03,0x06,0xa8,0xc1,0x83,0x07,0x77,0xa4,0x8a,0x55,0x63,0xf1,0xd6,0xdb,0x43,
+  0x90,0x55,0x61,0xc8,0x4a,0xac,0x6c,0x8b,0x80,0x35,0xad,0xf5,0x58,0x98,0xe7,0x21,
+  0xd4,0x43,0x05,0xbf,0x14,0xef,0xd9,0x79,0xe7,0x9d,0xa3,0xe1,0x16,0x97,0xe0,0x4f,
+  0x0a,0x6e,0x53,0x51,0x72,0x59,0xf8,0xb6,0xf9,0x05,0x5c,0x73,0x0f,0xd8,0x84,0xbf,
+  0x4d,0xe8,0x33,0x2c,0x00,0x28,0x00,0x35,0x0a,0x08,0x33,0x22,0x3c,0x7e,0x20,0x49,
+  0x8b,0xdd,0x7d,0xd0,0x1a,0xb8,0x02,0x00,0x4d,0x97,0xbe,0xaf,0x78,0x8f,0xe9,0x01,
+  0x10,0x21,0x21,0xcd,0x26,0xa0,0xe4,0x01,0x2f,0x82,0x45,0x04,0xbf,0x58,0x93,0x26,
+  0x36,0x17,0x78,0x2d,0x63,0xe2,0xb5,0x5a,0xe4,0x79,0x58,0xfc,0xa6,0xab,0x3d,0xad,
+  0x95,0x21,0xd5,0x4d,0xce,0xcd,0xb1,0xc7,0x1e,0xab,0x3e,0xfa,0xd1,0x8f,0xae,0x25,
+  0xf8,0x5d,0x6e,0xfe,0xf8,0xbc,0xd9,0x8e,0xa1,0x29,0xec,0x5d,0x69,0x95,0xae,0x94,
+  0xcb,0x50,0x65,0x00,0x00,0x05,0x20,0x27,0xe1,0xef,0xca,0x02,0x68,0x74,0xd1,0x15,
+  0xc8,0xd7,0xd3,0x93,0x54,0x00,0x92,0x1e,0x80,0xf8,0xbd,0x39,0xf9,0x4f,0x52,0xc8,
+  0x27,0xd7,0x15,0xff,0x4e,0x14,0x44,0x69,0x36,0x21,0x26,0x31,0x00,0xeb,0xad,0xb7,
+  0x5e,0x24,0xfc,0x93,0xc2,0xc2,0x66,0x71,0xa7,0xbd,0xd6,0xea,0x21,0xb0,0x09,0x7c,
+  0x9f,0x80,0xb7,0x29,0x17,0xb1,0x50,0xf4,0x09,0x76,0x97,0x22,0x54,0x6f,0xe4,0x98,
+  0x4b,0xa4,0xbe,0xe4,0xe7,0x9b,0xaf,0xf1,0xfb,0xf8,0x6f,0x39,0x57,0x52,0x64,0xe9,
+  0xee,0xbb,0xef,0x6e,0xb8,0xb7,0xaa,0x9e,0x9e,0x9d,0x32,0x7a,0xeb,0xe8,0x7f,0xfd,
+  0xfb,0x3f,0x62,0xc4,0x88,0x48,0x29,0xfd,0xf9,0xcf,0x7f,0xde,0xfa,0x0a,0x80,0x6d,
+  0x26,0x37,0xd3,0xf5,0x1f,0x2b,0x00,0xd0,0xfc,0x24,0x05,0x98,0x2d,0xf8,0x2f,0x64,
+  0x82,0x20,0x53,0xf0,0x8b,0xa0,0x13,0xc1,0x6f,0x8b,0x1a,0x97,0x22,0x3f,0xeb,0xaf,
+  0xbf,0x7e,0x14,0xfd,0x6f,0xbb,0xd9,0xaa,0xc9,0x53,0xaf,0x75,0x79,0xd7,0x32,0x36,
+  0x61,0x1e,0xbb,0xe2,0xcb,0x2c,0xd4,0x6d,0x82,0xdd,0xfc,0x3c,0x8e,0xd6,0x0f,0xc1,
+  0x76,0x1e,0xeb,0x91,0x7e,0x68,0xfe,0x3e,0xa9,0x90,0xd6,0x52,0x32,0xda,0xa6,0xfc,
+  0x66,0x5d,0x1f,0xfd,0x6f,0xfd,0xfe,0x4b,0x6a,0xb2,0xb4,0x97,0x5e,0x7a,0xc9,0x1a,
+  0xb7,0xd2,0x76,0x1e,0x80,0x64,0x1a,0xa0,0x2b,0x25,0x08,0x9a,0xd7,0x03,0x10,0x0b,
+  0x32,0x9b,0xeb,0xdf,0x25,0xec,0xcd,0xe5,0xe3,0x71,0x7e,0x13,0xb1,0xf4,0x45,0xf0,
+  0xc7,0x35,0xe0,0xeb,0x65,0x89,0x98,0xeb,0x4f,0x0a,0xf5,0xd8,0x62,0x4f,0x0a,0xf5,
+  0xf8,0x7d,0x99,0x84,0xba,0x08,0xeb,0xd8,0x12,0x37,0x05,0x7a,0xdc,0xe4,0x3b,0x69,
+  0xa1,0x9e,0x8d,0xd8,0x85,0x1f,0xda,0xc7,0x7a,0x5b,0x9c,0x8d,0xf0,0xec,0xd0,0x7f,
+  0xfa,0x1f,0xdf,0x1b,0x52,0xef,0x42,0x26,0x01,0x7b,0xf7,0xdd,0x77,0x9d,0xfb,0xd2,
+  0x68,0x65,0xa0,0xae,0x31,0x00,0xa6,0x85,0x88,0x02,0xd0,0x1a,0xc2,0x3f,0x79,0xf1,
+  0x26,0x67,0x02,0x4c,0x9e,0x7f,0x9f,0x47,0x20,0x4e,0xff,0x32,0xc7,0xac,0x65,0xcc,
+  0x56,0x84,0xbe,0xb8,0xfa,0xe3,0xc2,0x30,0xb5,0xa6,0xdd,0xd9,0x6e,0xec,0x38,0x28,
+  0x4e,0x6e,0x5c,0xd9,0x8f,0x38,0x3e,0x25,0x29,0xd4,0x63,0xc1,0x5e,0x86,0xeb,0x36,
+  0x16,0xea,0xa6,0x00,0x77,0x09,0xf5,0xd0,0x07,0x62,0x5a,0xdf,0x6c,0x16,0x4e,0x16,
+  0x05,0xc7,0x36,0x47,0x43,0x96,0x07,0xac,0x69,0xc1,0x85,0xac,0x2f,0x6d,0x79,0x57,
+  0xdd,0x7f,0xfa,0x4f,0xff,0xab,0xed,0x7f,0x5c,0xf3,0x42,0xbc,0x93,0x62,0xb0,0x98,
+  0xbf,0x33,0x97,0x6f,0xf4,0xd4,0xd3,0x85,0xa7,0x01,0x9a,0x42,0xc0,0x6c,0xd0,0xdc,
+  0x98,0x17,0x6d,0x2c,0xc0,0x5d,0xd1,0xfc,0xb6,0x80,0x3f,0x11,0xb4,0xa6,0xb5,0x2c,
+  0xc2,0x6b,0xe8,0xd0,0xa1,0x91,0xfb,0xcc,0x56,0xcf,0xdd,0xdc,0xb6,0x2b,0xa5,0x2d,
+  0x29,0xb8,0x6d,0xef,0xcb,0x2a,0xd4,0xcd,0xd7,0xb8,0x49,0x90,0xa3,0x58,0xf0,0xb6,
+  0x60,0x47,0x9f,0xfb,0xbd,0x56,0x8b,0xad,0x56,0x0b,0xc9,0x7c,0x20,0xd7,0x2a,0x20,
+  0xb2,0x3e,0xb0,0xe9,0x3f,0xfd,0x2f,0xb2,0xff,0x22,0xf8,0xc5,0x3b,0x39,0x70,0xe0,
+  0xc0,0x75,0xac,0x7c,0x33,0x05,0x3a,0x6f,0xef,0x48,0xa9,0x87,0x00,0x4c,0x4f,0x80,
+  0x39,0x55,0x2c,0xb4,0x86,0xfb,0x3f,0x16,0xe6,0xa6,0x07,0xc0,0x2c,0xe8,0x13,0x5f,
+  0x07,0xb1,0x00,0x4e,0x5e,0x07,0xa2,0x39,0x0f,0x1b,0x36,0x2c,0xba,0x89,0x6c,0x37,
+  0x5e,0xec,0x7e,0x8f,0xad,0xf3,0xa4,0x20,0x37,0x5b,0x99,0xdc,0xef,0x49,0x6b,0x3c,
+  0x29,0xd8,0x63,0x81,0x2e,0x7f,0xc7,0x55,0x08,0x43,0x3c,0x1b,0x21,0xf1,0x33,0xb5,
+  0x8e,0xa9,0xda,0x2c,0x26,0x73,0x0c,0xd5,0xb7,0xbe,0xe4,0x39,0xf0,0x59,0x60,0xbe,
+  0xf5,0xf9,0x04,0x04,0xfd,0xa7,0xff,0x8d,0xe8,0xbf,0x54,0x21,0x95,0xfb,0x37,0xb6,
+  0xf8,0x93,0x9e,0x4e,0xb3,0x48,0x55,0xfc,0x7b,0xb3,0xee,0x44,0xc8,0x74,0xd4,0x4d,
+  0x39,0x04,0x60,0x1b,0x06,0x60,0x08,0xa0,0x35,0xbd,0x00,0xc9,0xa9,0x80,0xd3,0xa6,
+  0xe9,0x8d,0xdd,0xec,0xc9,0xf3,0x2f,0x05,0x7b,0xc4,0xda,0x97,0x1b,0x49,0xbe,0x97,
+  0x71,0x33,0x53,0xa0,0xbb,0xb2,0x01,0x1a,0x25,0xd4,0xa5,0x89,0x00,0x4f,0x0a,0x77,
+  0xb3,0x89,0x50,0x0f,0x7d,0x20,0xc5,0xc7,0x2e,0x4f,0x8b,0x2b,0xcf,0x31,0xdb,0xbc,
+  0x2b,0x1e,0x96,0x6d,0x7d,0xf4,0x9f,0xfe,0x67,0x59,0xbf,0x8c,0xef,0x0b,0xb1,0xc5,
+  0xef,0xf2,0x7e,0xdb,0x94,0x0a,0x57,0x8d,0x8b,0x7a,0x2b,0x01,0x85,0x65,0x01,0x98,
+  0x82,0xdf,0xa6,0x08,0xa0,0x00,0xb4,0x9e,0x17,0x20,0xad,0x0e,0x40,0x5a,0x80,0xdf,
+  0xc2,0x85,0x0b,0xa3,0xd6,0x48,0xa1,0x2e,0xc2,0xdc,0x14,0xe0,0xb6,0xcf,0x92,0x42,
+  0x3d,0xd4,0xfd,0x5e,0xc4,0x03,0x29,0xab,0x45,0x54,0xab,0x8b,0x33,0x0f,0x45,0x91,
+  0xfe,0xd3,0xff,0x66,0xef,0x7f,0x3c,0x64,0x29,0x71,0x49,0xe6,0xba,0xcc,0xe7,0xa2,
+  0x29,0xc8,0x45,0xc9,0x4f,0xd6,0xba,0x48,0x2a,0x02,0x2d,0x1b,0x03,0xe0,0xf2,0x02,
+  0x30,0x17,0x77,0x6b,0xb1,0x74,0xe9,0xd2,0x8e,0xb9,0xdd,0x4d,0xa5,0x4f,0x4a,0xf7,
+  0xd6,0xbb,0x28,0x4d,0x52,0xa8,0x27,0x05,0xb9,0x29,0xd4,0xe5,0xef,0xa4,0xfb,0xdd,
+  0xf7,0x40,0x08,0x75,0x61,0x16,0xfd,0x40,0xf2,0xb9,0x64,0xab,0xd9,0x7e,0x96,0xf5,
+  0xd1,0x7f,0xfa,0xdf,0x4e,0xfd,0x97,0xe7,0x97,0x3c,0xe3,0x24,0x28,0x59,0xe2,0x92,
+  0x7c,0xc1,0x90,0xb6,0x00,0x3f,0x59,0x47,0x5c,0x8c,0x2a,0x7e,0x46,0xd9,0x02,0x03,
+  0xeb,0xe5,0x05,0xa8,0x6b,0x16,0x80,0x4d,0x11,0x80,0xe6,0xb7,0xfe,0xa5,0x9c,0xf3,
+  0x94,0x29,0x53,0x22,0xb7,0x7d,0x5c,0x7b,0x3f,0x3e,0xb7,0x22,0xf8,0xf3,0x1c,0x8f,
+  0x8f,0x85,0xba,0x29,0xd8,0x6d,0xaf,0xd5,0x5a,0xea,0x45,0x51,0x6f,0x8b,0xab,0x6c,
+  0xd0,0x7f,0xfa,0xdf,0x8c,0xfd,0x97,0xfd,0x93,0x79,0x47,0xc4,0xe2,0x97,0x52,0xe3,
+  0x2e,0x81,0x6f,0xeb,0x53,0x72,0x5a,0x6a,0x79,0x4d,0xce,0x93,0x62,0x3e,0xd7,0x5a,
+  0xc2,0x03,0x90,0xa6,0x15,0xe1,0x01,0x68,0x2d,0xc1,0x2f,0xd6,0xbe,0x4c,0xe7,0x3c,
+  0x67,0xce,0x9c,0x75,0xbe,0x8b,0xdd,0x64,0x21,0x82,0x35,0x2e,0x3e,0x63,0x4b,0x6b,
+  0x13,0x8d,0x5b,0xd6,0x13,0x97,0xf9,0xcd,0x22,0xd4,0x6d,0x43,0x0d,0x00,0x00,0xa1,
+  0x88,0xe0,0x97,0xd8,0xa4,0xe1,0xc3,0x87,0x07,0x3d,0x13,0x5d,0x55,0x46,0x63,0x25,
+  0x20,0xf6,0x82,0xc6,0x1e,0x47,0xd7,0xd4,0xd5,0x4d,0x1d,0x03,0x90,0xc5,0x0b,0x00,
+  0xcd,0x85,0x08,0x74,0x11,0xf8,0x33,0x67,0xce,0x8c,0xac,0x7b,0x9b,0xd0,0x8d,0x3f,
+  0x77,0x09,0x75,0xf3,0xbd,0x4d,0xa8,0x4b,0x4a,0x8d,0x78,0x16,0x92,0xe3,0x6c,0x66,
+  0x1a,0x61,0xbd,0x27,0xf5,0x09,0x7d,0x00,0xd4,0xab,0x20,0x11,0xfd,0xa7,0xff,0xf4,
+  0xbf,0x98,0xfe,0x4b,0x80,0x9f,0x4c,0x21,0x3e,0x72,0xe4,0xc8,0x54,0x41,0x9f,0x26,
+  0xf4,0x6d,0x1e,0x8e,0xd8,0x28,0xf1,0xcd,0x0f,0xd2,0xb4,0x1e,0x80,0x34,0x8f,0x00,
+  0xc2,0xbf,0x79,0x11,0x2b,0x7c,0xf6,0xec,0xd9,0x51,0x75,0x2b,0xb9,0x48,0x45,0x70,
+  0x8b,0xbb,0x5f,0x52,0x5f,0x92,0xa9,0x6d,0x71,0x8e,0x7a,0x48,0x9e,0xba,0xcd,0x25,
+  0x28,0x37,0x9e,0x6c,0x43,0xc6,0xc9,0x64,0x5d,0xa6,0x07,0x21,0x6b,0xe9,0xd1,0x5a,
+  0x4a,0x95,0xe6,0xe5,0x01,0xcb,0x73,0x7b,0xf4,0x9f,0xfe,0xd3,0xff,0xe2,0xfa,0x2f,
+  0xc6,0x8b,0xcc,0x24,0x6a,0x13,0xfc,0x69,0xbf,0xf5,0xd5,0x27,0x48,0xc6,0x00,0x24,
+  0xd3,0x00,0x6d,0x05,0xd2,0x5a,0x2e,0x0d,0x30,0x54,0x39,0x80,0xf2,0x22,0x02,0x59,
+  0xf2,0xf3,0xa5,0x25,0x49,0x73,0x8d,0xf9,0xc6,0xfc,0x92,0xaf,0x32,0x64,0x20,0x59,
+  0x00,0x72,0x43,0xb8,0xdc,0xfc,0x8c,0xa1,0xd2,0x7f,0xfa,0x4f,0xff,0x8b,0xe8,0x7f,
+  0x5c,0xd6,0x7a,0xc3,0x0d,0x37,0xb4,0x0a,0x72,0x57,0x8d,0x03,0x9b,0xa5,0x6f,0xfb,
+  0x2c,0x19,0x48,0x98,0x4c,0x03,0x94,0xe7,0x5d,0x1c,0x08,0x68,0x2e,0xdb,0xb4,0x41,
+  0x80,0x36,0x0b,0x1f,0xcb,0xbf,0xb9,0x49,0xe6,0xac,0x66,0x55,0xf0,0x5c,0xaf,0x71,
+  0x09,0xde,0x38,0x43,0x20,0x9e,0x9a,0xd5,0x76,0x83,0x95,0xe1,0x81,0x51,0xf4,0xfa,
+  0x5c,0x56,0x05,0xfd,0xa7,0xff,0xf4,0xbf,0x98,0xfd,0x8d,0x4b,0x7e,0x8b,0x61,0x63,
+  0x7b,0xf6,0xb8,0x66,0xed,0x0c,0x11,0xce,0x36,0x2f,0x40,0xf2,0x39,0x17,0xb7,0x58,
+  0x09,0xc8,0xb2,0xee,0xa6,0xf0,0x00,0xa4,0xb9,0x4b,0x50,0x06,0xda,0x8f,0xe4,0x78,
+  0x97,0x5c,0xf4,0x22,0xf8,0xcd,0xe2,0x3e,0xc9,0x1b,0x34,0xd6,0x8c,0x5d,0xca,0x47,
+  0xc8,0x18,0x9f,0xed,0x7d,0x2d,0x63,0x86,0x69,0xeb,0xab,0x66,0xcc,0xd1,0x65,0x51,
+  0xd0,0x7f,0xfa,0x4f,0xff,0x8b,0xeb,0xbf,0x2c,0xb7,0x78,0xf1,0xe2,0x28,0xa5,0x2f,
+  0x1e,0xae,0x34,0xc7,0xf3,0x5d,0x0a,0x88,0x69,0xd9,0x9b,0xcb,0xb8,0x9e,0x67,0x71,
+  0x10,0xa0,0x78,0x53,0xa5,0x25,0xa7,0x47,0x6f,0x94,0x3c,0xac,0x5b,0x10,0x20,0xb4,
+  0x2e,0x59,0x83,0x72,0xc4,0xdd,0x26,0xc2,0xdf,0xa6,0x65,0x9b,0xcb,0x27,0xf3,0x64,
+  0x6b,0x2d,0xed,0xe9,0xb3,0x28,0x7c,0x0f,0x1c,0xdf,0xfa,0xcc,0xdf,0xfb,0xf6,0x3f,
+  0x64,0xfd,0xf4,0x9f,0xfe,0xd3,0xff,0x7c,0xfb,0x2f,0xc1,0xc5,0x92,0x55,0x14,0x57,
+  0xf0,0xb3,0x3d,0x87,0x5c,0x55,0xf9,0xd2,0x94,0x01,0x73,0x9a,0x61,0xdb,0xf2,0xe2,
+  0x71,0x88,0x5b,0x5c,0x4b,0xc0,0xd6,0xea,0x15,0x14,0xd8,0x15,0xf1,0x05,0xb5,0x0a,
+  0xff,0x2c,0xb5,0xbc,0x45,0xf0,0x27,0x0b,0xe9,0x84,0x7a,0x0c,0x42,0x2d,0x9a,0x10,
+  0x6b,0x23,0xd4,0x22,0xc9,0xe2,0xd1,0xc8,0x63,0xff,0xe8,0x3f,0xfd,0xa7,0xff,0xc5,
+  0xad,0x5f,0x2c,0x7e,0x09,0xf0,0x1b,0x31,0x62,0x84,0xd7,0x8b,0x60,0x13,0xf0,0xb6,
+  0xdf,0x84,0xce,0x8c,0x98,0xac,0x03,0x20,0xcd,0x56,0x2d,0xb5,0x11,0xa0,0x00,0x40,
+  0xcd,0x6e,0x7d,0x9f,0x86,0x1e,0xcf,0xca,0x17,0x47,0xbc,0x9a,0xb3,0xfb,0x99,0xeb,
+  0x2a,0x4b,0xed,0xf2,0x46,0x1d,0x4b,0xfa,0x4f,0xff,0xe9,0x7f,0x7e,0xfd,0x97,0x5c,
+  0x7e,0x79,0xe6,0xc8,0xec,0xa2,0xa6,0xd1,0x62,0xfe,0xd6,0x25,0xdc,0xcd,0x67,0x5d,
+  0x5a,0xaa,0x9f,0x4d,0xf0,0xc7,0xdb,0x8b,0x85,0x7f,0xb2,0x35,0x52,0x11,0x40,0x01,
+  0x80,0x9a,0x3d,0x00,0xe6,0xfb,0xe4,0x67,0xc9,0x62,0x40,0xa6,0x6b,0xd1,0xf6,0x80,
+  0xf2,0x69,0xfc,0x3e,0x17,0x5f,0xd2,0x65,0xe8,0x73,0x49,0x66,0x75,0x79,0x16,0xe5,
+  0x3d,0xa1,0xff,0xf4,0x9f,0xfe,0xe7,0xdf,0xff,0x78,0x02,0x31,0x29,0xe4,0x13,0x62,
+  0xf1,0xa7,0x79,0x02,0x6c,0x16,0x7e,0x48,0x5a,0xa1,0xcd,0x18,0x2a,0x53,0x41,0x3c,
+  0x14,0x00,0x28,0x04,0xb9,0xd0,0x45,0xdb,0x4d,0x1b,0xe3,0x0f,0x19,0x33,0xcc,0xf2,
+  0x40,0xa8,0xc6,0xe2,0xc9,0x73,0x8c,0x2d,0xab,0x05,0x43,0xff,0xe9,0x3f,0xfd,0xcf,
+  0xbf,0xff,0x22,0xf8,0xe3,0x0a,0x7e,0xae,0xe7,0x4f,0x9a,0x80,0x77,0xd5,0xf5,0x0f,
+  0x71,0xf1,0xbb,0xde,0x27,0xff,0x4e,0x2a,0x01,0xf1,0x67,0x21,0x13,0x09,0xa1,0x00,
+  0x40,0x29,0x3d,0x00,0x66,0x90,0x8c,0x69,0xf1,0x67,0x19,0x73,0xcc,0xd3,0xe2,0x71,
+  0x3d,0x3c,0x8a,0xbc,0xb1,0xb2,0x6e,0x8f,0xfe,0xd3,0x7f,0xfa,0x9f,0x4f,0xff,0x65,
+  0x39,0x29,0x22,0x26,0xc1,0x7d,0x32,0xd6,0x1f,0x52,0x99,0xaf,0x16,0xeb,0x3f,0x4d,
+  0xe0,0x9b,0x25,0x80,0x93,0x53,0xa2,0xbb,0xac,0x7f,0x73,0x78,0x01,0x0f,0x00,0x94,
+  0x16,0x29,0xd6,0xd3,0xa7,0x4f,0x1f,0xeb,0x0d,0xec,0x1a,0xe3,0xaf,0x37,0x14,0x4e,
+  0xa1,0xff,0xf4,0xbf,0x3d,0xfa,0x3f,0x77,0xee,0x5c,0xd5,0xbb,0x77,0xef,0x75,0x4a,
+  0x87,0x9b,0xc7,0xc1,0xf5,0x59,0x68,0x30,0x5f,0x9a,0xa2,0x63,0x4b,0x23,0x74,0x6d,
+  0xcb,0x65,0xfd,0x13,0x03,0x00,0xa5,0x46,0x72,0x66,0xa5,0x04,0xb0,0x94,0xe9,0x8d,
+  0xc7,0xb4,0xcc,0x22,0x16,0x79,0xd5,0xea,0xce,0xe3,0xfb,0x34,0x97,0x62,0xad,0x69,
+  0x53,0x79,0xa7,0x65,0xd1,0x7f,0xfa,0x4f,0xff,0xb3,0xf5,0x4f,0x26,0x24,0x93,0x3e,
+  0x4a,0x5a,0x9f,0x6f,0x3c,0xdd,0x66,0xe1,0xfb,0xac,0xfe,0x2c,0xfb,0x1e,0x32,0x4c,
+  0xe0,0xb3,0xfe,0xeb,0x6e,0xc8,0x21,0xd2,0x20,0x0b,0x32,0xbe,0x26,0xda,0x36,0x00,
+  0x40,0xa3,0x89,0x4b,0x91,0xbb,0x02,0x0a,0x93,0x82,0xd6,0x15,0xdd,0xef,0x12,0xc0,
+  0x21,0x63,0xfa,0x69,0x93,0x02,0xd9,0xb6,0x5f,0x36,0x3a,0x73,0x09,0x01,0x00,0x40,
+  0xb3,0x62,0x0b,0xde,0xb3,0x09,0x5e,0xdf,0xb8,0xbe,0xb9,0x2e,0x9f,0x77,0xc0,0x15,
+  0x34,0x68,0x5a,0xf8,0xae,0xed,0xa3,0x00,0x00,0x00,0x00,0xd4,0x28,0xfc,0xd3,0x8a,
+  0x01,0xa5,0x0d,0x61,0x98,0xcb,0x25,0xad,0x78,0xdf,0x04,0x3f,0x69,0xef,0x43,0xb6,
+  0x8f,0x02,0x00,0x00,0x00,0x90,0x93,0x22,0x10,0x62,0xe9,0xa7,0xd5,0xed,0x37,0xbd,
+  0x00,0xa1,0xc3,0x06,0x65,0x18,0xcf,0x47,0x01,0x00,0x00,0x00,0x70,0x58,0xfa,0x69,
+  0x15,0xfb,0xd2,0xfe,0xb6,0xb9,0xf1,0xd3,0x52,0x18,0x51,0x00,0x00,0x00,0x00,0x1a,
+  0xe4,0x09,0x30,0x3f,0xb3,0x15,0xe5,0xb1,0xa5,0xe8,0xd9,0x52,0xf9,0xd2,0x3c,0x05,
+  0xc9,0xed,0xf8,0xb6,0x8f,0x02,0x00,0x00,0x00,0x50,0xb0,0x22,0xe0,0x4a,0x7f,0x0c,
+  0x15,0xc4,0xa1,0xde,0x82,0x50,0x4f,0x01,0x59,0x00,0x00,0x00,0x00,0x39,0x5b,0xfc,
+  0x36,0xeb,0xdd,0x54,0x06,0xcc,0xc9,0x7e,0x4c,0x2f,0x80,0x4d,0xc0,0xa7,0xd5,0x01,
+  0x48,0xfb,0xcc,0xdc,0x46,0xa3,0x6b,0xfe,0xa3,0x00,0x00,0x00,0x40,0x4b,0x61,0x96,
+  0xdd,0x4d,0x0a,0x63,0xb3,0x70,0x50,0x48,0x3a,0x60,0x35,0x11,0xfc,0xb6,0xe8,0x7f,
+  0x5b,0x49,0x60,0x3c,0x00,0x00,0x00,0x00,0x39,0x7a,0x00,0xcc,0x48,0xfd,0x34,0x4b,
+  0xbc,0x1a,0xcb,0xde,0xf4,0x34,0x98,0xca,0x84,0x2b,0x7b,0x20,0xb9,0x7d,0x3c,0x00,
+  0x00,0x00,0x00,0x05,0x79,0x02,0x6c,0x02,0xd9,0x25,0xf4,0x43,0x2d,0x7b,0x5b,0x1c,
+  0x41,0xc8,0xac,0x80,0xe6,0x90,0x43,0x9a,0xd2,0x81,0x02,0x00,0x00,0x00,0x50,0x85,
+  0xe0,0x37,0x05,0xad,0xab,0x86,0x7f,0x56,0x0b,0xdc,0xcc,0x18,0xb0,0x09,0xf8,0x90,
+  0xed,0x93,0x05,0x00,0x00,0x00,0x50,0x20,0xb5,0x14,0xe3,0xf1,0x15,0xf5,0x31,0x2d,
+  0x7f,0x9f,0x82,0xe1,0xaa,0x23,0x50,0x36,0xda,0x76,0x32,0xa0,0x85,0x0b,0x17,0xaa,
+  0x19,0x33,0x66,0x70,0xd7,0x00,0x00,0x14,0x44,0x8f,0x1e,0x3d,0xd4,0xa8,0x51,0xa3,
+  0x0a,0x17,0xfa,0xae,0xb2,0xbc,0xe6,0xb2,0x69,0x13,0xfc,0x98,0x16,0x7e,0xb2,0x1c,
+  0xb0,0x6b,0x08,0x20,0x74,0xfb,0x65,0xad,0x0e,0xd8,0x16,0x0a,0x80,0xcc,0x5d,0x3f,
+  0x70,0xe0,0xc0,0xb5,0x3e,0x93,0x79,0xa3,0x37,0xde,0x78,0x63,0xe7,0x6f,0x1a,0x3d,
+  0x97,0x76,0xad,0x53,0x75,0xe6,0xbd,0x7d,0xfa,0x4f,0xff,0xe9,0x3f,0xfd,0xaf,0x66,
+  0x7b,0x32,0x83,0xe8,0xbc,0x79,0xf3,0x0a,0xdd,0xcf,0x10,0xeb,0xdf,0x95,0x31,0xe0,
+  0x9a,0xd1,0x2f,0x6d,0x1e,0x80,0x6a,0xb6,0x8f,0x02,0xd0,0x20,0x7a,0xf7,0xee,0x5d,
+  0x95,0x0b,0x26,0xed,0x37,0xbe,0x1b,0x34,0xaf,0x8b,0xdb,0xf7,0x5d,0x23,0xb7,0x4f,
+  0xff,0xe9,0x3f,0xfd,0xa7,0xff,0x3e,0x96,0x2d,0x5b,0x56,0xb8,0x07,0x20,0xd4,0xca,
+  0x77,0x29,0x34,0xe6,0xe4,0x3f,0xa1,0xde,0x86,0x90,0x80,0x40,0x14,0x80,0x06,0x5b,
+  0xff,0x3d,0x7b,0xf6,0xcc,0xac,0xe1,0x86,0x68,0xe0,0x9d,0x3b,0x77,0xce,0xb4,0x7c,
+  0xd6,0xf5,0xa7,0x5d,0x90,0xb5,0x6a,0xe8,0xf4,0x9f,0xfe,0xd3,0x7f,0xfa,0x5f,0x74,
+  0xff,0xe5,0xb3,0x22,0x15,0x80,0x34,0xa5,0x25,0x2d,0x55,0xcf,0xd5,0x7f,0xdb,0x6f,
+  0xcd,0xdf,0x64,0x39,0xc6,0x65,0x57,0x04,0x5a,0x5e,0x01,0xe8,0xd3,0xa7,0x8f,0xf3,
+  0xe0,0xdb,0x4e,0x78,0xda,0xb4,0x92,0x3e,0x0d,0x3c,0xcf,0xe5,0xe3,0x9b,0x4b,0x5e,
+  0x5d,0x37,0x78,0xf2,0xf7,0x21,0xcb,0xd3,0x7f,0xfa,0x4f,0xff,0xe9,0x7f,0x3d,0xfb,
+  0xbf,0x64,0xc9,0x92,0xc2,0x5d,0xe2,0x3e,0x45,0x26,0x74,0x1c,0xdf,0xe5,0x59,0xc8,
+  0x22,0xf8,0x43,0xb6,0x8f,0x02,0x50,0x27,0xba,0x74,0xe9,0xa2,0x7a,0xf5,0xea,0xd5,
+  0xb4,0xfb,0x9f,0xbc,0x60,0x44,0x8b,0x5e,0xb4,0x68,0x51,0x74,0x43,0x2d,0x5f,0xbe,
+  0x5c,0xad,0x5e,0xbd,0xba,0xe1,0x63,0x4d,0xf2,0xb0,0xe9,0xde,0xbd,0xbb,0xea,0xdb,
+  0xb7,0xaf,0xea,0xdf,0xbf,0x7f,0x74,0xbc,0x8b,0xd6,0xe6,0x43,0x1e,0x4a,0xf5,0x72,
+  0x91,0x36,0xc2,0x9a,0xa1,0xff,0xf4,0xbf,0x99,0xfa,0x2f,0xcf,0xab,0x7a,0xe1,0x9a,
+  0xb0,0xc7,0x14,0xc2,0xbe,0xc0,0xbd,0x10,0x05,0xc1,0xa7,0x88,0xb8,0xb6,0x8f,0x02,
+  0x50,0x47,0x44,0x30,0x55,0xeb,0x92,0xab,0xd5,0x65,0x97,0xd7,0xf2,0x0b,0x16,0x2c,
+  0x50,0x73,0xe7,0xce,0xb5,0xba,0xd1,0x5c,0xa5,0x27,0xf3,0xd8,0x7e,0xc8,0xfa,0x62,
+  0xf7,0x9e,0xb4,0x0f,0x3e,0xf8,0x40,0x0d,0x1b,0x36,0xac,0x43,0xe1,0xca,0xfb,0x78,
+  0x55,0xa3,0x79,0x17,0xdd,0xff,0x7a,0x9c,0x7f,0xfa,0x4f,0xff,0x9b,0xb5,0xff,0xf2,
+  0x5c,0x58,0xb9,0x72,0x65,0xdd,0xac,0xff,0xb4,0x59,0xfe,0x7c,0x0a,0x43,0x16,0x81,
+  0xef,0x1a,0x3a,0xc8,0xba,0x7d,0x14,0x80,0x82,0xad,0x7f,0x09,0xfe,0xcb,0xe2,0x62,
+  0x4b,0x8e,0x69,0xf9,0xbe,0x77,0xd5,0x99,0x4e,0x5e,0x04,0xbe,0x31,0xb2,0x34,0x8d,
+  0x7d,0xe9,0xd2,0xa5,0x6a,0xe6,0xcc,0x99,0x6b,0x34,0x68,0xad,0x41,0x76,0x1e,0xa0,
+  0xbf,0x13,0x85,0xa6,0x97,0x6e,0x5d,0xa3,0xcf,0x72,0xbc,0x8d,0xd6,0xac,0x2f,0xbe,
+  0x50,0x3b,0x25,0x3e,0x73,0x2d,0x2f,0x1e,0x88,0x65,0xda,0x13,0x31,0x4f,0x55,0x74,
+  0x5b,0xb5,0x6a,0x95,0x9a,0x3e,0x7d,0x7a,0x94,0xf2,0x23,0xa9,0x3f,0xb5,0xf6,0x3f,
+  0xeb,0x03,0xc8,0x77,0xfc,0x9b,0xed,0xfc,0xd3,0x7f,0xfa,0xdf,0xec,0xfd,0x5f,0xbc,
+  0x78,0x71,0x5d,0xad,0xff,0xb4,0x4a,0x7f,0x59,0xc7,0xef,0x43,0xbc,0x0c,0x59,0xb7,
+  0x8f,0x02,0x50,0x47,0xfa,0xf5,0xeb,0xd7,0x71,0xf1,0x56,0xeb,0x32,0x2b,0x72,0x8c,
+  0xcc,0x76,0xe3,0xc4,0x17,0x91,0xa4,0xcc,0xbc,0xf7,0xde,0x7b,0x4a,0xae,0xa1,0x2e,
+  0x5d,0xd7,0x53,0x9d,0xbb,0x0c,0xd1,0xa2,0xb8,0x6b,0x87,0x80,0x36,0xc5,0xf5,0x3a,
+  0xdb,0x36,0xc4,0xb7,0x7f,0x79,0x7d,0x63,0xeb,0x7f,0x9d,0xd6,0xd4,0x85,0x8a,0xdf,
+  0x57,0x1c,0xbf,0xd0,0xea,0x88,0xfe,0xa6,0xb3,0xfe,0xd7,0x55,0x2b,0x5a,0x7d,0xb4,
+  0x12,0x30,0x40,0xad,0x5a,0x39,0x35,0xda,0xff,0xd9,0xb3,0x67,0xab,0x0d,0x37,0xdc,
+  0xb0,0xa6,0xfe,0xdb,0x1e,0x80,0x59,0x6f,0xa2,0x3c,0x5c,0xa6,0x8d,0x3a,0xff,0xf4,
+  0x9f,0xfe,0x37,0x7b,0xff,0xeb,0x15,0xfc,0x97,0xe6,0xda,0x4f,0x9b,0x07,0x20,0xab,
+  0x20,0x77,0x79,0x40,0xab,0xd9,0x3e,0x0a,0x40,0xc1,0x88,0xe0,0x4f,0x0b,0xfe,0x2b,
+  0x83,0xcb,0xce,0x75,0x31,0x8b,0xd5,0x3f,0x67,0xce,0x1c,0xdd,0x87,0x1e,0xaa,0x5b,
+  0x8f,0xd1,0xfa,0xb5,0xa7,0xea,0xd6,0xbd,0x97,0x1a,0x32,0x64,0x13,0xd5,0xb7,0xff,
+  0x50,0x6d,0x5d,0xf7,0xd5,0x42,0xb7,0x5b,0x6d,0xdb,0xce,0x6a,0xf0,0x1b,0xac,0x5a,
+  0xb5,0x42,0x2d,0x59,0x3c,0x57,0xbd,0x37,0xe3,0x15,0xb5,0x68,0xe1,0x2c,0xd5,0x45,
+  0x89,0x77,0x42,0xbb,0xfb,0x56,0xbc,0x17,0x69,0xfd,0xe2,0x0d,0x90,0xec,0x8b,0x6a,
+  0xfa,0x9f,0xe5,0x01,0x96,0x87,0xc5,0x50,0xb6,0xf3,0x4f,0xff,0xe9,0x7f,0x2b,0xf4,
+  0x5f,0xe2,0x95,0xea,0x29,0xf4,0x7c,0x81,0x7c,0x21,0x9f,0xdb,0x3c,0x30,0xbe,0xac,
+  0x82,0x6a,0xbc,0x05,0x28,0x00,0x75,0xb0,0xfe,0xcd,0x13,0x54,0x6f,0x97,0x5d,0x9a,
+  0xa6,0xea,0xba,0xa1,0x44,0xf8,0xcb,0x78,0x7f,0x97,0xae,0xfd,0x54,0xf7,0x9e,0x1b,
+  0xe9,0xfd,0xe9,0xa6,0x86,0x0d,0xdf,0x5a,0xad,0x3f,0x74,0x33,0xfd,0x7d,0x9e,0x55,
+  0x9b,0x3d,0x3e,0x02,0x8f,0x82,0xd0,0xa5,0x6b,0x17,0xd5,0xbd,0xc7,0x70,0xd5,0x7f,
+  0xe0,0x30,0x35,0x79,0xd2,0x23,0x6a,0xc1,0xfc,0xf7,0x54,0xd7,0xee,0x43,0xb4,0x17,
+  0xe0,0xfd,0xa8,0x3f,0x12,0xa4,0x68,0x2a,0x00,0x45,0x8f,0xb1,0x66,0x3d,0xfe,0x65,
+  0x3c,0xff,0xf4,0x9f,0xfe,0xb7,0x4a,0xff,0xeb,0xe5,0xfe,0xb7,0xf5,0x3b,0x4b,0xb4,
+  0x7e,0x9a,0xa5,0xef,0x2b,0xfe,0x13,0xb2,0x7d,0x62,0x00,0xea,0x8c,0x1c,0x70,0x57,
+  0xf0,0x5f,0xd6,0xb4,0x9b,0xac,0x63,0x62,0x69,0x2e,0x3d,0xdb,0xf6,0x93,0x7f,0x8b,
+  0xdb,0x5f,0x2c,0xff,0x2e,0x5d,0xfb,0xaa,0xee,0xbd,0xc6,0xa8,0x6e,0xdd,0x7a,0xab,
+  0x4d,0x37,0xdb,0x53,0xf5,0xee,0x33,0xd8,0x2b,0x91,0x65,0x35,0xb2,0x1b,0xf1,0xea,
+  0xe2,0xf7,0xa1,0xd7,0x9d,0xef,0xf7,0x69,0xea,0xc2,0x88,0x91,0xdb,0xaa,0x89,0xaf,
+  0xce,0xd4,0xef,0xba,0xeb,0x0f,0xbb,0xea,0xcf,0x57,0xae,0x75,0xbc,0x42,0xfb,0x1f,
+  0x32,0x06,0x9a,0xf6,0x1a,0x62,0x2d,0x95,0xf9,0xfc,0xd3,0x7f,0xfa,0xdf,0x2a,0xfd,
+  0x97,0xf8,0xa5,0xa2,0x83,0xff,0xf2,0xb4,0xb4,0x6d,0xe7,0xc9,0x54,0x02,0x5c,0xdb,
+  0xb2,0x0d,0xd3,0x34,0x53,0x55,0xc0,0x96,0x53,0x00,0xc4,0xf5,0x5f,0x6d,0x3a,0x9a,
+  0x6f,0x8c,0x2e,0xcf,0x1b,0x2e,0xb9,0x3e,0x19,0x2b,0x7b,0xff,0xfd,0xf7,0x75,0xa0,
+  0x5f,0x37,0xd5,0xa3,0xf7,0x87,0xc2,0x7f,0xf3,0x8f,0xec,0xaf,0x23,0xea,0x07,0x04,
+  0x5a,0x0f,0x1e,0x01,0x5e,0x6b,0xd1,0x90,0x14,0x05,0xa0,0x4f,0xbf,0xc1,0x3a,0x46,
+  0xa1,0xf3,0x5a,0xdb,0x8c,0xad,0xff,0x3c,0xc7,0x48,0xeb,0xe1,0x32,0x6d,0xd4,0xf9,
+  0xa7,0xff,0xf4,0xbf,0x95,0xfa,0x2f,0x99,0x4b,0x65,0xc3,0x56,0xe3,0x3f,0xcd,0xb3,
+  0x92,0x66,0xc1,0x9b,0xb3,0x00,0x86,0x0e,0x3b,0x50,0x07,0xa0,0x0e,0x48,0x3e,0x7a,
+  0x11,0xc5,0x17,0xaa,0xd1,0xf8,0x43,0x5d,0x78,0xe2,0xfa,0x97,0xf7,0xbd,0xfb,0x8d,
+  0xd1,0xae,0xf4,0x1e,0x6a,0xd3,0x2d,0x3e,0xae,0x06,0x0e,0xde,0xc0,0x69,0x81,0x7b,
+  0xa3,0xfc,0x8c,0xef,0xd7,0x55,0x08,0xd6,0x56,0x18,0xd6,0xdd,0xd9,0xf4,0xf5,0x25,
+  0xbf,0xef,0xb4,0x6c,0x55,0x34,0x24,0x50,0x59,0xbd,0x4a,0xff,0xbd,0xaa,0xa3,0xf6,
+  0x82,0xad,0x22,0x58,0x9e,0x69,0x47,0x59,0x5d,0xa4,0x65,0x3e,0xff,0xf4,0x9f,0xfe,
+  0xb7,0x4a,0xff,0x25,0xfe,0x47,0x3c,0x00,0x8d,0x16,0xf4,0xe6,0xdf,0xbe,0xf3,0xe4,
+  0x9a,0xe2,0x37,0xcd,0xf5,0x1f,0xe2,0xe6,0xb7,0xc5,0x12,0xa0,0x00,0x14,0x84,0x08,
+  0x1e,0x29,0x4c,0x13,0xe2,0x52,0xab,0x56,0x3b,0x4e,0x8b,0xda,0xad,0x26,0xed,0x46,
+  0x66,0x25,0x94,0x80,0x99,0x6e,0xdd,0xfb,0xab,0x6e,0x3d,0x07,0xaa,0x01,0x03,0x86,
+  0xe9,0x31,0xff,0x31,0x1e,0x81,0xed,0x93,0xf0,0x3e,0x05,0x21,0x9b,0xcf,0x3f,0xed,
+  0xeb,0x45,0x73,0x66,0x69,0xcf,0x45,0x67,0xb5,0x72,0xf9,0xdc,0xd4,0xe1,0x97,0x5a,
+  0x5d,0x8c,0xb6,0xf3,0x91,0xe7,0x18,0x6d,0xa3,0xce,0x3f,0xfd,0xa7,0xff,0xad,0xd4,
+  0x7f,0xc9,0x02,0x6a,0x24,0x2e,0xc1,0x6e,0x73,0xed,0xbb,0xbe,0x77,0x1d,0xab,0x3c,
+  0x82,0x0a,0x51,0x00,0xea,0x60,0xfd,0xe7,0xe1,0x22,0xcb,0x9a,0x96,0xe3,0x5b,0xbf,
+  0xcb,0x85,0x26,0xe3,0xfe,0xf2,0xda,0xa3,0xcf,0x88,0xe8,0x06,0x1a,0xb9,0xf1,0xf6,
+  0xaa,0x6b,0xb7,0xae,0x3e,0x35,0x37,0xd5,0xa4,0x5f,0x47,0xfe,0x9b,0xfb,0xee,0x75,
+  0x01,0x84,0x33,0x67,0xf6,0x9b,0xaa,0xb3,0x5e,0xcf,0x8a,0xe5,0x1f,0xde,0xf8,0x32,
+  0xeb,0x62,0x5a,0xfc,0x45,0xb5,0x63,0xa2,0x45,0xaf,0xaf,0x51,0xe7,0x9f,0xfe,0xd3,
+  0xff,0x56,0xe9,0xbf,0x7c,0x27,0x41,0xcc,0x32,0x04,0x58,0x6f,0x61,0x17,0x3a,0xd5,
+  0xaf,0xcf,0xb5,0xef,0x12,0xea,0x21,0x13,0x05,0x85,0x4c,0x42,0x84,0x02,0x50,0x10,
+  0xe2,0x7a,0x96,0xf1,0xff,0xa2,0xb4,0x49,0xdf,0x0d,0x14,0xe2,0x82,0x33,0xdf,0x4b,
+  0xb4,0xbc,0x44,0xcb,0x76,0xe9,0xda,0x53,0x47,0xfd,0x0f,0xd4,0x1e,0x8c,0xfe,0x6a,
+  0xc8,0x06,0xeb,0xce,0x9d,0xbd,0x6e,0x96,0xde,0xda,0x9f,0x7c,0x98,0xb7,0xdf,0xc9,
+  0x99,0xb7,0x9f,0xfd,0x6e,0x5a,0xdb,0x63,0xb0,0x8e,0xc3,0x60,0xcd,0xd7,0x8b,0x17,
+  0xcf,0x57,0xf3,0xe7,0xcd,0xd0,0xdf,0x2d,0xd7,0x1e,0x80,0xf9,0x1d,0x65,0x81,0xab,
+  0xb1,0x50,0x8a,0x3e,0x3f,0x65,0x3c,0xff,0xf4,0x9f,0xfe,0xb7,0x52,0xff,0x65,0xec,
+  0x5f,0xa6,0xfe,0x15,0x43,0x26,0xef,0xb2,0xe0,0x59,0x85,0xbf,0xad,0x04,0xb0,0x4d,
+  0x90,0x87,0x94,0x02,0x8e,0x97,0x0b,0x55,0x32,0x5c,0xdb,0xa7,0x14,0x70,0x81,0xc4,
+  0xae,0xe7,0x22,0xf3,0x74,0xf3,0xbe,0x61,0xa4,0x7c,0xae,0xbc,0xf6,0xea,0x33,0x3c,
+  0xd2,0x9a,0x47,0x8d,0xd9,0x56,0xf5,0xe8,0xd9,0xc3,0x27,0x8f,0xbd,0x31,0x01,0xbe,
+  0x11,0x01,0xef,0xfa,0x4d,0x07,0x81,0x23,0x4b,0x70,0xea,0xdb,0x93,0x55,0x67,0x3d,
+  0xfe,0xbf,0x64,0xd1,0xcc,0xe8,0xf3,0xc1,0x83,0x07,0xa7,0x06,0x0d,0x65,0x7d,0x60,
+  0x56,0xf3,0x10,0x68,0xa6,0xf3,0x4f,0xff,0xe9,0x7f,0x2b,0xf5,0x5f,0xbc,0x99,0x82,
+  0x64,0x00,0xd4,0x53,0x01,0xb0,0x29,0x02,0x2e,0x81,0xee,0x1a,0x0e,0x08,0x89,0xdc,
+  0xb7,0x05,0x11,0x26,0xcf,0xb1,0x6f,0xfb,0x0c,0x01,0x14,0x48,0x32,0xf8,0x2f,0xe4,
+  0xa0,0xe7,0xad,0x95,0x65,0x1d,0xc3,0x93,0xcf,0x25,0xf5,0xaf,0x73,0xe7,0xae,0xaa,
+  0x57,0xbf,0xa1,0xda,0x0b,0xd0,0x4d,0x8d,0x18,0xbd,0x95,0xea,0xa2,0xdd,0xff,0x99,
+  0x03,0x86,0x3c,0x02,0xde,0x94,0xe8,0x59,0x7f,0x6f,0x53,0x40,0x56,0xad,0x5a,0xa9,
+  0x66,0xce,0x98,0xa4,0xd7,0xa3,0xf3,0xfe,0x17,0xcf,0x8a,0x14,0x98,0x41,0x83,0x06,
+  0x75,0xdc,0xf8,0x21,0x63,0x98,0x3e,0x17,0x66,0x35,0x0f,0xdf,0x66,0x39,0xff,0xf4,
+  0x9f,0xfe,0xb7,0x52,0xff,0xc5,0xf2,0x97,0x58,0x26,0x41,0x26,0x2a,0xab,0xa7,0xd0,
+  0x4f,0xfb,0xdb,0xf7,0xbb,0x50,0xb7,0x7e,0x88,0xc2,0x15,0xb2,0x3e,0x14,0x80,0x22,
+  0x3a,0xa1,0x85,0x4f,0xcf,0x9e,0x3d,0x53,0x35,0xf2,0x90,0x1b,0xb0,0x9e,0x16,0x80,
+  0xb8,0xcb,0x24,0x62,0xb6,0x67,0x1f,0x11,0xfe,0xdd,0xd5,0xf0,0x91,0x9b,0xab,0x9e,
+  0xbd,0x7a,0xdb,0x4d,0xfa,0x8c,0x95,0xfa,0x2c,0x57,0x5e,0x7a,0x61,0x00,0x5f,0x4c,
+  0x80,0x25,0xe6,0xe0,0x7d,0x2d,0xfc,0x57,0xad,0x5a,0xae,0x96,0x2f,0x9d,0xad,0x3f,
+  0x5e,0xa9,0x83,0x17,0x07,0xae,0x55,0xfc,0xa7,0x0c,0xb3,0x91,0x95,0xf9,0xfc,0xd3,
+  0x7f,0xfa,0xdf,0x4a,0xfd,0x9f,0x35,0x6b,0xd6,0x5a,0x82,0x4e,0x94,0x00,0x5f,0x29,
+  0xf6,0x3c,0xfb,0x99,0x16,0xdc,0x57,0x6b,0xe0,0x63,0x5a,0xd6,0x80,0xcb,0xf5,0x6f,
+  0x53,0x32,0xf0,0x00,0x14,0x84,0xad,0xf2,0x5f,0x51,0xee,0xa5,0xbc,0x2a,0x77,0xc5,
+  0xee,0xb2,0x3e,0x03,0x46,0x44,0x51,0xf4,0xa3,0x36,0xd9,0x36,0xb2,0xfe,0x83,0x4c,
+  0xf0,0x75,0xae,0x54,0x95,0x29,0x2d,0x30,0x8e,0x17,0xe8,0xe4,0x8a,0x21,0x08,0x48,
+  0x03,0x9c,0xfe,0xce,0xab,0xd1,0x7e,0x2f,0x5d,0x38,0x23,0xfa,0x68,0xc8,0x90,0x21,
+  0x35,0xcd,0x4e,0x58,0x76,0xca,0x58,0x3a,0x96,0xfe,0xd3,0xff,0x32,0xf4,0x5f,0x84,
+  0xbd,0x04,0xff,0x25,0xa9,0x97,0x02,0xe0,0x12,0xf4,0x21,0x69,0x7a,0x2e,0xa1,0x6d,
+  0xf6,0xd3,0x57,0x10,0xc8,0xdc,0x7e,0x51,0x13,0x11,0xa1,0x00,0x38,0x88,0x03,0xcf,
+  0x42,0x35,0xb4,0x6a,0x6f,0xc8,0xbc,0xa2,0x74,0x65,0x86,0x3f,0xc9,0x95,0xed,0xde,
+  0xb3,0xbf,0xea,0xd9,0x7b,0xa0,0xea,0x3f,0x68,0x03,0xb5,0xfe,0xb0,0x51,0x89,0x20,
+  0x3e,0xa3,0xd2,0x5f,0x36,0xf9,0xee,0xbf,0x99,0x55,0x70,0x9a,0xbf,0xf5,0xfb,0x0f,
+  0xe6,0xea,0x9a,0xff,0x0b,0x67,0xab,0xd5,0xab,0x16,0xeb,0xe0,0xbf,0x85,0xd1,0xac,
+  0x8b,0xe6,0xcc,0x8b,0xd5,0x4c,0x1e,0x52,0x4b,0x29,0xd5,0x66,0x3a,0xff,0xf4,0x9f,
+  0xfe,0xb7,0x52,0xff,0x25,0x96,0x49,0xbc,0x99,0x66,0x7f,0xea,0xa5,0x98,0xa4,0x09,
+  0xf9,0xb4,0x7d,0xb1,0xa5,0x4a,0xda,0xac,0xff,0x10,0x2f,0x43,0x5a,0x10,0x21,0xa5,
+  0x80,0x0b,0x24,0x9e,0xf8,0xc7,0x76,0xe0,0x6b,0x99,0xcd,0xaa,0xd6,0x1b,0x3a,0x8d,
+  0xd8,0xfa,0xef,0x3b,0x68,0x64,0x64,0x45,0x6f,0x3c,0x76,0x87,0xa8,0x98,0x8e,0x5b,
+  0x40,0xa7,0x5b,0xec,0xd9,0x67,0xff,0xab,0x6d,0x7d,0xd3,0xdf,0x7e,0x39,0xda,0xef,
+  0xc5,0xf3,0xdf,0xb5,0x5a,0xff,0xb5,0xb8,0xdb,0x42,0x2b,0x9f,0xd9,0xc6,0x5c,0x9b,
+  0xe5,0xfc,0xd3,0x7f,0xfa,0xdf,0x4a,0xfd,0x4f,0xba,0xff,0x93,0x1e,0x80,0x7a,0x7b,
+  0x28,0x42,0x2c,0xfc,0xe4,0xe7,0xe6,0x7b,0x97,0x3b,0xdf,0x65,0xbd,0xbb,0x84,0x7c,
+  0x33,0x4c,0x02,0xd4,0x32,0x0a,0x80,0x59,0x75,0xae,0x2c,0xb3,0x67,0xb9,0x10,0x4d,
+  0x79,0xfe,0xfc,0xf9,0xfa,0xc6,0xd5,0x69,0x8b,0xfd,0x87,0xe9,0x71,0x73,0x3d,0xfe,
+  0xbf,0xd1,0x16,0x5a,0x01,0xe8,0x9a,0x10,0xc0,0x6b,0x0b,0xe8,0xec,0x4f,0x93,0x8c,
+  0x1a,0x41,0x06,0x9f,0xc2,0xd2,0xc5,0x0b,0xd4,0xf4,0x77,0x27,0xea,0xca,0x7f,0xcb,
+  0xd5,0x92,0x05,0xef,0x45,0xa9,0x7f,0xae,0xdc,0xff,0x7a,0xb8,0xff,0xb2,0x3c,0x40,
+  0xcb,0x70,0xfe,0xe9,0x3f,0xfd,0x6f,0xa5,0xfe,0x4b,0xe0,0x9f,0x6d,0xe2,0x9f,0x7a,
+  0x2b,0x00,0xa1,0x4a,0x4b,0xd6,0x69,0x80,0x4d,0x8f,0x4a,0xda,0xd0,0x42,0xd9,0x27,
+  0xfe,0x69,0x49,0x05,0x20,0x76,0x3d,0x17,0x3d,0xdb,0x96,0xef,0x86,0x0b,0x8d,0xdc,
+  0x97,0xca,0x7f,0x72,0x73,0xf4,0xec,0x33,0x44,0xd7,0xd0,0xef,0xaa,0x06,0x0e,0x19,
+  0xa6,0x03,0x18,0x7b,0xa7,0xbb,0xef,0x7c,0x63,0xf4,0xb5,0xdf,0x29,0xc1,0xb3,0x09,
+  0xbd,0x36,0xe1,0x51,0xb9,0xbd,0xd5,0xfc,0xd9,0x53,0xa2,0x1d,0x18,0x3a,0x74,0x68,
+  0x14,0xf9,0x9f,0xf7,0x6c,0x65,0x79,0xbb,0x48,0xcb,0x72,0xfe,0xe9,0x3f,0xfd,0x6f,
+  0xa5,0xfe,0x4f,0x9f,0x3e,0xdd,0xb9,0xbe,0x7a,0x06,0x02,0xfa,0x04,0x79,0x9a,0x27,
+  0x20,0xad,0xef,0x69,0xa5,0x7f,0x7d,0xb5,0x02,0x6c,0xdb,0x47,0x01,0x28,0x40,0x01,
+  0x88,0x2f,0x32,0xdf,0x0d,0x9a,0xa5,0x54,0xa7,0x4d,0x9b,0x4e,0xfb,0x3b,0x74,0xb6,
+  0xac,0xb8,0x4e,0x76,0xf7,0x9e,0x7d,0xa2,0x8a,0x7f,0x3d,0x7b,0xeb,0xf2,0xc5,0x3a,
+  0xf7,0x3f,0x7d,0xf6,0xbe,0xb5,0x25,0xfe,0xba,0x0a,0x42,0xb6,0x98,0x80,0x75,0xe4,
+  0xbb,0x27,0xe9,0x20,0x5e,0x7e,0xd2,0x2b,0x4f,0xab,0xf7,0xa7,0x4f,0x56,0xcb,0x16,
+  0xcf,0x56,0x8b,0xe6,0xbd,0x1b,0x0d,0xbd,0x48,0xea,0x5f,0x96,0xfe,0x87,0x96,0x52,
+  0x0d,0x79,0x00,0x65,0x7d,0x40,0x97,0xe1,0xfc,0xd3,0x7f,0xfa,0xdf,0x2a,0xfd,0x17,
+  0x4f,0xa6,0xb4,0x2c,0x6e,0xf9,0x7a,0x0f,0x09,0xf8,0xf2,0xf5,0xb3,0x0e,0x2b,0x84,
+  0xf6,0x2b,0x6d,0xfb,0x28,0x00,0x39,0xd2,0xa3,0x47,0x8f,0xaa,0xdc,0x41,0x59,0x6b,
+  0x79,0xe7,0x35,0x3b,0x97,0x14,0xc9,0x88,0x22,0x4b,0xf5,0xb6,0x3a,0x75,0xd6,0x1e,
+  0x81,0x05,0x73,0xa2,0xf1,0xff,0x0f,0x17,0x0b,0xf3,0xd9,0x67,0x4e,0x0a,0xf0,0xcd,
+  0x0e,0xe8,0xf1,0x30,0xc8,0x62,0x13,0x27,0x3c,0xa5,0x5e,0x79,0xe1,0x21,0x1d,0xf4,
+  0xb7,0x40,0xcd,0x7e,0xe7,0xdf,0x51,0xca,0xdf,0xe8,0xd1,0xa3,0x9d,0x0f,0x8c,0x3c,
+  0x8e,0x57,0x91,0x63,0x98,0x8d,0x3a,0xff,0xf4,0x9f,0xfe,0xb7,0x42,0xff,0xc5,0xba,
+  0x7f,0xfb,0xed,0xb7,0x53,0xb7,0x29,0xcb,0x14,0x5d,0x10,0x28,0xab,0xf5,0x6e,0x5a,
+  0xe3,0x36,0xcf,0x4a,0xa8,0x80,0x77,0x79,0x5d,0x6c,0xdb,0x60,0x08,0xa0,0xa0,0x31,
+  0x1e,0x19,0x83,0x0e,0xd5,0xe6,0xb2,0xce,0xaf,0x9d,0xd7,0x85,0x98,0x44,0x6e,0x08,
+  0xf9,0x6c,0xc5,0xd2,0x85,0xfa,0x55,0xa7,0xd1,0x2d,0x59,0xa4,0xa6,0x4e,0x7e,0x49,
+  0x6d,0xbc,0xf9,0x0e,0xa5,0x4c,0x29,0x5a,0xb2,0x68,0xbe,0x7a,0xf1,0xe9,0x7b,0xd5,
+  0xbb,0x6f,0xbf,0xa6,0xf7,0x79,0x81,0x9a,0x31,0xe5,0x99,0x48,0x55,0xd8,0x64,0x93,
+  0x4d,0xd6,0xaa,0xbd,0x90,0xb7,0xcb,0xb1,0x1e,0x95,0xd2,0x1a,0x71,0xfe,0xe9,0x3f,
+  0xfd,0x6f,0x85,0xfe,0xbf,0xf5,0xd6,0x5b,0xd1,0x34,0xe6,0x3e,0x05,0xa0,0x1e,0x32,
+  0xc0,0xe6,0x09,0xb1,0xb9,0xf7,0x43,0xa6,0xf0,0xcd,0xea,0xaa,0x77,0x55,0x07,0x74,
+  0x05,0x20,0xa2,0x00,0xe4,0x48,0x2c,0x4c,0x43,0x6e,0xa0,0xac,0x95,0xba,0x7c,0x17,
+  0x5a,0xb5,0xeb,0x8f,0x85,0xe6,0xd2,0x45,0x73,0xd4,0xaa,0x15,0x8b,0xf5,0x0c,0x80,
+  0x7d,0xd5,0x8b,0xcf,0xfc,0x43,0x2d,0x5e,0x32,0x5f,0x8d,0xd9,0x6c,0x3b,0xd5,0xa7,
+  0xef,0x20,0x1d,0x1b,0xd0,0xc5,0x67,0xd3,0x67,0xf2,0x10,0xac,0x1b,0x54,0xb8,0xf6,
+  0x12,0xe6,0xf2,0xcb,0x97,0x2e,0x56,0x73,0x67,0xcf,0x50,0xef,0xbc,0xf9,0x8a,0x56,
+  0x4e,0x26,0x44,0x55,0xff,0x16,0xcc,0x9d,0xa6,0x66,0x4d,0x9d,0xa0,0xfb,0xd4,0x49,
+  0x8d,0xd1,0xc2,0x5f,0xdc,0xff,0xb5,0x1c,0x5f,0x9f,0x45,0xe3,0x73,0x49,0x66,0x7d,
+  0x80,0x96,0xe5,0xfc,0xd3,0x7f,0xfa,0xdf,0xec,0xfd,0x7f,0xff,0xfd,0xf7,0xa3,0xe6,
+  0xa3,0x1e,0x0a,0x40,0x5a,0x6a,0x5e,0x9a,0x25,0x9e,0x56,0x1b,0x20,0xc4,0xe2,0xf7,
+  0x29,0x6a,0xd5,0x2a,0x14,0x28,0x00,0x19,0xb5,0xbf,0x50,0x97,0x59,0x88,0x8b,0xad,
+  0xd6,0xd9,0xbf,0x42,0xd2,0x74,0x64,0xcc,0x5c,0x02,0x67,0xe4,0xe6,0x78,0xef,0xad,
+  0x7f,0xa9,0x91,0x9b,0x8f,0x8b,0x2a,0x01,0x4e,0x7e,0xf5,0x69,0x35,0x45,0xb7,0x10,
+  0x17,0x7f,0xee,0xc7,0x31,0x45,0xbd,0x58,0xb6,0x78,0x9e,0x9a,0x39,0x6d,0x82,0x4e,
+  0xf9,0x9b,0x15,0x29,0x2f,0x63,0xc6,0x8c,0x59,0x6b,0xd8,0x25,0x6b,0xff,0xb3,0x3c,
+  0x70,0x92,0xaf,0x3e,0x0b,0xa6,0x59,0xce,0x3f,0xfd,0xa7,0xff,0xcd,0xdc,0x7f,0xc9,
+  0xf9,0x7f,0xe3,0x8d,0x37,0x82,0xbd,0xae,0xf5,0xb2,0x80,0x6d,0x53,0xf9,0xfa,0x5c,
+  0xff,0x2e,0x21,0x6f,0x2a,0x03,0x21,0x25,0xe6,0x43,0xb7,0x8f,0x02,0x50,0x80,0xf6,
+  0x97,0xe5,0x22,0xc9,0xba,0x6c,0xde,0xb3,0x75,0x75,0xeb,0xd6,0x4d,0x0d,0x1f,0x3e,
+  0x5c,0xbd,0xfb,0xee,0xbb,0x6a,0xf9,0x92,0x05,0xea,0xad,0x09,0x0f,0xa8,0xc1,0xc3,
+  0xc7,0xaa,0x3e,0x03,0x87,0xa9,0x6e,0x3d,0x7a,0x47,0xe9,0x81,0x9d,0x12,0x82,0xb9,
+  0x6e,0xca,0xd4,0x9a,0xd7,0x55,0x2b,0x57,0xa8,0x95,0x2b,0x96,0xa8,0xc5,0xf3,0x66,
+  0x6a,0xab,0x7f,0xba,0x4e,0xf5,0x9b,0x1d,0xed,0xfb,0x06,0x1b,0x6c,0xa0,0x86,0x0d,
+  0x1b,0x96,0x69,0x4c,0xaf,0xd6,0x34,0x25,0xdf,0xf8,0x69,0x33,0x9e,0x7f,0xfa,0x4f,
+  0xff,0x9b,0xb5,0xff,0x92,0xc1,0xf4,0xec,0xb3,0xcf,0x66,0x9a,0x75,0xb5,0xe8,0x38,
+  0x00,0x9b,0xf5,0xed,0x52,0xb6,0x7c,0xca,0x97,0x2b,0xe8,0x31,0x6b,0x31,0xa0,0x6a,
+  0xb7,0x8f,0x02,0x90,0x91,0xb8,0xfa,0x94,0x2f,0x95,0xa3,0x1a,0x17,0x5c,0x91,0x48,
+  0xea,0x5c,0xe4,0x01,0x78,0xef,0x3d,0x2d,0x70,0x97,0xab,0x99,0x53,0x5f,0x8e,0x5a,
+  0x19,0x3d,0x2c,0x32,0xc3,0x9f,0x08,0x7f,0xa9,0xb7,0x50,0x86,0xfd,0xc9,0x62,0x21,
+  0x95,0xf5,0xfc,0xd3,0x7f,0xfa,0xdf,0x6c,0xfd,0x97,0x5c,0xff,0xc7,0x1e,0x7b,0xcc,
+  0x3a,0xe7,0x4a,0x23,0x15,0x00,0x97,0x80,0xcd,0x2a,0x6c,0x43,0xa7,0xfa,0xb5,0x29,
+  0x1e,0x21,0xdb,0x27,0x0d,0xb0,0xa0,0x13,0x2e,0x81,0x28,0xc9,0x62,0x40,0xb5,0xb8,
+  0xb8,0xaa,0xd1,0x3c,0xab,0x5d,0xdf,0x86,0x1b,0x6e,0x18,0x15,0xd0,0x91,0xaa,0x80,
+  0x92,0x4a,0xb3,0x7c,0xf9,0xf2,0x86,0x5f,0x20,0xb2,0xff,0xe2,0xa1,0x90,0xe3,0x29,
+  0xf3,0x2b,0xc8,0xfe,0xc9,0xdf,0x45,0xf4,0xbf,0x9a,0x3c,0x69,0xdf,0xf9,0x6d,0xa6,
+  0xf3,0x4f,0xff,0xe9,0x7f,0xb3,0xf4,0x7f,0xf6,0xec,0xd9,0xea,0xc9,0x27,0x9f,0xec,
+  0x78,0x3e,0x64,0x55,0x00,0xea,0x21,0xf4,0xd3,0xc6,0xe1,0xb3,0x0a,0x79,0x73,0xac,
+  0xdf,0x15,0xdd,0x9f,0x65,0xfb,0xcc,0x05,0x50,0x10,0xe2,0x96,0x32,0xeb,0xd0,0x17,
+  0xe5,0x92,0xcb,0x7b,0x7d,0xe2,0x4a,0xcb,0xe2,0x4e,0x6b,0x26,0x8b,0xa4,0x11,0xe7,
+  0xa3,0xd9,0xce,0x3f,0xfd,0xa7,0xff,0x65,0xef,0xff,0x9b,0x6f,0xbe,0xa9,0xfe,0xf5,
+  0xaf,0x7f,0x45,0xb1,0x0c,0x71,0xcd,0x8f,0x32,0x29,0x00,0x59,0xac,0x7f,0x57,0xc4,
+  0xbe,0x4d,0x41,0xf0,0xa5,0x16,0x9a,0xeb,0x0c,0xdd,0x3e,0x0a,0x40,0xce,0xcc,0x9c,
+  0x39,0x33,0x72,0xa9,0xe7,0x71,0x01,0x15,0x99,0x96,0x53,0xf6,0xd9,0xc1,0xe8,0x3f,
+  0xfd,0xa7,0xff,0xf4,0x3f,0xde,0x3f,0xa9,0x57,0xf2,0xfc,0xf3,0xcf,0x77,0xe4,0xfa,
+  0xf7,0xef,0xdf,0xbf,0xaa,0xaa,0x7e,0x45,0x07,0x02,0x86,0xd6,0xf9,0x4f,0xab,0x02,
+  0xe8,0x52,0x24,0x42,0xbc,0x0d,0xbe,0xe5,0xcb,0x3e,0xac,0xd4,0xf4,0x0a,0x80,0x0c,
+  0x01,0x48,0x4e,0xea,0x46,0x1b,0x6d,0x54,0x93,0x0b,0xce,0xa7,0x21,0xfb,0x2a,0x6b,
+  0x85,0xdc,0xd0,0x59,0x34,0xf0,0xbc,0x67,0x07,0xa3,0xff,0xf4,0x9f,0xfe,0xd3,0xff,
+  0x90,0xfe,0x8b,0xd5,0x3f,0x61,0xc2,0x84,0x8e,0xaa,0xa5,0x32,0xdb,0x6a,0x56,0xd7,
+  0xbf,0xe9,0x05,0x28,0x2a,0x0e,0x20,0xad,0x5a,0x61,0xa8,0xf0,0xf7,0x05,0xf7,0xd9,
+  0x82,0xfc,0xb2,0xec,0x5b,0x99,0x15,0x81,0x96,0x98,0x0e,0x78,0xd2,0xa4,0x49,0x51,
+  0x6a,0x9a,0x44,0xd7,0x67,0x49,0xbb,0xa9,0xa5,0xd2,0x56,0xde,0x79,0xbf,0x21,0xeb,
+  0x4f,0x4b,0x4b,0xaa,0x26,0xed,0x88,0xfe,0xd3,0x7f,0xfa,0x4f,0xff,0x63,0xa6,0x4e,
+  0x9d,0xaa,0x5e,0x79,0xe5,0x15,0xb5,0x60,0xc1,0x82,0x8e,0xdf,0x49,0x3c,0x50,0xe8,
+  0x10,0x6b,0x23,0x14,0x00,0x97,0xa5,0x6f,0xa6,0xf0,0xf9,0xdc,0xfb,0xa6,0x35,0x1f,
+  0x5a,0xfb,0x3f,0xc4,0x53,0x54,0xe6,0x82,0x40,0x2d,0xa1,0x00,0xc8,0x81,0x7d,0xea,
+  0xa9,0xa7,0xd4,0xa6,0x9b,0x6e,0xaa,0xb6,0xdc,0x72,0xcb,0xb5,0xaa,0x03,0x16,0x55,
+  0x59,0x2b,0xab,0x46,0x5f,0x8d,0x8b,0xd0,0x67,0x81,0xd4,0xba,0x3c,0xfd,0xa7,0xff,
+  0xf4,0xbf,0xbd,0xfb,0x2f,0x79,0xfd,0xd3,0xa6,0x4d,0x8b,0xac,0xfe,0xd8,0xe2,0x8f,
+  0xbf,0x17,0xa3,0x4a,0xac,0xff,0x5a,0x69,0x44,0x1c,0x80,0x4b,0xd0,0xfb,0x52,0xf8,
+  0xcc,0xf7,0x69,0x6e,0x7e,0xf3,0x5c,0xa7,0x4d,0x2d,0x4c,0x16,0x40,0x91,0x9d,0xd0,
+  0x75,0xe9,0xe5,0x00,0x4f,0x9e,0x3c,0x39,0x1a,0x0e,0x18,0x31,0x62,0x44,0x94,0xba,
+  0x26,0x91,0xec,0x12,0x64,0x27,0xdf,0x9b,0x13,0x06,0xf9,0x5c,0x78,0xb5,0xce,0xee,
+  0x95,0xd5,0x65,0x97,0xb5,0xf2,0x57,0xc8,0xe4,0x23,0xb6,0x0b,0x92,0xfe,0xd3,0x7f,
+  0xfa,0xdf,0x7e,0xfd,0x97,0x94,0x69,0x19,0x2e,0x95,0xa0,0x69,0xc9,0x3a,0x92,0xc8,
+  0xfe,0x59,0xb3,0x66,0x59,0xa7,0xf2,0x15,0xc4,0x88,0x92,0xe7,0x67,0x1e,0x56,0x6b,
+  0x91,0x0a,0x80,0xcf,0x0a,0x4f,0x73,0xdb,0xbb,0x84,0xbc,0x39,0x4f,0x40,0x88,0xc7,
+  0xc1,0xa5,0x6c,0x51,0x09,0xb0,0x0e,0x24,0x2b,0xd3,0xc9,0x85,0x2e,0xae,0x2c,0x69,
+  0x69,0x48,0x90,0x4b,0xb3,0xcd,0xdd,0x0c,0x00,0x50,0x34,0xe2,0xf6,0x8f,0x4b,0x7d,
+  0xe7,0x25,0xa4,0xeb,0xed,0x02,0x0f,0x89,0xd6,0xcf,0xe2,0xe1,0xf1,0x79,0x03,0x5c,
+  0x55,0x04,0x6d,0xde,0x88,0x32,0xd1,0xb9,0x15,0x2e,0x58,0xb1,0xf0,0xa5,0x55,0xeb,
+  0xbe,0x03,0x00,0x68,0x77,0xe4,0x99,0x28,0x56,0xbf,0xb8,0xfd,0xf3,0x7e,0x3e,0x16,
+  0xe5,0x05,0xb0,0x59,0xfa,0x36,0x41,0x1c,0x2a,0x7c,0xd3,0xf2,0xf7,0x4d,0x77,0xbe,
+  0xcb,0xd3,0xd0,0x4c,0x33,0x02,0x76,0x6d,0x95,0x8b,0x57,0x2e,0xdc,0xb9,0x73,0xe7,
+  0x86,0x6b,0x3e,0x6b,0xdc,0x65,0x65,0x4f,0xcf,0xa9,0x87,0xa6,0x4c,0xff,0xe9,0x3f,
+  0xfd,0x6f,0xef,0xfe,0x4b,0x90,0x9e,0x3c,0x43,0xb3,0x1a,0x52,0x65,0xea,0x47,0x11,
+  0xc7,0x25,0x2d,0xab,0xc0,0x17,0x27,0xd0,0x0c,0x1e,0xe6,0x96,0x51,0x00,0xc4,0x6d,
+  0xb5,0x64,0xc9,0x92,0x68,0x9c,0x2b,0xcb,0x0d,0xdc,0x8c,0x25,0x41,0xf3,0xd6,0xa0,
+  0xe9,0x3f,0xfd,0xa7,0xff,0xed,0xd9,0x7f,0x31,0x84,0x24,0xca,0x5f,0x4a,0xfc,0x36,
+  0x63,0xbf,0x43,0x85,0xb1,0xeb,0x77,0xe6,0x6f,0x5c,0x53,0x08,0xdb,0xbc,0x0e,0x21,
+  0xdb,0x27,0x06,0xa0,0x8e,0x48,0xe9,0x5a,0xf1,0x02,0x48,0x59,0xdd,0x90,0x1b,0x5f,
+  0x2e,0xfe,0x7a,0x45,0xa8,0x02,0x00,0x94,0x49,0xf1,0x11,0xa3,0x49,0x04,0x7f,0x35,
+  0x05,0x7e,0x5a,0xc9,0xfa,0xb7,0xd5,0x43,0xb0,0x05,0x17,0xc6,0xcb,0xa6,0x15,0x0f,
+  0xaa,0x46,0x19,0x41,0x01,0xc8,0x51,0x9b,0x95,0xc9,0x6b,0x16,0x2d,0x5a,0x14,0x45,
+  0xbb,0xfa,0x0e,0x7e,0x72,0x18,0x00,0x00,0xa0,0xd5,0x91,0x82,0x3e,0x12,0x34,0x2d,
+  0xad,0x9e,0x16,0x7f,0xa3,0x95,0x0c,0x5b,0x8d,0x7f,0x9b,0x05,0x6f,0xab,0xb5,0x60,
+  0x93,0x0f,0x69,0xf3,0x0d,0x84,0x28,0x19,0x28,0x00,0x05,0x6a,0xb6,0x12,0xc4,0x22,
+  0x6e,0x2d,0x19,0x0e,0x90,0x26,0x11,0xff,0x92,0x1d,0x60,0x0a,0xfb,0xd8,0x0b,0x10,
+  0xcf,0x2a,0x08,0x00,0xd0,0x2a,0xcf,0x41,0x79,0xb6,0xc9,0xd8,0xbe,0x34,0x19,0xdb,
+  0x17,0xe1,0xdf,0x08,0x41,0xec,0xaa,0xbd,0x5f,0x94,0x27,0xc0,0x36,0x8d,0xaf,0x19,
+  0x98,0x67,0xab,0x20,0x68,0xc6,0x84,0xf9,0x5c,0xff,0x3e,0x65,0x20,0x29,0xf8,0xa9,
+  0x04,0xd8,0x00,0x6f,0x80,0xb8,0xb8,0x42,0xa6,0xb1,0x15,0x25,0xa1,0x0c,0x4a,0x00,
+  0x9e,0x88,0xda,0x1e,0x32,0x00,0x50,0x3e,0xea,0x35,0x1d,0xb0,0xab,0x2c,0x70,0xd6,
+  0x62,0x40,0xa1,0xf3,0x04,0x84,0x56,0x5b,0x34,0x15,0x13,0x14,0x80,0x92,0x21,0x45,
+  0x2f,0x44,0x09,0x68,0x74,0x3c,0x00,0x42,0x0c,0x00,0x5a,0x8d,0x7a,0x64,0x16,0x98,
+  0xc5,0x79,0x6c,0xd6,0xbe,0xcf,0x6a,0xcf,0x3a,0x76,0x5f,0xcd,0x24,0x44,0xa5,0x33,
+  0x94,0xb9,0x3c,0xff,0x7f,0xd9,0x4b,0x04,0x30,0x00,0x40,0xbe,0xd6,0x7f,0xd1,0xc3,
+  0x0e,0x3e,0xe1,0x9b,0x56,0xd7,0x3f,0x8b,0xd7,0xd5,0x54,0x10,0x6c,0x15,0x03,0x43,
+  0x26,0x15,0x42,0x01,0x40,0x09,0x00,0x00,0x68,0x79,0x6a,0x99,0x45,0xb0,0x16,0x45,
+  0xc0,0x25,0x90,0x6d,0xe3,0xfa,0x59,0x64,0x84,0xcd,0x9d,0xef,0x2a,0x0b,0x6c,0x2b,
+  0x16,0x84,0x02,0x50,0x62,0x44,0x53,0x95,0xb4,0x98,0x7a,0x8d,0x59,0x01,0x00,0xb4,
+  0x2a,0x32,0xb4,0x5a,0x0f,0xeb,0xdf,0xfc,0x3b,0x4b,0x66,0x57,0xe8,0x30,0x40,0xda,
+  0xf8,0xbf,0xcd,0x33,0xd0,0x2c,0x85,0x81,0x50,0x00,0x2c,0x5a,0x9e,0x5c,0xb8,0xf5,
+  0xd4,0x5c,0x01,0x00,0x5a,0x4d,0xf8,0xd7,0xab,0xaa,0xa0,0xcd,0xc2,0x4e,0xab,0xcb,
+  0xef,0x5b,0x57,0x9a,0x65,0x6f,0xf3,0x2a,0xd8,0x26,0x9e,0x72,0x15,0x19,0x42,0x01,
+  0x68,0x12,0x25,0x40,0x14,0x00,0xbc,0x01,0x00,0x00,0xd9,0x9e,0x9d,0x32,0x94,0x5a,
+  0x6f,0xe1,0x9f,0x66,0xb1,0xbb,0x04,0x6f,0xda,0xef,0x92,0x56,0x7c,0x5a,0x6d,0x00,
+  0xdb,0xf6,0x6d,0xe9,0xe6,0x65,0xf5,0x00,0x90,0x05,0x90,0xa6,0x1d,0x69,0xf7,0x95,
+  0x5c,0xcc,0x92,0x1d,0xb0,0x62,0xc5,0x0a,0xea,0x05,0x00,0x00,0xb8,0x84,0xc9,0x9a,
+  0x5a,0x03,0x8d,0x98,0xf5,0xcf,0x97,0x8b,0xef,0xb3,0xf6,0x6d,0xcb,0xb9,0xac,0xfc,
+  0xb4,0x14,0x42,0xdb,0xbe,0x50,0x0a,0xb8,0x45,0x14,0x01,0x39,0x91,0xa2,0x04,0x88,
+  0x42,0x20,0x8d,0x2a,0x82,0x00,0xd0,0xce,0xcf,0xc5,0x78,0x22,0x21,0x69,0x8d,0x74,
+  0x71,0xbb,0xc6,0xdc,0x5d,0xe5,0x7c,0x6d,0x41,0x82,0xae,0xcf,0x42,0xc6,0xf4,0x5d,
+  0x5e,0x84,0xb2,0x07,0x95,0xa3,0x00,0x64,0x40,0x4e,0x66,0xb3,0xce,0x96,0x05,0x00,
+  0xd0,0x6e,0xcf,0x6b,0xd3,0xd2,0xaf,0x36,0x38,0x30,0x4d,0x11,0xf0,0x6d,0xbf,0xd4,
+  0x4a,0x1c,0x97,0x09,0x00,0x00,0x34,0x2b,0xbe,0x68,0x7d,0xd3,0x22,0xf7,0x59,0xfa,
+  0x66,0x2a,0x9f,0xb9,0xde,0x34,0xc1,0xee,0xdb,0x3e,0x1e,0x00,0x00,0x00,0x80,0x9c,
+  0x2d,0x7d,0x9b,0x20,0x0e,0x89,0xea,0x77,0x09,0xe7,0xac,0x31,0x05,0xa1,0xdb,0xc7,
+  0x03,0x00,0x00,0x00,0x90,0x93,0xf5,0x9f,0x56,0x74,0x27,0x99,0x9b,0x6f,0x2b,0x0c,
+  0x14,0xa2,0x0c,0xa4,0x6d,0x37,0xf9,0x99,0x6b,0xd8,0xa1,0xac,0xf1,0x62,0x28,0x00,
+  0x00,0x00,0xd0,0xb4,0xd6,0xbf,0xe9,0xda,0x37,0xdd,0xfa,0xb6,0xea,0x80,0xd5,0x5a,
+  0xff,0xae,0xed,0xdb,0x84,0xbe,0x6b,0xfb,0x28,0x00,0x00,0x00,0x00,0x39,0x78,0x00,
+  0xd2,0xea,0xfb,0x57,0x33,0x8e,0x6f,0xfb,0xde,0x5c,0x87,0x2d,0x8e,0x20,0xcb,0xf6,
+  0x51,0x00,0x00,0x00,0x00,0x72,0xf2,0x04,0x24,0x05,0x72,0xfc,0xde,0x25,0xf4,0x43,
+  0xac,0x7e,0xb3,0x18,0x90,0x29,0xd0,0x6b,0xd9,0x3e,0x0a,0x00,0x00,0x00,0x40,0x0e,
+  0x5e,0x80,0x90,0x29,0x78,0x7d,0xae,0x7f,0xf3,0x37,0xf1,0xb0,0x82,0x2d,0x93,0xc0,
+  0x8c,0x27,0xa8,0x66,0xfb,0x28,0x00,0x00,0x00,0x00,0x35,0x5a,0xfe,0xa6,0x80,0x0d,
+  0x11,0xb6,0xb6,0x40,0x3d,0xdb,0xfb,0xa4,0x22,0x10,0x2a,0xe0,0x6b,0x99,0x75,0x10,
+  0x05,0x00,0x00,0x00,0x20,0xc0,0xfa,0xaf,0x66,0xd9,0x34,0x21,0x6f,0xa6,0xee,0xa5,
+  0xd5,0xf5,0x0f,0x4d,0xf7,0x23,0x0b,0x00,0x00,0x00,0xa0,0x81,0xde,0x82,0xa4,0xc0,
+  0xb6,0x05,0xfa,0x99,0x63,0xfd,0xb6,0xb4,0x41,0x9b,0x65,0x1f,0xe2,0x7d,0x20,0x06,
+  0x00,0x00,0x00,0xa0,0x20,0x0f,0x80,0xaf,0x3e,0xbf,0xf9,0xb7,0x2b,0xf0,0xaf,0xda,
+  0x92,0xc1,0xcd,0x32,0x09,0x10,0x0a,0x00,0x00,0x00,0x34,0xbd,0x55,0x9f,0x14,0xb6,
+  0x21,0x95,0xff,0x5c,0xb3,0xfa,0xb9,0xdc,0xf8,0xd5,0xd6,0xff,0x2f,0xf3,0x34,0xc0,
+  0x28,0x00,0x00,0x00,0xd0,0x12,0x5e,0x00,0xdb,0xd8,0xbc,0x6b,0x7a,0x5e,0xd7,0xd4,
+  0xbd,0x2e,0xeb,0xdd,0xe5,0xba,0x4f,0xfb,0x5d,0xda,0xf6,0xcb,0x04,0x73,0x01,0x00,
+  0x00,0x40,0x4b,0x28,0x02,0xa6,0x35,0x6e,0xb3,0xf2,0x6d,0x82,0x39,0x4d,0x48,0x87,
+  0x8e,0xe9,0xa7,0x05,0x0b,0x96,0x55,0x09,0xc0,0x03,0x00,0x00,0x00,0x4d,0x6d,0xfd,
+  0xdb,0x22,0xf9,0x6d,0x9e,0x01,0x97,0xc0,0x4e,0xfb,0xde,0x37,0xce,0x6f,0xdb,0xbe,
+  0xcb,0x33,0x81,0x02,0x00,0x00,0x00,0x50,0xa0,0x17,0x20,0x24,0x5a,0xdf,0x87,0x6b,
+  0x62,0x9f,0x6a,0xbd,0x11,0x28,0x00,0x00,0x00,0x00,0x05,0x79,0x01,0x5c,0x02,0x3b,
+  0x4d,0x70,0xfb,0xb2,0x05,0x5c,0xf5,0x02,0x4c,0xeb,0xdf,0xac,0x08,0x58,0xf6,0x79,
+  0x00,0x50,0x00,0x00,0x00,0xa0,0x69,0xc9,0xc3,0xc5,0x9e,0x56,0xb8,0xc7,0x9c,0x65,
+  0x30,0xa9,0x08,0xa4,0x59,0xfc,0x65,0x16,0xfa,0x28,0x00,0x00,0x00,0xd0,0x32,0xd6,
+  0x7f,0x88,0xe0,0x75,0x45,0xeb,0x9b,0x02,0xdf,0x96,0x36,0x98,0x6c,0xbe,0xb2,0xc0,
+  0xcd,0x20,0xf8,0x51,0x00,0x00,0x00,0xa0,0x25,0x94,0x80,0x90,0xcf,0x6c,0x96,0xbe,
+  0x19,0xc0,0x97,0xfc,0xcc,0x14,0xf0,0x2e,0x6f,0x43,0xd9,0x67,0xfc,0x4b,0x83,0x34,
+  0x40,0x00,0x00,0x68,0x29,0x5c,0x65,0x7e,0xb3,0xa4,0x00,0xba,0xea,0xfe,0xa7,0xfd,
+  0x26,0xcd,0xfb,0x40,0x29,0x60,0x00,0x00,0x80,0x82,0x3c,0x01,0xae,0x09,0x7f,0x6c,
+  0x11,0xfd,0xbe,0xf7,0x69,0x25,0x81,0x43,0x84,0xbf,0x6d,0xfb,0x78,0x00,0x00,0x00,
+  0x00,0x72,0x14,0xfc,0xb6,0xc9,0x7d,0x5c,0xc5,0x78,0x7c,0x9e,0x00,0x73,0x19,0xdf,
+  0x76,0x5d,0x5e,0x87,0xb4,0x32,0xc5,0x78,0x00,0x00,0x00,0x00,0x6a,0x24,0x29,0xb8,
+  0x4d,0xcb,0xdb,0x57,0xa0,0xc7,0x65,0xc1,0x87,0x04,0xf2,0xb9,0xea,0x03,0xf8,0xb6,
+  0x8f,0x02,0x00,0x00,0x00,0x90,0xb3,0x07,0xc0,0xac,0xbe,0x67,0x9b,0x07,0x20,0x29,
+  0xb0,0xb3,0x08,0x65,0x9f,0x90,0x77,0x79,0x05,0x98,0x0c,0x08,0x00,0x00,0xa0,0x0e,
+  0x8a,0x40,0x9a,0xa0,0xaf,0xa5,0x42,0x9f,0xab,0xd8,0x90,0x4d,0xf8,0xdb,0xbc,0x12,
+  0x0c,0x01,0x00,0x00,0x00,0xe4,0x28,0xf4,0xcd,0xbf,0xcd,0xe0,0xbd,0x34,0xc1,0xbb,
+  0x7a,0xf5,0xea,0x54,0x2b,0x3f,0x6d,0x3b,0xa6,0x90,0xf7,0x6d,0x9f,0x21,0x00,0x00,
+  0x00,0x80,0x1c,0xb1,0x15,0xef,0x09,0xad,0xdf,0xef,0x0a,0xdc,0x73,0x59,0xf6,0xa6,
+  0xf0,0xcf,0xb2,0x7d,0x3c,0x00,0x00,0x00,0x00,0x39,0x0b,0x7f,0x9f,0xc5,0x9e,0xe6,
+  0x3d,0x70,0x55,0x08,0x74,0xd5,0x09,0x70,0x65,0x11,0xb8,0xb6,0x8f,0x07,0x00,0x00,
+  0x00,0x20,0x67,0xf2,0x9c,0x03,0xc0,0x16,0x1f,0xe0,0x9a,0xf4,0xc7,0xa6,0x08,0x84,
+  0xae,0x17,0x05,0x00,0x00,0x00,0xa0,0x0e,0xca,0x81,0xab,0x74,0xaf,0x4d,0xb8,0x9b,
+  0x82,0x3e,0xcd,0x7a,0xf7,0xc5,0x0b,0x94,0x7d,0x26,0x40,0x14,0x00,0x00,0x00,0x68,
+  0x49,0x6c,0xd5,0xff,0x42,0x83,0x03,0x5d,0xd9,0x02,0x59,0x84,0xb9,0x6d,0xfb,0x65,
+  0x83,0x4a,0x80,0x00,0x00,0xd0,0xd4,0x96,0x7e,0x5a,0xc0,0x5e,0x9a,0x20,0xb7,0xb9,
+  0xf6,0x93,0xcb,0x66,0xb5,0xe2,0x5d,0xdb,0x2f,0x6b,0x3d,0x00,0x14,0x00,0x00,0x00,
+  0x68,0x7a,0x4b,0xdf,0x66,0xc1,0xbb,0xa6,0xf7,0x35,0x05,0xb2,0x2d,0xc8,0xaf,0x16,
+  0x81,0x1d,0x12,0x1b,0x50,0x06,0x18,0x02,0x00,0x00,0x80,0xa6,0xb5,0xfe,0xe3,0xd7,
+  0xb4,0xa2,0x3b,0xc9,0xfc,0x7c,0x5f,0x59,0xe0,0x6a,0x32,0x08,0x6c,0xf1,0x04,0xb6,
+  0x6d,0xa3,0x00,0x00,0x00,0x00,0xe4,0x64,0xfd,0x27,0x03,0xf8,0xd2,0xea,0xfe,0xbb,
+  0xc6,0xf1,0xb3,0x4c,0xeb,0xeb,0xdb,0xbe,0xf9,0x99,0x6d,0xfb,0x65,0x82,0x21,0x00,
+  0x00,0x00,0x68,0x5a,0x0f,0x80,0x2f,0x35,0xcf,0x36,0x8e,0xef,0x1b,0x93,0xf7,0x8d,
+  0xe3,0xbb,0xe6,0x1b,0x48,0xab,0x19,0x80,0x07,0x00,0x00,0x00,0xa0,0x00,0x4f,0x80,
+  0x69,0xf1,0xa7,0xb9,0xdd,0x5d,0x56,0xbf,0xad,0xac,0xaf,0x69,0xdd,0x57,0xbb,0x7d,
+  0x3c,0x00,0x00,0x00,0x00,0x39,0x7b,0x01,0x92,0xd6,0x76,0xb5,0x11,0xfb,0xae,0xb2,
+  0xc0,0xbe,0x8c,0x01,0xdb,0xf6,0x6d,0x1e,0x06,0x3c,0x00,0x00,0x00,0x00,0x39,0x5b,
+  0xfe,0x69,0x56,0x7d,0xe8,0x6f,0x5d,0x01,0x85,0x49,0xe1,0x6e,0x2a,0x0e,0xae,0xed,
+  0x97,0xb9,0xf8,0x0f,0x0a,0x00,0x00,0x00,0xb4,0x8c,0xf5,0x9f,0x26,0xe4,0x5d,0xb5,
+  0xfa,0x4d,0x81,0xee,0x9b,0xd4,0xc7,0xe6,0x15,0xc8,0x32,0xd1,0x0f,0x1e,0x00,0x00,
+  0x00,0x80,0x06,0x78,0x09,0x5c,0xb5,0xfb,0x93,0x02,0xda,0x5c,0x36,0xb4,0xac,0x6f,
+  0x88,0x70,0xa7,0x0e,0x00,0x00,0x00,0x40,0x41,0x1e,0x00,0x5f,0x7d,0x7e,0x53,0xd8,
+  0xdb,0x3e,0xcf,0x12,0xbc,0x57,0xed,0xf6,0x51,0x00,0x00,0x00,0x00,0x72,0xb0,0xee,
+  0xd3,0x2a,0xef,0xf9,0x2a,0x01,0xfa,0x5c,0xff,0xa1,0x71,0x04,0xa1,0xdb,0x47,0x01,
+  0x00,0x00,0x00,0xc8,0xc9,0x0b,0x60,0x1b,0x9b,0x0f,0xc9,0xcd,0x4f,0x8b,0x11,0xf0,
+  0x79,0x00,0xd2,0x7e,0x97,0xb6,0xfd,0x32,0x41,0x1a,0x20,0x00,0x00,0xb4,0x84,0x22,
+  0x60,0x5a,0xe3,0x69,0x82,0x3e,0xad,0x80,0x4f,0xda,0x7a,0x5d,0x8a,0x81,0x4d,0x69,
+  0x28,0xbb,0x12,0x80,0x07,0x00,0x00,0x00,0x9a,0xda,0xfa,0xb7,0x45,0xf2,0xdb,0x3c,
+  0x03,0x59,0xd2,0xf6,0x5c,0x81,0x7f,0xe6,0xef,0x6c,0xdb,0x77,0x79,0x26,0x50,0x00,
+  0x00,0x00,0x00,0x0a,0xf4,0x02,0xf8,0xa6,0x01,0x0e,0xc1,0x97,0xeb,0x5f,0xcd,0xf6,
+  0xcb,0x06,0x43,0x00,0x00,0x00,0xd0,0x12,0x5e,0x80,0x50,0x81,0x6c,0xfb,0xbd,0xf9,
+  0x3e,0x44,0x91,0xb0,0x55,0x07,0xb4,0x7d,0x46,0x0c,0x00,0x00,0x00,0x40,0x8e,0xd8,
+  0xca,0xff,0x66,0x1d,0x6f,0x77,0xd5,0x04,0x48,0xfb,0xce,0x55,0x0e,0xd8,0xb6,0x8e,
+  0x32,0xc3,0x10,0x00,0x00,0x00,0x34,0xb5,0xf5,0x1f,0x22,0x78,0x5d,0xd1,0xfa,0xf1,
+  0xab,0x2d,0x76,0x20,0xf9,0x9d,0xad,0xce,0x7f,0xb5,0xdb,0x47,0x01,0x00,0x00,0x00,
+  0xc8,0x41,0x09,0x08,0xf9,0xcc,0x66,0xcd,0x9b,0x01,0x7c,0xa6,0x07,0xc1,0x56,0xf7,
+  0x3f,0x2d,0x28,0x30,0x6d,0xac,0x9f,0xd9,0x00,0x01,0x00,0x00,0x0a,0xc6,0x66,0x95,
+  0xbb,0xd2,0xfe,0x5c,0x43,0x06,0xae,0xba,0xff,0x59,0x95,0x11,0x97,0xa7,0x00,0x05,
+  0x20,0xc1,0xca,0x95,0x2b,0xb9,0x6a,0x01,0x00,0x20,0x98,0xb9,0x73,0xe7,0x46,0xaf,
+  0x83,0x06,0x0d,0x4a,0x2d,0xfc,0x63,0x5a,0xfc,0x21,0xef,0xb3,0xba,0xec,0x5d,0x01,
+  0x84,0x49,0xef,0x02,0x0a,0x00,0x00,0x00,0x40,0x81,0x56,0x7f,0x5a,0xbe,0xbf,0x2b,
+  0x80,0x2f,0x29,0xf8,0x43,0x02,0x09,0x6d,0x35,0x00,0xd2,0x3c,0x08,0x4c,0x06,0x04,
+  0x00,0x00,0x90,0x33,0xe6,0xcc,0x7d,0x69,0x55,0xff,0x6c,0xe3,0xfa,0x36,0x45,0x21,
+  0x54,0xe1,0xb0,0x29,0x14,0xae,0xa9,0x86,0x51,0x00,0x00,0x00,0x00,0x72,0xb6,0xfe,
+  0x6d,0xd5,0xff,0x7c,0x56,0x79,0x16,0xa1,0xec,0x13,0xf2,0xb6,0x6d,0x96,0x79,0x1e,
+  0x00,0xa1,0x34,0x43,0x00,0x5d,0xbb,0x32,0x1a,0x01,0x00,0x00,0xe1,0xf4,0xeb,0xd7,
+  0x6f,0x1d,0x41,0x9c,0x7c,0xb5,0xa5,0xfb,0xd5,0xa2,0x64,0xa4,0x59,0xf4,0xb6,0xed,
+  0x9b,0xdf,0xe1,0x01,0x00,0x00,0x00,0xc8,0x01,0x57,0x4a,0x5e,0x68,0x6a,0x9e,0xaf,
+  0xce,0x7f,0xda,0x72,0x2e,0x25,0xc0,0xb5,0x7d,0x86,0x00,0x00,0x00,0x00,0x72,0xc4,
+  0x56,0xbc,0x27,0xb4,0x7e,0x7f,0x5a,0xa0,0x9e,0x19,0x14,0xe8,0x12,0xfe,0xa1,0xdb,
+  0x27,0x0d,0x10,0x00,0x00,0xa0,0x00,0x2f,0x40,0x48,0x10,0x9f,0x4f,0x78,0xdb,0xbe,
+  0xb7,0x59,0xf4,0x69,0xd3,0x0c,0xbb,0xb6,0x5f,0x46,0x0f,0x00,0x0a,0x00,0x00,0x00,
+  0xb4,0x8d,0xb7,0xc0,0x65,0x8d,0xdb,0x26,0xfe,0x09,0x99,0xf4,0xa7,0x99,0x61,0x08,
+  0x00,0x00,0x00,0x9a,0xda,0xfa,0xf7,0x79,0x06,0x5c,0xf3,0x00,0xd8,0x72,0xf9,0xf3,
+  0x9a,0xec,0xa7,0xec,0x33,0x01,0xa2,0x00,0x00,0x00,0x40,0xd3,0x5b,0xf4,0x3e,0x6b,
+  0xdf,0xe5,0xca,0xf7,0x09,0x6f,0xdf,0x3c,0x00,0xd5,0x7a,0x1b,0xca,0x02,0x43,0x00,
+  0x00,0x00,0xd0,0xd4,0x5e,0x00,0x57,0x1e,0xbe,0xcd,0xad,0x6f,0x0a,0xf8,0xb4,0xca,
+  0x7f,0x69,0x56,0xbc,0x6b,0x26,0xc0,0xd0,0x00,0x44,0x14,0x00,0x00,0x00,0x80,0x9c,
+  0xbd,0x00,0x69,0x11,0xfa,0x79,0x05,0xe8,0x85,0x7a,0x10,0xca,0x5a,0x03,0x40,0x60,
+  0x08,0x00,0x00,0x00,0x9a,0xd6,0xfa,0x8f,0x5f,0x6d,0x95,0xf9,0x92,0xcb,0xa5,0xa5,
+  0xf4,0xd5,0xb2,0xdd,0xe4,0xfa,0x5d,0x02,0xbf,0x9a,0xc9,0x85,0x50,0x00,0x00,0x00,
+  0x00,0x52,0xac,0x70,0x73,0xd6,0x3d,0x5f,0xdd,0xff,0xb4,0xe2,0x3f,0x59,0x3d,0x02,
+  0xb6,0xc9,0x80,0x42,0xe6,0x1d,0x28,0x0b,0x0c,0x01,0x00,0x00,0x40,0xd3,0x7a,0x00,
+  0x5c,0xd3,0xf7,0xd6,0x52,0xf7,0xdf,0x55,0xc8,0x27,0xeb,0xfb,0x6a,0xb7,0x8f,0x07,
+  0x00,0x00,0x00,0x20,0xa3,0xc0,0x4e,0x0a,0xee,0xac,0x93,0xfd,0xd8,0x26,0xfc,0x31,
+  0xad,0x7b,0xdb,0x36,0x6d,0x41,0x88,0x65,0x75,0xfb,0xe3,0x01,0x00,0x00,0x80,0x96,
+  0xf1,0x02,0x98,0xd6,0x77,0x16,0xef,0x81,0x4b,0x89,0x08,0xcd,0x18,0x30,0xbf,0x6f,
+  0xa6,0xe2,0x40,0x78,0x00,0x00,0x00,0xa0,0x65,0x14,0x01,0xdf,0x67,0x36,0x81,0x6f,
+  0x06,0x11,0x9a,0x6e,0xfb,0x90,0x71,0xfd,0x66,0xac,0x0a,0x88,0x02,0x00,0x00,0x00,
+  0x2d,0x49,0x5a,0xad,0x7e,0x53,0xa0,0xbb,0xe6,0x05,0x48,0xf3,0x0a,0x64,0xf5,0x38,
+  0xa0,0x00,0x00,0x00,0x00,0xd4,0x51,0x09,0x30,0x95,0x01,0x57,0x9a,0x9e,0x2b,0x63,
+  0xa0,0xd6,0x40,0xbe,0xb2,0xd6,0x02,0x40,0x01,0x00,0x00,0x80,0xa6,0xc4,0x96,0xd2,
+  0x17,0x32,0x3b,0x5f,0xda,0xac,0x7f,0x59,0xc6,0xf1,0xd3,0x52,0x0a,0xcd,0x7d,0x59,
+  0xbd,0x7a,0x35,0x0a,0x00,0x00,0x00,0x40,0x9e,0xd6,0xbd,0x59,0x0b,0x20,0x69,0xf1,
+  0xbb,0x8a,0xff,0xa4,0x55,0xeb,0x0b,0xb5,0xd6,0x7d,0xb3,0x0a,0x96,0x55,0xf0,0xc7,
+  0x90,0x05,0x00,0x00,0x00,0x4d,0xed,0x05,0x30,0xc7,0xed,0x5d,0xb9,0xf8,0x49,0x81,
+  0x6f,0xbe,0xf7,0xcd,0xfe,0xe7,0xda,0xae,0xf9,0x3b,0xf9,0x4c,0x84,0x7e,0x72,0xbf,
+  0xe4,0x6f,0x0a,0x01,0x01,0x00,0x00,0x14,0xa4,0x08,0x98,0xd6,0x79,0x9a,0xa0,0x77,
+  0x7d,0x1f,0xba,0x1d,0xd3,0xc3,0x60,0x1b,0x3a,0xc8,0xaa,0x54,0xd4,0x1b,0x86,0x00,
+  0x00,0x00,0xa0,0xa9,0xad,0x7f,0x57,0xae,0xbe,0x6d,0x88,0x20,0x54,0x38,0x9b,0x69,
+  0x81,0xa6,0x02,0x21,0x56,0x7d,0xec,0xde,0x4f,0xfe,0x3e,0xb6,0xfe,0xe3,0xd7,0xac,
+  0x71,0x05,0x78,0x00,0x00,0x00,0x00,0x32,0xe0,0x72,0xe7,0xa7,0x79,0x09,0x42,0xbd,
+  0x09,0xa6,0x70,0x37,0x97,0x35,0x15,0x11,0x9b,0x72,0x81,0x02,0x00,0x00,0x00,0x50,
+  0xa0,0x17,0x20,0x54,0xe0,0x9b,0x9e,0x02,0x9b,0x17,0x21,0x19,0xc0,0xe7,0x2b,0xf3,
+  0x6b,0xfb,0xcc,0xfc,0x3d,0x0a,0x00,0x00,0x00,0x40,0x8e,0x56,0x7f,0x35,0xc2,0xd5,
+  0x36,0x1c,0x60,0x9b,0xde,0xd7,0xf6,0xb9,0x4b,0xc9,0x30,0xe3,0x01,0x5c,0xd3,0x03,
+  0xa3,0x00,0x00,0x00,0x00,0xd4,0x68,0xfd,0x67,0xf5,0x10,0xd8,0xca,0xfa,0x26,0x05,
+  0xb6,0x39,0xae,0x9f,0x65,0xfa,0x60,0xd7,0x70,0x40,0x59,0x63,0x00,0x08,0x02,0x04,
+  0x00,0x80,0x96,0x55,0x0c,0x4c,0x37,0xbf,0x29,0x8c,0x6d,0x6e,0xfa,0xb4,0x57,0x73,
+  0x1d,0xb6,0xb8,0x00,0x5b,0x70,0x20,0x1e,0x00,0x00,0x00,0x80,0x3a,0x92,0x14,0xc6,
+  0xa6,0x85,0x1e,0xe7,0xe7,0xbb,0x2c,0x74,0xd7,0x04,0x41,0xb6,0xdf,0xd8,0x0a,0xfe,
+  0x94,0x3d,0x0d,0x10,0x05,0x00,0x00,0x00,0x5a,0xc6,0xea,0x4f,0x13,0xe8,0x66,0x60,
+  0x9f,0xcd,0xca,0x77,0x09,0x6f,0x5b,0x51,0xa1,0xd0,0x54,0x42,0x3c,0x00,0x00,0x00,
+  0x00,0x05,0x08,0xfd,0x50,0x21,0xec,0x9b,0xdc,0xc7,0x55,0x4f,0x20,0x2d,0x66,0xc0,
+  0x37,0xe7,0x00,0x0a,0x00,0x00,0x00,0x40,0x81,0x4a,0x80,0x2b,0x75,0xcf,0xb6,0x7c,
+  0x68,0xce,0x7e,0xb2,0x84,0xaf,0x6b,0x38,0xc0,0xa5,0x00,0x54,0x5b,0x69,0x10,0x05,
+  0x00,0x00,0x00,0x20,0x40,0xf8,0xbb,0xd2,0xf5,0xd2,0x84,0x72,0x9a,0x7b,0xdf,0x14,
+  0xd6,0xc9,0x18,0x02,0xd7,0x30,0x40,0x9a,0x27,0x20,0xa9,0x4c,0xa0,0x00,0x00,0x00,
+  0x00,0xe4,0x6c,0xfd,0x87,0x4c,0xff,0xeb,0xf2,0x0e,0xd8,0x4a,0xfd,0xfa,0xaa,0xf9,
+  0xd9,0x3c,0x09,0xc9,0xbf,0xcb,0x5e,0x04,0x08,0x05,0x00,0x00,0x00,0x9a,0x16,0x9b,
+  0x8b,0x3e,0x8b,0xd5,0x6f,0xce,0xd2,0x17,0x32,0x9e,0x9f,0xfc,0x9d,0x99,0x02,0x98,
+  0x26,0xf4,0x19,0x02,0x00,0x00,0x00,0x28,0xc0,0x0b,0xe0,0x12,0xba,0x3e,0xd7,0xbc,
+  0xed,0x33,0x9b,0x52,0xe1,0xf2,0x14,0x84,0x2a,0x22,0x9f,0xf9,0xcc,0x67,0x50,0x00,
+  0x00,0x00,0x00,0x8a,0x52,0x00,0x92,0xae,0xfe,0x58,0x28,0x27,0xf3,0xfd,0x43,0x14,
+  0x88,0xb4,0xd8,0x02,0x73,0xfd,0xbe,0xcc,0x02,0xe1,0xd8,0x63,0x8f,0x55,0xbb,0xec,
+  0xb2,0x4b,0xe9,0x8e,0x1d,0x95,0x00,0x01,0x00,0xa0,0x69,0x85,0xbf,0x59,0x91,0xcf,
+  0x35,0x69,0x8f,0x2f,0x8a,0xdf,0x35,0xe5,0x6f,0x48,0x6c,0x80,0x6b,0x5d,0xf2,0xfb,
+  0xa3,0x8f,0x3e,0x5a,0x7d,0xf4,0xa3,0x1f,0x2d,0xe5,0x7c,0x00,0x78,0x00,0x00,0x00,
+  0xa0,0x29,0xb1,0x59,0xf6,0xc9,0xf1,0x79,0xd3,0x82,0x77,0x59,0xec,0x49,0xa5,0xc1,
+  0x5c,0xa7,0xf9,0x77,0x9a,0x17,0x21,0xb9,0x5d,0xf9,0xec,0xa8,0xa3,0x8e,0x52,0xdb,
+  0x6c,0xb3,0x4d,0xc7,0x72,0xf2,0x79,0xdc,0x92,0xc4,0x7f,0xd7,0x5b,0x49,0x40,0x01,
+  0x00,0x00,0x80,0x96,0xf0,0x02,0xb8,0x2c,0xf3,0xe4,0x72,0x69,0x69,0x83,0xbe,0x39,
+  0x00,0x6c,0xdb,0x76,0xcd,0x35,0xb0,0xf7,0xde,0x7b,0xab,0x2d,0xb7,0xdc,0x32,0x55,
+  0xe8,0xa7,0x29,0x03,0x28,0x00,0x00,0x00,0x00,0x29,0xc2,0xdf,0xf6,0x3e,0xe9,0x0d,
+  0x30,0xbf,0xb3,0xcd,0xfe,0x67,0xce,0x0d,0x90,0xb6,0x7e,0x33,0x06,0x20,0x7e,0x9f,
+  0xcc,0x00,0x18,0x31,0x62,0x84,0xda,0x75,0xd7,0x5d,0xd7,0x12,0xf2,0x66,0x33,0x49,
+  0x7e,0x56,0x2f,0x25,0x00,0x05,0x00,0x00,0x00,0x5a,0x46,0x09,0x48,0x2b,0xd5,0x6b,
+  0x0a,0xea,0x90,0x71,0x7d,0x53,0x20,0x27,0x87,0x18,0x5c,0xeb,0x91,0x71,0xff,0xce,
+  0x9d,0x3b,0xa7,0x2a,0x00,0x3e,0x85,0xa0,0x1e,0x10,0x04,0x08,0x00,0x00,0x4d,0x89,
+  0x6d,0xa6,0x3f,0xdb,0x67,0xf1,0xe7,0xb6,0x80,0x41,0x73,0x7a,0x5f,0xdb,0xdf,0xb2,
+  0x7c,0xdc,0x92,0xdb,0x35,0xd7,0x33,0x7f,0xfe,0x7c,0x75,0xf2,0xc9,0x27,0xab,0xae,
+  0x5d,0xbb,0x5a,0x85,0xbc,0x4d,0x29,0x68,0x24,0x0d,0x57,0x00,0xe4,0x40,0x01,0x00,
+  0x00,0x54,0x23,0xfc,0xcd,0x62,0x3c,0xa6,0x62,0x60,0xbe,0xda,0x04,0xbd,0x2b,0x86,
+  0xc0,0x35,0xee,0x6f,0xcb,0x3e,0x98,0x33,0x67,0x8e,0xfa,0xc2,0x17,0xbe,0xa0,0xfa,
+  0xf4,0xe9,0xd3,0x21,0xec,0xcd,0xe6,0x52,0x02,0x1a,0xa5,0x10,0x34,0x5c,0x01,0xe8,
+  0xdb,0xb7,0x2f,0x57,0x32,0x00,0x00,0x64,0x56,0x00,0x92,0x6e,0xf8,0xa4,0x35,0xee,
+  0xb2,0xe4,0xd3,0xd2,0xfe,0xe2,0xdf,0xbb,0xbc,0x0a,0xa6,0x17,0x21,0xf9,0xfb,0xd9,
+  0xb3,0x67,0x47,0x85,0x7e,0x86,0x0f,0x1f,0x1e,0x09,0xf8,0x2e,0x5d,0xba,0x74,0xbc,
+  0xc6,0xcd,0x54,0x02,0x4c,0x45,0x20,0xa6,0x9e,0x19,0x01,0x0d,0x57,0x00,0x7a,0xf5,
+  0xea,0xc5,0x95,0x0c,0x00,0x00,0x99,0x58,0xb5,0x6a,0x95,0xd5,0x92,0x77,0xb5,0xa4,
+  0x05,0x6f,0x0a,0x79,0xdb,0xe7,0xb1,0x82,0xe1,0xab,0x06,0x28,0x96,0xbf,0x14,0xfa,
+  0xd9,0x78,0xe3,0x8d,0xd7,0x11,0xfe,0x49,0xeb,0xdf,0x54,0x06,0x4c,0xe1,0xdf,0x96,
+  0x1e,0x80,0x81,0x03,0x07,0x72,0x25,0x03,0x00,0x40,0x4d,0x0a,0x40,0x88,0x32,0x60,
+  0x0a,0x78,0xf3,0xf7,0x69,0x7f,0xdb,0x94,0x85,0x79,0xf3,0xe6,0xa9,0xcf,0x7f,0xfe,
+  0xf3,0x6a,0xec,0xd8,0xb1,0xeb,0x08,0x79,0x69,0x32,0xc4,0x2d,0xcd,0xf4,0x02,0x98,
+  0xc3,0x02,0x8d,0x8a,0x07,0x68,0xb8,0x02,0xb0,0xe1,0x86,0x1b,0x72,0x25,0x03,0x00,
+  0x40,0x26,0x42,0x2c,0xfe,0xb4,0x21,0x80,0xf8,0x33,0xc1,0x15,0x14,0x98,0xf6,0xfb,
+  0xa5,0x4b,0x97,0xaa,0x2f,0x7d,0xe9,0x4b,0x6b,0xb9,0xfd,0x5d,0x82,0x3f,0xf9,0xde,
+  0x36,0x1c,0x60,0xba,0xfd,0xdb,0x26,0x0d,0x70,0x83,0x0d,0x36,0xe0,0x4a,0x06,0x00,
+  0x80,0x4c,0xd6,0x7f,0xf7,0xee,0xdd,0xd7,0x49,0xf7,0x33,0x0b,0xf3,0x98,0x42,0xde,
+  0x95,0xef,0x9f,0x5c,0xce,0xf5,0x3e,0xb9,0x1e,0x09,0xf4,0x93,0x80,0xbf,0x1e,0x3d,
+  0x7a,0x58,0x05,0xbf,0xad,0xb9,0xbc,0x00,0xb6,0xa1,0x80,0x7a,0xd1,0x70,0x05,0x60,
+  0xe8,0xd0,0xa1,0x5c,0xcd,0x00,0x00,0x10,0x2c,0xfc,0x63,0x8b,0x3d,0x6d,0x32,0x9e,
+  0x90,0x7c,0x7f,0x73,0xaa,0x60,0x57,0xc9,0xdf,0xe4,0x3a,0xb7,0xda,0x6a,0x2b,0xb5,
+  0xe7,0x9e,0x7b,0xae,0x35,0xd6,0xef,0x12,0xfa,0xdd,0xba,0x75,0xf3,0x2a,0x02,0x8d,
+  0xcc,0x02,0x28,0x85,0x07,0x40,0x0e,0x46,0x3c,0x9e,0x03,0x00,0x00,0x90,0x26,0xfc,
+  0x93,0xc5,0x78,0x42,0xa6,0xe5,0xf5,0x59,0xf5,0xf1,0x7b,0x9b,0x17,0x21,0xb9,0xcc,
+  0xc1,0x07,0x1f,0xac,0x46,0x8f,0x1e,0x6d,0xb5,0xf8,0x45,0xd8,0xbb,0x9a,0x29,0xfc,
+  0x93,0x81,0x80,0x49,0x45,0xa0,0xde,0xd4,0x25,0x06,0xc0,0xd5,0x31,0xf9,0x5c,0x0e,
+  0x8e,0xd4,0x4b,0x06,0x00,0x00,0x48,0x13,0xfe,0x2b,0x57,0xae,0xb4,0x96,0xf7,0x75,
+  0xa5,0xe7,0xb9,0xc6,0xf1,0x4d,0xcb,0xdf,0x57,0x37,0x40,0xda,0xa7,0x3f,0xfd,0xe9,
+  0xb5,0x84,0x7f,0x52,0x01,0x48,0x0a,0x7b,0x19,0x9a,0x88,0x9b,0x4d,0x09,0x90,0x96,
+  0xcc,0x12,0x68,0x64,0x26,0x40,0xa1,0x0a,0x80,0xab,0xde,0xb1,0xd9,0xc9,0xad,0xb7,
+  0xde,0x9a,0xab,0x1b,0x00,0x00,0xac,0x88,0xe0,0x97,0x96,0x14,0xd8,0xb6,0xbc,0x7f,
+  0x9b,0xd0,0xb7,0x7d,0x66,0x56,0x05,0x34,0x97,0x31,0x97,0x17,0xe1,0xbf,0xfe,0xfa,
+  0xeb,0x7b,0x85,0xbf,0xcf,0x03,0xe0,0x1b,0x02,0xf0,0x19,0xcd,0x79,0x53,0xc8,0x10,
+  0x40,0xda,0xcc,0x47,0xb6,0x65,0x37,0xdb,0x6c,0x33,0xae,0x70,0x00,0x00,0x70,0x0a,
+  0xff,0xa4,0x30,0x37,0x05,0xbb,0xe9,0xaa,0x37,0x95,0x02,0x73,0xd2,0x1f,0xdf,0x94,
+  0xc0,0xc9,0x75,0x1d,0x71,0xc4,0x11,0x1d,0x43,0xd5,0x49,0xe1,0x6f,0x13,0xf4,0x36,
+  0xeb,0xdf,0x14,0xfe,0xb6,0xca,0x80,0x8d,0xb0,0xfe,0x0b,0xf7,0x00,0x84,0x7a,0x01,
+  0xa4,0x18,0xd0,0x76,0xdb,0x6d,0xc7,0x95,0x0e,0x00,0x00,0x6b,0x09,0xff,0x15,0x2b,
+  0x56,0xac,0x25,0xa4,0x6d,0x29,0x7b,0x2e,0x8b,0x3e,0x7e,0x75,0xe5,0xff,0xbb,0xaa,
+  0x07,0xc6,0xef,0x45,0xf8,0x4b,0xa0,0x7a,0x9a,0xf0,0x4f,0x0a,0xfd,0xa4,0xf0,0xb7,
+  0x0d,0x01,0xb8,0x52,0x01,0x1b,0x61,0xfd,0x17,0xe6,0x01,0x70,0x29,0x01,0x69,0x9e,
+  0x01,0x99,0x3a,0xf1,0xc5,0x17,0x5f,0xe4,0x8a,0x07,0x00,0x80,0x48,0xf0,0xc7,0x96,
+  0xbf,0xad,0x5e,0xbf,0x29,0xe4,0x93,0xd6,0xbd,0x6b,0x26,0xc0,0xb4,0x38,0x81,0x78,
+  0xf9,0xfe,0xfd,0xfb,0xab,0x71,0xe3,0xc6,0x75,0x8c,0xf7,0x27,0x23,0xfd,0xe5,0xd5,
+  0x27,0xfc,0x5d,0xe3,0xff,0x69,0x95,0x00,0x1b,0x55,0x08,0xa8,0x6e,0x59,0x00,0xa6,
+  0x86,0x63,0x36,0x29,0xa6,0x30,0x72,0xe4,0x48,0x35,0x6d,0xda,0x34,0xae,0x7c,0x00,
+  0x80,0x36,0x17,0xfe,0xb1,0xe5,0x6f,0x0a,0xef,0xe4,0x54,0xbc,0x49,0xd7,0x7e,0x32,
+  0xed,0x2f,0x29,0xd8,0x4d,0x65,0xc0,0x1c,0x06,0x88,0x3f,0xfb,0xe8,0x47,0x3f,0x1a,
+  0xc5,0xa3,0xf5,0xee,0xdd,0x3b,0xfa,0xcc,0x55,0xdc,0xc7,0x25,0xfc,0xa5,0x26,0x80,
+  0x4d,0x09,0xf0,0x0d,0x01,0x34,0xaa,0x06,0x40,0x21,0x0a,0x80,0x79,0xa0,0x6d,0xd6,
+  0xbe,0xab,0xed,0xb7,0xdf,0x7e,0xea,0xaa,0xab,0xae,0xe2,0xea,0x07,0x00,0x68,0x73,
+  0xe1,0x6f,0x0a,0xe8,0x18,0xd3,0xc5,0xef,0xca,0xdd,0x37,0x2d,0x7e,0x9b,0xe5,0x2f,
+  0x95,0x68,0xc5,0xfb,0x2c,0x01,0x7e,0x49,0x19,0x95,0xac,0xdf,0x9f,0xb4,0xfc,0x63,
+  0x05,0x20,0x4d,0xf8,0xdb,0x02,0x00,0x7d,0xf3,0x00,0x34,0x8a,0xc2,0x3d,0x00,0xae,
+  0x09,0x0f,0x6c,0xf3,0x24,0x0f,0x1b,0x36,0x4c,0x6d,0xb2,0xc9,0x26,0x6a,0xf2,0xe4,
+  0xc9,0xdc,0x05,0x00,0x00,0x6d,0xc6,0xf2,0xe5,0xcb,0xad,0x96,0xbf,0x59,0xac,0x27,
+  0x69,0xf5,0xbb,0x02,0x00,0x6d,0x7f,0xcb,0xfb,0x9e,0x3d,0x7b,0xaa,0xdd,0x76,0xdb,
+  0x4d,0x6d,0xba,0xe9,0xa6,0x91,0x40,0x8e,0x89,0x05,0xb3,0x39,0x93,0x9f,0x2f,0xd5,
+  0xaf,0x1a,0xcb,0xbf,0x0c,0xd6,0x7f,0xa1,0x0a,0x40,0x88,0xf5,0x6f,0x1e,0x04,0x39,
+  0x48,0x07,0x1d,0x74,0x90,0xba,0xfc,0xf2,0xcb,0xb9,0x13,0x00,0x00,0xda,0xd0,0xf2,
+  0x8f,0x05,0xb5,0x6d,0x0c,0xdf,0x66,0xd5,0x27,0x5d,0xff,0xae,0xdf,0x08,0x9b,0x6f,
+  0xbe,0x79,0xe4,0xe6,0x97,0x31,0xfe,0x58,0x71,0x30,0x65,0x51,0x56,0xe1,0x5f,0xcd,
+  0xd8,0x7f,0x59,0x84,0x7f,0x61,0x0a,0x40,0xb2,0x8a,0x92,0xaf,0x99,0x1a,0x91,0xd4,
+  0x58,0x96,0xa1,0x80,0xfb,0xef,0xbf,0x9f,0x3b,0x02,0x00,0xa0,0x4d,0x2c,0x7f,0x69,
+  0xa6,0xf0,0xb7,0xb9,0xf0,0x6d,0xa9,0x7a,0x36,0x17,0xbf,0x2c,0x27,0xc2,0xfe,0x63,
+  0x1f,0xfb,0x58,0x14,0x5f,0x96,0x5c,0x36,0x29,0x84,0x4d,0xcb,0x3c,0xe9,0xf6,0xb7,
+  0x09,0xff,0xf8,0xd5,0x74,0xfb,0x9b,0xc2,0xdf,0x9c,0x19,0xd0,0x55,0xf6,0xb7,0x91,
+  0xc3,0x00,0x0d,0xc9,0x02,0xb0,0x1d,0xf4,0xe4,0x67,0x12,0x88,0x31,0x71,0xe2,0x44,
+  0x35,0x75,0xea,0x54,0xee,0x0c,0x00,0x80,0x36,0x10,0xfe,0xb6,0x2a,0x7d,0x36,0x81,
+  0x6f,0xab,0xe7,0x9f,0xfc,0x3c,0x19,0xd0,0x27,0x42,0xda,0x26,0x83,0xcc,0x99,0xf8,
+  0x5c,0x96,0xbf,0x19,0xf4,0x97,0x96,0xf6,0x67,0x0a,0x7f,0xd3,0xf5,0x6f,0x7a,0xbd,
+  0x1b,0x2d,0xfc,0x0b,0x55,0x00,0x7c,0xd6,0xbe,0x4d,0xeb,0x4a,0xfe,0x2d,0x35,0x97,
+  0xaf,0xbe,0xfa,0xea,0x68,0xca,0x45,0x00,0x00,0x68,0x4d,0xe1,0x2f,0xcf,0xf8,0xa4,
+  0x40,0xf4,0x05,0xf2,0x99,0xc2,0x3f,0x1e,0x02,0x18,0x31,0x62,0x44,0x34,0xb6,0xbf,
+  0xde,0x7a,0xeb,0xad,0xa5,0x0c,0xa4,0xc9,0xa2,0x50,0xe1,0xef,0x52,0x00,0x92,0x9f,
+  0x27,0x27,0xff,0x49,0x5a,0xfd,0xf2,0x5a,0x46,0xe1,0x1f,0x2b,0x00,0x32,0x0b,0x4f,
+  0x97,0xa2,0xad,0xff,0x34,0x97,0x8b,0xa9,0x04,0xc8,0xab,0x1c,0xd4,0xa3,0x8e,0x3a,
+  0x4a,0x5d,0x73,0xcd,0x35,0xce,0x31,0x1d,0x00,0x00,0x68,0x4e,0x96,0x2d,0x5b,0xd6,
+  0xe1,0xf6,0x77,0x4d,0xe2,0x63,0x8b,0xf4,0x4f,0x0a,0x4e,0x91,0x13,0xbb,0xef,0xbe,
+  0x7b,0x14,0x3c,0x2e,0x82,0x37,0x5e,0x26,0x59,0x5d,0xcf,0x74,0xbd,0xdb,0xe4,0x4e,
+  0x48,0x89,0x5f,0x53,0xe0,0xbb,0x6a,0xfd,0xdb,0xc6,0xfb,0xcd,0xc9,0x7e,0xca,0x20,
+  0xfc,0x45,0xf6,0x8b,0x02,0x20,0x67,0xa0,0x57,0x91,0x5b,0xf1,0x79,0x01,0x4c,0x6d,
+  0x29,0xfe,0xbc,0x6f,0xdf,0xbe,0xea,0xc8,0x23,0x8f,0x54,0x37,0xde,0x78,0x23,0x77,
+  0x0b,0x00,0x40,0x8b,0x20,0x56,0x7f,0x72,0xcc,0xdf,0x25,0xf8,0xcd,0xef,0x63,0x8b,
+  0x7f,0x8b,0x2d,0xb6,0xe8,0x08,0xe8,0x4b,0x0e,0x03,0xd8,0x84,0xbd,0x4f,0xf6,0xc8,
+  0x6b,0x72,0xcc,0xdf,0xa7,0x00,0x98,0xef,0x6d,0x75,0xfe,0xcd,0xd9,0xfe,0xca,0x64,
+  0xf5,0x27,0x1d,0x30,0xa2,0x00,0x2c,0x29,0x4a,0x01,0x70,0x45,0xfd,0xbb,0x34,0x2f,
+  0xd3,0x15,0x23,0xef,0x07,0x0d,0x1a,0xa4,0x0e,0x3d,0xf4,0x50,0x75,0xc7,0x1d,0x77,
+  0x70,0xd7,0x00,0x00,0xb4,0x80,0xe5,0x2f,0xcd,0xb4,0xec,0xcd,0xbf,0xcd,0x98,0x80,
+  0x01,0x03,0x06,0x44,0x01,0x7d,0xa3,0x46,0x8d,0x5a,0x6b,0x7d,0xae,0xaa,0x7a,0xa6,
+  0xbc,0x09,0xb5,0xfc,0x43,0x14,0x00,0x97,0xcb,0x3f,0x44,0xf8,0x97,0x48,0x09,0x58,
+  0xd2,0x49,0x1f,0xd8,0x89,0xfa,0xcd,0xd8,0xbc,0xd7,0x1c,0xd7,0x59,0x8e,0x5b,0x3c,
+  0x95,0x63,0x9c,0xea,0x11,0x5f,0x04,0xd2,0x44,0x1b,0x34,0x5b,0xfc,0x5d,0x9c,0x17,
+  0x3a,0x6f,0xde,0x3c,0x75,0xf3,0xcd,0x37,0x33,0x1c,0x00,0x00,0xd0,0xc4,0x96,0xbf,
+  0x3c,0xd7,0x6d,0x81,0x7c,0xb6,0xb2,0xbe,0xf2,0xba,0xe3,0x8e,0x3b,0xa6,0x06,0xf4,
+  0xb9,0x02,0xfb,0x42,0x05,0xbf,0x2d,0xea,0x3f,0xa9,0x00,0xd8,0x94,0x01,0x53,0x59,
+  0x30,0x3d,0xd8,0x4d,0x20,0xfc,0x85,0x49,0xe2,0x01,0x98,0x55,0x84,0x02,0x60,0x3b,
+  0x41,0x3e,0xeb,0xdf,0xd5,0x44,0x81,0xe8,0xd7,0xaf,0x9f,0x1a,0x3f,0x7e,0xbc,0xba,
+  0xed,0xb6,0xdb,0x08,0x0c,0x04,0x00,0x68,0x42,0xe1,0x9f,0x7c,0x76,0xbb,0x66,0xea,
+  0x13,0xa4,0x34,0xbc,0x8c,0xed,0x87,0x06,0xf4,0xf9,0x04,0xbf,0xe9,0x5d,0x76,0x09,
+  0xff,0xa4,0xf5,0x6f,0x53,0x02,0x6c,0x82,0xdf,0x37,0xe6,0x5f,0x52,0xe1,0x2f,0xcc,
+  0x12,0x05,0xa0,0xd0,0xe2,0xfb,0x21,0xc1,0x17,0xe6,0x41,0x95,0x26,0x1e,0x03,0x69,
+  0x49,0x2f,0x82,0x54,0x70,0x3a,0xfa,0xe8,0xa3,0xd5,0x43,0x0f,0x3d,0x44,0x8a,0x20,
+  0x00,0x40,0x93,0x09,0x7f,0x33,0x72,0x3f,0xf9,0x5e,0x5c,0xec,0x12,0xc5,0x3f,0x76,
+  0xec,0xd8,0xcc,0x01,0x7d,0xa6,0x7c,0x49,0x0a,0x64,0xdb,0xf0,0x72,0x9a,0xf0,0x37,
+  0x95,0x00,0xf3,0x7d,0xf2,0x77,0x65,0xad,0xf0,0x17,0xc8,0x34,0x51,0x00,0xa6,0x14,
+  0x29,0xfc,0x6d,0x05,0x81,0x42,0xc6,0x5f,0x62,0x05,0x40,0x5a,0xec,0x05,0x88,0xc7,
+  0x84,0xf6,0xda,0x6b,0xaf,0x68,0xd2,0x20,0x51,0x04,0x00,0x00,0xa0,0xbc,0x2c,0x59,
+  0xb2,0x24,0x72,0xfb,0xbb,0xca,0xf6,0xca,0x74,0xbb,0xfb,0xee,0xbb,0x6f,0x47,0x40,
+  0x5f,0x4c,0x48,0x40,0x9f,0xe9,0x55,0x0e,0xb1,0xf8,0x6d,0xc2,0xdf,0xa5,0x04,0xd8,
+  0x84,0xbe,0xcf,0xe5,0xdf,0x24,0xc2,0x5f,0x98,0x22,0x0a,0xc0,0xa4,0xa2,0x85,0x7f,
+  0xfc,0xea,0xaa,0xb8,0x14,0x0b,0xfa,0x58,0xd3,0x4a,0x0a,0xff,0xd8,0x0b,0x60,0xce,
+  0xfb,0x2c,0x39,0x9f,0xc7,0x1d,0x77,0x9c,0x7a,0xf2,0xc9,0x27,0xd5,0x94,0x29,0x53,
+  0xb8,0xcb,0x00,0x00,0x4a,0x28,0xfc,0xa5,0x25,0x05,0x7e,0x5c,0x89,0x4f,0x82,0xf9,
+  0x0e,0x38,0xe0,0x00,0x6b,0x3d,0xfe,0xac,0x01,0x7d,0xa1,0x42,0x3f,0x44,0x01,0x70,
+  0x7d,0xe7,0xca,0x56,0x2b,0x63,0x85,0xbf,0x40,0xa2,0x18,0x80,0x17,0x8b,0xde,0x8a,
+  0x2b,0x06,0x40,0x84,0x79,0x52,0x09,0x88,0x85,0x7f,0xfc,0x1a,0xbb,0xfe,0x4d,0xe1,
+  0x1f,0x5f,0x48,0xf2,0xf7,0x2e,0xbb,0xec,0xa2,0x76,0xd8,0x61,0x07,0xf5,0xd4,0x53,
+  0x4f,0xa9,0x77,0xde,0x79,0x87,0x3b,0x0e,0x00,0xa0,0xa4,0xc2,0x5f,0x9e,0xed,0x5b,
+  0x6d,0xb5,0x55,0x14,0xcd,0x9f,0x4c,0xdf,0xab,0x25,0xa0,0xcf,0x14,0xfa,0xe6,0xf0,
+  0x72,0x9a,0xf0,0x4f,0x7b,0xef,0xb2,0xf6,0xd3,0xac,0xfe,0x26,0x12,0xfe,0xc2,0x8b,
+  0x92,0x05,0xd0,0x57,0xbf,0x99,0x27,0xca,0x57,0xde,0x6b,0x37,0x85,0x75,0x9c,0x0d,
+  0x60,0x66,0x04,0xc4,0xa5,0x20,0x93,0x59,0x01,0xc9,0x2c,0x81,0x64,0x36,0x40,0xdc,
+  0xe2,0x75,0x24,0xd7,0x2b,0xdb,0x79,0xf5,0xd5,0x57,0xd5,0x84,0x09,0x13,0xb8,0xfb,
+  0x00,0x00,0x1a,0x2c,0xfc,0x63,0x21,0x2f,0xee,0xfd,0x71,0xe3,0xc6,0xa9,0x8d,0x36,
+  0xda,0x68,0x9d,0x89,0x78,0xd2,0xaa,0xf4,0x85,0x08,0x7d,0x5f,0x70,0x5f,0xe8,0xe7,
+  0xae,0x66,0x6e,0xd7,0x54,0x4c,0x92,0x0a,0x4c,0x13,0x09,0x7f,0x09,0xbc,0xe8,0xdf,
+  0x55,0xef,0xec,0x42,0x7d,0x92,0x5e,0xd2,0x7f,0x6c,0x5f,0x84,0xe5,0x6f,0x46,0x70,
+  0xca,0x01,0x8b,0x5d,0x40,0xb1,0x17,0x40,0x4e,0x48,0x2c,0xc4,0x93,0xaf,0xa6,0x07,
+  0xc0,0x9c,0x16,0x52,0x90,0x65,0x93,0x0a,0x87,0x68,0x97,0xdb,0x6c,0xb3,0x8d,0x9a,
+  0x3f,0x7f,0xbe,0x7a,0xf3,0xcd,0x37,0xd5,0xeb,0xaf,0xbf,0xbe,0xd6,0x32,0x00,0x00,
+  0x50,0x1c,0x8b,0x17,0x2f,0x8e,0x8c,0x38,0x99,0xd8,0x6d,0xfb,0xed,0xb7,0x8f,0x9e,
+  0xc9,0xb1,0xa0,0x34,0x27,0xe2,0xa9,0x36,0x8a,0x3f,0x74,0x7c,0xdf,0xf5,0xb9,0xaf,
+  0x0e,0x8d,0xcd,0xcd,0x1f,0x32,0xd6,0xdf,0x24,0xc2,0x5f,0x78,0x49,0xef,0xeb,0xa2,
+  0x78,0x2e,0x80,0x47,0x8b,0x50,0x00,0x92,0x8a,0x80,0xa9,0x04,0x24,0x15,0x80,0xa4,
+  0x12,0x20,0x4d,0xa2,0x41,0xd3,0x84,0xbe,0xa9,0x71,0xc5,0x7f,0xc7,0xd1,0xa4,0xf2,
+  0x2a,0x17,0xdf,0x47,0x3e,0xf2,0x91,0x28,0x7f,0x54,0x7e,0x2b,0xda,0xa8,0xd4,0x12,
+  0x98,0x39,0x73,0x66,0xa4,0x1c,0xc8,0xdf,0x8b,0x16,0x2d,0x8a,0xbc,0x08,0x00,0x00,
+  0x90,0x1d,0xc9,0xcd,0x17,0xeb,0x5e,0xd2,0xb4,0xa5,0x50,0x4f,0x3c,0xac,0x3b,0x66,
+  0xcc,0x98,0x75,0x02,0xc0,0xe3,0xe7,0xb4,0x2f,0x98,0xcf,0x26,0xf4,0x43,0xc7,0xf6,
+  0xb3,0x58,0xf7,0xa6,0x42,0x91,0x45,0xe8,0x9b,0xfd,0x6a,0x32,0xe1,0x1f,0xcb,0xfc,
+  0x8e,0xc9,0x80,0xee,0xd5,0xed,0xf4,0xa2,0x84,0xbf,0x2d,0x8f,0x33,0xf6,0x04,0xc8,
+  0x01,0x4f,0x8e,0xf1,0xc7,0x16,0xbf,0x69,0xfd,0xc7,0xda,0xa3,0x4b,0xa9,0x88,0x3d,
+  0x07,0xf1,0xf6,0x92,0xbf,0x95,0xcf,0x7a,0xf5,0xea,0x15,0x35,0x89,0x38,0x4d,0x42,
+  0x61,0x21,0x00,0x80,0xda,0x8c,0x3b,0xd7,0x73,0x39,0xeb,0xd8,0x7e,0x35,0x42,0x3f,
+  0x8b,0xf0,0xf7,0x59,0xf8,0xb6,0xc0,0x3e,0xdf,0x38,0x7f,0x93,0x09,0x7e,0x95,0x90,
+  0xf9,0x1d,0x0a,0xc0,0x7d,0xba,0xad,0xd0,0xad,0x5b,0x3d,0xbd,0x00,0x49,0x05,0x20,
+  0xf6,0x02,0xd8,0xac,0xfe,0x34,0xc1,0x2f,0x16,0xbc,0xbc,0xc6,0xc2,0x3f,0x56,0x1c,
+  0x64,0xfd,0xe6,0xf0,0x81,0xb9,0xae,0x64,0x10,0x0a,0x00,0x00,0xd4,0xa6,0x04,0xa4,
+  0x29,0x00,0x45,0x8d,0xeb,0xa7,0x09,0xfe,0xb4,0xb9,0x66,0xd2,0x2c,0xfd,0x34,0xa1,
+  0xdf,0xc4,0x56,0x7f,0xcc,0x8a,0x35,0x32,0xff,0x43,0x05,0x40,0x77,0x62,0x81,0x16,
+  0x86,0x0f,0xe8,0xb7,0x07,0xd5,0xc3,0x0b,0x90,0x1c,0x0f,0x32,0xbd,0x00,0x3e,0x05,
+  0xc0,0x54,0x22,0x4c,0x57,0x52,0x32,0x7e,0xc0,0x54,0x02,0x92,0xdb,0xc4,0x03,0x00,
+  0x00,0x90,0xbf,0xe0,0xf7,0x3d,0xa3,0xab,0x4d,0xdd,0x0b,0x15,0xfe,0x79,0x0a,0x7d,
+  0x97,0xb5,0xdf,0xe4,0x86,0xe3,0x03,0x22,0xf3,0x93,0x1e,0x00,0xe1,0xba,0xa2,0x14,
+  0x00,0xd7,0x05,0x13,0x2b,0x02,0x49,0xc1,0xec,0x1a,0xf7,0xf7,0x69,0x94,0x71,0x56,
+  0x40,0x2c,0xf4,0xd3,0x82,0x08,0x6d,0x9e,0x00,0x00,0x00,0xc8,0xd7,0xf2,0x4f,0xab,
+  0xd2,0xe7,0xab,0xce,0x17,0xf2,0x99,0xed,0xf7,0xa1,0xee,0xfd,0xb4,0x71,0x7d,0x57,
+  0x54,0x7f,0x8b,0x78,0x8c,0xaf,0x8b,0xdf,0x24,0x15,0x80,0x9b,0x75,0xfb,0xad,0x6e,
+  0x3d,0x8b,0xf6,0x02,0x24,0x15,0x80,0x64,0x46,0x80,0x2d,0xd8,0xcf,0xb6,0x1e,0xdb,
+  0x05,0x15,0x0b,0x7f,0x5b,0x09,0x61,0x33,0x26,0x20,0x29,0xf4,0x6d,0xdb,0x43,0x21,
+  0x00,0x00,0x70,0x0b,0x7c,0x9f,0xe0,0x0f,0x99,0xfe,0x3d,0xc4,0xd2,0x0f,0x0d,0xea,
+  0x73,0x55,0x02,0x34,0x15,0x90,0x90,0x80,0xbe,0x16,0x16,0xfc,0xc2,0xd2,0x35,0xb2,
+  0x7e,0x6d,0x05,0x40,0x77,0x70,0xae,0x16,0x7c,0x37,0xea,0xb7,0x9f,0xa9,0xe7,0x45,
+  0x94,0x1c,0x0e,0x48,0x56,0x84,0xb2,0x09,0xfd,0x34,0x8d,0x32,0x6e,0x66,0x05,0x41,
+  0x5b,0x31,0xa1,0xa4,0xc7,0x01,0xa1,0x0f,0x00,0x50,0x9b,0xf5,0x1f,0x22,0xfc,0x43,
+  0x2d,0xfe,0x50,0x05,0x20,0x34,0x65,0xcf,0x15,0xd0,0x67,0xee,0xbb,0x4d,0x3e,0xb5,
+  0x60,0x8c,0xd8,0x8d,0x22,0xeb,0x6d,0x1e,0x00,0xe1,0x8a,0x22,0x15,0x80,0x64,0x59,
+  0x60,0x53,0x01,0x08,0xb1,0xfa,0x4d,0x05,0x20,0xbe,0x10,0xa4,0x30,0x50,0x7c,0xb1,
+  0x88,0x27,0x20,0xa9,0x00,0xc4,0x05,0x82,0x4c,0x4f,0x80,0xcb,0x0b,0x80,0x22,0x00,
+  0x00,0x10,0x26,0xf8,0x93,0xcf,0xe7,0xf8,0x79,0x6e,0x7b,0x4e,0xa7,0x59,0xfe,0x21,
+  0x95,0xf8,0xb2,0x8c,0xed,0xdb,0x04,0x7f,0x9b,0x5a,0xfb,0x36,0xae,0x48,0xfe,0xd1,
+  0xd5,0x38,0xb9,0x8f,0x68,0x01,0xf8,0x8c,0x7e,0xbb,0x73,0x3d,0x95,0x00,0x33,0x1e,
+  0x20,0x4d,0x01,0x48,0x5e,0x54,0x22,0xf8,0x93,0x43,0x00,0xd2,0x92,0x4a,0x80,0x19,
+  0x0b,0x10,0x12,0x0f,0x80,0x22,0x00,0x00,0xa0,0x52,0x2d,0x61,0x5f,0xd0,0x5f,0x16,
+  0xb7,0xbf,0xad,0xde,0x7e,0x88,0x9b,0xbf,0xd6,0x28,0xfe,0x36,0x12,0xfa,0x31,0xcf,
+  0x88,0x8c,0x77,0x2a,0x00,0x6b,0xb8,0x58,0xb7,0xbf,0x16,0x7d,0x31,0x25,0x95,0x80,
+  0x38,0x70,0xcf,0xa6,0x04,0xa4,0xb9,0x95,0xe2,0x0b,0x23,0x16,0xfe,0xb1,0xe0,0x4f,
+  0x2a,0x00,0xe6,0x9c,0x02,0xc4,0x02,0x00,0x00,0x54,0x2f,0xfc,0x6d,0x82,0xdf,0xe6,
+  0xa5,0xb5,0x4d,0xc9,0x9b,0xc5,0xfd,0x6f,0x2b,0xd4,0x53,0x6d,0x40,0x5f,0x9b,0x5a,
+  0xfb,0x36,0xd9,0xbe,0xf6,0x79,0xb4,0x08,0x3d,0x91,0xc2,0x32,0x41,0xd0,0xd6,0x45,
+  0xee,0x89,0x4d,0x00,0x27,0x85,0x74,0x52,0x80,0x27,0x85,0x7a,0x52,0xd8,0xdb,0x9a,
+  0x6d,0x26,0x41,0xdf,0x30,0x80,0x29,0xe8,0x11,0xfc,0x00,0x00,0x6e,0x45,0xc0,0xa7,
+  0x00,0x84,0xa6,0xfa,0xb9,0xac,0x7e,0x57,0x50,0x1f,0x01,0x7d,0x55,0x23,0x13,0xe4,
+  0x6c,0xa7,0xfb,0xbe,0x3a,0xd5,0x03,0x20,0x0b,0x68,0x01,0xf8,0x3d,0xfd,0xf6,0x86,
+  0x7a,0x79,0x01,0x92,0xd3,0x05,0x27,0x3d,0x01,0x3e,0xf7,0x92,0x79,0x21,0xb9,0x14,
+  0x80,0x90,0x79,0x05,0xd2,0x84,0x3e,0x0a,0x01,0x00,0x60,0xf9,0xfb,0x3d,0x00,0x69,
+  0x41,0xda,0x21,0x19,0x00,0xa1,0x82,0x9f,0x80,0xbe,0xcc,0x9c,0x67,0x0a,0x7f,0xab,
+  0x07,0x20,0x21,0xf4,0xee,0xd7,0x2f,0xfb,0x16,0xbd,0x57,0x36,0x4f,0x40,0xb2,0x14,
+  0x70,0xb2,0x99,0xc2,0xdd,0xf4,0x0e,0xf8,0x84,0x7f,0xa8,0x02,0x80,0xc0,0x07,0x00,
+  0xc8,0xc7,0x03,0x10,0x32,0x6d,0xaf,0x4d,0xf0,0x63,0xed,0xe7,0x86,0x14,0xfe,0xd9,
+  0xcf,0x7a,0x4e,0x53,0x04,0xf3,0x96,0xfa,0xe5,0x05,0xdd,0xba,0x37,0x4a,0x09,0xf0,
+  0x29,0x02,0x2e,0xa5,0xc0,0x36,0xa3,0xa0,0x2d,0x06,0x00,0xe1,0x0f,0x00,0x50,0xbd,
+  0x12,0x90,0x25,0x08,0x30,0xed,0x35,0x6b,0x3d,0x7e,0xdb,0xf6,0x11,0xfa,0x56,0x96,
+  0xeb,0xb6,0xbd,0x3e,0x26,0xaf,0xda,0xbe,0xec,0x9a,0x72,0xa2,0x5f,0xd5,0xc2,0xf0,
+  0x12,0xfd,0xf6,0x5b,0xf5,0xb8,0xa8,0x5c,0x75,0xf9,0x5d,0x5a,0x5f,0x72,0xb8,0x20,
+  0xce,0xff,0x77,0x09,0xfe,0x34,0xeb,0x1f,0xe1,0x0f,0x00,0x50,0x9b,0x12,0x10,0x5a,
+  0xf3,0x3f,0x8f,0x2a,0x7d,0x58,0xfb,0x99,0xb8,0xc4,0x25,0xfc,0x53,0x3d,0x00,0x6b,
+  0x04,0x62,0x6f,0xfd,0xf2,0x6f,0xdd,0xc6,0xd4,0x6b,0x6f,0x6d,0xc1,0x79,0xa6,0xe5,
+  0xee,0x12,0xf0,0x69,0x82,0x1f,0xf7,0x3f,0x00,0x40,0xbe,0xc2,0x3f,0xab,0x12,0xe0,
+  0x52,0x0c,0xd2,0x52,0xf8,0xb0,0xf6,0xab,0x66,0x8a,0x6e,0xdb,0xe8,0x63,0xb4,0xb8,
+  0x2a,0x05,0x60,0x8d,0x40,0xdc,0x5d,0xbf,0x3c,0xac,0x0a,0x9c,0x29,0x30,0x4d,0x09,
+  0x48,0x2a,0x03,0xe6,0xd0,0x80,0x6b,0x0a,0x61,0x53,0xe8,0x23,0xfc,0x01,0x00,0x1a,
+  0xa7,0x04,0xd8,0xc6,0xf3,0xb3,0x58,0xfb,0x04,0xf4,0x65,0x46,0x66,0xfc,0xdb,0x4b,
+  0x1f,0xa7,0x27,0x52,0xcf,0x65,0xa0,0x40,0xfe,0x9a,0xb2,0xe4,0x10,0xd6,0x43,0x09,
+  0x08,0x55,0x04,0x5c,0x02,0xdf,0x57,0xfc,0x27,0x24,0x0b,0x00,0x00,0x00,0x94,0x55,
+  0xf0,0xdb,0x2c,0x74,0x9b,0x60,0x77,0x09,0x7c,0x57,0x34,0x3f,0xd6,0x7e,0x4d,0x9c,
+  0xad,0x8f,0xd7,0x25,0xde,0xf3,0x98,0x41,0x20,0xdf,0xa6,0x5f,0x0e,0xab,0x77,0x2f,
+  0x4c,0x45,0x20,0x4d,0x19,0x70,0x29,0x07,0xb6,0xe5,0x6d,0x42,0x1f,0x25,0x00,0x00,
+  0xa0,0x3a,0x0f,0x80,0xcb,0x13,0x10,0xda,0x6c,0xeb,0x43,0xf0,0x57,0xc5,0xed,0xfa,
+  0x98,0xfd,0x47,0xd0,0xb9,0xcc,0x20,0x88,0x07,0xeb,0x97,0x27,0x75,0x1b,0xdb,0x88,
+  0x1e,0xf9,0x3c,0x02,0x2e,0xa5,0xc0,0xb5,0x5c,0x9a,0xd0,0x47,0x11,0x00,0x00,0x70,
+  0x0b,0x7e,0x97,0x32,0x90,0x96,0x93,0x4f,0x69,0xde,0xba,0x30,0x49,0xb7,0xdd,0xf4,
+  0xf1,0x9b,0x93,0xab,0x02,0xb0,0x46,0x30,0x4a,0x30,0xe0,0x63,0xba,0x0d,0x6b,0x54,
+  0xef,0x5c,0x8a,0x80,0xcd,0x43,0x90,0xf6,0x19,0x02,0x1f,0x00,0x20,0x3f,0x85,0x20,
+  0x64,0x58,0xc0,0xb5,0x1c,0x82,0x3f,0x17,0x66,0xe8,0x36,0x4e,0x1f,0xc3,0x29,0xc1,
+  0xe7,0xb0,0x0a,0x01,0xbc,0xbd,0x7e,0x79,0x48,0xb7,0x01,0x8d,0xec,0xa9,0x4b,0x88,
+  0xa7,0x59,0xf9,0xa1,0x01,0x7f,0x28,0x04,0x00,0x00,0x7e,0x0f,0x80,0xcb,0x13,0xe0,
+  0x13,0xf0,0x04,0xf5,0xe5,0xce,0x3c,0xdd,0xf6,0xd6,0xc7,0xf1,0x85,0x4c,0xe7,0xb4,
+  0x4a,0xe1,0xbb,0xb7,0x7e,0xf9,0xbf,0xba,0xf5,0x2c,0x43,0xcf,0x7d,0x16,0x7d,0x88,
+  0xe0,0x47,0xe8,0x03,0x00,0xd4,0xa6,0x0c,0xa4,0x59,0xf3,0x08,0xfd,0xc2,0x58,0xaa,
+  0xdb,0xc1,0xfa,0x78,0x3e,0x94,0xf9,0x3c,0xd6,0x20,0x74,0x45,0x09,0xb8,0xb5,0xd1,
+  0x9e,0x80,0x2c,0xc2,0x3c,0x54,0xc8,0xa3,0x0c,0x00,0x00,0x84,0x7b,0x00,0xb2,0x2a,
+  0x07,0x90,0xab,0xe5,0x7f,0x78,0x35,0xc2,0xbf,0x26,0x05,0x60,0x8d,0xa0,0xdc,0x7e,
+  0x8d,0x27,0x60,0x58,0x33,0x1d,0x31,0x04,0x3c,0x00,0x40,0x63,0x14,0x04,0xc8,0x8d,
+  0x19,0x6b,0x2c,0xff,0x17,0xaa,0x3e,0x67,0x39,0x08,0x53,0x09,0x0c,0xbc,0x47,0x35,
+  0x28,0x3b,0x00,0x00,0x00,0xa0,0xcd,0x90,0x68,0xff,0x83,0xb2,0x04,0xfc,0xd9,0xe8,
+  0x9c,0x83,0xd6,0x27,0x3b,0xb0,0x9b,0x6e,0xb7,0x73,0x4e,0x00,0x00,0x00,0x0a,0x45,
+  0x64,0xed,0x6e,0xb5,0x0a,0xff,0x5c,0x14,0x80,0x35,0x4a,0xc0,0x9c,0x35,0x85,0x07,
+  0xce,0x56,0x1f,0x96,0x20,0x04,0x00,0x00,0x80,0xfc,0x10,0xd9,0x2a,0x15,0xfe,0xfe,
+  0x23,0x34,0xcf,0xdf,0x2b,0xbb,0xf3,0xde,0xc3,0x35,0x73,0x07,0x5c,0xa3,0xea,0x38,
+  0x81,0x10,0x00,0x00,0x40,0x0b,0x23,0xd6,0xfe,0x09,0xbe,0xda,0xfe,0x0d,0xf1,0x00,
+  0x18,0xde,0x00,0xd9,0xc1,0x6d,0x74,0xfb,0x89,0xfa,0x70,0x2e,0x62,0x00,0x00,0x00,
+  0xc8,0xce,0xf2,0x35,0xb2,0x74,0x9b,0xbc,0x85,0x7f,0x21,0x1e,0x00,0xc3,0x1b,0xb0,
+  0xa5,0x7e,0xb9,0x4c,0xb7,0x7d,0x39,0x8f,0x00,0x00,0x00,0xc1,0x3c,0xa0,0xdb,0x57,
+  0xb4,0xe0,0x7f,0xb5,0xa8,0x0d,0x74,0x2e,0x72,0xef,0x65,0xc7,0x75,0xdb,0x4f,0xbf,
+  0x3d,0x5a,0xb7,0x09,0x9c,0x4f,0x00,0x00,0x80,0x54,0x44,0x56,0x1e,0x2d,0xb2,0xb3,
+  0x48,0xe1,0x5f,0xb8,0x07,0xc0,0xf0,0x06,0x88,0xb2,0x31,0x5e,0x7d,0x18,0x28,0xb8,
+  0x33,0xe7,0x18,0x00,0x00,0xa0,0x83,0x67,0x74,0xbb,0x58,0xb7,0xeb,0xb5,0xe0,0x5f,
+  0x5d,0x8f,0x0d,0x36,0xa4,0x72,0x83,0x56,0x06,0xf6,0xd4,0x2f,0xa7,0xea,0x76,0x94,
+  0x2a,0x49,0x39,0x61,0x00,0x00,0x80,0x3a,0x23,0x65,0x7c,0x6f,0xd4,0xed,0x0a,0x2d,
+  0xf4,0x1f,0xa9,0xf7,0xc6,0x1b,0x5a,0xba,0x49,0x2b,0x02,0x83,0xf4,0xcb,0x11,0xba,
+  0x1d,0xab,0x3e,0x8c,0x13,0xe8,0xc6,0xf5,0x00,0x00,0x00,0x2d,0x8c,0xa4,0xf3,0xc9,
+  0xf8,0xfe,0x75,0xba,0xdd,0xac,0x05,0xff,0xdc,0x46,0xed,0x48,0x69,0x6a,0x37,0x6a,
+  0x65,0xa0,0x9f,0x7e,0x39,0x40,0xb7,0xfd,0x75,0xdb,0x43,0xb7,0x6d,0x55,0xc1,0x31,
+  0x0a,0x00,0x00,0x00,0x05,0x23,0xee,0xfc,0x97,0x74,0x7b,0x54,0xb7,0xfb,0x74,0xbb,
+  0x57,0x0b,0xfd,0x05,0x65,0xd8,0xb1,0xd2,0x16,0x6f,0xd6,0x0a,0x41,0x5f,0xf5,0x61,
+  0x3a,0xe1,0x76,0xea,0xc3,0x32,0xc3,0x52,0x57,0x60,0xa4,0x6e,0xeb,0xe9,0x36,0x58,
+  0xb7,0x5e,0xba,0x75,0xd7,0xad,0x0b,0xd7,0x17,0x00,0x00,0x34,0x80,0x55,0xea,0xc3,
+  0x54,0xbd,0x25,0xba,0x49,0x71,0x9e,0x59,0xba,0x4d,0x53,0x1f,0xe6,0xed,0x4b,0xb9,
+  0xde,0x17,0x45,0xf8,0x6b,0x81,0xbf,0xa8,0x8c,0x3b,0xff,0xff,0x00,0xa9,0xd9,0x66,
+  0x33,0x79,0x3c,0x5d,0x0d,0x00,0x00,0x00,0x00,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,
+  0x82,
+  
+};
diff --git a/tools/printer-lg.png b/tools/printer-lg.png
new file mode 100644 (file)
index 0000000..439c59c
Binary files /dev/null and b/tools/printer-lg.png differ
index 95c42c5c966650f8a7d1055db8a995d27ee4ae2a..192b1fd6b461b551fe7269f0fca04c8fa6e25e88 100644 (file)
@@ -2,304 +2,450 @@ static const unsigned char printer_png[] =
 {
   0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,
   0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x08,0x06,0x00,0x00,0x00,0xc3,0x3e,0x61,
-  0xcb,0x00,0x00,0x12,0x8c,0x49,0x44,0x41,0x54,0x78,0x01,0xec,0xd5,0x01,0x44,0x2c,
-  0x51,0x14,0xc6,0xf1,0xcf,0x06,0x10,0x25,0x45,0xa9,0x01,0x12,0x48,0x02,0x01,0x10,
-  0x64,0x42,0x28,0x28,0x03,0xa1,0x24,0x01,0xc5,0x14,0x04,0x29,0x50,0x29,0x54,0x01,
-  0x50,0x51,0xa0,0xc8,0xc0,0x50,0xa1,0x28,0x80,0x0a,0x02,0x01,0xad,0x10,0xb2,0xc4,
-  0x32,0xbb,0xcb,0xff,0xed,0xbb,0x76,0xc7,0x1a,0xdb,0xbe,0x17,0xc0,0x6d,0x7e,0x1c,
-  0xec,0x39,0xe3,0x0c,0xf7,0xdb,0xbb,0xab,0x46,0x00,0x07,0xf0,0x81,0x10,0xc8,0x02,
-  0x11,0x16,0xb0,0x5c,0x54,0xc9,0x2a,0xac,0x64,0xe7,0xe8,0xa7,0x80,0x6e,0xe0,0x18,
-  0x28,0x61,0x3b,0xfb,0x95,0x2a,0x59,0x76,0xff,0x6f,0xf8,0x2e,0x90,0xc3,0x36,0xa9,
-  0x1c,0xe0,0xaa,0x11,0x60,0xce,0xea,0x5b,0x9f,0x2a,0x01,0x73,0x8d,0x6e,0x7e,0x09,
-  0xdb,0xa5,0x4a,0x80,0x5b,0xef,0x3f,0x3f,0xc7,0x6f,0x91,0xca,0x01,0xdd,0xaa,0x02,
-  0x8e,0x49,0x18,0x1c,0x1c,0xa4,0xa7,0xa7,0x87,0xf5,0xf5,0x75,0xac,0x94,0x3a,0x56,
-  0x59,0x06,0x70,0x24,0x79,0x4a,0xc8,0x66,0xb3,0xa6,0x3e,0x3f,0x3f,0x65,0xa5,0x94,
-  0x67,0xb2,0x07,0x7c,0xea,0x58,0x5e,0x5e,0x66,0x7e,0x7e,0x9e,0xf3,0xf3,0x73,0x52,
-  0xd6,0xf2,0x05,0x84,0xa4,0x7e,0xab,0x30,0x23,0xa9,0x5f,0x75,0x1c,0x1c,0x1c,0x68,
-  0x73,0x73,0x53,0xb7,0xb7,0xb7,0xaa,0xf5,0xfc,0xfc,0x6c,0xfa,0x5b,0x5b,0x5b,0x2a,
-  0x16,0x8b,0xfa,0xf8,0xf8,0xd0,0xc9,0xc9,0x89,0xa6,0xa7,0xa7,0x35,0x35,0x35,0xa5,
-  0xed,0xed,0x6d,0xbd,0xbf,0xbf,0xeb,0x5f,0x3b,0x01,0x3d,0x3c,0x3c,0x68,0x6d,0x6d,
-  0x4d,0x63,0x63,0x63,0x5a,0x5a,0x5a,0x52,0x10,0x04,0x6a,0xe4,0xed,0xed,0x4d,0xbb,
-  0xbb,0xbb,0xf2,0x3c,0x4f,0x13,0x13,0x13,0xda,0xd8,0xd8,0xd0,0xeb,0xeb,0xab,0x6a,
-  0xed,0xed,0xed,0x99,0x77,0x5c,0x5d,0x5d,0xe9,0x3b,0x37,0x37,0x37,0xe6,0x99,0xa3,
-  0xa3,0x23,0x25,0x5d,0x5e,0x5e,0xca,0xf7,0x7d,0x8d,0x8e,0x8e,0x6a,0x61,0x61,0x41,
-  0xa7,0xa7,0xa7,0x02,0x64,0xa9,0x7e,0x01,0x11,0x75,0xb4,0xb7,0xb7,0x23,0x89,0xc5,
-  0xc5,0x45,0x6a,0xed,0xef,0xef,0x23,0xc9,0xd4,0xd3,0xd3,0x13,0x9d,0x9d,0x9d,0x48,
-  0xaa,0x2d,0xd3,0x2b,0x87,0xdb,0x70,0xe7,0xca,0xca,0x0a,0x92,0x48,0xd6,0xec,0xec,
-  0x2c,0x85,0x42,0x81,0xa4,0x30,0x0c,0x69,0x6b,0x6b,0x23,0xf9,0x7c,0x4b,0x4b,0x8b,
-  0x99,0x55,0xb9,0xae,0x6b,0xfa,0xbd,0xbd,0xbd,0x7c,0xa7,0xaf,0xaf,0x0f,0x49,0x94,
-  0x03,0xa6,0xea,0xeb,0xeb,0x8b,0xc9,0xc9,0x49,0xd3,0x4f,0xd6,0xf8,0xf8,0x38,0xf9,
-  0x7c,0x1e,0x0b,0x45,0x22,0xf6,0xf3,0x2f,0x40,0x57,0x57,0x17,0x99,0x4c,0x86,0xa1,
-  0xa1,0x21,0x73,0x98,0xc3,0xc3,0xc3,0xf1,0xcc,0x71,0x1c,0xa2,0x28,0xaa,0xbb,0xb3,
-  0xb5,0xb5,0x15,0x49,0x7f,0x3f,0x9b,0x43,0x9f,0x99,0x99,0xa9,0xce,0x4c,0x1d,0x1e,
-  0x1e,0x52,0xeb,0xe5,0xe5,0x85,0xa6,0xa6,0x26,0x33,0x1b,0x19,0x19,0x21,0x08,0x02,
-  0x2e,0x2e,0x2e,0x18,0x18,0x18,0x30,0xbd,0x8e,0x8e,0x8e,0x38,0xa0,0xb3,0xb3,0xb3,
-  0x78,0xcf,0xfd,0xfd,0x3d,0x49,0x77,0x77,0x77,0xf1,0xfc,0xf1,0xf1,0x91,0x2a,0xcf,
-  0xf3,0x4c,0xaf,0xb9,0xb9,0x99,0x9d,0x9d,0x1d,0xae,0xaf,0xaf,0x59,0x5d,0x5d,0x8d,
-  0xdf,0x5b,0xfe,0xc5,0xc3,0x46,0x7f,0xd8,0x33,0x03,0x8f,0xda,0x82,0x20,0x8c,0x7f,
-  0x3d,0xb7,0xaa,0x22,0x88,0x50,0x54,0x49,0x52,0x10,0x08,0x55,0x55,0x10,0x08,0x22,
-  0x80,0x0a,0xa8,0xa0,0x84,0x82,0x42,0xe8,0x9f,0xa8,0x92,0x84,0x90,0x00,0xa9,0x28,
-  0x54,0x14,0x92,0x84,0x40,0x44,0x29,0x52,0xa9,0x54,0x29,0x85,0x6a,0xde,0x67,0x98,
-  0x63,0x9d,0xb7,0x75,0xea,0x7a,0x91,0xea,0xc7,0x70,0xdf,0xee,0xdb,0xdd,0x75,0x76,
-  0x76,0x67,0xbe,0x29,0x6e,0x07,0xb0,0xdb,0xb7,0xb8,0xb8,0x28,0x0e,0xea,0x08,0xd6,
-  0x3f,0x3a,0x3a,0xea,0x9b,0x53,0xad,0xb9,0xb9,0x59,0xee,0xef,0xef,0xc5,0xd8,0xdb,
-  0xdb,0x93,0x8c,0x8c,0x8c,0xc0,0x79,0x18,0x5e,0xc4,0x68,0x6c,0x6c,0xd4,0xf6,0xd2,
-  0xd2,0x52,0x79,0x7a,0x7a,0x12,0x83,0xa1,0x46,0x92,0x92,0x92,0xb4,0x8f,0xe1,0x45,
-  0xdb,0x1e,0x1e,0x1e,0x74,0x5f,0x00,0xa4,0xb3,0xb3,0x53,0xc2,0x30,0x54,0x69,0x5f,
-  0x79,0x79,0xb9,0x18,0x9b,0x9b,0x9b,0x92,0x90,0x90,0x20,0x00,0xd4,0x81,0x5c,0xba,
-  0xba,0xba,0xcc,0xd9,0x6d,0x4f,0xc6,0xaf,0x03,0x6c,0x6f,0x6f,0x4b,0x98,0xe3,0xe3,
-  0xe3,0xe0,0xd6,0xb4,0xb4,0xb4,0x78,0xe7,0x6c,0x6a,0x6a,0x92,0x97,0x97,0x17,0x09,
-  0xa1,0xaa,0xc3,0xe6,0x66,0x6c,0xd7,0xb6,0xf3,0xf3,0xf3,0xa0,0x8d,0xf9,0x85,0x84,
-  0xa9,0xaa,0xaa,0xd2,0xbe,0xb6,0xb6,0x36,0x31,0x3a,0x3a,0x3a,0x82,0x97,0xe6,0xf1,
-  0xf1,0x51,0x8c,0x9b,0x9b,0x1b,0x49,0x4b,0x4b,0xd3,0xbe,0xb1,0xb1,0xb1,0xf0,0x21,
-  0xab,0x03,0x86,0xf7,0xc5,0x5c,0x22,0x58,0x7f,0x7f,0x7f,0xdf,0xe9,0xf9,0x75,0x00,
-  0xfd,0xa0,0x3e,0x72,0x73,0x73,0xb5,0x9f,0x87,0x13,0x39,0xa7,0xcb,0xc4,0xc4,0x84,
-  0xcd,0xad,0x1f,0x9e,0xe8,0x33,0x6e,0x6d,0x65,0x65,0x65,0xc2,0xe4,0xcf,0x35,0xc9,
-  0xcc,0xcc,0xd4,0xbe,0xfa,0xfa,0x7a,0x31,0xdc,0x31,0x33,0x33,0x33,0x62,0x8c,0x8c,
-  0x8c,0xd8,0x33,0xaf,0x31,0xdf,0x68,0x68,0x68,0xd0,0xf6,0xc4,0xc4,0xc4,0x7f,0xe6,
-  0xaf,0xae,0xae,0x0e,0xe6,0x5a,0x5d,0x5d,0x15,0x63,0x7a,0x7a,0x5a,0xd7,0x8c,0xb2,
-  0x9e,0x9e,0x1e,0xf9,0xca,0xfc,0xc1,0x27,0xc0,0x83,0x06,0xc1,0xc5,0xc5,0x45,0x5c,
-  0xe3,0xdc,0xb1,0xbc,0x75,0xae,0x02,0x01,0x63,0xbf,0x6b,0xb8,0xbc,0xbc,0x04,0x51,
-  0x35,0x62,0x54,0x56,0x56,0xa2,0xa8,0xa8,0x08,0xc4,0xcd,0xf4,0x31,0x3e,0x3e,0x0e,
-  0xa2,0x6a,0x85,0x4e,0x00,0xe2,0xae,0xa1,0xaa,0x26,0x3c,0xff,0xfa,0xfa,0x3a,0x0c,
-  0x77,0x8d,0x83,0x83,0x03,0xd0,0x21,0x22,0x6d,0x6b,0x6b,0x0b,0x5f,0x99,0x4f,0x71,
-  0x80,0xdb,0xdb,0x5b,0x10,0xb0,0x94,0x1c,0xd7,0x38,0x77,0x2c,0x13,0x3c,0x18,0x94,
-  0x8c,0x58,0x59,0x59,0xf1,0xda,0xe4,0xe4,0x24,0x5c,0x18,0x12,0x40,0xc0,0x1c,0x05,
-  0x67,0x67,0x67,0xea,0x3c,0x76,0x18,0xed,0xed,0xed,0x30,0xdc,0x35,0x0a,0x0a,0x0a,
-  0xbc,0x73,0x9b,0xf1,0x46,0x83,0xd8,0x1c,0x3a,0x67,0x84,0xa9,0x44,0xfe,0xca,0xc4,
-  0xf0,0x9f,0x61,0x92,0x86,0x93,0x93,0x93,0xe0,0x83,0x7e,0x84,0xa3,0xa3,0x23,0x18,
-  0x36,0x96,0x89,0x1f,0x0c,0x11,0xb1,0x43,0x88,0xa4,0xb5,0xb5,0x15,0x83,0x83,0x83,
-  0xba,0x1f,0x6a,0x79,0xbd,0xb1,0x04,0x54,0x0e,0xa0,0x6a,0x81,0x61,0x6b,0x6c,0x6c,
-  0x6c,0xe8,0xbe,0x2b,0x2a,0x2a,0x90,0x9c,0x9c,0x8c,0x28,0x18,0x7a,0xd4,0xe2,0xe0,
-  0xfb,0xbc,0x00,0xd4,0xeb,0x08,0x33,0x3f,0x3f,0x0f,0x66,0xf7,0x20,0x60,0x0e,0x10,
-  0x3d,0xce,0x81,0xf1,0x3a,0x38,0xfc,0xec,0xec,0x6c,0x80,0x50,0x11,0x20,0x3f,0x3f,
-  0x1f,0x20,0xc3,0xc3,0xc3,0xb8,0xbe,0xbe,0xc6,0x7b,0xc8,0xcb,0xcb,0x03,0x65,0x29,
-  0x40,0x98,0xf0,0x61,0x6a,0x6a,0xca,0x77,0xfb,0x95,0x9a,0x9a,0x1a,0x80,0x30,0x61,
-  0x04,0x25,0x20,0xe2,0xe0,0x67,0x3a,0x40,0x6d,0x6d,0xad,0x1b,0xe3,0xb4,0x52,0xc7,
-  0x02,0x0f,0x88,0x1e,0x1a,0x55,0x00,0x7c,0x30,0x19,0x43,0x7f,0x7f,0xbf,0xeb,0x08,
-  0x5a,0x99,0x63,0x61,0x09,0x20,0x03,0x03,0x03,0xa0,0x2c,0x83,0x5b,0xdd,0x23,0xfa,
-  0x94,0xb3,0x28,0x83,0xc3,0xc3,0x43,0x18,0xcf,0xcf,0xcf,0x3a,0x6e,0x69,0x69,0x09,
-  0x61,0x28,0xf9,0x00,0xb2,0xbb,0xbb,0x8b,0xab,0xab,0x2b,0xa4,0xa6,0xa6,0xfa,0xf6,
-  0xa4,0xe1,0x82,0xb2,0x10,0x20,0x43,0x43,0x43,0xea,0x30,0x22,0x02,0x83,0x4a,0x04,
-  0x73,0x73,0x73,0xfa,0x42,0x7c,0x3b,0xe2,0x55,0x01,0xae,0x15,0x17,0x17,0x0b,0x6f,
-  0x91,0xa4,0xa7,0xa7,0xeb,0xbf,0xf9,0x84,0xca,0xec,0xec,0xec,0x6b,0x73,0x9a,0x69,
-  0x36,0x5e,0x57,0x57,0xa7,0x55,0x3b,0x6b,0xa3,0x53,0x79,0x2b,0x81,0xdd,0xdd,0xdd,
-  0xc1,0xff,0xa1,0xf6,0x57,0x45,0xc0,0xa7,0xdc,0xd6,0xd4,0xdf,0x61,0xee,0xee,0xee,
-  0x74,0x0d,0x00,0x8e,0x54,0xf4,0xb3,0xb3,0xb3,0x23,0x39,0x39,0x39,0x6e,0x91,0x4b,
-  0x55,0x4c,0x61,0x61,0x61,0xd0,0xb6,0xb0,0xb0,0xf0,0x73,0x64,0x60,0x56,0x56,0x96,
-  0x00,0x90,0xde,0xde,0xde,0x57,0x1d,0x60,0x79,0x79,0x59,0x4a,0x4a,0x4a,0xdc,0x43,
-  0xd5,0x0f,0xc6,0xcc,0xf9,0x2d,0xa7,0x52,0xdd,0xdd,0xd7,0xd7,0x27,0x29,0x29,0x29,
-  0xc1,0x38,0xfe,0x16,0x3e,0xcf,0x56,0x3d,0xf4,0xc2,0x3a,0xbd,0xeb,0x2c,0x6a,0xb1,
-  0x58,0x4c,0x0b,0x44,0x7c,0x79,0x44,0xf1,0x17,0x7e,0xd4,0xd6,0xd6,0xd6,0xe4,0x2d,
-  0xf8,0xa7,0x6f,0xad,0x5d,0x58,0xad,0xc0,0x8c,0xb1,0x5e,0x25,0x1d,0x93,0xba,0x6f,
-  0xea,0x00,0x1f,0xc0,0x57,0x07,0x38,0x3d,0x3d,0xd5,0x43,0xe7,0x13,0x29,0xca,0x3b,
-  0x5f,0x15,0xde,0x74,0x2d,0xc7,0xd2,0xf4,0xf7,0x7b,0x61,0x1e,0x20,0x4c,0xda,0x74,
-  0xdc,0x5f,0x76,0xce,0x40,0x23,0xde,0x26,0x0a,0xe3,0x07,0xdd,0x40,0xd7,0x51,0xa1,
-  0x44,0x00,0x54,0x20,0x29,0x50,0x04,0xd0,0x05,0xa4,0x1b,0x88,0x80,0x82,0xa8,0x00,
-  0xba,0x82,0x84,0x2e,0x23,0x21,0x20,0x52,0x74,0x2d,0xf3,0xfd,0x3c,0x3c,0x2c,0x8d,
-  0xf5,0x1d,0xbb,0xfd,0x8d,0xed,0xfc,0x18,0x6f,0x6f,0xb3,0xdb,0xf6,0xce,0x9c,0x9d,
-  0x99,0x39,0xe7,0x3c,0x23,0x47,0xcf,0x9c,0x61,0x5a,0x69,0x9f,0x9f,0x9f,0x0d,0x83,
-  0x91,0xb7,0x71,0x3a,0x65,0x00,0xd3,0x48,0x39,0x82,0x8a,0xa1,0x1d,0x41,0x45,0xed,
-  0x02,0x8a,0x32,0x00,0x56,0xed,0x71,0x7b,0x7b,0x1b,0x77,0x77,0x77,0xc1,0x62,0x29,
-  0x32,0x5c,0x5d,0x5d,0xe9,0xbd,0xf8,0xd8,0xa3,0x18,0x84,0x56,0xfc,0x69,0xa2,0xf5,
-  0x29,0xca,0x00,0x8a,0x32,0x80,0xa2,0x0c,0xa0,0x28,0x03,0x28,0xca,0x11,0x54,0xac,
-  0xaf,0xaf,0x2b,0x34,0x8d,0x16,0xe1,0x2f,0xfa,0x01,0x8a,0xdf,0xd4,0x4a,0x92,0x88,
-  0x3a,0xba,0x01,0x14,0xa7,0xa7,0xa7,0x41,0xd6,0x72,0x90,0x24,0x1a,0x73,0x42,0x0e,
-  0xb1,0xe5,0xe5,0x65,0xe5,0x2d,0xfc,0x41,0x47,0x50,0xb1,0xb2,0xb2,0xd2,0x22,0x42,
-  0xa2,0x94,0x24,0xb5,0x06,0x98,0x5d,0x77,0xd8,0xd7,0x3a,0x32,0xcc,0x2b,0xf5,0x0c,
-  0xe1,0x8a,0x32,0x97,0xb2,0x5a,0x49,0x84,0x29,0xca,0x1e,0x3a,0x3b,0x3b,0x8b,0xc3,
-  0xc3,0xc3,0x40,0x5d,0xe4,0xcc,0x65,0xe1,0x0c,0x25,0xde,0xa3,0x0c,0xa7,0x80,0xf7,
-  0xf7,0xf7,0xe0,0x5e,0xe5,0xfe,0xfe,0x3e,0xaf,0x89,0xcc,0x3f,0xcf,0xe2,0x8d,0x00,
-  0x39,0xdd,0x61,0x3f,0xbc,0x4d,0x8e,0x81,0x65,0x6b,0xd6,0x0e,0xa6,0x32,0xa4,0x48,
-  0x3c,0x6d,0x9b,0x9b,0x9b,0xbe,0x9f,0xcc,0x2e,0x92,0xc0,0xc5,0x90,0x9f,0xd8,0xfd,
-  0xff,0x9c,0x25,0x95,0xd7,0x44,0xe6,0x9f,0xc7,0x2c,0x9c,0x01,0x24,0x75,0x87,0x6e,
-  0x30,0x6b,0x0c,0x2d,0x40,0x51,0x63,0xd1,0x51,0x09,0x03,0x90,0x20,0xd5,0x1d,0x2e,
-  0x63,0x5b,0x5d,0x5d,0x75,0x9d,0x32,0xa0,0xcc,0xc7,0xc7,0x47,0xbb,0xbe,0xbe,0xf6,
-  0xdf,0x6c,0x6b,0x6b,0x6b,0xba,0xa7,0x34,0x82,0x65,0x69,0x4d,0x64,0xe2,0x79,0x16,
-  0xdb,0x00,0x12,0xba,0xc3,0x5e,0x83,0x49,0xe8,0xfa,0xfc,0xfc,0x3c,0x53,0x8e,0x24,
-  0xd3,0x8d,0x32,0x8a,0x40,0x57,0xe7,0x24,0x92,0xa1,0x9c,0x5e,0x03,0x24,0x34,0x91,
-  0x89,0xe7,0x59,0x70,0x3f,0x00,0xba,0xc3,0x78,0x7a,0x7a,0x72,0xa8,0x5a,0xf0,0xcd,
-  0xd4,0xfc,0xe9,0xf9,0x54,0x59,0xc5,0x1d,0x98,0x37,0xf5,0xfe,0x59,0x76,0x0a,0x37,
-  0x37,0x37,0x41,0xc3,0x07,0xe8,0xba,0xb1,0xb1,0x11,0xa0,0x75,0x40,0x06,0x94,0x51,
-  0x4a,0xb1,0xf7,0xdf,0x65,0x24,0x08,0xc3,0x08,0xe3,0x2c,0xe6,0x78,0x7d,0x7d,0x0d,
-  0x48,0x3c,0xcf,0x82,0x6f,0x03,0xd1,0x14,0x38,0xa5,0xdc,0x08,0x8b,0x41,0x2c,0xeb,
-  0xea,0xc1,0xb0,0x1d,0x33,0xa0,0xce,0x37,0x86,0xb3,0x12,0x22,0x0d,0x7c,0x7d,0x7d,
-  0x85,0x41,0x5d,0xa4,0x45,0xdc,0x64,0x61,0x21,0xf9,0x43,0x4c,0x93,0x7e,0x1e,0x58,
-  0x8a,0x45,0x23,0xa1,0x3b,0x9c,0x37,0xfa,0xe6,0xcf,0x4e,0x4f,0x13,0xa9,0xd2,0x43,
-  0x7a,0xc5,0x72,0x04,0xe5,0x75,0x87,0xa3,0x93,0xd3,0x44,0x4e,0xa1,0x46,0x80,0xbe,
-  0xee,0x70,0x24,0xac,0x42,0x32,0x79,0x4d,0x64,0x8d,0x00,0x69,0xdd,0xe1,0x08,0x78,
-  0x61,0xf7,0xfd,0xfd,0x1d,0x06,0xf2,0x9a,0xc8,0x32,0x80,0xbc,0xee,0x70,0x00,0xb4,
-  0x3b,0x09,0x78,0x7b,0x7b,0xeb,0xcc,0xe5,0x09,0x4d,0xe4,0xe0,0x06,0xa0,0x68,0xd7,
-  0xe3,0xe3,0xa3,0x24,0xdb,0x7b,0x7b,0x7b,0xe1,0xc2,0x89,0x5e,0x81,0x83,0x23,0x76,
-  0x76,0x76,0x54,0x76,0x77,0x77,0x55,0xf8,0x9d,0x5c,0xb8,0x47,0x47,0x47,0x0a,0x94,
-  0x70,0xca,0x46,0x5c,0x5e,0x5e,0x06,0x7b,0xdc,0x60,0x5f,0x1b,0x34,0x98,0xc4,0x9e,
-  0x1d,0xd4,0x30,0x38,0x54,0x24,0xdd,0x66,0xd8,0xd4,0x41,0x11,0x78,0x06,0x2d,0x66,
-  0xd5,0xdf,0x1b,0x04,0x3d,0xa3,0xff,0x67,0x9c,0x46,0xc1,0xbd,0x5c,0xc8,0x66,0x7f,
-  0x7f,0x3f,0xd0,0x44,0x06,0xe8,0xb0,0x09,0x4e,0x37,0x0b,0x8e,0xf0,0x8d,0xad,0xad,
-  0xad,0xc0,0x13,0xa8,0x10,0xf5,0xc5,0xc5,0xc5,0x98,0xc1,0x20,0x3a,0xbd,0xe1,0x37,
-  0x97,0x53,0x86,0x8e,0x68,0x9c,0xbb,0xa7,0x42,0xa7,0xfb,0xda,0x2d,0xae,0x9b,0xf6,
-  0x7a,0x4e,0x00,0x91,0x63,0x85,0x86,0xd3,0xe7,0xcc,0xa0,0x3b,0x94,0x67,0xd0,0xaf,
-  0x63,0xa1,0xd8,0xfe,0x97,0x56,0x32,0xf1,0xfe,0x93,0x93,0x13,0xd5,0xd1,0x71,0xad,
-  0x07,0x1d,0x68,0x51,0xaa,0x0a,0x9d,0x9b,0xd6,0x44,0xe6,0x9f,0x47,0x88,0xf8,0x8d,
-  0x8e,0xe7,0xdb,0xd9,0x8e,0x8f,0x8f,0x1b,0xdf,0x6a,0x79,0xb3,0x26,0x0b,0x56,0xed,
-  0xeb,0xe4,0xcf,0xbd,0xfa,0x1f,0x85,0x50,0xac,0x3a,0x1f,0xa3,0x52,0x21,0xf0,0x22,
-  0x0f,0x19,0x9f,0x99,0xd0,0x1d,0x8e,0x86,0xda,0x4c,0xea,0x64,0x8e,0xb0,0x93,0x40,
-  0x35,0xaf,0x89,0x1c,0x23,0x25,0x4c,0x5a,0x41,0x9c,0x16,0x8d,0x28,0x58,0x3b,0x38,
-  0x38,0x98,0x57,0x51,0xc7,0xe3,0xf9,0xd2,0xe9,0x62,0x93,0x07,0x38,0xb1,0x9f,0x57,
-  0x43,0x30,0x12,0xe4,0x75,0x87,0xa2,0x58,0x8a,0x39,0x40,0xa4,0x4b,0xe1,0x56,0x0e,
-  0x57,0x0c,0x3a,0x64,0x5e,0x0e,0x11,0x39,0x6c,0xd0,0xf8,0x6b,0xdf,0xce,0x09,0x5e,
-  0x61,0x0c,0x75,0x3a,0xce,0x85,0xe1,0x30,0x8a,0x7f,0xeb,0x07,0xd0,0xc2,0xe5,0xe5,
-  0xe5,0x45,0xb1,0x6f,0x5c,0xab,0xba,0xf7,0xd6,0xa6,0xb5,0xd6,0x5d,0x69,0x83,0xeb,
-  0x74,0x05,0xff,0xac,0xab,0xeb,0xf1,0x9b,0xcb,0xa8,0xd8,0x0a,0x69,0x31,0xe7,0xd7,
-  0xf8,0x24,0x2f,0x46,0x1a,0x79,0xf6,0x98,0x02,0x82,0x29,0x40,0x75,0x22,0x4f,0x91,
-  0x9d,0xab,0x58,0x81,0xb7,0xf3,0xf3,0x73,0x0d,0xc7,0x84,0x5b,0x7f,0x14,0xe6,0x7e,
-  0x5f,0xbb,0xc5,0x75,0xbd,0xd7,0x33,0xcf,0xeb,0x1c,0xdf,0xed,0xed,0xed,0xc6,0xb6,
-  0x47,0x9f,0xe1,0x2b,0x53,0x81,0x16,0x93,0x04,0x57,0x14,0xde,0xe4,0x77,0x9a,0x37,
-  0x31,0x16,0x45,0xf7,0x1e,0x1e,0x1e,0x14,0x4a,0xfd,0xaf,0xbd,0x73,0x80,0xb5,0x2d,
-  0x87,0xc2,0x70,0xc7,0x7c,0xf6,0xbb,0x1a,0xdb,0xb6,0xad,0x60,0x3c,0xc1,0xd8,0x88,
-  0x86,0xe1,0x8d,0xed,0x0c,0xc3,0x61,0xcc,0xb1,0x1d,0x8c,0x6d,0xdb,0xf3,0x6c,0xf5,
-  0x7b,0xc9,0x9f,0xa4,0x3b,0xdd,0x39,0x7d,0xa7,0xe9,0x3e,0xf7,0xec,0xbb,0xfe,0x64,
-  0xa5,0x3d,0xdd,0x3c,0xfd,0x57,0xd7,0xaa,0x76,0xcb,0x37,0xfd,0x05,0x60,0x2e,0x00,
-  0xd3,0xce,0x4c,0x14,0x46,0xa8,0x0a,0x42,0x3d,0x60,0x28,0xa6,0x9a,0x90,0x98,0x7a,
-  0x4a,0x3d,0xa5,0x1f,0x4b,0x83,0x70,0x5c,0x92,0x31,0x90,0x63,0xd8,0x38,0xc1,0x42,
-  0x40,0x3e,0xed,0xd3,0xd2,0xe4,0x83,0x80,0x58,0x3f,0xd9,0xc1,0xb1,0xf4,0x3c,0x75,
-  0x01,0xde,0xc1,0x37,0xe3,0x1c,0x1d,0x3c,0x84,0xbd,0x06,0x4a,0xe8,0x57,0x46,0x71,
-  0x7e,0x25,0x91,0xf6,0xd6,0x01,0x20,0x81,0x3f,0xca,0xa7,0xe0,0x6f,0xbf,0xfd,0x76,
-  0x63,0xfd,0xe2,0x90,0x4c,0x89,0x87,0x68,0x9e,0x4f,0x88,0x25,0x20,0x8e,0xcf,0x27,
-  0x2c,0x05,0xba,0x5c,0x21,0x56,0xc2,0xca,0x60,0x28,0x21,0xbd,0x70,0xcc,0xaf,0xa3,
-  0x57,0x8e,0xa9,0xe1,0xbc,0x07,0x56,0xc7,0xef,0xac,0xa2,0x3a,0x4c,0xfb,0x14,0x80,
-  0x4c,0xf7,0xb3,0x69,0xe8,0xc5,0x6b,0x74,0x60,0x84,0x6e,0x51,0x9e,0x2d,0xb2,0x31,
-  0xfd,0x8a,0x13,0x72,0x0c,0x49,0x04,0xd6,0x23,0x20,0x54,0x71,0x48,0x65,0x82,0x08,
-  0x69,0x58,0x19,0xc8,0xa7,0x05,0xc3,0x72,0x72,0x6a,0x59,0xe8,0xf9,0x00,0xc5,0xe4,
-  0xfd,0x98,0xa0,0x01,0xf1,0x4c,0xcc,0xa0,0xd2,0xcb,0xbb,0x70,0x1d,0x4a,0xd0,0x1a,
-  0x05,0x10,0x01,0x74,0xbd,0x36,0x5d,0xcb,0x26,0xa3,0xe5,0xeb,0x45,0x3c,0x69,0x22,
-  0x5f,0x35,0x7f,0x08,0xc3,0x52,0x30,0xd4,0x8b,0xd2,0x40,0x2a,0x84,0x32,0xf2,0x47,
-  0xa9,0x25,0x8d,0xd2,0x0a,0x81,0xcc,0x10,0xf2,0xd3,0xa8,0x20,0x4a,0x56,0x86,0x38,
-  0x04,0x22,0x34,0x33,0x99,0xbc,0x11,0x90,0x28,0x05,0x40,0x81,0x68,0x71,0xd0,0x95,
-  0xcd,0xb7,0x01,0x0c,0xd5,0x72,0x2f,0xd2,0x7c,0x2f,0x23,0xd7,0xa8,0xe9,0xdb,0x2a,
-  0x05,0xc0,0xf4,0xf6,0x64,0xb1,0x63,0x99,0x7e,0x44,0xa4,0x4b,0x01,0xc8,0x78,0x32,
-  0xdd,0xaf,0xd9,0xc7,0x78,0x38,0x71,0xc8,0x83,0xd4,0xa0,0x29,0x8a,0x50,0x8a,0x21,
-  0x95,0x78,0x2a,0x20,0x53,0xf7,0x62,0xc5,0x53,0x2a,0xa0,0xbe,0x85,0xe2,0xce,0x3b,
-  0xef,0x3c,0xe7,0x27,0x9c,0xf2,0x2e,0x28,0x9c,0xf3,0xeb,0x13,0x42,0x3a,0xef,0xd3,
-  0xbe,0x3a,0x80,0x32,0x00,0x0d,0xf7,0xeb,0xff,0x37,0xdd,0x2c,0x0d,0x2c,0x80,0x94,
-  0x00,0x62,0x10,0x4a,0x3d,0x5f,0xd3,0x30,0xc8,0x03,0xc1,0x9d,0xfa,0x15,0xaa,0xf7,
-  0xd6,0xfd,0x24,0x58,0x07,0x14,0x84,0xf3,0x65,0x5d,0x28,0xf1,0xa4,0x33,0x18,0xe5,
-  0x97,0x92,0x67,0x65,0x71,0x8e,0x51,0x29,0x85,0x78,0x07,0xa4,0x60,0xfd,0x6a,0xfa,
-  0x85,0x8d,0x68,0x0b,0xc6,0x4a,0x3f,0xe4,0xe3,0x17,0x99,0x54,0xd8,0x24,0x18,0xab,
-  0xf7,0x1b,0x51,0x88,0x0c,0x85,0x10,0x87,0xe9,0x85,0x7c,0x99,0x5b,0x91,0x1a,0x90,
-  0xa9,0x50,0xd7,0xe8,0xb7,0xd2,0x20,0x8d,0xde,0x43,0x59,0x12,0x84,0xdf,0x31,0xa9,
-  0x27,0x36,0xde,0x81,0xa5,0xb4,0xfa,0xf3,0xd3,0x3a,0xc8,0x72,0x81,0xd5,0xe2,0xff,
-  0xfa,0xb1,0x05,0xee,0xd9,0x9d,0x05,0x20,0xb3,0x7a,0xd5,0xdc,0xc2,0x02,0xc8,0xec,
-  0x53,0x1a,0xfd,0x87,0x11,0xf8,0x70,0x7d,0xe9,0x12,0x25,0x15,0x42,0x25,0x90,0xc7,
-  0xf9,0x8a,0x13,0x4a,0xc8,0x90,0x14,0x2b,0xc4,0x7f,0xcf,0x21,0x38,0x83,0xd0,0x6e,
-  0x15,0x48,0xf9,0x45,0xef,0x29,0x8a,0xcd,0x6f,0xf2,0x46,0x2e,0x30,0xdd,0x02,0x90,
-  0xa9,0x7e,0x47,0x0d,0x2a,0x52,0x5a,0x5c,0xb9,0x09,0xf0,0xf2,0xf8,0x5d,0x2c,0x0f,
-  0xa5,0x57,0x04,0xe2,0xe3,0x51,0x08,0xe2,0xf2,0xf9,0x1c,0x23,0x44,0xc8,0x94,0x08,
-  0x01,0xe9,0xae,0xa1,0xfc,0xf9,0x65,0x15,0x48,0x95,0x64,0x2c,0xa4,0xf2,0x02,0x3c,
-  0xfa,0xe8,0xa3,0x2a,0x08,0xa4,0xa5,0x5b,0x00,0xbd,0x00,0x99,0xde,0x14,0x78,0x16,
-  0xcf,0xc4,0xb7,0xfb,0x0f,0x26,0xe4,0x93,0x35,0xf1,0x03,0xb3,0x9f,0xff,0x69,0x75,
-  0x79,0xc2,0x1b,0xaf,0x2f,0xe1,0xaa,0xfd,0x5c,0x05,0x0a,0x42,0x90,0x2e,0x57,0x40,
-  0x7a,0xdc,0x0a,0x24,0x28,0x00,0xd2,0x14,0xd4,0xfe,0xa6,0x94,0xf3,0x5c,0x2c,0x10,
-  0x69,0x94,0x78,0x90,0x5b,0xc2,0x0b,0x12,0x5a,0xbe,0xc4,0x47,0xce,0xa7,0x25,0x42,
-  0xab,0x84,0x3a,0x51,0xec,0x3a,0xf5,0xa4,0x4e,0x98,0x30,0x81,0x78,0x5f,0xcc,0x0a,
-  0x46,0x53,0x71,0x03,0x68,0x2d,0xca,0x90,0x91,0x81,0x79,0xc7,0x13,0x90,0xa7,0x90,
-  0x19,0xef,0x43,0xc1,0x20,0x7f,0x66,0xcd,0x9a,0x15,0xdc,0x2b,0xf6,0x7e,0xaa,0x4b,
-  0xf5,0xcd,0xb4,0x70,0xea,0x1e,0x32,0xf9,0x06,0x21,0xf9,0x4b,0xa3,0xaa,0x32,0x49,
-  0x5a,0x3a,0x2b,0xd8,0x20,0x72,0x43,0xa2,0x23,0xbf,0x4d,0x01,0x5a,0x48,0x3c,0xa2,
-  0xb8,0x10,0x4b,0x2b,0xa6,0x00,0x34,0x2d,0x68,0x76,0x98,0x94,0x11,0xa6,0x7d,0x47,
-  0x50,0x5b,0xd2,0xc3,0xb0,0xec,0x94,0x30,0x7c,0x0c,0x2f,0x48,0x65,0x24,0xb5,0x62,
-  0x44,0x73,0x05,0xe9,0xf8,0x82,0x54,0xfe,0x68,0xbb,0xf6,0x15,0x0a,0x74,0x06,0x31,
-  0xc8,0x15,0x83,0xee,0x59,0x7d,0x66,0xfc,0x78,0x21,0x0b,0x00,0x41,0x34,0xcf,0x34,
-  0x9a,0x46,0x88,0xf0,0x60,0x85,0x8a,0x83,0xbf,0xfe,0x5e,0xe4,0x96,0x2c,0x1f,0x70,
-  0xdb,0x4c,0x3a,0xc1,0xcb,0x89,0x0e,0xd9,0x76,0xb2,0x42,0xc4,0x8b,0x8f,0x6f,0xb9,
-  0xed,0x91,0xfe,0xdc,0x95,0xea,0x9f,0xaf,0x4a,0xf5,0x79,0x41,0x5a,0x81,0xf3,0x25,
-  0x75,0xd7,0xa7,0xfc,0x7f,0xc2,0xe4,0xe7,0x4b,0xf8,0xff,0xd4,0xe0,0x37,0xd4,0xff,
-  0x57,0x95,0xaf,0x98,0x05,0xf0,0xab,0x6d,0x24,0x0f,0x7f,0xfe,0xfd,0xcf,0x02,0x37,
-  0x77,0xe4,0x14,0x37,0x77,0x70,0x5f,0xe7,0x5f,0xd5,0xf9,0xac,0x71,0x80,0xc0,0xff,
-  0x24,0x0c,0xb0,0x62,0xf9,0x6f,0x2c,0xa7,0xc0,0xfd,0xfb,0xb7,0x04,0xe7,0x7f,0xc9,
-  0x9c,0x40,0x7e,0x7d,0x9a,0xe2,0x45,0x14,0x80,0x92,0xcf,0x88,0x58,0x0a,0xd0,0xe4,
-  0xb5,0x9b,0x4c,0x75,0xbb,0xec,0x75,0xa4,0xdb,0xa8,0x23,0xa1,0x90,0xbf,0xc4,0xad,
-  0x5e,0x33,0x0f,0x05,0x23,0xe3,0x73,0x08,0xeb,0x5b,0x97,0x41,0x3b,0x9f,0xee,0xf0,
-  0xf8,0x54,0xf7,0xfa,0x52,0xae,0x74,0x42,0xc5,0x4b,0x28,0x00,0x3d,0x4b,0x98,0xa9,
-  0xa4,0xce,0x8c,0xff,0xe7,0xcd,0x77,0x7b,0x1d,0x74,0xa1,0x9b,0x39,0x94,0xb6,0x4a,
-  0xc6,0xd7,0x9f,0xbe,0xe9,0x26,0x6c,0xbd,0x9a,0xfb,0xa7,0x76,0xa6,0x60,0x29,0x82,
-  0xe7,0x2b,0x2c,0xdf,0x59,0x53,0xe4,0x7e,0x9a,0x0d,0x95,0x66,0x01,0xe2,0xc7,0x8a,
-  0xba,0x00,0x4a,0x3f,0x95,0xbf,0xa4,0x3f,0xb8,0x6a,0xed,0x96,0x6e,0xbb,0xdd,0xf6,
-  0x71,0x13,0xa6,0x4c,0x8c,0xa9,0x3f,0x17,0x10,0x3a,0xb0,0x64,0xd1,0x3c,0xf7,0xc3,
-  0x97,0x2f,0xb9,0x99,0x33,0xa6,0xa7,0x29,0x58,0x01,0xf4,0xb8,0x7b,0x19,0xd3,0x4f,
-  0xe9,0x97,0xfb,0x4b,0xb7,0x00,0x21,0xf9,0x65,0x15,0x40,0x93,0x20,0x92,0xb0,0x66,
-  0x99,0xfb,0xfa,0x93,0x57,0xdd,0xc0,0x0e,0x7b,0x05,0x99,0x53,0xad,0x02,0x2c,0x5e,
-  0xf0,0x8f,0xfb,0xf2,0x83,0x17,0xdc,0xa4,0xad,0x56,0x78,0xe5,0xda,0xba,0xbc,0xc9,
-  0x2f,0x74,0xbf,0x9c,0xe7,0x51,0xea,0x7f,0xf8,0xe1,0x07,0x92,0x89,0xeb,0x58,0xf2,
-  0xb0,0x70,0x24,0xad,0x8c,0x02,0xa0,0xa1,0xb8,0x81,0x14,0x0c,0x0d,0xcc,0x72,0x7f,
-  0x7d,0xf3,0xb2,0xfb,0xe3,0xab,0x17,0x6b,0x4b,0x88,0xfa,0x14,0x66,0xae,0x9f,0xe8,
-  0x31,0xa1,0xe9,0x01,0x9b,0xc0,0x85,0x28,0x4e,0x98,0x8f,0xf4,0xe7,0x21,0xfe,0x83,
-  0x4f,0xea,0x4c,0x1d,0x09,0xcd,0xef,0x00,0xca,0x54,0x00,0x96,0x28,0xc5,0x05,0xf0,
-  0x69,0x16,0xa6,0x5a,0xa4,0x44,0x10,0x0c,0xea,0x44,0x50,0x74,0x00,0xa7,0xbc,0xcf,
-  0xce,0x9f,0x05,0xc4,0xa4,0x13,0x26,0xb2,0xb2,0xe2,0x57,0x75,0xc8,0x56,0x33,0x8d,
-  0x53,0xfa,0xfd,0xeb,0xd3,0x0b,0x35,0x03,0xd9,0x6b,0x1f,0x68,0xae,0x7e,0xea,0xc3,
-  0x9a,0xaf,0x64,0x35,0x72,0x7e,0xce,0xff,0x87,0x78,0x5a,0x3d,0x01,0xf9,0xca,0xdb,
-  0x84,0x0a,0x20,0xe7,0x05,0xef,0xa1,0x78,0xa9,0x3a,0x00,0x9d,0x40,0x9a,0x30,0x9a,
-  0xdc,0xec,0x50,0x66,0x25,0xa7,0xe7,0xfb,0xda,0x84,0x4a,0x53,0xde,0x00,0x4c,0xee,
-  0x71,0x08,0xd7,0x9c,0x44,0xde,0x2f,0x3f,0x5f,0x9a,0xa9,0x04,0xf2,0x62,0x68,0x2c,
-  0x12,0x4c,0x1f,0xcf,0xce,0x5c,0x83,0x20,0x05,0x49,0xb1,0x42,0x4a,0x8b,0x59,0xce,
-  0x66,0x46,0x03,0x35,0x6b,0x07,0x53,0xc6,0x43,0x0d,0xf9,0xf9,0xc9,0xac,0xa8,0x14,
-  0xff,0x1f,0x49,0xcf,0xe8,0x07,0xc8,0x34,0xb9,0x45,0x3f,0x90,0x30,0xa4,0x5a,0x83,
-  0x8c,0xe1,0xe0,0xd6,0xc0,0xe6,0x03,0x80,0xd6,0x29,0x80,0x21,0x7d,0x3e,0x80,0x59,
-  0x80,0xf6,0x2b,0x80,0xc2,0x68,0x85,0xb0,0xfd,0x16,0xc0,0x90,0x3e,0x1f,0xc0,0x14,
-  0xa0,0xa5,0xe4,0x27,0xa4,0xb5,0x4d,0x01,0x0c,0xa1,0xe9,0x4f,0xa8,0x03,0xb4,0x60,
-  0xb9,0x78,0x43,0xde,0x7c,0x80,0xf6,0x5b,0x00,0x6b,0x05,0x44,0x49,0x6f,0x9f,0x02,
-  0x18,0xa2,0xa6,0x3f,0x85,0x70,0x73,0x01,0xed,0xaf,0x00,0x8e,0xe3,0x8e,0x20,0xeb,
-  0x0d,0x14,0xac,0x23,0x68,0x1c,0x12,0xaf,0x79,0x03,0x4a,0xb3,0x7e,0x80,0x71,0xaa,
-  0x14,0xe5,0x46,0x03,0xf9,0x64,0xbb,0x3f,0x60,0x23,0x80,0xa4,0x87,0xf1,0x7c,0x05,
-  0xe8,0x93,0xb5,0xf8,0xad,0x22,0x68,0xcd,0x40,0x1b,0x18,0x1a,0x17,0xeb,0x03,0x18,
-  0x6c,0x3e,0x80,0x91,0x2f,0xd8,0x58,0x80,0x55,0x02,0x15,0x0f,0xd6,0x0c,0x54,0xfa,
-  0xf8,0x50,0x00,0x53,0x04,0x48,0x8f,0xc5,0xcd,0x05,0xb4,0x14,0xfa,0x96,0x50,0x02,
-  0xe9,0x92,0x60,0x6d,0xe5,0xf6,0x29,0x80,0x41,0x24,0x8b,0x68,0x91,0x1d,0x84,0xed,
-  0x55,0x00,0x43,0x95,0xf8,0x5a,0x61,0xff,0xe5,0xf6,0x29,0x80,0x21,0x20,0xbe,0xae,
-  0xf4,0x8f,0x8c,0x8c,0xb8,0xa3,0x8f,0x3e,0x5a,0x6b,0x14,0x65,0x29,0xc0,0x18,0x5b,
-  0xb1,0xcb,0xcc,0xbf,0x56,0x06,0xaf,0xf3,0xfb,0x2c,0xad,0xef,0xb7,0xd5,0xd5,0x2a,
-  0xeb,0xfa,0x82,0xbb,0x7b,0x05,0x60,0x4d,0x5a,0xc3,0xd8,0x40,0xb5,0xa4,0x57,0xdd,
-  0x81,0xdf,0x61,0xdc,0x5d,0x72,0xc9,0x25,0xac,0xdf,0x80,0x68,0xf3,0xab,0xee,0x14,
-  0x80,0x8b,0x90,0xbd,0xf7,0xde,0xdb,0xf5,0x1c,0x06,0x11,0x0e,0xd1,0x0a,0x83,0xb4,
-  0x53,0x4f,0x3d,0x15,0xbf,0xcf,0x0a,0xe2,0x6c,0x18,0xc1,0x2a,0xe2,0x5a,0xce,0xa7,
-  0x7b,0x05,0xc0,0x7c,0xb0,0x93,0x27,0x61,0xef,0x60,0xd0,0x3e,0x46,0xd5,0x5a,0x3e,
-  0x04,0xb3,0xa7,0xd1,0xd5,0x57,0x5f,0xed,0x76,0xdd,0x75,0x57,0xcc,0x3f,0x7b,0x07,
-  0x60,0xb5,0x51,0x00,0x2c,0x40,0x77,0x2e,0x40,0xe4,0x63,0x3e,0xb8,0xd1,0x69,0xa7,
-  0x9d,0xe6,0x7a,0x02,0x83,0xb6,0x81,0x09,0x9a,0x7f,0xfb,0xed,0xb7,0x1f,0x5b,0xd8,
-  0xb9,0x8b,0x2f,0xbe,0xd8,0xed,0xb8,0xe3,0x8e,0x70,0xc4,0x8a,0x2d,0xac,0x24,0x8e,
-  0x10,0xc7,0x05,0x68,0x9b,0xbc,0x8e,0x3d,0x81,0x2b,0x58,0xa6,0x27,0xa6,0x00,0x54,
-  0x24,0xd0,0xa2,0xdd,0x76,0xdb,0x8d,0xe5,0xcb,0x1a,0xda,0x3d,0xd4,0x20,0x68,0xbb,
-  0x5c,0xd5,0xc5,0x0e,0x3b,0xec,0x30,0x42,0xed,0x73,0xc8,0x67,0xf9,0x54,0xd2,0x59,
-  0xab,0x81,0xd2,0x0f,0xf1,0x84,0x90,0x0f,0x77,0x1d,0x4b,0x3f,0xdc,0xa3,0x1e,0x7f,
-  0xc7,0x2c,0x00,0xa5,0x1f,0xf2,0xb9,0x19,0x0f,0x38,0xf0,0xc0,0x03,0xf1,0x31,0xe6,
-  0x0e,0x1a,0x24,0x1f,0xa1,0x84,0x5f,0x76,0xd9,0x65,0xec,0xde,0xc6,0x76,0xfa,0x6c,
-  0x61,0x07,0xc9,0x28,0x02,0x3b,0xac,0x91,0xe6,0x86,0x87,0x87,0xdd,0xc0,0xc0,0x00,
-  0x8b,0x4c,0xc3,0x55,0x2a,0xf9,0xe0,0x6f,0x36,0x8d,0x7a,0xc6,0x47,0x4e,0x8d,0xf9,
-  0x1d,0xb6,0x1c,0x61,0x2f,0x7f,0xf6,0x0e,0xd4,0x26,0xce,0xa4,0x61,0x0d,0xbe,0xfa,
-  0xea,0x2b,0xf6,0xf8,0xe7,0xb7,0xcb,0x87,0x41,0x80,0x60,0x0a,0x1e,0x15,0xb9,0x7d,
-  0xf6,0xd9,0x47,0x3b,0xa2,0x51,0xda,0x49,0xc7,0xef,0x73,0x4e,0x20,0xa4,0x71,0x8c,
-  0x73,0x36,0x70,0x2f,0xc3,0x67,0x71,0x01,0x2f,0xc6,0x14,0x40,0x2e,0x00,0x0b,0x80,
-  0x69,0x41,0x21,0x00,0x3b,0x7a,0x70,0x8c,0x34,0x6d,0xe3,0x0e,0x08,0x0d,0xf9,0xeb,
-  0x1a,0x11,0x42,0xa0,0x88,0x17,0xe9,0xf0,0x00,0xd9,0x84,0xfc,0xc6,0xf4,0x73,0x4c,
-  0xdb,0xe2,0x89,0x78,0x24,0x15,0x70,0xbf,0xc9,0xe8,0xe8,0xe8,0xcf,0x3e,0x72,0x0b,
-  0x15,0xc2,0x48,0x33,0x10,0xb2,0x03,0xe1,0x41,0xda,0xae,0x4d,0xdb,0xba,0x21,0x68,
-  0x9f,0x49,0xd7,0xa2,0x3c,0x0c,0x08,0x97,0x5f,0xc7,0xdc,0x53,0xbb,0xc7,0xc4,0x63,
-  0x19,0x58,0xaa,0x9f,0xe3,0x28,0x41,0xa4,0xc3,0x27,0x15,0x0c,0x16,0x5c,0xbd,0xb1,
-  0xbf,0x08,0x05,0x78,0xcc,0x45,0xa0,0xbd,0x71,0x65,0x05,0xf0,0x33,0xf8,0x1b,0x09,
-  0xfe,0x67,0x70,0x70,0x10,0xe1,0x58,0x86,0x98,0x28,0x1f,0x11,0xf2,0x95,0xee,0x5c,
-  0x09,0x69,0xec,0x54,0x8e,0x02,0xd0,0xce,0x57,0x27,0x4f,0x97,0xc4,0x0b,0x8f,0xc1,
-  0xbd,0xe6,0x03,0xdc,0xe5,0xe5,0x1c,0x2f,0x93,0xaa,0x56,0x40,0x4a,0xa0,0x10,0xad,
-  0xa3,0xd9,0x41,0xed,0x94,0x95,0x2d,0xb5,0xac,0xa9,0x21,0x1f,0xca,0x6f,0xb9,0x5f,
-  0x44,0xd6,0x41,0x64,0xcb,0xbf,0x67,0x62,0x3e,0x9c,0x13,0xd1,0x9d,0x20,0x91,0xc6,
-  0xfe,0x13,0xb8,0xff,0x9a,0x31,0xe8,0xea,0x20,0x44,0xc1,0x3a,0x80,0xd5,0x01,0xe4,
-  0x6e,0x09,0x11,0xd2,0x91,0x4c,0xc8,0xf4,0x9f,0xe5,0xef,0xf5,0x8c,0x14,0x40,0x80,
-  0xc4,0x6b,0x7c,0x70,0x4f,0x8d,0x12,0xe8,0x9c,0x40,0x0c,0x45,0x94,0x21,0x90,0x00,
-  0xf9,0xe4,0xdf,0xe0,0xef,0xf9,0x80,0xab,0x03,0x96,0xc0,0xcb,0xbc,0xb5,0x6d,0x83,
-  0x61,0x1e,0xdc,0xa6,0x4e,0x39,0x1a,0xf0,0xf2,0x90,0x97,0x55,0x96,0x6f,0x7d,0x0f,
-  0x38,0x84,0xcb,0x81,0x6e,0xe6,0x9e,0x0d,0x79,0xb9,0x8d,0xce,0x22,0x2f,0xbf,0x78,
-  0x59,0x6e,0xf9,0x39,0xe6,0xb1,0x1c,0xae,0xe0,0x0c,0xee,0xe0,0xd0,0xd5,0xc3,0xad,
-  0x03,0x63,0x75,0xc1,0xae,0xdd,0xd9,0xb0,0x20,0x00,0x00,0x00,0x00,0x49,0x45,0x4e,
-  0x44,0xae,0x42,0x60,0x82,
+  0xcb,0x00,0x00,0x04,0x19,0x69,0x43,0x43,0x50,0x6b,0x43,0x47,0x43,0x6f,0x6c,0x6f,
+  0x72,0x53,0x70,0x61,0x63,0x65,0x47,0x65,0x6e,0x65,0x72,0x69,0x63,0x52,0x47,0x42,
+  0x00,0x00,0x38,0x8d,0x8d,0x55,0x5d,0x68,0x1c,0x55,0x14,0x3e,0xbb,0x73,0x67,0x23,
+  0x24,0xce,0x53,0x6c,0x34,0x85,0x74,0xa8,0x3f,0x0d,0x25,0x0d,0x93,0x56,0x34,0xa1,
+  0xb4,0xba,0x7f,0xdd,0xdd,0x36,0x6e,0x96,0x49,0x36,0xda,0x22,0xe8,0x64,0xf6,0xee,
+  0xce,0x98,0xc9,0xce,0x38,0x33,0xbb,0xfd,0xa1,0x4f,0x45,0x50,0x7c,0x31,0xea,0x9b,
+  0x14,0xc4,0xbf,0xb7,0x80,0x20,0x28,0xf5,0x0f,0xdb,0x3e,0xb4,0x2f,0x95,0x0a,0x25,
+  0xda,0xd4,0x20,0x28,0x3e,0xb4,0xf8,0x83,0x50,0xe8,0x8b,0xa6,0xeb,0x99,0x3b,0x33,
+  0x99,0x69,0xba,0xb1,0xde,0x65,0xee,0x7c,0xf3,0x9d,0xef,0x9e,0x7b,0xee,0xb9,0x67,
+  0xef,0x05,0xe8,0xb9,0xaa,0x58,0x96,0x91,0x14,0x01,0x16,0x9a,0xae,0x2d,0x17,0x32,
+  0xe2,0x73,0x87,0x8f,0x88,0x3d,0x2b,0x90,0x84,0x87,0xa0,0x17,0x06,0xa1,0x57,0x51,
+  0x1d,0x2b,0x5d,0xa9,0x4c,0x02,0x36,0x4f,0x0b,0x77,0xb5,0x5b,0xdf,0x43,0xc2,0x7b,
+  0x5f,0xd9,0xd5,0xdd,0xfe,0x9f,0xad,0xb7,0x46,0x1d,0x15,0x20,0x71,0x1f,0x62,0xb3,
+  0xe6,0xa8,0x0b,0x88,0x8f,0x01,0xf0,0xa7,0x55,0xcb,0x76,0x01,0x7a,0xfa,0x91,0x1f,
+  0x3f,0xea,0x5a,0x1e,0xf6,0x62,0xe8,0xb7,0x31,0x40,0xc4,0x2f,0x7a,0xb8,0xe1,0x63,
+  0xd7,0xc3,0x73,0x3e,0x7e,0x8d,0x69,0x66,0xe4,0x2c,0xe2,0xd3,0x88,0x05,0x55,0x53,
+  0x6a,0x88,0x97,0x10,0x8f,0xcc,0xc5,0xf8,0x46,0x0c,0xfb,0x31,0xb0,0xd6,0x5f,0xa0,
+  0x4d,0x6a,0xeb,0xaa,0xe8,0xe5,0xa2,0x62,0x9b,0x75,0xdd,0xa0,0xb1,0x70,0xef,0x61,
+  0xfe,0x9f,0x6d,0xc1,0x68,0x85,0xf3,0x6d,0xc3,0xa7,0xcf,0x99,0x9f,0x3e,0x84,0xef,
+  0x61,0x5c,0xfb,0x2b,0x35,0x25,0xe7,0xe1,0x51,0xc4,0x4b,0xaa,0x92,0x9f,0x46,0xfc,
+  0x08,0xe2,0x6b,0x6d,0x7d,0xb6,0x1c,0xe0,0xdb,0x96,0x9b,0x91,0x11,0x3f,0x06,0x90,
+  0xdc,0xde,0x9a,0xaf,0xa6,0x11,0xef,0x44,0x5c,0xac,0xdb,0x07,0xaa,0xbe,0x9f,0xa4,
+  0xad,0xb5,0x8a,0x21,0x7e,0xe7,0x84,0x36,0xf3,0x2c,0xe2,0x2d,0x88,0xcf,0x37,0xe7,
+  0xca,0x53,0xc1,0xd8,0xab,0xaa,0x93,0xc5,0x9c,0xc1,0x76,0xc4,0xb7,0x35,0x5a,0xf2,
+  0xf2,0x3b,0x04,0xc0,0x89,0xba,0x5b,0x9a,0xf1,0xc7,0x72,0xfb,0x6d,0x53,0x9e,0xf2,
+  0xe7,0xe5,0xea,0x35,0x9a,0xcb,0x7b,0x79,0x44,0xfc,0xfa,0xbc,0x79,0x48,0xf6,0x7d,
+  0x72,0x9f,0x39,0xed,0xe9,0x7c,0xe8,0xf3,0x84,0x96,0x2d,0x07,0xfc,0xa5,0x97,0x94,
+  0x83,0x15,0xc4,0x83,0x88,0x7f,0xa1,0x46,0x41,0xf6,0xe7,0xe2,0xfe,0xb1,0xdc,0x4a,
+  0x10,0x03,0x19,0x6a,0x1a,0xe5,0x49,0x7f,0x2e,0x92,0xa3,0x0e,0x5b,0x2f,0xe3,0x5d,
+  0x6d,0xa6,0xe8,0xcf,0x4b,0x0c,0x17,0x37,0xd4,0x1f,0x4b,0x16,0xeb,0xfa,0x81,0x52,
+  0xa0,0xff,0x44,0xb3,0x8b,0x72,0x80,0xaf,0x59,0x06,0xab,0x51,0x8c,0x8d,0x4f,0xda,
+  0x2d,0xb9,0xea,0xeb,0xf9,0x51,0xc5,0xce,0x17,0x7c,0x9f,0x7c,0x85,0x36,0xab,0x81,
+  0x7f,0xbe,0x0d,0xb3,0x09,0x05,0x28,0x98,0x30,0x87,0xbd,0x0a,0x4d,0x58,0x03,0x11,
+  0x64,0x28,0x40,0x06,0xdf,0x16,0xd8,0x68,0xa9,0x83,0x0e,0x06,0x32,0x14,0xad,0x14,
+  0x19,0x8a,0x5f,0xa1,0x66,0x17,0x1b,0xe7,0xc0,0x3c,0xf2,0x3a,0xb4,0x99,0xcd,0xc1,
+  0xbe,0xc2,0x94,0xfe,0xc8,0xc8,0x5f,0x83,0xf9,0xb8,0xce,0xb4,0x2a,0x64,0x87,0x3e,
+  0x82,0x16,0xb2,0x1a,0xfc,0x8e,0xac,0x16,0xd3,0x65,0xf1,0xab,0x85,0x5c,0x63,0x13,
+  0x3f,0x7e,0x2c,0x37,0x02,0x3f,0x26,0x19,0x20,0x12,0xd9,0x83,0xcf,0x5e,0x32,0x49,
+  0xf6,0x91,0x71,0x32,0x01,0x22,0x79,0x8a,0x3c,0x4d,0xf6,0x93,0x1c,0xb2,0x13,0x64,
+  0xef,0xfa,0xd8,0x4a,0x6c,0x45,0x5e,0x3c,0x37,0xd6,0xfd,0xbc,0x8c,0x33,0x52,0xa6,
+  0x9b,0x45,0xdd,0x39,0xb4,0xbb,0xa0,0x60,0xff,0x33,0x2a,0x4c,0x5c,0x53,0xd7,0xac,
+  0x2c,0x0e,0xb6,0x86,0x23,0xcb,0x29,0xfb,0x05,0x5d,0xbd,0xfc,0xc6,0x5f,0xb1,0x5c,
+  0xe9,0x2c,0x37,0x51,0xb6,0xe2,0x19,0x9d,0xba,0x57,0xce,0xf9,0x5f,0xf9,0xeb,0xfc,
+  0x32,0xf6,0x2b,0xfc,0x6a,0xa4,0xe0,0x7f,0xe4,0x57,0xf1,0xb7,0x72,0xc7,0x5a,0xcc,
+  0xbb,0xb2,0x4c,0xc3,0xec,0x6c,0x58,0x73,0x77,0x55,0x1a,0x6d,0x06,0xe3,0x16,0xf0,
+  0xd1,0x99,0xc5,0x89,0xc5,0x1d,0xf3,0x71,0xf1,0xe4,0x57,0x0f,0x46,0x7e,0x96,0xc9,
+  0x99,0xe7,0xaf,0xf4,0x5d,0x3c,0x59,0x6f,0x2e,0x0e,0x46,0xac,0x97,0x05,0xfa,0x6a,
+  0xf9,0x56,0x19,0x4e,0x8d,0x44,0xac,0xf4,0x83,0xf4,0x87,0xb4,0x2c,0xbd,0x27,0x7d,
+  0x28,0xfd,0xc6,0xbd,0xcd,0x7d,0xca,0x7d,0xcd,0x7d,0xce,0x7d,0xc1,0x5d,0x02,0x91,
+  0x3b,0xcb,0x9d,0xe3,0xbe,0xe1,0x2e,0x70,0x1f,0x73,0x5f,0xc6,0xf6,0x6a,0xf3,0x1a,
+  0x5a,0xdf,0x7b,0x16,0x79,0x18,0xb7,0x67,0xe9,0x96,0x6b,0xac,0x4a,0x21,0x23,0x6c,
+  0x15,0x1e,0x16,0x72,0xc2,0x36,0xe1,0x51,0x61,0x32,0xf2,0x27,0x0c,0x08,0x63,0x42,
+  0x51,0xd8,0x81,0x96,0xad,0xeb,0xfb,0x16,0x9f,0x2f,0x9e,0x3d,0x1d,0x0e,0x63,0x1f,
+  0xe6,0xa7,0xfb,0x5c,0xbe,0x2e,0x56,0x01,0x89,0xfb,0xb1,0x02,0xf4,0x4d,0xfe,0x55,
+  0x55,0x54,0xe9,0x70,0x94,0x29,0x1d,0x56,0x6f,0x4d,0x38,0xbe,0x41,0x13,0x8c,0x24,
+  0x43,0x64,0x8c,0x94,0x36,0x54,0xf7,0xb8,0x57,0xf3,0xa1,0x22,0x95,0x4f,0xe5,0x52,
+  0x69,0x10,0x53,0x3b,0x53,0x13,0xa9,0xb1,0xd4,0x41,0x0f,0x87,0xb3,0xa6,0x76,0xa0,
+  0x6d,0x02,0xfb,0xfc,0x1d,0xd5,0xa9,0x6e,0xb2,0x52,0xea,0xd2,0x63,0xde,0x7d,0x02,
+  0x59,0xd3,0x3a,0x6e,0xeb,0x0d,0xcd,0x15,0x77,0x4b,0xd2,0x93,0x62,0x1a,0xaf,0x36,
+  0x2a,0x96,0x9a,0xea,0xe8,0x88,0xa8,0x18,0x86,0xc8,0x4c,0x8e,0x68,0x53,0x87,0xda,
+  0x6d,0x5a,0x1b,0x05,0xef,0xde,0xf4,0x8f,0xf4,0x9b,0x32,0xbb,0x0f,0x13,0x5b,0x2e,
+  0x47,0x9c,0xfb,0x0c,0xc0,0xbe,0x3f,0xf1,0xec,0xfb,0x2e,0xe2,0x8e,0xb4,0x00,0x96,
+  0x1c,0x80,0x81,0xc7,0x23,0x6e,0x18,0xcf,0xca,0x07,0xde,0x05,0x38,0xf3,0x84,0xda,
+  0xb2,0xdb,0xc1,0x1d,0x91,0x48,0x7c,0x0b,0xe0,0xd4,0xf7,0xec,0xf6,0xbf,0xfa,0x32,
+  0x78,0x7e,0xfd,0xd4,0xe9,0xdc,0xc4,0x73,0xac,0xe7,0x2d,0x80,0xb5,0x37,0x3b,0x9d,
+  0xbf,0xdf,0xef,0x74,0xd6,0x3e,0x40,0xff,0xab,0x00,0x67,0x8d,0x7f,0x01,0xa0,0x9f,
+  0x7c,0x55,0x03,0x5c,0x0b,0xef,0x00,0x00,0x00,0x38,0x65,0x58,0x49,0x66,0x4d,0x4d,
+  0x00,0x2a,0x00,0x00,0x00,0x08,0x00,0x01,0x87,0x69,0x00,0x04,0x00,0x00,0x00,0x01,
+  0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x00,0x00,0x02,0xa0,0x02,0x00,0x04,0x00,0x00,
+  0x00,0x01,0x00,0x00,0x00,0x80,0xa0,0x03,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,
+  0x00,0x80,0x00,0x00,0x00,0x00,0x6b,0x46,0x26,0x4d,0x00,0x00,0x03,0x62,0x69,0x54,
+  0x58,0x74,0x58,0x4d,0x4c,0x3a,0x63,0x6f,0x6d,0x2e,0x61,0x64,0x6f,0x62,0x65,0x2e,
+  0x78,0x6d,0x70,0x00,0x00,0x00,0x00,0x00,0x3c,0x78,0x3a,0x78,0x6d,0x70,0x6d,0x65,
+  0x74,0x61,0x20,0x78,0x6d,0x6c,0x6e,0x73,0x3a,0x78,0x3d,0x22,0x61,0x64,0x6f,0x62,
+  0x65,0x3a,0x6e,0x73,0x3a,0x6d,0x65,0x74,0x61,0x2f,0x22,0x20,0x78,0x3a,0x78,0x6d,
+  0x70,0x74,0x6b,0x3d,0x22,0x58,0x4d,0x50,0x20,0x43,0x6f,0x72,0x65,0x20,0x35,0x2e,
+  0x34,0x2e,0x30,0x22,0x3e,0x0a,0x20,0x20,0x20,0x3c,0x72,0x64,0x66,0x3a,0x52,0x44,
+  0x46,0x20,0x78,0x6d,0x6c,0x6e,0x73,0x3a,0x72,0x64,0x66,0x3d,0x22,0x68,0x74,0x74,
+  0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x77,0x33,0x2e,0x6f,0x72,0x67,0x2f,0x31,
+  0x39,0x39,0x39,0x2f,0x30,0x32,0x2f,0x32,0x32,0x2d,0x72,0x64,0x66,0x2d,0x73,0x79,
+  0x6e,0x74,0x61,0x78,0x2d,0x6e,0x73,0x23,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
+  0x20,0x3c,0x72,0x64,0x66,0x3a,0x44,0x65,0x73,0x63,0x72,0x69,0x70,0x74,0x69,0x6f,
+  0x6e,0x20,0x72,0x64,0x66,0x3a,0x61,0x62,0x6f,0x75,0x74,0x3d,0x22,0x22,0x0a,0x20,
+  0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x6d,0x6c,0x6e,0x73,
+  0x3a,0x64,0x63,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x70,0x75,0x72,0x6c,
+  0x2e,0x6f,0x72,0x67,0x2f,0x64,0x63,0x2f,0x65,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x73,
+  0x2f,0x31,0x2e,0x31,0x2f,0x22,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+  0x20,0x20,0x20,0x78,0x6d,0x6c,0x6e,0x73,0x3a,0x49,0x70,0x74,0x63,0x34,0x78,0x6d,
+  0x70,0x45,0x78,0x74,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x69,0x70,0x74,
+  0x63,0x2e,0x6f,0x72,0x67,0x2f,0x73,0x74,0x64,0x2f,0x49,0x70,0x74,0x63,0x34,0x78,
+  0x6d,0x70,0x45,0x78,0x74,0x2f,0x32,0x30,0x30,0x38,0x2d,0x30,0x32,0x2d,0x32,0x39,
+  0x2f,0x22,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,
+  0x6d,0x6c,0x6e,0x73,0x3a,0x70,0x68,0x6f,0x74,0x6f,0x73,0x68,0x6f,0x70,0x3d,0x22,
+  0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x6e,0x73,0x2e,0x61,0x64,0x6f,0x62,0x65,0x2e,
+  0x63,0x6f,0x6d,0x2f,0x70,0x68,0x6f,0x74,0x6f,0x73,0x68,0x6f,0x70,0x2f,0x31,0x2e,
+  0x30,0x2f,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,
+  0x63,0x3a,0x63,0x72,0x65,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
+  0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x72,0x64,0x66,0x3a,0x53,0x65,0x71,0x3e,
+  0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+  0x3c,0x72,0x64,0x66,0x3a,0x6c,0x69,0x3e,0x4d,0x69,0x63,0x68,0x61,0x65,0x6c,0x20,
+  0x53,0x77,0x65,0x65,0x74,0x3c,0x2f,0x72,0x64,0x66,0x3a,0x6c,0x69,0x3e,0x0a,0x20,
+  0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x72,0x64,0x66,
+  0x3a,0x53,0x65,0x71,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
+  0x2f,0x64,0x63,0x3a,0x63,0x72,0x65,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,
+  0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x63,0x3a,0x72,0x69,0x67,0x68,0x74,0x73,
+  0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x72,
+  0x64,0x66,0x3a,0x41,0x6c,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+  0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x72,0x64,0x66,0x3a,0x6c,0x69,0x20,0x78,
+  0x6d,0x6c,0x3a,0x6c,0x61,0x6e,0x67,0x3d,0x22,0x78,0x2d,0x64,0x65,0x66,0x61,0x75,
+  0x6c,0x74,0x22,0x3e,0x43,0x6f,0x70,0x79,0x72,0x69,0x67,0x68,0x74,0x20,0x32,0x30,
+  0x31,0x30,0x20,0x41,0x70,0x70,0x6c,0x65,0x20,0x49,0x6e,0x63,0x2e,0x3c,0x2f,0x72,
+  0x64,0x66,0x3a,0x6c,0x69,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+  0x20,0x20,0x20,0x3c,0x2f,0x72,0x64,0x66,0x3a,0x41,0x6c,0x74,0x3e,0x0a,0x20,0x20,
+  0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x63,0x3a,0x72,0x69,0x67,0x68,
+  0x74,0x73,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x70,
+  0x74,0x63,0x34,0x78,0x6d,0x70,0x45,0x78,0x74,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69,
+  0x6e,0x65,0x3e,0x4e,0x65,0x77,0x20,0x49,0x6d,0x61,0x67,0x65,0x3c,0x2f,0x49,0x70,
+  0x74,0x63,0x34,0x78,0x6d,0x70,0x45,0x78,0x74,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69,
+  0x6e,0x65,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x68,
+  0x6f,0x74,0x6f,0x73,0x68,0x6f,0x70,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69,0x6e,0x65,
+  0x3e,0x4e,0x65,0x77,0x20,0x49,0x6d,0x61,0x67,0x65,0x3c,0x2f,0x70,0x68,0x6f,0x74,
+  0x6f,0x73,0x68,0x6f,0x70,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69,0x6e,0x65,0x3e,0x0a,
+  0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x72,0x64,0x66,0x3a,0x44,0x65,0x73,0x63,
+  0x72,0x69,0x70,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x3c,0x2f,0x72,0x64,
+  0x66,0x3a,0x52,0x44,0x46,0x3e,0x0a,0x3c,0x2f,0x78,0x3a,0x78,0x6d,0x70,0x6d,0x65,
+  0x74,0x61,0x3e,0x0a,0xa0,0x50,0x98,0x64,0x00,0x00,0x13,0xdb,0x49,0x44,0x41,0x54,
+  0x78,0xda,0xed,0x9d,0x07,0x90,0x55,0x35,0x17,0xc7,0xd7,0x5e,0xc7,0xde,0xd7,0x55,
+  0xec,0xbd,0x0b,0x0a,0x28,0x88,0x88,0xae,0x05,0x7b,0xd7,0xc1,0xbe,0x2a,0x28,0x22,
+  0xba,0xe8,0x88,0x8d,0xcf,0x82,0x34,0xa5,0x0a,0xa2,0x28,0xae,0xa8,0x58,0x41,0x71,
+  0x64,0x11,0x07,0xc5,0x2e,0xa2,0xa0,0xa8,0xe8,0x88,0xd8,0x16,0x15,0xb0,0x20,0x56,
+  0x14,0xcd,0xb7,0xbf,0xb8,0xe7,0x9a,0xcd,0xe6,0xbe,0x77,0xef,0x6b,0xbb,0xdc,0x97,
+  0xcc,0xfc,0x27,0xf7,0xdd,0x92,0x77,0x6f,0xce,0x3f,0x27,0x27,0xc9,0x49,0x52,0x52,
+  0x92,0x22,0x28,0xa5,0xca,0x6a,0x51,0x59,0x8b,0xea,0x5a,0xd4,0xd4,0x62,0x89,0xf2,
+  0xa1,0xa9,0x87,0x25,0x75,0xb2,0xaa,0xae,0x93,0x5d,0x59,0x49,0xdc,0x50,0xfb,0x50,
+  0x69,0x2d,0xaa,0x6a,0xb1,0xd4,0xe7,0xe7,0x32,0x1f,0x96,0xd6,0xc9,0xb2,0x34,0xaa,
+  0xf0,0xcb,0x6b,0xb1,0xc8,0xe7,0x5b,0xe2,0x02,0x32,0x2d,0x4f,0x27,0xfc,0x0a,0x5f,
+  0xea,0x13,0xaf,0x0d,0x2a,0x52,0x95,0x7c,0x2f,0xfc,0xe2,0x20,0x41,0xb9,0xab,0xce,
+  0xf7,0x6a,0xbf,0xb8,0xaa,0x83,0x52,0x93,0x00,0x55,0xf6,0x1d,0x7b,0xee,0xb9,0xa7,
+  0xda,0x7c,0xf3,0xcd,0xd5,0x4d,0x37,0xdd,0xe4,0xb3,0x2b,0x99,0xa1,0xca,0x6c,0xea,
+  0x35,0x50,0xfd,0x1b,0x6c,0xb0,0x81,0xe2,0xf2,0xe5,0x97,0x5f,0xee,0xb3,0x2a,0xb9,
+  0x55,0x41,0x59,0x49,0x5d,0x5b,0xb1,0x41,0xe8,0xd1,0xa3,0x87,0xba,0xe8,0xa2,0x8b,
+  0xd4,0x13,0x4f,0x3c,0xe1,0xb3,0x2a,0xb9,0xa1,0xb2,0xa4,0xae,0xc3,0xc0,0x87,0xe2,
+  0x0c,0xd5,0x10,0xa0,0xc6,0x75,0x65,0xe8,0xd0,0xa1,0xaa,0x4f,0x9f,0x3e,0xea,0xc5,
+  0x17,0x5f,0xac,0x77,0x7e,0xe6,0xcc,0x99,0xfa,0x7c,0xdf,0xbe,0x7d,0xd5,0x9f,0x7f,
+  0xfe,0xa9,0xe6,0xcf,0x9f,0xaf,0xaa,0xaa,0xaa,0x54,0xa7,0x4e,0x9d,0xd4,0x29,0xa7,
+  0x9c,0xa2,0xfa,0xf5,0xeb,0xa7,0xe6,0xcd,0x9b,0xa7,0xd2,0xa5,0xf9,0xcf,0x3f,0xff,
+  0xa8,0x57,0x5f,0x7d,0x55,0xdd,0x78,0xe3,0x8d,0xea,0xa8,0xa3,0x8e,0xd2,0x55,0xcd,
+  0xd3,0x4f,0x3f,0x9d,0xf2,0x6d,0xbf,0xfc,0xf2,0x4b,0x75,0xfb,0xed,0xb7,0xab,0xd3,
+  0x4e,0x3b,0x4d,0x1d,0x77,0xdc,0x71,0xda,0x3e,0xf9,0xe4,0x93,0x4f,0xea,0xdd,0x33,
+  0x78,0xf0,0x60,0xfd,0x1f,0xcf,0x3d,0xf7,0x5c,0x68,0x3a,0xcf,0x3f,0xff,0xbc,0xbe,
+  0x67,0xf4,0xe8,0xd1,0x0d,0xae,0x8d,0x1f,0x3f,0x5e,0x5d,0x79,0xe5,0x95,0xaa,0xbc,
+  0xbc,0x5c,0x5d,0x7c,0xf1,0xc5,0xea,0xc1,0x07,0x1f,0xd4,0xef,0x9a,0xd0,0x50,0x03,
+  0x01,0x9c,0xdd,0xbb,0x61,0x36,0x00,0x42,0xe4,0x3c,0x80,0x0c,0x9b,0x6c,0xb2,0x49,
+  0xf0,0x5b,0xc0,0xb9,0xd7,0x5e,0x7b,0x2d,0x65,0x9a,0x57,0x5d,0x75,0x55,0x83,0xe7,
+  0xc0,0xf9,0xe7,0x9f,0xaf,0x89,0xd5,0x80,0xaa,0xd5,0xd5,0x6a,0xbd,0xf5,0xd6,0x6b,
+  0x70,0xff,0xda,0x6b,0xaf,0xad,0xaf,0x49,0x40,0x70,0x9c,0xdf,0x76,0xdb,0x6d,0x43,
+  0xbf,0x7a,0xfb,0xed,0xb7,0xd7,0xf7,0x74,0xee,0xdc,0x39,0x38,0xf7,0xf3,0xcf,0x3f,
+  0x6b,0x02,0xbb,0xde,0x09,0xb2,0xfd,0xf6,0xdb,0x6f,0x49,0x24,0xc0,0x92,0x92,0xb0,
+  0x2b,0x51,0x08,0xb0,0xe9,0xa6,0x9b,0xaa,0xe5,0x97,0x5f,0x5e,0xb5,0x68,0xd1,0x42,
+  0x67,0x66,0xbb,0x76,0xed,0x82,0x6b,0x65,0x65,0x65,0x6a,0xc9,0x92,0x25,0xce,0x34,
+  0xd7,0x59,0x67,0x1d,0x1d,0xf3,0x9b,0x4c,0x3f,0xef,0xbc,0xf3,0x82,0x6b,0xe0,0xce,
+  0x3b,0xef,0xac,0xf7,0xdc,0x87,0x1f,0x7e,0xa8,0x56,0x58,0x61,0x05,0x7d,0xed,0xd0,
+  0x43,0x0f,0x55,0x13,0x26,0x4c,0x50,0x4f,0x3e,0xf9,0xa4,0xda,0x7d,0xf7,0xdd,0xf5,
+  0xb9,0x0d,0x37,0xdc,0x30,0x10,0xd0,0xc3,0x0f,0x3f,0x1c,0xa4,0x83,0x86,0xb1,0xc3,
+  0x4b,0x2f,0xbd,0x14,0x5c,0x9f,0x31,0x63,0x46,0x70,0xfe,0xf4,0xd3,0x4f,0xd7,0xe7,
+  0xd6,0x5c,0x73,0x4d,0xad,0x65,0xd0,0x12,0xd7,0x5e,0x7b,0x6d,0xf0,0xbf,0x68,0xb6,
+  0x24,0x86,0xac,0x08,0x40,0xe9,0x9b,0x34,0x69,0x52,0xbd,0xeb,0x10,0x41,0xae,0xdf,
+  0x75,0xd7,0x5d,0xce,0x34,0xc1,0x09,0x27,0x9c,0xa0,0x7e,0xfd,0xf5,0xd7,0xe0,0x1a,
+  0xaa,0x7c,0xad,0xb5,0xd6,0x0a,0xc8,0xf3,0xd7,0x5f,0x7f,0x05,0xd7,0x8e,0x3c,0xf2,
+  0x48,0x7d,0x7e,0xe7,0x9d,0x77,0x56,0x4b,0x97,0xfe,0xd7,0x60,0xf9,0xfa,0xeb,0xaf,
+  0xd5,0xca,0x2b,0xaf,0xac,0xaf,0x0d,0x1b,0x36,0x4c,0x9f,0xfb,0xfd,0xf7,0xdf,0xf5,
+  0x7b,0x71,0xee,0xc2,0x0b,0x2f,0x6c,0xf0,0x5d,0x67,0x9d,0x75,0x96,0xbe,0xd6,0xbc,
+  0x79,0xf3,0xe0,0xdc,0xb4,0x69,0xd3,0xd4,0x72,0xcb,0x2d,0xa7,0xcf,0x43,0x20,0x33,
+  0x5c,0x72,0xc9,0x25,0x01,0xd9,0xcd,0x77,0xf2,0x04,0xa8,0xc5,0x3b,0xef,0xbc,0xd3,
+  0xe0,0x39,0xea,0x7f,0x29,0x35,0x67,0x9e,0x79,0xa6,0x33,0xcd,0x63,0x8f,0x3d,0xd6,
+  0x59,0xaf,0xd2,0xea,0x90,0xb4,0xe7,0xcc,0x99,0xa3,0xcf,0x2d,0x5c,0xb8,0x30,0x38,
+  0xd7,0xbf,0x7f,0xff,0x06,0xcf,0xb4,0x6e,0xdd,0x5a,0x5f,0xc3,0x06,0x91,0x50,0x51,
+  0x51,0x11,0x68,0x9a,0x3f,0xfe,0xf8,0x23,0x38,0xff,0xd3,0x4f,0x3f,0xa9,0xd5,0x57,
+  0x5f,0x5d,0x5f,0x1b,0x39,0x72,0x64,0x03,0x21,0x43,0x40,0xfb,0xbd,0x26,0x4f,0x9e,
+  0x1c,0xfc,0xff,0xdc,0xb9,0x73,0x3d,0x01,0x4c,0x02,0x90,0xa1,0xae,0xb0,0xc5,0x16,
+  0x5b,0xe8,0xeb,0x08,0x27,0x4e,0xdf,0xc2,0xbd,0xf7,0xde,0x1b,0xa4,0x4d,0xc6,0x13,
+  0x50,0xe3,0x72,0x6e,0x8f,0x3d,0xf6,0x50,0xc7,0x1f,0x7f,0x7c,0x3d,0xac,0xbf,0xfe,
+  0xfa,0xfa,0xda,0x41,0x07,0x1d,0x14,0xa4,0x63,0x3e,0xf3,0xe8,0xa3,0x8f,0x06,0xe7,
+  0x47,0x8c,0x18,0x11,0xa8,0x79,0xea,0x7c,0x09,0x1d,0x3a,0x74,0xd0,0xe7,0x57,0x5a,
+  0x69,0xa5,0x06,0xe9,0x1f,0x70,0xc0,0x01,0x41,0x5a,0xa6,0x41,0x3c,0x76,0xec,0x58,
+  0xfd,0x9f,0xe9,0x70,0xd9,0x65,0x97,0x15,0x1f,0x01,0xf6,0xde,0x7b,0x6f,0x7d,0x7d,
+  0x87,0x1d,0x76,0x88,0x45,0x00,0x5a,0x01,0x92,0xb6,0xa8,0xe2,0x07,0x1e,0x78,0xc0,
+  0x69,0x98,0xd9,0xa0,0x7a,0x30,0xc3,0x76,0xdb,0x6d,0xa7,0xcf,0x53,0x7d,0x48,0xd8,
+  0x77,0xdf,0x7d,0x03,0x43,0xd3,0x0c,0xdb,0x6c,0xb3,0x4d,0xa4,0xff,0x30,0xc9,0xd4,
+  0xbb,0x77,0xef,0x48,0xcf,0xd8,0x85,0xa0,0x28,0x08,0x80,0x05,0xce,0xf5,0xf6,0xed,
+  0xdb,0xc7,0x22,0xc0,0x98,0x31,0x63,0x82,0xb4,0x5f,0x7e,0xf9,0xe5,0xc0,0xfa,0x97,
+  0x73,0xbd,0x7a,0xf5,0x52,0x2f,0xbc,0xf0,0x82,0x13,0xd4,0xe3,0x66,0xa0,0x89,0xc8,
+  0x33,0x2b,0xae,0xb8,0xa2,0xfa,0xf6,0xdb,0x6f,0x75,0x8b,0x45,0xd2,0x79,0xf3,0xcd,
+  0x37,0xeb,0xdd,0xbb,0xff,0xfe,0xfb,0xeb,0xf3,0x5b,0x6d,0xb5,0x55,0x68,0xfa,0x60,
+  0xc1,0x82,0x05,0xc1,0x33,0xdf,0x7d,0xf7,0x9d,0x7a,0xf7,0xdd,0x77,0xd3,0xa2,0xa9,
+  0x57,0x1b,0x39,0x27,0x00,0x86,0xd2,0x1a,0x6b,0xac,0xe1,0x2c,0x69,0xe9,0x08,0x70,
+  0xeb,0xad,0xb7,0x06,0x69,0xd7,0xd4,0xd4,0x04,0x6d,0x7f,0x39,0x47,0x9f,0x41,0xd4,
+  0xf0,0xf9,0xe7,0x9f,0x07,0x86,0x1d,0x56,0xfd,0xa5,0x97,0x5e,0xaa,0x8f,0x69,0x39,
+  0xd8,0xe1,0xdc,0x73,0xcf,0xd5,0xd7,0x56,0x5d,0x75,0xd5,0x7a,0x36,0x43,0x31,0x84,
+  0xac,0x08,0x80,0x81,0xe6,0xea,0x48,0x91,0xeb,0xf7,0xdd,0x77,0x9f,0x33,0xcd,0x2e,
+  0x5d,0xba,0x38,0xff,0x93,0x01,0x28,0x29,0x89,0xa6,0x31,0xd6,0xac,0x59,0x33,0x7d,
+  0x7e,0xe3,0x8d,0x37,0x56,0x3f,0xfe,0xf8,0x63,0xe4,0x8f,0x3b,0xf8,0xe0,0x83,0xf5,
+  0x73,0x3b,0xee,0xb8,0xa3,0x5a,0x77,0xdd,0x75,0xf5,0xf1,0x90,0x21,0x43,0x1a,0xdc,
+  0xc7,0x7b,0xca,0x3b,0x43,0x42,0x4f,0x80,0x88,0x04,0xd8,0x69,0xa7,0x9d,0xd4,0x5b,
+  0x6f,0xbd,0x55,0xaf,0xa7,0x8e,0x7a,0x9f,0x6b,0x08,0xcd,0x6e,0x36,0x49,0x9a,0xb4,
+  0x12,0xae,0xbe,0xfa,0xea,0x7a,0xfd,0x04,0xf4,0xcc,0x49,0xba,0x77,0xdf,0x7d,0x77,
+  0xbd,0xe7,0x68,0xf7,0xcb,0x35,0x0c,0x2b,0x4a,0xb7,0x04,0x9a,0x85,0xb4,0xe7,0xed,
+  0xe6,0x28,0xe1,0xfe,0xfb,0xef,0xaf,0x57,0x1f,0xaf,0xb6,0xda,0x6a,0x4e,0x02,0xfd,
+  0xfd,0xf7,0xdf,0xba,0x59,0x28,0x5a,0x80,0xe6,0xab,0x49,0x40,0x54,0x3f,0xef,0x40,
+  0xb3,0xd3,0x13,0xc0,0x20,0x80,0x00,0xa1,0x1f,0x78,0xe0,0x81,0x81,0xea,0x5f,0x65,
+  0x95,0x55,0x9c,0xdd,0xba,0x66,0x3f,0x80,0x58,0xe3,0x6d,0xdb,0xb6,0x0d,0x6c,0x06,
+  0xd0,0xa6,0x4d,0x1b,0x67,0x4f,0xa0,0xa8,0x70,0x40,0xdb,0x9f,0x16,0x01,0x1d,0x50,
+  0xf2,0x9f,0x1c,0xdb,0xe1,0x97,0x5f,0x7e,0xd1,0xff,0x21,0xcf,0x99,0x4d,0x45,0x3b,
+  0xbc,0xf7,0xde,0x7b,0xaa,0xb4,0xb4,0xb4,0x5e,0x27,0x17,0x06,0x9c,0x69,0x20,0x3e,
+  0xfb,0xec,0xb3,0xc5,0x43,0x80,0x8d,0x36,0xda,0x48,0x7f,0xf4,0x15,0x57,0x5c,0x11,
+  0x4a,0x80,0x29,0x53,0xa6,0x68,0x2d,0x60,0x0a,0x95,0x0c,0x7b,0xe5,0x95,0x57,0x52,
+  0x92,0x8a,0x76,0x37,0xfd,0xed,0x94,0x36,0x79,0x8e,0xe3,0x0b,0x2e,0xb8,0xa0,0x41,
+  0xef,0xa1,0x19,0x9e,0x7a,0xea,0xa9,0x7a,0x64,0x11,0x23,0x8f,0x16,0x00,0x5d,0xcb,
+  0xae,0x20,0x1d,0x3f,0xa6,0x61,0x19,0x16,0x7e,0xf8,0xe1,0x07,0xdd,0x77,0x21,0x7d,
+  0x05,0x02,0x9a,0x9a,0x68,0x1e,0x8c,0xba,0xa2,0x21,0x40,0x58,0x70,0x19,0x81,0x58,
+  0xd9,0x08,0xfd,0x9b,0x6f,0xbe,0x49,0xf9,0xac,0xad,0x55,0x28,0xe9,0xa8,0x6f,0xe0,
+  0x2a,0xf5,0x61,0x61,0xd1,0xa2,0x45,0xea,0x8d,0x37,0xde,0xd0,0xcf,0xe5,0xc3,0x68,
+  0xa3,0x4a,0xf8,0xf8,0xe3,0x8f,0x35,0x61,0x92,0xa8,0xf6,0x73,0x4e,0x80,0xa8,0xc1,
+  0x3b,0x99,0x78,0x02,0x78,0x02,0x78,0x02,0x78,0x02,0x2c,0xd3,0x04,0x98,0x35,0x6b,
+  0x96,0x1a,0x38,0x70,0xa0,0x1a,0x34,0x68,0x50,0xec,0xd1,0x31,0x9a,0x77,0x3c,0x9b,
+  0xce,0x18,0xf3,0xa1,0x09,0x13,0xc0,0x07,0x4f,0x00,0x1f,0x3c,0x01,0x7c,0xf0,0x04,
+  0xf0,0xc1,0x13,0xc0,0x07,0x4f,0x00,0x1f,0x3c,0x01,0x8a,0x23,0x24,0x75,0xae,0xa4,
+  0x27,0x40,0xc4,0x90,0xcf,0x4e,0x2c,0xc6,0x1e,0x3c,0x01,0x9a,0x78,0xc8,0xc7,0x5c,
+  0x49,0x26,0x9c,0xe0,0xb9,0x6c,0x7b,0x4f,0x7b,0x02,0x14,0x49,0xd8,0x65,0x97,0x5d,
+  0xb4,0x56,0x61,0x52,0x8a,0x27,0x40,0x96,0x21,0xd3,0x79,0x87,0xf6,0x5c,0xc7,0xaf,
+  0xbe,0xfa,0x4a,0xcf,0x4c,0xc2,0x25,0x7c,0xf8,0xf0,0xe1,0xce,0xf4,0x53,0x3d,0xcf,
+  0x0c,0x25,0xbc,0x87,0x70,0x60,0x39,0xfa,0xe8,0xa3,0x55,0xcf,0x9e,0x3d,0xb5,0x03,
+  0xa9,0x19,0x66,0xcf,0x9e,0xad,0x9f,0x91,0x6a,0x05,0x3f,0x45,0x7e,0x03,0xba,0xd8,
+  0xed,0x10,0x65,0x4e,0x64,0xdc,0xef,0x49,0x1c,0x01,0x32,0x9d,0x77,0x68,0x0e,0x6e,
+  0xe1,0x63,0x20,0xd3,0xd6,0xec,0xb9,0x83,0x51,0x3c,0xa4,0x3e,0xfb,0xec,0xb3,0xc0,
+  0xf5,0xdc,0x04,0xde,0x45,0xa6,0xff,0xa4,0xe9,0xfd,0x6c,0x03,0x0f,0x26,0x33,0x44,
+  0x9d,0x13,0x19,0xf7,0x7b,0x12,0x4b,0x80,0xb8,0xf3,0x0e,0xcd,0x0c,0x63,0x8e,0xa1,
+  0x4c,0x40,0x21,0xb3,0x10,0x54,0x1c,0x02,0x88,0xb7,0x12,0x02,0x87,0x6c,0xbb,0xee,
+  0xba,0x6b,0x70,0x0d,0x0f,0x28,0x53,0x03,0xdc,0x76,0xdb,0x6d,0x41,0x9a,0xbb,0xed,
+  0xb6,0x9b,0xfe,0x0d,0x18,0x2c,0x93,0x10,0x67,0x4e,0x64,0xdc,0xef,0x49,0x2c,0x01,
+  0xe2,0xce,0x3b,0x34,0x33,0x8c,0x89,0xae,0xe3,0xc6,0x8d,0x8b,0xd5,0x0a,0xb0,0x7d,
+  0x24,0xbb,0x77,0xef,0x1e,0x58,0xf5,0xc4,0xe2,0x93,0xc8,0xc4,0xd9,0xb8,0x36,0x40,
+  0x9c,0x39,0x91,0x71,0xbf,0x27,0xb1,0x04,0x88,0x33,0xef,0xd0,0xce,0xb0,0x01,0x03,
+  0x06,0xc4,0x6e,0x06,0x9a,0xcf,0x33,0xbf,0xc0,0x0e,0x38,0xb9,0x86,0xcd,0x47,0x48,
+  0x45,0x80,0x4c,0xe6,0x44,0xc6,0xf9,0x9e,0x44,0xdb,0x00,0xae,0xe0,0x9a,0x77,0x68,
+  0x67,0x58,0x2a,0x07,0x97,0x28,0x04,0x70,0xb9,0x9c,0x9f,0x7c,0xf2,0xc9,0x19,0x11,
+  0x20,0x93,0x39,0x91,0x71,0xbe,0xa7,0xe8,0x08,0xe0,0x9a,0x77,0x98,0x6b,0x02,0xb8,
+  0x9e,0xcf,0x94,0x00,0x99,0xce,0x89,0xf4,0x04,0x88,0x31,0xef,0xb0,0x29,0x13,0x20,
+  0xd3,0x39,0x91,0x9e,0x00,0x31,0xe6,0x1d,0x36,0x15,0x02,0xd0,0xbe,0x77,0xb5,0xfd,
+  0x33,0x99,0x13,0x59,0xf4,0x04,0x88,0x3b,0xef,0xb0,0x31,0x09,0x20,0xcd,0x39,0xd7,
+  0xac,0x26,0x42,0x26,0x73,0x22,0x8b,0x9e,0x00,0x71,0xe7,0x1d,0x36,0x26,0x01,0x30,
+  0xe6,0xe4,0x9d,0x59,0x6d,0xcd,0x0e,0x99,0xcc,0x89,0x6c,0x92,0x04,0xa0,0x3d,0xcc,
+  0x8a,0x1a,0x0c,0x7a,0x1c,0x7e,0xf8,0xe1,0x01,0x0e,0x3b,0xec,0x30,0xbd,0x3a,0x07,
+  0xb3,0x78,0x01,0xeb,0x09,0x00,0xce,0xd1,0x85,0x7b,0xe2,0x89,0x27,0xea,0x66,0x4e,
+  0xd7,0xae,0x5d,0xd5,0x0d,0x37,0xdc,0xa0,0x67,0xf6,0xd2,0x11,0x32,0x7d,0xfa,0x74,
+  0x3d,0x8d,0x2b,0xac,0x1f,0x20,0xce,0xbc,0xc3,0xc6,0x24,0x80,0x39,0x2b,0x99,0x4e,
+  0x1b,0xbe,0x99,0x2e,0x64,0x33,0xc4,0x9d,0x13,0xd9,0x64,0x08,0x80,0x9a,0x9d,0x3a,
+  0x75,0xaa,0xee,0x94,0x81,0xbd,0x22,0x74,0x96,0x71,0x93,0xd8,0x05,0xf3,0x9e,0xb0,
+  0xfb,0x5b,0xb5,0x6a,0xa5,0x3b,0x56,0x20,0x96,0xa8,0xf3,0x4c,0xe7,0x1d,0xd2,0x33,
+  0x28,0xf7,0x2d,0x5e,0xbc,0x38,0xf4,0x7b,0xc2,0xe6,0x4a,0xa6,0x7b,0x9e,0xfa,0x9d,
+  0x6b,0x54,0x41,0xae,0x70,0xdd,0x75,0xd7,0xd5,0x9b,0x94,0xba,0xdf,0x7e,0xfb,0x35,
+  0xb8,0x27,0xce,0x9c,0xc8,0xa8,0xdf,0x93,0x37,0x02,0x20,0x10,0xea,0x2b,0x98,0x4f,
+  0x69,0xa6,0x37,0xcb,0x04,0x2c,0x97,0xd8,0x3c,0x0e,0xbb,0x6e,0x82,0xf5,0x7a,0x10,
+  0x3e,0xa4,0x02,0xac,0x08,0x86,0x2a,0xe4,0x3f,0x73,0x35,0xef,0xb0,0x31,0x02,0xef,
+  0xcf,0xec,0x64,0x96,0xb0,0xb3,0x35,0x9b,0x19,0xf2,0x31,0x27,0x32,0xa7,0x04,0x40,
+  0xe5,0xd0,0x7e,0x3d,0xe6,0x98,0x63,0xf4,0x48,0x58,0xae,0x80,0xe0,0x99,0xbf,0x4f,
+  0x2f,0x9f,0xd9,0x19,0xc2,0x28,0x1b,0x19,0x81,0x26,0xf0,0xb3,0x8e,0x1a,0x91,0x00,
+  0x2c,0xa0,0x30,0x6a,0xd4,0xa8,0x60,0xb8,0x32,0x57,0x60,0xcd,0x81,0xbd,0xf6,0xda,
+  0x4b,0x75,0xec,0xd8,0xb1,0x41,0x4f,0x18,0xc0,0x28,0x62,0xb5,0x2f,0xb4,0x80,0x27,
+  0x40,0x81,0x09,0x40,0xa6,0xd3,0xa1,0x42,0x1d,0x84,0xba,0x17,0xb5,0x8c,0xe1,0x26,
+  0xb1,0x0b,0xe6,0x3d,0xae,0xfb,0xc5,0x66,0xa0,0x8d,0x4c,0x7d,0x4f,0xa9,0x37,0x49,
+  0x41,0x55,0x00,0x31,0x38,0x66,0x54,0x8d,0xea,0x86,0xc1,0x1d,0x4f,0x80,0x02,0x10,
+  0x80,0xba,0xea,0xed,0xb7,0xdf,0x56,0xdd,0xba,0x75,0xd3,0x82,0x61,0xb8,0xd5,0x06,
+  0x64,0x90,0xd8,0x05,0xf3,0x1e,0xfb,0x7e,0x84,0xcb,0x3a,0xbe,0xb4,0x08,0x10,0xb0,
+  0x08,0x9f,0x98,0xaa,0x00,0x62,0xb0,0x04,0x1d,0x96,0x30,0xe7,0xa8,0x37,0xbf,0xff,
+  0xfe,0x7b,0x4d,0x00,0x3f,0xef,0x30,0xcf,0x04,0xc0,0xe0,0xc2,0xbb,0x05,0x6b,0x36,
+  0x9f,0x40,0xb0,0x26,0xb0,0x27,0x30,0x26,0x71,0xb4,0x40,0xf0,0x8c,0xb1,0xb3,0x2a,
+  0x09,0xe7,0x59,0xb1,0x03,0x3b,0x20,0x89,0x4b,0xb8,0x36,0x19,0x02,0x50,0xea,0x11,
+  0x3e,0xcd,0xa8,0x7c,0x0b,0x1f,0x20,0x58,0x01,0x4e,0x10,0x18,0x7f,0x22,0x78,0x56,
+  0xfb,0x42,0x43,0x6c,0xbd,0xf5,0xd6,0x8d,0x4e,0x00,0xaa,0x40,0x56,0x44,0xf9,0xe8,
+  0xa3,0x8f,0x92,0x4b,0x00,0x84,0x4f,0xe6,0xe2,0xa9,0x52,0x08,0xe1,0x03,0x54,0x3d,
+  0x75,0x7f,0xcb,0x96,0x2d,0x03,0x75,0x2f,0x82,0x67,0xfd,0xa1,0x2d,0xb7,0xdc,0x52,
+  0xfb,0xe7,0xe7,0x8b,0x00,0xd8,0x14,0xd8,0x16,0x0c,0xb4,0x30,0x6a,0x88,0x2f,0x1e,
+  0xfd,0x0a,0x27,0x9d,0x74,0x92,0x7e,0x27,0xc8,0x87,0xd7,0x11,0x1d,0x4d,0x54,0x85,
+  0x38,0x67,0x2c,0xcb,0xfb,0x09,0x94,0xa4,0x63,0x39,0x6e,0x49,0x58,0xe2,0x85,0x22,
+  0x00,0x16,0x3f,0x82,0xe7,0x58,0xd4,0xbd,0x29,0x78,0xf6,0x22,0xa0,0x53,0x86,0xfb,
+  0xa2,0x12,0x00,0x0d,0x86,0xbf,0xde,0xeb,0xaf,0xbf,0xae,0x7b,0x12,0xe9,0x2c,0xb9,
+  0xfe,0xfa,0xeb,0xf5,0x02,0x52,0xd8,0x1b,0xfc,0x07,0x3d,0x71,0xac,0x15,0xcc,0x0a,
+  0x67,0x08,0x18,0xa3,0x12,0xb0,0xbe,0x20,0xc2,0x06,0xf4,0xc4,0x71,0x0f,0xab,0x90,
+  0x7f,0xfa,0xe9,0xa7,0xda,0x1d,0x8b,0xce,0x25,0xe9,0x8b,0x48,0x14,0x01,0x68,0x5b,
+  0xd3,0xc6,0xbe,0xe5,0x96,0x5b,0x0a,0x26,0x7c,0x21,0x80,0x08,0x5e,0xd4,0x3d,0xc2,
+  0xc7,0xcf,0x0e,0x21,0xe1,0x08,0x81,0x43,0x24,0x06,0x23,0x3d,0x8d,0x74,0x9e,0x3c,
+  0xf3,0xcc,0x33,0xda,0xe1,0x83,0x11,0x3f,0x76,0xf9,0xa0,0x23,0x09,0xd2,0xd2,0xc3,
+  0xc6,0xda,0x80,0xf4,0x9a,0xe1,0x12,0x86,0x40,0x21,0x0f,0xe9,0x90,0x06,0xc2,0xe5,
+  0x1c,0x83,0x2d,0x9b,0x6d,0xb6,0x99,0x76,0x17,0x63,0xa1,0x6b,0x13,0xa4,0xc1,0x7f,
+  0xb2,0x72,0x18,0xfe,0x85,0xac,0x8b,0x48,0xf3,0x93,0x92,0x8f,0x01,0x8a,0xeb,0x19,
+  0x1d,0x4d,0x89,0x23,0x00,0xa5,0x8a,0x8e,0x1d,0xac,0xf0,0x42,0x13,0x80,0x85,0x9e,
+  0x45,0xf0,0x08,0x00,0xe1,0x8b,0xe0,0x11,0x1e,0x02,0xc3,0xdf,0x8d,0xfe,0x70,0xce,
+  0xa3,0x15,0x38,0x27,0xa5,0x56,0x04,0x8a,0x00,0x19,0xfd,0xa3,0x1b,0x35,0x2a,0xf8,
+  0x6f,0x62,0x9e,0x83,0x2c,0x08,0xfe,0xec,0xb3,0xcf,0xd6,0x24,0x63,0x25,0x34,0xd6,
+  0x19,0xa6,0xf5,0x81,0x06,0x60,0x75,0x34,0xfa,0x21,0x12,0x47,0x00,0x3e,0x86,0xd2,
+  0xcf,0x07,0x32,0xd8,0x50,0x48,0x02,0x50,0xb2,0x45,0xdd,0x23,0x78,0x84,0x80,0x5b,
+  0x34,0x82,0x46,0x35,0xa3,0x82,0x39,0xc7,0xe2,0x94,0xf4,0x15,0xd0,0x1f,0x2e,0xb1,
+  0x79,0x4c,0x6c,0x83,0xf3,0x3c,0x27,0x55,0x0a,0xe4,0x22,0x2d,0xfe,0x07,0xc2,0x40,
+  0x24,0x08,0x84,0xba,0xa7,0x2a,0x60,0xf0,0x8a,0xd5,0x46,0x99,0x0d,0x84,0x47,0x11,
+  0xfb,0x10,0xe1,0xaa,0x05,0x01,0xd0,0x02,0x54,0x3f,0x68,0x00,0x0a,0x4b,0xa2,0x08,
+  0x80,0xfa,0x67,0x95,0x4d,0x3e,0xb2,0x90,0xc2,0x07,0x47,0x1c,0x71,0x44,0x50,0xcf,
+  0x23,0x78,0x31,0xb8,0x50,0xe5,0x94,0x68,0x8c,0x42,0xd4,0xbb,0x40,0x6c,0x05,0x0c,
+  0x45,0x11,0x2c,0xc2,0xe4,0x79,0xd1,0x1a,0x94,0x62,0x88,0xc3,0xe2,0xd1,0xc4,0xa4,
+  0x47,0xda,0xdc,0x87,0xa6,0xa1,0xba,0x21,0x1d,0x06,0x62,0x18,0x31,0x94,0xd1,0x48,
+  0xb4,0x51,0x18,0x30,0x56,0x25,0x36,0x8f,0xa3,0xde,0x6f,0x23,0xdd,0xf3,0x71,0xc0,
+  0x40,0x19,0xdd,0xe7,0x51,0x48,0x59,0x12,0x66,0xfc,0x31,0xf0,0xc0,0x62,0x89,0x8d,
+  0x41,0x00,0x11,0x3c,0x82,0x43,0xd5,0x53,0x2a,0x11,0xbe,0x59,0x15,0xd8,0x42,0xa5,
+  0x3a,0xa0,0x4e,0x47,0xfd,0x73,0x2f,0x6a,0x9c,0x12,0x0f,0x49,0x10,0x2c,0xbd,0x87,
+  0xf4,0x27,0x1c,0x72,0xc8,0x21,0x91,0x00,0x09,0x24,0x36,0x8f,0x73,0x75,0x7f,0x5c,
+  0xd8,0xe9,0xdb,0xe0,0x1a,0xe4,0x45,0x63,0xcb,0x48,0x2a,0x5a,0xdc,0x74,0x27,0x8f,
+  0x4c,0x00,0x54,0x1a,0xa3,0x52,0xef,0xbf,0xff,0x7e,0x41,0x85,0x4f,0x29,0xc6,0x10,
+  0xa3,0xb4,0x63,0x71,0x53,0x52,0xa5,0x8e,0xa7,0x44,0x73,0x8d,0x3a,0x1a,0xc1,0x72,
+  0x3f,0x7d,0x04,0x8c,0x0e,0xe2,0x22,0x0d,0xe3,0x25,0x36,0x8f,0x89,0x5d,0xd7,0x6d,
+  0x14,0xfa,0x7e,0x1b,0xe9,0xde,0x3f,0x15,0xd8,0xef,0x80,0x96,0x13,0xfe,0x15,0xe6,
+  0x50,0x3a,0x32,0x84,0x04,0xa9,0x34,0x41,0x28,0x01,0xb0,0x70,0xa9,0xeb,0x0a,0x25,
+  0x7c,0x1c,0x26,0xa8,0x9f,0x69,0x96,0xc9,0x47,0xf0,0x41,0x30,0x1a,0xf0,0x91,0xb9,
+  0x04,0x5a,0x41,0x62,0xf3,0x38,0x57,0xf7,0x17,0x02,0xfc,0x3f,0xf9,0x46,0xe9,0x37,
+  0x1d,0x6d,0xc4,0x6f,0x02,0xbf,0x42,0x19,0x2c,0x8b,0x4d,0x00,0xd9,0x11,0xa3,0xd0,
+  0x55,0x80,0x7c,0x00,0xec,0x47,0xa5,0x09,0xf0,0xee,0x91,0xd8,0x3c,0x0e,0xbb,0x9e,
+  0x0e,0xd9,0x3e,0x1f,0x37,0x7d,0x1b,0xe9,0xbe,0x27,0xdd,0xfd,0x54,0x6d,0xd4,0xf5,
+  0x61,0x0e,0x36,0x14,0x1e,0x7a,0x29,0x65,0xb0,0x6c,0x99,0x20,0x00,0xfd,0xfd,0x7c,
+  0x14,0x5d,0xc0,0xd4,0x6b,0x12,0xbb,0x60,0xde,0xe3,0xba,0x3f,0xdb,0xeb,0xe9,0x10,
+  0x37,0x7d,0x1b,0x99,0xbe,0x0f,0x25,0x1f,0x7b,0x26,0xcc,0xa3,0xca,0x84,0x39,0x58,
+  0xb6,0xcc,0x68,0x00,0x8f,0xd4,0x48,0x25,0x70,0x4a,0xbd,0xd8,0x01,0xc4,0x51,0x7a,
+  0x4a,0x3d,0x01,0x96,0x61,0x02,0x98,0xc2,0xb6,0x81,0xf6,0xf0,0x04,0x48,0x28,0x01,
+  0x5c,0x02,0x17,0xa1,0x4b,0x9c,0x77,0x02,0x60,0x99,0x47,0xad,0x2f,0x3d,0xe2,0x03,
+  0x43,0xcf,0x95,0xef,0xb6,0xc0,0x6d,0xa1,0x9b,0xc8,0x1b,0x01,0xb0,0x40,0x79,0x49,
+  0x3a,0x6d,0x4c,0x30,0x08,0x23,0xb1,0x79,0x4c,0x8c,0x71,0x67,0x36,0xa3,0xc2,0x80,
+  0xd7,0x8f,0x9d,0xee,0xb2,0x82,0x54,0xdf,0x1f,0x17,0x61,0x5d,0xf0,0x22,0x70,0x57,
+  0x89,0xb7,0x0d,0xc9,0xbc,0x11,0x80,0xce,0x07,0xba,0x1c,0xa5,0xbb,0xd4,0xe5,0xc2,
+  0x6d,0xba,0x7d,0xef,0xdb,0xbc,0x8d,0xda,0xaf,0xd5,0x99,0xaa,0xfd,0x61,0xd7,0xa8,
+  0x83,0x0f,0xfd,0x17,0x72,0x4c,0xac,0x51,0x7b,0xdc,0xb6,0x7d,0x77,0xb5,0xf3,0x2e,
+  0xad,0xf5,0x47,0xb8,0xba,0x38,0xed,0xff,0x33,0xcf,0xe5,0xe3,0x7e,0x1b,0xf6,0xf3,
+  0x51,0xbe,0x3f,0xd5,0xf3,0x61,0xe0,0xfb,0xc3,0x34,0x6f,0x2a,0xa1,0xdb,0xad,0x88,
+  0xbc,0x11,0x80,0x76,0xa7,0xe9,0xb9,0x93,0x0a,0xad,0x5a,0xb7,0x53,0x47,0x9f,0x78,
+  0xb3,0xba,0xa8,0xdb,0x04,0x75,0x61,0xb7,0xa7,0x75,0xac,0x71,0xb9,0x11,0x1b,0x68,
+  0x79,0xc0,0xa9,0xfa,0xe5,0xa3,0xa6,0x9f,0x4b,0x88,0x0b,0x9a,0xe9,0x8e,0x26,0x71,
+  0x21,0x81,0x26,0x4c,0x45,0x00,0x57,0x93,0xd2,0x6e,0x4e,0xe6,0x8d,0x00,0xa8,0xf1,
+  0x30,0x8f,0x5f,0x1b,0x7c,0x4c,0xcb,0x36,0x27,0xa8,0x2b,0x6f,0x7c,0x41,0x55,0xfe,
+  0x6f,0x6a,0x5a,0x5c,0xd6,0x73,0xa2,0x6a,0xd1,0xaa,0x3c,0xa5,0x57,0xb1,0x09,0xbc,
+  0x74,0x24,0x36,0x8f,0xa3,0xbe,0x5f,0x63,0xc3,0xf5,0xfe,0x94,0x6e,0x06,0xb7,0xc2,
+  0x08,0x60,0x97,0x72,0x7b,0xec,0xc1,0x3c,0xce,0x0b,0x01,0x48,0x38,0xcc,0x03,0xd8,
+  0xf6,0xf8,0x6d,0x7f,0x48,0x07,0x75,0x41,0xf7,0x7b,0x54,0xdf,0x51,0xb3,0x23,0x81,
+  0x7b,0x79,0x26,0x2c,0xbd,0x5c,0x7a,0x20,0x67,0x92,0x7e,0x21,0xd2,0xc3,0xbe,0x92,
+  0xb1,0x8e,0x30,0x02,0x84,0x0d,0x06,0xd9,0x83,0x4f,0x79,0x21,0x00,0x2a,0x91,0x71,
+  0x72,0x17,0xce,0x38,0xe3,0x8c,0x20,0x06,0x6d,0xdb,0x77,0x54,0xb7,0x8c,0x9c,0xa6,
+  0x86,0x3f,0x39,0xaf,0x21,0xc6,0x7d,0xfd,0x5f,0x5c,0x8b,0x01,0x0f,0x7c,0xa8,0x3a,
+  0x1c,0x79,0xba,0x9e,0x5c,0x12,0x96,0x9e,0x79,0x2e,0x1f,0xc8,0xf6,0xff,0xb2,0x7d,
+  0x9e,0xe1,0x60,0xbc,0xa0,0x18,0x14,0x0b,0x23,0x80,0x5d,0xd2,0xc3,0xc0,0xc8,0x67,
+  0x5e,0x08,0x20,0x33,0x76,0xa3,0xa0,0x6d,0xbb,0x0e,0xea,0xec,0xae,0xfd,0x54,0xcf,
+  0x81,0x13,0xd5,0x35,0x77,0x3c,0x1b,0xc4,0xfa,0xd8,0x88,0xbb,0xf5,0xaa,0x52,0x87,
+  0x1f,0xd7,0x29,0x6d,0xda,0xf8,0xf0,0x49,0x6c,0x1e,0x47,0x7d,0x9f,0x7c,0xa7,0x97,
+  0xcd,0xff,0x41,0x00,0x06,0x76,0x20,0x00,0xc0,0xef,0x21,0x4c,0x03,0xb8,0x4a,0xbb,
+  0x3d,0xd4,0x9d,0x37,0x02,0x60,0x00,0x9e,0x73,0xce,0x39,0x91,0xc0,0x47,0xd1,0xa4,
+  0x09,0xeb,0xb9,0x92,0xf3,0x30,0x9f,0x8c,0xb0,0x9f,0xc7,0x15,0x4b,0x62,0xf3,0x38,
+  0xea,0xff,0xa7,0x43,0xbe,0xd3,0x8f,0xfa,0x7f,0x10,0x00,0x8f,0x25,0x11,0x3e,0x80,
+  0x0c,0x61,0x1a,0xc0,0x55,0xda,0x5d,0xc8,0x0b,0x01,0x18,0x8f,0x47,0x60,0x2c,0x89,
+  0xc6,0x5c,0x81,0x8a,0x8a,0x0a,0x1d,0xbb,0x20,0xd7,0x88,0x5d,0xb0,0x9f,0xb7,0xef,
+  0x8f,0x7b,0x3d,0xdd,0xff,0xa7,0x4b,0x2f,0xdb,0xf7,0x8b,0xfb,0xfd,0x90,0x9e,0x82,
+  0x80,0x17,0x13,0xde,0x4c,0x26,0x01,0xc2,0x0c,0x41,0x5b,0xe8,0x36,0x01,0xcc,0xb5,
+  0x16,0xf2,0x46,0x00,0x9c,0x33,0x80,0xb8,0x4d,0xe3,0xc1,0x93,0x09,0xe4,0x59,0x62,
+  0xf3,0x38,0xea,0xf5,0xb8,0xe9,0x15,0xfa,0xfe,0x28,0xdf,0x8f,0x93,0xab,0x2d,0x7c,
+  0x10,0x66,0x08,0xda,0xa5,0x5c,0x84,0x6d,0x2e,0xb0,0x21,0x24,0xc8,0x0b,0x01,0xa8,
+  0x9b,0xf0,0xa3,0xc3,0x3d,0x0b,0xf7,0x2b,0x3c,0x76,0xc4,0x69,0x33,0x15,0xc4,0x63,
+  0xd7,0x06,0x19,0x90,0x6b,0x08,0x41,0xc5,0x05,0xdc,0x3c,0xce,0x16,0x61,0xdf,0x21,
+  0x48,0x97,0x0f,0x22,0x7c,0xd2,0x12,0x0f,0x27,0x5b,0xf8,0x80,0x2a,0x21,0x2e,0x01,
+  0x4c,0xd0,0xf3,0x5a,0x90,0xc1,0x20,0xf1,0xe4,0x71,0x7d,0x84,0x47,0xe6,0x08,0xb3,
+  0x01,0x52,0x09,0xdc,0x3e,0x2e,0xd8,0x68,0x20,0x5a,0x41,0x5c,0xae,0xbd,0xf0,0xb2,
+  0x03,0x4d,0x40,0x16,0x8f,0x0e,0xcb,0x6b,0x5b,0xf0,0xa6,0xd0,0x6d,0xf8,0xe1,0xe0,
+  0x04,0xc2,0x55,0xea,0x6d,0xc1,0x33,0xa0,0x06,0x3c,0x01,0x12,0x4a,0x00,0x57,0x69,
+  0x17,0xc1,0x7b,0x02,0x24,0x1c,0xae,0x92,0x6e,0x1e,0x03,0x7c,0x09,0x3c,0x01,0x12,
+  0x0a,0x5b,0xe0,0x2e,0xe1,0x7b,0x02,0x14,0x01,0x01,0x44,0xc8,0x66,0x89,0x37,0x63,
+  0xe0,0x09,0x90,0x50,0x02,0x98,0xc2,0x36,0x05,0xee,0x09,0x50,0x04,0x08,0x13,0xbc,
+  0x6b,0x92,0x89,0x27,0x40,0x42,0x09,0x10,0x75,0x26,0x92,0x27,0x40,0x02,0x61,0x97,
+  0xf4,0x30,0x30,0x7b,0xc8,0x13,0x20,0xa1,0x1a,0x20,0x4c,0xe0,0x9e,0x00,0x45,0xa2,
+  0x01,0x5c,0xc2,0x77,0xc1,0x13,0x20,0xc1,0x04,0x10,0x21,0xdb,0x04,0x90,0xf5,0x05,
+  0x3c,0x01,0x12,0x0a,0xbb,0x94,0x8b,0xb0,0x25,0x36,0x49,0xe0,0x09,0x50,0x24,0x04,
+  0x08,0x5b,0x91,0x24,0x27,0x04,0xc0,0x35,0xc9,0xa3,0xe9,0xc0,0x2c,0xf1,0xae,0x25,
+  0x68,0xcc,0x63,0xaf,0x01,0x12,0x88,0x54,0x25,0xde,0x86,0x27,0x40,0xc2,0x09,0x10,
+  0xb6,0x90,0x14,0x0b,0x67,0x01,0x4f,0x80,0x84,0x12,0x20,0x6c,0xb5,0x30,0x59,0x31,
+  0xcd,0x13,0x20,0xc1,0x70,0x95,0x74,0xf3,0x18,0xb0,0xaa,0xb9,0x27,0x40,0x42,0x61,
+  0x0b,0xdc,0x16,0xbe,0xb9,0x8c,0x9d,0x27,0x40,0x82,0x09,0x20,0xa5,0x5c,0x84,0x2e,
+  0x8b,0x6f,0xb0,0xd2,0x1a,0x0b,0x68,0x12,0x7b,0x02,0x24,0x94,0x00,0xa6,0xd0,0x81,
+  0x29,0x74,0x56,0x0c,0x95,0x75,0x94,0x3d,0x01,0x12,0x08,0x11,0xbc,0x08,0x1c,0x98,
+  0x8b,0x67,0x33,0x9f,0x00,0xb7,0x72,0x62,0x4f,0x80,0x04,0x42,0x04,0x6f,0x0b,0x5d,
+  0x20,0xcb,0xe2,0xb3,0xcd,0x8d,0x27,0x40,0x02,0xe1,0x2a,0xe9,0xe6,0x3e,0x09,0x4c,
+  0xce,0x61,0x06,0x37,0xfb,0x0d,0xcf,0x9a,0x35,0x2b,0xfb,0x95,0x42,0xa9,0x6f,0x7c,
+  0xc6,0x37,0x0d,0x88,0xc0,0xcd,0x0d,0x30,0x88,0x99,0x4d,0x84,0xe0,0x01,0xc6,0x21,
+  0x7b,0x28,0x56,0x57,0x57,0xeb,0xb5,0x82,0x59,0xf6,0x3f,0xab,0xc5,0xa2,0x0b,0xbd,
+  0x65,0x8c,0x47,0x38,0xd8,0xd8,0x02,0x81,0x8b,0xb0,0x45,0xf0,0xb2,0xdd,0x0d,0x2b,
+  0xb2,0x0d,0x19,0x32,0x44,0x8d,0x1d,0x3b,0x56,0xef,0x6c,0xf2,0xc5,0x17,0x5f,0xe8,
+  0x8d,0x3f,0xd8,0x00,0x24,0xe3,0xe5,0xe2,0xd9,0x5d,0xcb,0x67,0x7e,0xe3,0x83,0x81,
+  0x20,0x11,0xba,0xec,0x6b,0x24,0x7b,0x1c,0xb1,0xbf,0x51,0x97,0x2e,0x5d,0xd4,0xa0,
+  0x41,0x83,0xf4,0xe6,0xdd,0x93,0x27,0x4f,0xd6,0xbb,0xbd,0x51,0x88,0xd9,0xd5,0x2c,
+  0xa3,0xfd,0x02,0xd8,0x6c,0xe0,0x83,0x0f,0x3e,0xd0,0x6c,0xda,0x67,0x9f,0x7d,0xbc,
+  0x10,0x1a,0x59,0xf8,0xe6,0xc6,0x56,0x08,0x1c,0x30,0x29,0xb7,0x73,0xe7,0xce,0x7a,
+  0xb7,0xb4,0xc1,0x83,0x07,0x6b,0xe1,0x4f,0x9a,0x34,0x49,0x17,0x5c,0x36,0xb5,0x64,
+  0x3f,0xa3,0x8c,0x76,0x0c,0xe1,0x21,0x76,0x0c,0x63,0xcb,0x18,0x12,0x2c,0xc4,0x96,
+  0xb1,0x1e,0x6e,0x50,0xcf,0x8b,0xd0,0x59,0x97,0x01,0x50,0x2d,0xa3,0x99,0xd9,0xd0,
+  0x73,0xc0,0x80,0x01,0x6a,0xf8,0xf0,0xe1,0xea,0xa1,0x87,0x1e,0xd2,0x25,0x9f,0x6a,
+  0x9b,0x2d,0xed,0x50,0xfd,0x51,0x36,0xb3,0x82,0x00,0x4b,0x52,0x6d,0x1a,0xc5,0xbe,
+  0x7c,0x30,0xab,0x50,0x5b,0xc7,0x7a,0xd4,0xdf,0x42,0x47,0x4a,0x3b,0x6d,0x7f,0x76,
+  0x2a,0xed,0xdd,0xbb,0xb7,0xea,0xdb,0xb7,0xaf,0xba,0xe3,0x8e,0x3b,0xb4,0xe0,0xd9,
+  0xd5,0x6c,0xdc,0xb8,0x71,0x7a,0x0f,0x45,0x34,0x36,0x25,0x3f,0xaa,0xf0,0x91,0x3d,
+  0x04,0xa8,0x09,0xdb,0x36,0x6e,0xfe,0xfc,0xf9,0x6a,0xc6,0x8c,0x19,0xba,0x49,0x31,
+  0x62,0xc4,0x08,0xd5,0xa3,0x47,0x0f,0x5f,0x1d,0x14,0x50,0xf8,0xcd,0x9a,0x35,0xd3,
+  0x6b,0x00,0xf5,0xea,0xd5,0x2b,0x28,0xed,0x18,0x79,0xf7,0xdc,0x73,0x8f,0x2e,0xf1,
+  0xc8,0x65,0xca,0x94,0x29,0x7a,0x47,0xf7,0x39,0x73,0xe6,0xa8,0x05,0x0b,0x16,0xc4,
+  0xdd,0xc6,0xae,0x06,0x02,0x54,0xa7,0xda,0x38,0x72,0xee,0xdc,0xb9,0x7a,0x4b,0xf6,
+  0x47,0x1e,0x79,0x44,0x0d,0x1b,0x36,0x4c,0xf5,0xeb,0xd7,0x4f,0x55,0x56,0x56,0xfe,
+  0xbb,0x0c,0xac,0x6f,0x22,0xe6,0x65,0xb8,0x97,0x25,0xe0,0x4e,0x3d,0xf5,0x54,0x5d,
+  0xb7,0x53,0xda,0x07,0x0e,0x1c,0xa8,0x0b,0x20,0xa5,0xfd,0xf1,0xc7,0x1f,0xd7,0x4d,
+  0x3c,0x36,0xb1,0x9c,0x39,0x73,0xa6,0x16,0x3c,0xa5,0x9e,0xe6,0x9e,0xec,0x12,0x16,
+  0x63,0x0f,0xc3,0x6a,0x08,0x50,0x99,0x6a,0xf3,0xc8,0x85,0x0b,0x17,0x06,0x9b,0x29,
+  0x43,0x02,0x5e,0x84,0x0d,0x95,0xfb,0xf4,0xe9,0xa3,0x5f,0x90,0xad,0x65,0xc1,0xcd,
+  0x37,0xdf,0xec,0x91,0x05,0x24,0x1f,0xc9,0x53,0x4a,0x7b,0xff,0xfe,0xfd,0xb5,0x61,
+  0x47,0x9b,0x9e,0xd2,0x3e,0x61,0xc2,0x04,0x2d,0x83,0xe9,0xd3,0xa7,0x6b,0x79,0xd0,
+  0xc4,0xa3,0xc4,0x53,0x48,0xd9,0x1b,0x99,0x02,0x9b,0xaa,0xb9,0x17,0x12,0x2a,0x21,
+  0x40,0x19,0x76,0x5f,0x98,0x31,0xc8,0x06,0xc9,0x54,0x05,0xfc,0x29,0x9a,0x00,0xb5,
+  0x33,0x66,0xcc,0x18,0xfd,0x62,0x6c,0xc2,0x3c,0x74,0xe8,0x50,0xad,0x96,0x3c,0xb2,
+  0x07,0x79,0x49,0x9e,0x8e,0x1c,0x39,0x52,0x8d,0x1e,0x3d,0x5a,0x3d,0xf6,0xd8,0x63,
+  0x6a,0xe2,0xc4,0x89,0xc1,0x6e,0xa5,0x6c,0x57,0x4b,0x69,0xa7,0x85,0x46,0x3d,0x9f,
+  0xe5,0xc6,0xd5,0xc8,0xbc,0xac,0x84,0x50,0x7b,0x50,0x15,0xa6,0x05,0x84,0x04,0x68,
+  0x02,0xaa,0x03,0x6c,0x02,0x0c,0x43,0x5a,0x07,0xb0,0x72,0xfc,0xf8,0xf1,0xda,0x08,
+  0x61,0x57,0x6e,0x8f,0xcc,0x41,0x1e,0x92,0x97,0x6c,0x51,0x8b,0xd0,0x29,0xed,0xd3,
+  0xa6,0x4d,0xd3,0xed,0x79,0x4a,0x3b,0xf9,0xbf,0x78,0xf1,0xe2,0x7a,0xa5,0x3d,0xcb,
+  0xed,0x6a,0xab,0x4a,0x24,0xd4,0xfe,0x28,0xad,0xc5,0xa2,0x54,0x24,0xa0,0x3a,0x40,
+  0xdd,0xb0,0x9f,0x30,0xad,0x03,0x9a,0x88,0x6c,0x2c,0x09,0x33,0x69,0x7a,0x78,0x64,
+  0x0f,0xf2,0x92,0x3c,0x45,0xdb,0x52,0xd8,0xe6,0xcd,0x9b,0xa7,0x3b,0xe4,0x72,0x50,
+  0xda,0xed,0x80,0xac,0x4b,0x4b,0xcc,0x50,0x7b,0xa2,0x3c,0xac,0x2a,0x10,0x22,0xc0,
+  0x3c,0x88,0xc0,0x0b,0x41,0x06,0x54,0x11,0x2f,0x08,0xe8,0x75,0xf2,0xc8,0x1c,0x92,
+  0x8f,0xe4,0x29,0x06,0x1d,0x1b,0x3e,0x52,0xda,0xd9,0x99,0x3c,0x07,0xa5,0xdd,0x56,
+  0xfd,0xe5,0x25,0xae,0x50,0x7b,0xa1,0x22,0x15,0x09,0x84,0x08,0xbc,0x10,0x6c,0x84,
+  0x10,0x1e,0xb9,0x07,0x79,0x9b,0x63,0xa1,0x9b,0xc2,0xaf,0x28,0x49,0x15,0xea,0x34,
+  0xc1,0x22,0xe5,0x43,0xd2,0xc2,0xa2,0xd0,0x92,0xef,0x20,0x41,0x69,0x9d,0x61,0xb8,
+  0xd4,0xe7,0xdb,0x32,0x1f,0x96,0xd6,0xc9,0xb2,0xb4,0x24,0x6e,0xa8,0x6b,0x22,0x56,
+  0xd6,0x75,0x16,0xd5,0xb8,0xba,0x8d,0x7d,0x68,0x72,0x61,0x49,0x9d,0xac,0xaa,0xeb,
+  0x64,0x57,0x96,0x4a,0xc6,0xff,0x07,0x09,0xd2,0xdd,0xcf,0xb2,0x57,0xe1,0x2d,0x00,
+  0x00,0x00,0x00,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,
   
 };
diff --git a/tools/printer-sm-png.h b/tools/printer-sm-png.h
new file mode 100644 (file)
index 0000000..033ccc8
--- /dev/null
@@ -0,0 +1,235 @@
+static const unsigned char printer_sm_png[] =
+{
+  0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,
+  0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x08,0x03,0x00,0x00,0x00,0x60,0xdc,0x09,
+  0xb5,0x00,0x00,0x04,0x19,0x69,0x43,0x43,0x50,0x6b,0x43,0x47,0x43,0x6f,0x6c,0x6f,
+  0x72,0x53,0x70,0x61,0x63,0x65,0x47,0x65,0x6e,0x65,0x72,0x69,0x63,0x52,0x47,0x42,
+  0x00,0x00,0x38,0x8d,0x8d,0x55,0x5d,0x68,0x1c,0x55,0x14,0x3e,0xbb,0x73,0x67,0x23,
+  0x24,0xce,0x53,0x6c,0x34,0x85,0x74,0xa8,0x3f,0x0d,0x25,0x0d,0x93,0x56,0x34,0xa1,
+  0xb4,0xba,0x7f,0xdd,0xdd,0x36,0x6e,0x96,0x49,0x36,0xda,0x22,0xe8,0x64,0xf6,0xee,
+  0xce,0x98,0xc9,0xce,0x38,0x33,0xbb,0xfd,0xa1,0x4f,0x45,0x50,0x7c,0x31,0xea,0x9b,
+  0x14,0xc4,0xbf,0xb7,0x80,0x20,0x28,0xf5,0x0f,0xdb,0x3e,0xb4,0x2f,0x95,0x0a,0x25,
+  0xda,0xd4,0x20,0x28,0x3e,0xb4,0xf8,0x83,0x50,0xe8,0x8b,0xa6,0xeb,0x99,0x3b,0x33,
+  0x99,0x69,0xba,0xb1,0xde,0x65,0xee,0x7c,0xf3,0x9d,0xef,0x9e,0x7b,0xee,0xb9,0x67,
+  0xef,0x05,0xe8,0xb9,0xaa,0x58,0x96,0x91,0x14,0x01,0x16,0x9a,0xae,0x2d,0x17,0x32,
+  0xe2,0x73,0x87,0x8f,0x88,0x3d,0x2b,0x90,0x84,0x87,0xa0,0x17,0x06,0xa1,0x57,0x51,
+  0x1d,0x2b,0x5d,0xa9,0x4c,0x02,0x36,0x4f,0x0b,0x77,0xb5,0x5b,0xdf,0x43,0xc2,0x7b,
+  0x5f,0xd9,0xd5,0xdd,0xfe,0x9f,0xad,0xb7,0x46,0x1d,0x15,0x20,0x71,0x1f,0x62,0xb3,
+  0xe6,0xa8,0x0b,0x88,0x8f,0x01,0xf0,0xa7,0x55,0xcb,0x76,0x01,0x7a,0xfa,0x91,0x1f,
+  0x3f,0xea,0x5a,0x1e,0xf6,0x62,0xe8,0xb7,0x31,0x40,0xc4,0x2f,0x7a,0xb8,0xe1,0x63,
+  0xd7,0xc3,0x73,0x3e,0x7e,0x8d,0x69,0x66,0xe4,0x2c,0xe2,0xd3,0x88,0x05,0x55,0x53,
+  0x6a,0x88,0x97,0x10,0x8f,0xcc,0xc5,0xf8,0x46,0x0c,0xfb,0x31,0xb0,0xd6,0x5f,0xa0,
+  0x4d,0x6a,0xeb,0xaa,0xe8,0xe5,0xa2,0x62,0x9b,0x75,0xdd,0xa0,0xb1,0x70,0xef,0x61,
+  0xfe,0x9f,0x6d,0xc1,0x68,0x85,0xf3,0x6d,0xc3,0xa7,0xcf,0x99,0x9f,0x3e,0x84,0xef,
+  0x61,0x5c,0xfb,0x2b,0x35,0x25,0xe7,0xe1,0x51,0xc4,0x4b,0xaa,0x92,0x9f,0x46,0xfc,
+  0x08,0xe2,0x6b,0x6d,0x7d,0xb6,0x1c,0xe0,0xdb,0x96,0x9b,0x91,0x11,0x3f,0x06,0x90,
+  0xdc,0xde,0x9a,0xaf,0xa6,0x11,0xef,0x44,0x5c,0xac,0xdb,0x07,0xaa,0xbe,0x9f,0xa4,
+  0xad,0xb5,0x8a,0x21,0x7e,0xe7,0x84,0x36,0xf3,0x2c,0xe2,0x2d,0x88,0xcf,0x37,0xe7,
+  0xca,0x53,0xc1,0xd8,0xab,0xaa,0x93,0xc5,0x9c,0xc1,0x76,0xc4,0xb7,0x35,0x5a,0xf2,
+  0xf2,0x3b,0x04,0xc0,0x89,0xba,0x5b,0x9a,0xf1,0xc7,0x72,0xfb,0x6d,0x53,0x9e,0xf2,
+  0xe7,0xe5,0xea,0x35,0x9a,0xcb,0x7b,0x79,0x44,0xfc,0xfa,0xbc,0x79,0x48,0xf6,0x7d,
+  0x72,0x9f,0x39,0xed,0xe9,0x7c,0xe8,0xf3,0x84,0x96,0x2d,0x07,0xfc,0xa5,0x97,0x94,
+  0x83,0x15,0xc4,0x83,0x88,0x7f,0xa1,0x46,0x41,0xf6,0xe7,0xe2,0xfe,0xb1,0xdc,0x4a,
+  0x10,0x03,0x19,0x6a,0x1a,0xe5,0x49,0x7f,0x2e,0x92,0xa3,0x0e,0x5b,0x2f,0xe3,0x5d,
+  0x6d,0xa6,0xe8,0xcf,0x4b,0x0c,0x17,0x37,0xd4,0x1f,0x4b,0x16,0xeb,0xfa,0x81,0x52,
+  0xa0,0xff,0x44,0xb3,0x8b,0x72,0x80,0xaf,0x59,0x06,0xab,0x51,0x8c,0x8d,0x4f,0xda,
+  0x2d,0xb9,0xea,0xeb,0xf9,0x51,0xc5,0xce,0x17,0x7c,0x9f,0x7c,0x85,0x36,0xab,0x81,
+  0x7f,0xbe,0x0d,0xb3,0x09,0x05,0x28,0x98,0x30,0x87,0xbd,0x0a,0x4d,0x58,0x03,0x11,
+  0x64,0x28,0x40,0x06,0xdf,0x16,0xd8,0x68,0xa9,0x83,0x0e,0x06,0x32,0x14,0xad,0x14,
+  0x19,0x8a,0x5f,0xa1,0x66,0x17,0x1b,0xe7,0xc0,0x3c,0xf2,0x3a,0xb4,0x99,0xcd,0xc1,
+  0xbe,0xc2,0x94,0xfe,0xc8,0xc8,0x5f,0x83,0xf9,0xb8,0xce,0xb4,0x2a,0x64,0x87,0x3e,
+  0x82,0x16,0xb2,0x1a,0xfc,0x8e,0xac,0x16,0xd3,0x65,0xf1,0xab,0x85,0x5c,0x63,0x13,
+  0x3f,0x7e,0x2c,0x37,0x02,0x3f,0x26,0x19,0x20,0x12,0xd9,0x83,0xcf,0x5e,0x32,0x49,
+  0xf6,0x91,0x71,0x32,0x01,0x22,0x79,0x8a,0x3c,0x4d,0xf6,0x93,0x1c,0xb2,0x13,0x64,
+  0xef,0xfa,0xd8,0x4a,0x6c,0x45,0x5e,0x3c,0x37,0xd6,0xfd,0xbc,0x8c,0x33,0x52,0xa6,
+  0x9b,0x45,0xdd,0x39,0xb4,0xbb,0xa0,0x60,0xff,0x33,0x2a,0x4c,0x5c,0x53,0xd7,0xac,
+  0x2c,0x0e,0xb6,0x86,0x23,0xcb,0x29,0xfb,0x05,0x5d,0xbd,0xfc,0xc6,0x5f,0xb1,0x5c,
+  0xe9,0x2c,0x37,0x51,0xb6,0xe2,0x19,0x9d,0xba,0x57,0xce,0xf9,0x5f,0xf9,0xeb,0xfc,
+  0x32,0xf6,0x2b,0xfc,0x6a,0xa4,0xe0,0x7f,0xe4,0x57,0xf1,0xb7,0x72,0xc7,0x5a,0xcc,
+  0xbb,0xb2,0x4c,0xc3,0xec,0x6c,0x58,0x73,0x77,0x55,0x1a,0x6d,0x06,0xe3,0x16,0xf0,
+  0xd1,0x99,0xc5,0x89,0xc5,0x1d,0xf3,0x71,0xf1,0xe4,0x57,0x0f,0x46,0x7e,0x96,0xc9,
+  0x99,0xe7,0xaf,0xf4,0x5d,0x3c,0x59,0x6f,0x2e,0x0e,0x46,0xac,0x97,0x05,0xfa,0x6a,
+  0xf9,0x56,0x19,0x4e,0x8d,0x44,0xac,0xf4,0x83,0xf4,0x87,0xb4,0x2c,0xbd,0x27,0x7d,
+  0x28,0xfd,0xc6,0xbd,0xcd,0x7d,0xca,0x7d,0xcd,0x7d,0xce,0x7d,0xc1,0x5d,0x02,0x91,
+  0x3b,0xcb,0x9d,0xe3,0xbe,0xe1,0x2e,0x70,0x1f,0x73,0x5f,0xc6,0xf6,0x6a,0xf3,0x1a,
+  0x5a,0xdf,0x7b,0x16,0x79,0x18,0xb7,0x67,0xe9,0x96,0x6b,0xac,0x4a,0x21,0x23,0x6c,
+  0x15,0x1e,0x16,0x72,0xc2,0x36,0xe1,0x51,0x61,0x32,0xf2,0x27,0x0c,0x08,0x63,0x42,
+  0x51,0xd8,0x81,0x96,0xad,0xeb,0xfb,0x16,0x9f,0x2f,0x9e,0x3d,0x1d,0x0e,0x63,0x1f,
+  0xe6,0xa7,0xfb,0x5c,0xbe,0x2e,0x56,0x01,0x89,0xfb,0xb1,0x02,0xf4,0x4d,0xfe,0x55,
+  0x55,0x54,0xe9,0x70,0x94,0x29,0x1d,0x56,0x6f,0x4d,0x38,0xbe,0x41,0x13,0x8c,0x24,
+  0x43,0x64,0x8c,0x94,0x36,0x54,0xf7,0xb8,0x57,0xf3,0xa1,0x22,0x95,0x4f,0xe5,0x52,
+  0x69,0x10,0x53,0x3b,0x53,0x13,0xa9,0xb1,0xd4,0x41,0x0f,0x87,0xb3,0xa6,0x76,0xa0,
+  0x6d,0x02,0xfb,0xfc,0x1d,0xd5,0xa9,0x6e,0xb2,0x52,0xea,0xd2,0x63,0xde,0x7d,0x02,
+  0x59,0xd3,0x3a,0x6e,0xeb,0x0d,0xcd,0x15,0x77,0x4b,0xd2,0x93,0x62,0x1a,0xaf,0x36,
+  0x2a,0x96,0x9a,0xea,0xe8,0x88,0xa8,0x18,0x86,0xc8,0x4c,0x8e,0x68,0x53,0x87,0xda,
+  0x6d,0x5a,0x1b,0x05,0xef,0xde,0xf4,0x8f,0xf4,0x9b,0x32,0xbb,0x0f,0x13,0x5b,0x2e,
+  0x47,0x9c,0xfb,0x0c,0xc0,0xbe,0x3f,0xf1,0xec,0xfb,0x2e,0xe2,0x8e,0xb4,0x00,0x96,
+  0x1c,0x80,0x81,0xc7,0x23,0x6e,0x18,0xcf,0xca,0x07,0xde,0x05,0x38,0xf3,0x84,0xda,
+  0xb2,0xdb,0xc1,0x1d,0x91,0x48,0x7c,0x0b,0xe0,0xd4,0xf7,0xec,0xf6,0xbf,0xfa,0x32,
+  0x78,0x7e,0xfd,0xd4,0xe9,0xdc,0xc4,0x73,0xac,0xe7,0x2d,0x80,0xb5,0x37,0x3b,0x9d,
+  0xbf,0xdf,0xef,0x74,0xd6,0x3e,0x40,0xff,0xab,0x00,0x67,0x8d,0x7f,0x01,0xa0,0x9f,
+  0x7c,0x55,0x03,0x5c,0x0b,0xef,0x00,0x00,0x00,0x38,0x65,0x58,0x49,0x66,0x4d,0x4d,
+  0x00,0x2a,0x00,0x00,0x00,0x08,0x00,0x01,0x87,0x69,0x00,0x04,0x00,0x00,0x00,0x01,
+  0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x00,0x00,0x02,0xa0,0x02,0x00,0x04,0x00,0x00,
+  0x00,0x01,0x00,0x00,0x00,0x30,0xa0,0x03,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,
+  0x00,0x30,0x00,0x00,0x00,0x00,0xf8,0xff,0x4e,0x36,0x00,0x00,0x03,0x62,0x69,0x54,
+  0x58,0x74,0x58,0x4d,0x4c,0x3a,0x63,0x6f,0x6d,0x2e,0x61,0x64,0x6f,0x62,0x65,0x2e,
+  0x78,0x6d,0x70,0x00,0x00,0x00,0x00,0x00,0x3c,0x78,0x3a,0x78,0x6d,0x70,0x6d,0x65,
+  0x74,0x61,0x20,0x78,0x6d,0x6c,0x6e,0x73,0x3a,0x78,0x3d,0x22,0x61,0x64,0x6f,0x62,
+  0x65,0x3a,0x6e,0x73,0x3a,0x6d,0x65,0x74,0x61,0x2f,0x22,0x20,0x78,0x3a,0x78,0x6d,
+  0x70,0x74,0x6b,0x3d,0x22,0x58,0x4d,0x50,0x20,0x43,0x6f,0x72,0x65,0x20,0x35,0x2e,
+  0x34,0x2e,0x30,0x22,0x3e,0x0a,0x20,0x20,0x20,0x3c,0x72,0x64,0x66,0x3a,0x52,0x44,
+  0x46,0x20,0x78,0x6d,0x6c,0x6e,0x73,0x3a,0x72,0x64,0x66,0x3d,0x22,0x68,0x74,0x74,
+  0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x77,0x33,0x2e,0x6f,0x72,0x67,0x2f,0x31,
+  0x39,0x39,0x39,0x2f,0x30,0x32,0x2f,0x32,0x32,0x2d,0x72,0x64,0x66,0x2d,0x73,0x79,
+  0x6e,0x74,0x61,0x78,0x2d,0x6e,0x73,0x23,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
+  0x20,0x3c,0x72,0x64,0x66,0x3a,0x44,0x65,0x73,0x63,0x72,0x69,0x70,0x74,0x69,0x6f,
+  0x6e,0x20,0x72,0x64,0x66,0x3a,0x61,0x62,0x6f,0x75,0x74,0x3d,0x22,0x22,0x0a,0x20,
+  0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x6d,0x6c,0x6e,0x73,
+  0x3a,0x64,0x63,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x70,0x75,0x72,0x6c,
+  0x2e,0x6f,0x72,0x67,0x2f,0x64,0x63,0x2f,0x65,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x73,
+  0x2f,0x31,0x2e,0x31,0x2f,0x22,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+  0x20,0x20,0x20,0x78,0x6d,0x6c,0x6e,0x73,0x3a,0x49,0x70,0x74,0x63,0x34,0x78,0x6d,
+  0x70,0x45,0x78,0x74,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x69,0x70,0x74,
+  0x63,0x2e,0x6f,0x72,0x67,0x2f,0x73,0x74,0x64,0x2f,0x49,0x70,0x74,0x63,0x34,0x78,
+  0x6d,0x70,0x45,0x78,0x74,0x2f,0x32,0x30,0x30,0x38,0x2d,0x30,0x32,0x2d,0x32,0x39,
+  0x2f,0x22,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,
+  0x6d,0x6c,0x6e,0x73,0x3a,0x70,0x68,0x6f,0x74,0x6f,0x73,0x68,0x6f,0x70,0x3d,0x22,
+  0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x6e,0x73,0x2e,0x61,0x64,0x6f,0x62,0x65,0x2e,
+  0x63,0x6f,0x6d,0x2f,0x70,0x68,0x6f,0x74,0x6f,0x73,0x68,0x6f,0x70,0x2f,0x31,0x2e,
+  0x30,0x2f,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,
+  0x63,0x3a,0x63,0x72,0x65,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
+  0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x72,0x64,0x66,0x3a,0x53,0x65,0x71,0x3e,
+  0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+  0x3c,0x72,0x64,0x66,0x3a,0x6c,0x69,0x3e,0x4d,0x69,0x63,0x68,0x61,0x65,0x6c,0x20,
+  0x53,0x77,0x65,0x65,0x74,0x3c,0x2f,0x72,0x64,0x66,0x3a,0x6c,0x69,0x3e,0x0a,0x20,
+  0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x72,0x64,0x66,
+  0x3a,0x53,0x65,0x71,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
+  0x2f,0x64,0x63,0x3a,0x63,0x72,0x65,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,
+  0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x63,0x3a,0x72,0x69,0x67,0x68,0x74,0x73,
+  0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x72,
+  0x64,0x66,0x3a,0x41,0x6c,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+  0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x72,0x64,0x66,0x3a,0x6c,0x69,0x20,0x78,
+  0x6d,0x6c,0x3a,0x6c,0x61,0x6e,0x67,0x3d,0x22,0x78,0x2d,0x64,0x65,0x66,0x61,0x75,
+  0x6c,0x74,0x22,0x3e,0x43,0x6f,0x70,0x79,0x72,0x69,0x67,0x68,0x74,0x20,0x32,0x30,
+  0x31,0x30,0x20,0x41,0x70,0x70,0x6c,0x65,0x20,0x49,0x6e,0x63,0x2e,0x3c,0x2f,0x72,
+  0x64,0x66,0x3a,0x6c,0x69,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+  0x20,0x20,0x20,0x3c,0x2f,0x72,0x64,0x66,0x3a,0x41,0x6c,0x74,0x3e,0x0a,0x20,0x20,
+  0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x63,0x3a,0x72,0x69,0x67,0x68,
+  0x74,0x73,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x70,
+  0x74,0x63,0x34,0x78,0x6d,0x70,0x45,0x78,0x74,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69,
+  0x6e,0x65,0x3e,0x4e,0x65,0x77,0x20,0x49,0x6d,0x61,0x67,0x65,0x3c,0x2f,0x49,0x70,
+  0x74,0x63,0x34,0x78,0x6d,0x70,0x45,0x78,0x74,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69,
+  0x6e,0x65,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x68,
+  0x6f,0x74,0x6f,0x73,0x68,0x6f,0x70,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69,0x6e,0x65,
+  0x3e,0x4e,0x65,0x77,0x20,0x49,0x6d,0x61,0x67,0x65,0x3c,0x2f,0x70,0x68,0x6f,0x74,
+  0x6f,0x73,0x68,0x6f,0x70,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69,0x6e,0x65,0x3e,0x0a,
+  0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x72,0x64,0x66,0x3a,0x44,0x65,0x73,0x63,
+  0x72,0x69,0x70,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x3c,0x2f,0x72,0x64,
+  0x66,0x3a,0x52,0x44,0x46,0x3e,0x0a,0x3c,0x2f,0x78,0x3a,0x78,0x6d,0x70,0x6d,0x65,
+  0x74,0x61,0x3e,0x0a,0xa0,0x50,0x98,0x64,0x00,0x00,0x02,0xa0,0x50,0x4c,0x54,0x45,
+  0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfe,0xff,
+  0xff,0xff,0xfc,0xfc,0xfc,0xff,0xff,0xff,0x00,0x00,0x00,0x01,0x01,0x01,0x02,0x02,
+  0x02,0x03,0x03,0x03,0x04,0x04,0x04,0x05,0x05,0x05,0x06,0x06,0x06,0x07,0x07,0x07,
+  0x08,0x08,0x08,0x09,0x09,0x09,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x0d,
+  0x0d,0x0d,0x0f,0x0f,0x0f,0x10,0x10,0x10,0x11,0x11,0x11,0x12,0x12,0x12,0x13,0x13,
+  0x13,0x14,0x14,0x14,0x15,0x15,0x15,0x16,0x16,0x16,0x18,0x18,0x18,0x19,0x19,0x19,
+  0x1c,0x1c,0x1c,0x1d,0x1d,0x1d,0x1e,0x1e,0x1e,0x1f,0x1f,0x1f,0x20,0x20,0x20,0x21,
+  0x21,0x21,0x22,0x22,0x22,0x23,0x23,0x23,0x24,0x24,0x24,0x25,0x25,0x25,0x26,0x26,
+  0x26,0x27,0x27,0x27,0x28,0x28,0x28,0x29,0x29,0x29,0x2a,0x2a,0x2a,0x2c,0x2c,0x2c,
+  0x2d,0x2d,0x2d,0x2d,0x2e,0x39,0x2e,0x2e,0x2e,0x2e,0x2e,0x39,0x2e,0x2f,0x35,0x2f,
+  0x2f,0x2f,0x2f,0x2f,0x3a,0x30,0x30,0x30,0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,
+  0x33,0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x37,0x37,0x37,0x38,0x38,0x38,
+  0x38,0x3c,0x55,0x39,0x39,0x39,0x3a,0x3a,0x3a,0x3a,0x3a,0x3c,0x3b,0x3b,0x3b,0x3c,
+  0x3c,0x3c,0x3d,0x3d,0x3d,0x3e,0x3e,0x3e,0x3e,0x43,0x60,0x3f,0x3f,0x3f,0x40,0x40,
+  0x40,0x41,0x41,0x41,0x41,0x42,0x45,0x41,0x44,0x4c,0x42,0x42,0x42,0x43,0x43,0x43,
+  0x44,0x44,0x44,0x45,0x45,0x45,0x46,0x46,0x46,0x47,0x47,0x47,0x48,0x48,0x48,0x49,
+  0x49,0x49,0x4a,0x4a,0x4a,0x4b,0x4b,0x4b,0x4c,0x4c,0x4c,0x4d,0x4d,0x4d,0x4e,0x4e,
+  0x4e,0x4f,0x4f,0x4f,0x50,0x50,0x50,0x51,0x51,0x51,0x52,0x52,0x52,0x53,0x53,0x53,
+  0x54,0x54,0x54,0x55,0x55,0x55,0x56,0x56,0x56,0x57,0x57,0x57,0x58,0x58,0x58,0x59,
+  0x59,0x59,0x5a,0x5a,0x5a,0x5b,0x5b,0x5b,0x5c,0x5c,0x5c,0x5e,0x5e,0x5e,0x5f,0x5f,
+  0x5f,0x5f,0x6e,0x90,0x60,0x60,0x60,0x60,0x69,0xa2,0x61,0x61,0x61,0x62,0x62,0x62,
+  0x63,0x63,0x63,0x65,0x65,0x65,0x66,0x66,0x66,0x67,0x67,0x67,0x68,0x68,0x68,0x6a,
+  0x6a,0x6a,0x6a,0x7a,0xa0,0x6b,0x6b,0x6b,0x6c,0x6c,0x6c,0x6d,0x6d,0x6d,0x71,0x71,
+  0x71,0x71,0x82,0xab,0x71,0x83,0xac,0x72,0x72,0x72,0x74,0x74,0x74,0x76,0x76,0x76,
+  0x77,0x77,0x77,0x79,0x79,0x79,0x7c,0x7c,0x7c,0x7d,0x7d,0x7d,0x7f,0x7f,0x7f,0x80,
+  0x80,0x80,0x81,0x81,0x81,0x82,0x82,0x82,0x83,0x83,0x83,0x84,0x84,0x84,0x85,0x85,
+  0x85,0x86,0x86,0x86,0x87,0x87,0x87,0x8a,0x8a,0x8a,0x8c,0x8c,0x8c,0x8d,0x8d,0x8d,
+  0x8e,0x8e,0x8e,0x90,0x90,0x90,0x91,0x91,0x91,0x92,0x92,0x92,0x93,0x93,0x93,0x96,
+  0x96,0x96,0x98,0x98,0x98,0x9b,0x9b,0x9b,0x9d,0x9d,0x9d,0x9f,0x9f,0x9f,0xa0,0xa0,
+  0xa0,0xa2,0xa2,0xa2,0xa3,0xa3,0xa3,0xa6,0xa6,0xa6,0xa7,0xa7,0xa7,0xa8,0xa8,0xa8,
+  0xaa,0xaa,0xaa,0xab,0xab,0xab,0xad,0xad,0xad,0xae,0xae,0xae,0xaf,0xaf,0xaf,0xb0,
+  0xb0,0xb0,0xb2,0xb2,0xb2,0xb4,0xb4,0xb4,0xb7,0xb7,0xb7,0xb9,0xb9,0xb9,0xba,0xba,
+  0xba,0xbb,0xbb,0xbb,0xbc,0xbc,0xbc,0xbd,0xbd,0xbd,0xbe,0xbe,0xbe,0xc0,0xc0,0xc0,
+  0xc2,0xc2,0xc2,0xc3,0xc3,0xc3,0xc4,0xc4,0xc4,0xc5,0xc5,0xc5,0xc6,0xc6,0xc6,0xc7,
+  0xc7,0xc7,0xc9,0xc9,0xc9,0xca,0xca,0xca,0xcc,0xcc,0xcc,0xcd,0xcd,0xcd,0xce,0xce,
+  0xce,0xd0,0xd0,0xd0,0xd1,0xd1,0xd1,0xd4,0xd4,0xd4,0xd8,0xd8,0xd8,0xd9,0xd9,0xd9,
+  0xda,0xda,0xda,0xdb,0xdb,0xdb,0xdc,0xdc,0xdc,0xdd,0xdd,0xdd,0xde,0xde,0xde,0xdf,
+  0xdf,0xdf,0xe0,0xe0,0xe0,0xe2,0xe2,0xe2,0xe3,0xe3,0xe3,0xe5,0xe5,0xe5,0xe6,0xe6,
+  0xe6,0xe9,0xe9,0xe9,0xea,0xea,0xea,0xeb,0xeb,0xeb,0xed,0xed,0xed,0xee,0xee,0xee,
+  0xef,0xef,0xef,0xf0,0xf0,0xf0,0xf1,0xf1,0xf1,0xf2,0xf2,0xf2,0xf3,0xf3,0xf3,0xf4,
+  0xf4,0xf4,0xf6,0xf6,0xf6,0xf7,0xf7,0xf7,0xf8,0xf8,0xf8,0xf9,0xf9,0xf9,0xfa,0xfa,
+  0xfa,0xfb,0xfb,0xfb,0xfc,0xfc,0xfc,0xfd,0xfd,0xfd,0xfe,0xfe,0xfe,0xff,0xff,0xff,
+  0x96,0xb7,0x1b,0xef,0x00,0x00,0x00,0x08,0x74,0x52,0x4e,0x53,0x00,0x08,0x7f,0xc4,
+  0xdc,0xdc,0xfc,0xfc,0x86,0xfa,0x37,0x3a,0x00,0x00,0x03,0x97,0x49,0x44,0x41,0x54,
+  0x18,0x19,0x95,0xc1,0x6f,0x68,0xd4,0x75,0x1c,0xc0,0xf1,0xf7,0xe7,0xfb,0xfb,0xfe,
+  0xee,0xcf,0xe6,0xb1,0x73,0x53,0xdb,0xfa,0xc3,0xc2,0x1d,0x35,0xcc,0x1c,0x4a,0x60,
+  0x89,0x3e,0x50,0xfa,0x43,0x52,0x4a,0x52,0x94,0x48,0x33,0x0c,0x1f,0x84,0x21,0x3d,
+  0xe8,0x0f,0xe1,0xa3,0x20,0x0c,0x83,0x11,0x42,0x04,0xd2,0x1f,0xb0,0x7a,0x12,0x14,
+  0x66,0xd1,0x13,0x35,0x08,0x4b,0x4b,0x54,0xc4,0xd4,0x5c,0x63,0x78,0xe8,0x6a,0x59,
+  0x6a,0xdb,0xed,0x76,0xdb,0xfd,0xee,0xee,0xf7,0xfd,0xf4,0xbb,0x6d,0xa2,0x79,0x3a,
+  0xcf,0xd7,0x4b,0x10,0xf1,0x4c,0x2f,0xf5,0xe8,0x74,0xa1,0xaa,0x88,0xe9,0xa7,0x7e,
+  0x19,0x67,0xe4,0xf0,0xaf,0xd4,0xaf,0x5f,0x8c,0x37,0x36,0xc0,0x2d,0xf0,0xac,0xa9,
+  0x8c,0xd1,0x73,0xcf,0x2f,0xab,0x16,0x1f,0xb8,0x74,0xac,0x7d,0xf5,0xcc,0x93,0xbb,
+  0x16,0x3c,0xf1,0xc1,0x86,0xc6,0x3d,0x6d,0xb3,0x76,0xf9,0x6b,0x5a,0xa8,0x61,0x4c,
+  0x6f,0xe1,0x08,0x9f,0x8d,0x3c,0xf7,0x6a,0xe9,0xfc,0xce,0x55,0x43,0x7b,0x83,0x2d,
+  0x2f,0x1d,0x3f,0x65,0x0e,0xba,0xf7,0xdb,0x7b,0x96,0xb7,0xed,0xa3,0x56,0xaf,0x25,
+  0x92,0x5c,0x47,0x7b,0x96,0x75,0x0b,0x83,0xdd,0x99,0x0b,0xef,0x5c,0x1c,0x5c,0xbe,
+  0xa3,0x69,0x59,0x7c,0xaf,0x16,0xe6,0x0d,0xf6,0xc0,0x83,0xcf,0xf0,0x3f,0x96,0x88,
+  0x2b,0xc6,0x06,0xdb,0x4f,0x16,0xf9,0xa7,0xab,0x63,0xc6,0x36,0x0b,0xd9,0x1d,0xaf,
+  0xc4,0xbb,0x36,0xcd,0x85,0x1e,0x6a,0x58,0x22,0xe1,0xd6,0x73,0x9b,0x13,0x7c,0x7d,
+  0xac,0xfc,0x7a,0xd3,0xcb,0x2f,0xb6,0x3e,0xf2,0x70,0xf7,0xa7,0xf7,0xb3,0x79,0x5b,
+  0x3a,0xb3,0x91,0x5a,0x92,0x05,0x1e,0xfa,0xb9,0x98,0xe0,0x2b,0x59,0x99,0x00,0x2a,
+  0xe5,0x24,0x93,0xf2,0x29,0xae,0xc3,0x12,0x79,0x96,0x04,0xb4,0x49,0x82,0x88,0xb5,
+  0x4c,0x49,0x71,0x3d,0x92,0xe5,0xd6,0x18,0x6e,0x91,0xe1,0xc6,0x8e,0x0f,0x53,0xcb,
+  0x70,0x63,0x03,0xe3,0x4c,0xf8,0x84,0xab,0x58,0x6a,0x7c,0x91,0xda,0xbf,0xec,0xf1,
+  0x81,0x1f,0x87,0x17,0x15,0x2a,0x67,0x0f,0x94,0xb2,0x1b,0xb2,0xef,0x9d,0x5b,0x9f,
+  0xd8,0xe5,0xaf,0x69,0xe9,0xe9,0x18,0x5f,0x8b,0xa1,0xc6,0xe1,0x43,0x2f,0x7c,0x7e,
+  0xaa,0xb0,0x7d,0xc9,0xc2,0xc3,0x85,0xc2,0xbb,0x99,0xfb,0xbe,0x5f,0xd2,0xf8,0x5a,
+  0x7b,0xcf,0xf2,0xb6,0x7d,0xec,0xf4,0x56,0x82,0x65,0x8a,0x73,0x0a,0x82,0x88,0xb0,
+  0xb6,0xf3,0xd1,0xfe,0x7b,0x57,0x2c,0x22,0xf2,0xd8,0xd2,0x83,0x87,0x62,0xd2,0x18,
+  0xec,0xd5,0xc2,0x3c,0x1a,0x9f,0x04,0x2c,0x13,0xb4,0xd2,0xff,0xe5,0x88,0xb1,0x5e,
+  0x43,0x73,0x6b,0xa7,0x16,0x39,0xf3,0x34,0x57,0xf1,0x82,0x78,0xd7,0xa6,0xb9,0x4c,
+  0xb2,0x44,0x34,0x1c,0xf9,0xb6,0x8f,0x18,0x12,0x8e,0xe6,0x8e,0xfc,0xe0,0x3e,0x72,
+  0xed,0xf3,0x7f,0xe7,0x8a,0xe7,0xdf,0x7c,0x63,0xf3,0xb6,0x74,0x66,0xa3,0x10,0x91,
+  0x2c,0x1a,0x9e,0xf9,0x69,0x80,0x2a,0x1d,0x1d,0x6b,0xca,0xcd,0xba,0xb8,0xa9,0x23,
+  0x01,0xaa,0xea,0xb4,0x70,0x62,0xe6,0x7c,0x81,0xe1,0x34,0xe4,0x53,0x4c,0xb0,0x50,
+  0xd9,0xff,0x21,0x53,0x32,0x7a,0x36,0xd7,0xfc,0x40,0xd2,0x2f,0xeb,0xd8,0xf1,0xd3,
+  0x47,0x7f,0xcb,0xb9,0xa7,0xb6,0xa8,0x40,0x1a,0x48,0x31,0xc9,0xe2,0x8a,0xdf,0x71,
+  0x99,0xeb,0x1b,0xaf,0x54,0x5a,0xf7,0x1c,0x3d,0x9d,0xab,0x58,0x5f,0xc6,0x1a,0xb6,
+  0x76,0x71,0x2d,0x8b,0x2b,0x0e,0x72,0x99,0x1b,0x2d,0xbb,0x6f,0x76,0x83,0xe7,0x25,
+  0x5c,0xe0,0x56,0x74,0xb7,0x18,0x57,0x12,0x2e,0x13,0xf1,0x0c,0x16,0x57,0x62,0x4a,
+  0x30,0x32,0x98,0x0f,0xed,0x0c,0xdf,0x7a,0x7e,0xcc,0x4b,0xfa,0x7e,0xe9,0x63,0x15,
+  0xae,0x08,0x0b,0xa9,0xed,0x09,0x63,0xa1,0xc2,0xa4,0x20,0x48,0xde,0x19,0x36,0x59,
+  0xae,0x6f,0xd8,0xcd,0x69,0xd6,0x51,0xdf,0x58,0x54,0x99,0x14,0x8f,0x13,0x70,0x89,
+  0x1b,0xb8,0x0b,0x55,0x2d,0x2a,0x96,0x2a,0xef,0x76,0x95,0xa1,0x7c,0xd9,0xc8,0x1d,
+  0x56,0x14,0x51,0xe1,0x1a,0xa5,0xbf,0x55,0x41,0x9d,0x62,0x89,0xd8,0xbb,0x8d,0x14,
+  0xfc,0xc5,0x70,0x22,0x96,0x04,0x54,0x94,0x2a,0x51,0x41,0x45,0x89,0x5c,0xc0,0x89,
+  0x52,0x65,0x89,0xa4,0x1b,0xe0,0xdf,0x8e,0x26,0x2d,0xa7,0xd2,0x5c,0x45,0x54,0x50,
+  0x51,0x60,0x30,0xef,0x2b,0x4a,0x95,0x25,0x92,0x68,0x74,0x6e,0xf6,0x5f,0x7f,0x3a,
+  0x3b,0xdb,0x29,0xaa,0xa2,0xa2,0x22,0x88,0x08,0x46,0xc4,0x9a,0x7c,0xdf,0x25,0xdf,
+  0xc7,0x81,0x02,0x96,0xc8,0x1f,0xd9,0xc0,0xa9,0xa2,0x0a,0x28,0x53,0x04,0x04,0x41,
+  0x04,0x35,0x80,0x03,0x42,0xc0,0x52,0xe5,0x7b,0x65,0xa6,0x63,0x7c,0x20,0x54,0x01,
+  0x2c,0x13,0x4c,0x9c,0x9b,0x08,0x15,0x71,0x80,0xa5,0x4e,0xaa,0x28,0x11,0x4b,0x9d,
+  0xd4,0xa1,0x02,0x18,0xea,0xe4,0x50,0x14,0xb0,0x40,0x91,0x3a,0x9c,0xbf,0x4d,0x95,
+  0x88,0x05,0x12,0xd4,0x21,0xe5,0x84,0x2a,0x4b,0xbd,0x1c,0x04,0x80,0xa5,0x4e,0x61,
+  0x09,0x19,0x17,0xb0,0xd4,0x29,0x07,0x41,0xe8,0x09,0x16,0x31,0x4d,0x39,0x6e,0x2e,
+  0x20,0xf0,0xde,0x8a,0x1b,0x4c,0xa7,0xd8,0xa5,0xdc,0xdc,0x50,0xb9,0x65,0xfd,0xdb,
+  0xad,0x0d,0x5e,0xa7,0x75,0x26,0xbe,0x40,0x0f,0xe4,0x98,0x5e,0xbe,0xb9,0x7b,0x56,
+  0x3a,0x95,0x4a,0x88,0xb3,0xa1,0x69,0x98,0xb3,0x28,0x53,0x72,0x4c,0x47,0x6c,0x43,
+  0x7a,0x46,0x32,0xee,0x1b,0x42,0x11,0xd3,0x17,0x8c,0x05,0x65,0x65,0x3a,0x62,0x63,
+  0xc9,0x98,0x35,0x90,0x71,0x82,0x88,0x31,0x27,0x55,0x99,0x96,0x18,0x4f,0xe8,0x74,
+  0xa1,0xea,0x7f,0x66,0xc2,0x6f,0x17,0x59,0xdf,0xbf,0x1b,0x00,0x00,0x00,0x00,0x49,
+  0x45,0x4e,0x44,0xae,0x42,0x60,0x82,
+  
+};
diff --git a/tools/printer-sm.png b/tools/printer-sm.png
new file mode 100644 (file)
index 0000000..e87527e
Binary files /dev/null and b/tools/printer-sm.png differ
index 9bb5196aa1f1ae2537e5547d8923ee1174b6028f..1d499b63296f902cbb0b165a8b868530ed5e0840 100644 (file)
Binary files a/tools/printer.png and b/tools/printer.png differ
index d711ca9794ce0c97e28cb60b2857b137005a19de..6e3e70e28d1f392457a37163578b7af5766c9018 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Configuration file for CUPS on Windows.
  *
- * Copyright © 2007-2020 by Apple Inc.
+ * Copyright © 2007-2021 by Apple Inc.
  * Copyright © 1997-2007 by Easy Software Products.
  *
  * Licensed under Apache License v2.0.  See the file "LICENSE" for more
@@ -97,8 +97,8 @@ typedef unsigned long useconds_t;
  * Version of software...
  */
 
-#define CUPS_SVERSION "CUPS v2.3.4"
-#define CUPS_MINIMAL "CUPS/2.3.4"
+#define CUPS_SVERSION "CUPS v2.3.5"
+#define CUPS_MINIMAL "CUPS/2.3.5"
 
 
 /*
@@ -330,9 +330,8 @@ typedef unsigned long useconds_t;
  * Do we have the (v)snprintf() functions?
  */
 
-/* Windows snprintf/vsnprintf are non-conforming */
-/* #undef HAVE_SNPRINTF */
-/* #undef HAVE_VSNPRINTF */
+#define HAVE_SNPRINTF 1
+#define HAVE_VSNPRINTF 1
 
 
 /*
index c165c61ab916c11f73d6b1caefc2314a46a35227..03aea505f6b9af4bc47d99f25d090a09d9ed8a53 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Configuration file for CUPS and Xcode.
  *
- * Copyright 2007-2020 by Apple Inc.
+ * Copyright 2007-2021 by Apple Inc.
  * Copyright 1997-2007 by Easy Software Products.
  *
  * Licensed under Apache License v2.0.  See the file "LICENSE" for more information.
@@ -18,8 +18,8 @@
  * Version of software...
  */
 
-#define CUPS_SVERSION "CUPS v2.3.4"
-#define CUPS_MINIMAL "CUPS/2.3.4"
+#define CUPS_SVERSION "CUPS v2.3.5"
+#define CUPS_MINIMAL "CUPS/2.3.5"
 
 
 /*