From f8c0de913afad60f99aed7d11ce337e47a0033a5 Mon Sep 17 00:00:00 2001 From: rmkaplan Date: Mon, 23 Feb 2026 22:27:21 -0800 Subject: [PATCH] These files cause the init.sysout to contain the :UTF-8 external format --- library/UNICODE | 1508 ------------------- library/UNICODE-TABLES | 733 +++++---- library/UNICODE-TABLES.LCOM | Bin 10901 -> 17736 bytes library/UNICODE.LCOM | Bin 24940 -> 0 bytes sources/EXTERNALFORMAT | 195 +-- sources/EXTERNALFORMAT.LCOM | Bin 15442 -> 13282 bytes sources/FILESETS | 12 +- sources/LLARRAYELT | 661 +++++--- sources/LLARRAYELT.LCOM | Bin 27391 -> 34139 bytes sources/UNICODE-FORMATS | 2739 ++++++++++++++++++++++++++++++++++ sources/UNICODE-FORMATS.LCOM | Bin 0 -> 165202 bytes 11 files changed, 3690 insertions(+), 2158 deletions(-) delete mode 100644 library/UNICODE delete mode 100644 library/UNICODE.LCOM create mode 100644 sources/UNICODE-FORMATS create mode 100644 sources/UNICODE-FORMATS.LCOM diff --git a/library/UNICODE b/library/UNICODE deleted file mode 100644 index 36012439..00000000 --- a/library/UNICODE +++ /dev/null @@ -1,1508 +0,0 @@ -(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) - -(FILECREATED " 5-Feb-2026 11:07:12" {WMEDLEY}UNICODE.;213 82607 - - :EDIT-BY rmk - - :CHANGES-TO (FNS MAKE-UNICODE-FORMATS) - - :PREVIOUS-DATE "31-Jan-2026 19:24:45" {WMEDLEY}UNICODE.;212) - - -(PRETTYCOMPRINT UNICODECOMS) - -(RPAQQ UNICODECOMS - ( - (* ;; "Unicode external formats and MCCS-to-Unicode mapping functions. Must be loaded after UNICODE-TABLES.") - - (COMS (* ; "External formats") - (FNS UTF8.OUTCHARFN UTF8.SLUG.OUTCHARFN UTF8.INCCODEFN UTF8.PEEKCCODEFN - \UTF8.BACKCCODEFN) - (FNS UTF16BE.OUTCHARFN UTF16BE.INCCODEFN UTF16BE.PEEKCCODEFN \UTF16BE.BACKCCODEFN) - (FNS UTF16LE.OUTCHARFN UTF16LE.INCCODEFN UTF16LE.PEEKCCODEFN \UTF16LE.BACKCCODEFN) - (FNS READBOM WRITEBOM) - (INITVARS (EXTERNALEOL 'LF)) - (FNS MAKE-UNICODE-FORMATS) - (P (MAKE-UNICODE-FORMATS EXTERNALEOL)) - (ADDVARS (*DEFAULT-EXTERNALFORMATS* (UNIX :UTF-8))) - (FNS UTF8.BINCODE \UTF8.FETCHCODE) - (FNS UTF8.VALIDATE NUTF8-BYTE1-BYTES NUTF8-CODE-BYTES NUTF8-STRING-BYTES N-MCHARS) - (DECLARE%: EVAL@COMPILE DONTCOPY (MACROS UNICODE.TRANSLATE \UTF8.GETBASEBYTE - UNICODE.SMALLP))) - - (* ;; "") - - - (* ;; "These come after the translation tables have been loaded, since the Unix file names needed to read the mapping files depend on the UTF8 string coercions. Those functions are defined as EVQ in UFS, cannot be used until the tables exist. This assumes that previous files have only 7-bit MCCS characters in their names.") - - (FNS MTOUCODE UTOMCODE MTOUCODE? UTOMCODE? MTOUSTRING UTOMSTRING MTOUTF8STRING UTF8TOMSTRING) - (FNS XTOUCODE UTOXCODE XTOUCODE? UTOXCODE? XTOUSTRING UTOXSTRING XTOUTF8STRING) - - (* ;; "") - - (COMS (* ; "Write Unicode mapping files") - (FNS WRITE-UNICODE-MAPPING WRITE-UNICODE-INCLUDED WRITE-UNICODE-MAPPING-HEADER - WRITE-UNICODE-MAPPING-FILENAME) - (FNS XCCS-UTF8-AFTER-OPEN) - - (* ;; "Automate dumping of a documentation prefix") - - [DECLARE%: EVAL@COMPILE DONTCOPY (CONSTANTS (MISSINGCODE (CL:PARSE-INTEGER "FFFE" - :RADIX 16)) - (UNDEFINEDCODE (CL:PARSE-INTEGER "FFFF" :RADIX - 16] - (VARS UNICODE-MAPPING-HEADER)) - (FNS UTF8HEXSTRING) - (COMS (* ; "debugging") - (FNS SHOWCHARS) - (DECLARE%: DOEVAL@LOAD DONTCOPY (MACROS HEXCHAR OCTALCHAR))) - (DECLARE%: EVAL@COMPILE DONTCOPY (FILES (LOADCOMP) - UNICODE-EXPORTS)) - (PROP (FILETYPE) - UNICODE))) - - - -(* ;; -"Unicode external formats and MCCS-to-Unicode mapping functions. Must be loaded after UNICODE-TABLES." -) - - - - -(* ; "External formats") - -(DEFINEQ - -(UTF8.OUTCHARFN - [LAMBDA (STREAM CHARCODE RAW) (* ; "Edited 24-Apr-2025 15:43 by rmk") - (* ; "Edited 20-Jan-2025 20:45 by rmk") - (* ; "Edited 31-Jan-2024 00:32 by rmk") - (* ; "Edited 8-Aug-2021 13:02 by rmk:") - (* ; "Edited 17-Aug-2020 08:45 by rmk:") - (* ; "Edited 30-Jan-2020 23:08 by rmk:") - - (* ;; "Perhaps the translation table should already do the mapping for EOL to LF, but that seems to be a separate property of the stream. Also, CRLF=2 bytes.") - - (* ;; "Print UTF8 sequence for CHARCODE. Do not do MCCS to Unicode translation if RAW.") - - (IF (EQ CHARCODE (CHARCODE EOL)) - THEN (FREPLACE (STREAM CHARPOSITION) OF STREAM WITH 0) - (\BOUTEOL STREAM) - ELSE (CHANGE (FFETCH (STREAM CHARPOSITION) OF STREAM) - (IPLUS16 1 DATUM)) - (FOR C INSIDE (CL:IF RAW - CHARCODE - (UNICODE.TRANSLATE CHARCODE *MCCSTOUNICODE*)) - DO (IF (ILESSP C 128) - THEN (\BOUT STREAM C) - ELSEIF (ILESSP C 2048) - THEN (* ; "x800") - (\BOUT STREAM (LOGOR (LLSH 3 6) - (LRSH C 6))) - (\BOUT STREAM (LOGOR (LLSH 2 6) - (LOADBYTE C 0 6))) - ELSEIF (ILESSP C 65536) - THEN (* ; "x10000") - (\BOUT STREAM (LOGOR (LLSH 7 5) - (LRSH C 12))) - (\BOUT STREAM (LOGOR (LLSH 2 6) - (LOADBYTE C 6 6))) - (\BOUT STREAM (LOGOR (LLSH 2 6) - (LOADBYTE C 0 6))) - ELSEIF (ILESSP C 2097152) - THEN (* ; "x200000") - (\BOUT STREAM (LOGOR (LLSH 15 4) - (LRSH C 18))) - (\BOUT STREAM (LOGOR (LLSH 2 6) - (LOADBYTE C 12 6))) - (\BOUT STREAM (LOGOR (LLSH 2 6) - (LOADBYTE C 6 6))) - (\BOUT STREAM (LOGOR (LLSH 2 6) - (LOADBYTE C 0 6))) - ELSE (ERROR "CHARCODE too big for UTF8" C]) - -(UTF8.SLUG.OUTCHARFN - [LAMBDA (STREAM CODE RAW) (* ; "Edited 24-Apr-2025 15:43 by rmk") - (* ; "Edited 21-Jan-2025 18:37 by rmk") - (* ; "Edited 14-Jan-2025 12:39 by rmk") - - (* ;; "Produces Unicode Representative FFFD as a slug for MCCS unmapped characters") - - (UTF8.OUTCHARFN STREAM (OR (CL:IF RAW - CODE - (XTOUCODE? CODE)) - (CONSTANT (HEXNUM? "FFFD"))) - T]) - -(UTF8.INCCODEFN - [LAMBDA (STREAM COUNTP RAW) (* ; "Edited 23-Oct-2025 08:31 by rmk") - (* ; "Edited 24-Apr-2025 15:44 by rmk") - (* ; "Edited 2-Feb-2024 11:44 by rmk") - (* ; "Edited 30-Jan-2024 22:56 by rmk") - (* ; "Edited 6-Aug-2021 16:02 by rmk:") - (* ; "Edited 6-Aug-2020 17:13 by rmk:") - - (* ;; "Do not do UNICODE to MCSS translation if RAW.") - - (* ;; "Test for smallp because the stream's End-of-file operation may suppress the error") - - (DECLARE (USEDFREE *BYTECOUNTER*)) - (LET (BYTE1 BYTE2 BYTE3 BYTE4 CODE (COUNT 1)) - (SETQ BYTE1 (\BIN STREAM)) - - (* ;; "Distinguish on header bytes (modulo peculiar EOF behavior--the caller will get whatever ended up in BYTE1") - - (CL:WHEN (SMALLP BYTE1) - [SETQ CODE (if (ILEQ BYTE1 127) - then - (* ;; - "Test first: Ascii is the common case. EOL requires its own translation") - - (SELCHARQ BYTE1 - (CR (SELECTC (fetch (STREAM EOLCONVENTION) of STREAM) - (CR.EOLC (* ; "Also eq BYTE1") - (CHARCODE EOL)) - (CRLF.EOLC (if (EQ (CHARCODE LF) - (\PEEKBIN STREAM T)) - then (\BIN STREAM) - (CL:WHEN COUNTP (SETQ COUNT 2)) - (CHARCODE EOL) - else BYTE1)) - BYTE1)) - (LF (CL:IF (EQ LF.EOLC (fetch (STREAM EOLCONVENTION) - of STREAM)) - (CHARCODE EOL) - BYTE1)) - BYTE1) - elseif (ILEQ BYTE1 223) - then (* ; "2 bytes") - (SETQ COUNT 2) - (SETQ BYTE2 (\BIN STREAM)) - (CL:WHEN (OR (NOT (SMALLP BYTE2)) - (ILESSP BYTE2 128)) - (ERROR "INVALID UTF8 SEQUENCE" (LIST BYTE1 BYTE2))) - (LOGOR (LLSH (LOADBYTE BYTE1 0 5) - 6) - (LOADBYTE BYTE2 0 6)) - elseif (ILEQ BYTE1 239) - then (* ; "3 bytes") - (SETQ BYTE2 (\BIN STREAM)) - (CL:WHEN (OR (NOT (SMALLP BYTE2)) - (ILESSP BYTE2 128)) - (ERROR "INVALID UTF8 SEQUENCE" (LIST BYTE1 BYTE2))) - (SETQ BYTE3 (\BIN STREAM)) - (CL:WHEN (OR (NOT (SMALLP BYTE3)) - (ILESSP BYTE3 128)) - (ERROR "INVALID UTF8 SEQUENCE" (LIST BYTE1 BYTE2 BYTE3))) - (SETQ COUNT 3) - (LOGOR (LLSH (LOADBYTE BYTE1 0 4) - 12) - (LLSH (LOADBYTE BYTE2 0 6) - 6) - (LOADBYTE BYTE3 0 6)) - else (* ; "4 bytes") - (SETQ BYTE2 (\BIN STREAM)) - (CL:WHEN (OR (NOT (SMALLP BYTE2)) - (ILESSP BYTE2 128)) - (ERROR "INVALID UTF8 SEQUENCE" (LIST BYTE1 BYTE2))) - (SETQ BYTE3 (\BIN STREAM)) - (CL:WHEN (OR (NOT (SMALLP BYTE3)) - (ILESSP BYTE3 128)) - (ERROR "INVALID UTF8 SEQUENCE" (LIST BYTE1 BYTE2 BYTE3))) - (SETQ BYTE4 (\BIN STREAM)) - (CL:WHEN (OR (NOT (SMALLP BYTE4)) - (ILESSP BYTE4 128)) - (ERROR "INVALID UTF8 SEQUENCE" (LIST BYTE1 BYTE2 BYTE3 BYTE4))) - (SETQ COUNT 4) - (LOGOR (LLSH (LOADBYTE BYTE1 0 3) - 18) - (LLSH (LOADBYTE BYTE2 0 6) - 12) - (LLSH (LOADBYTE BYTE3 0 6) - 6) - (LOADBYTE BYTE4 0 6]) - (CL:UNLESS RAW - (SETQ CODE (UNICODE.TRANSLATE (UNICODE.SMALLP CODE) - *UNICODETOMCCS*))) - (CL:WHEN COUNTP (SETQ *BYTECOUNTER* COUNT)) - CODE]) - -(UTF8.PEEKCCODEFN - [LAMBDA (STREAM NOERROR RAW) (* ; "Edited 23-Oct-2025 08:26 by rmk") - (* ; "Edited 24-Apr-2025 15:44 by rmk") - (* ; "Edited 2-Feb-2024 11:48 by rmk") - (* ; "Edited 14-Jun-2021 22:53 by rmk:") - - (* ;; "Modeled this after \EUCPEEK on LLREAD. In the multi-byte (non-ASCII) case, backs the file pointer to the beginning by the proper number of \BACKFILEPTRs, and returns a count of 0. Returns NIL if NOERROR and either invalid UTF8 or end of file.") - - (* ;; "Could be that the caller takes care of backing up the file position if the number of binned-bytes is returned.") - - (* ;; "Do not do UNICODE to MCCS translation if RAW") - - (PROG (BYTE1 BYTE2 BYTE3 BYTE4 CODE) - (SETQ BYTE1 (\PEEKBIN STREAM NOERROR)) - - (* ;; "Distinguish on header bytex") - - (CL:UNLESS BYTE1 (RETURN NIL)) - [if (ILEQ BYTE1 127) - then - (* ;; - "Test first: Ascii is the common case. No need to back up, since we peeked.") - - (SETQ CODE BYTE1) - elseif [ILEQ BYTE1 223 (* ; "2 bytes") - (BIN STREAM) - (SETQ BYTE2 (\PEEKBIN STREAM NOERROR)) - (\BACKFILEPTR STREAM) - (if (AND BYTE2 (IGEQ BYTE2 128)) - then (SETQ CODE (LOGOR (LLSH (LOADBYTE BYTE1 0 5) - 6) - (LOADBYTE BYTE2 0 6))) - elseif NOERROR - else (ERROR "INVALID UTF8 SEQUENCE" (LIST BYTE1 BYTE2] - elseif (ILEQ BYTE1 239) - then (* ; "3 bytes") - (BIN STREAM) - (CL:UNLESS (AND (SETQ BYTE2 (\PEEKBIN STREAM NOERROR)) - (IGEQ BYTE2 128)) - (\BACKFILEPTR STREAM) - (OR NOERROR (ERROR "INVALID UTF8 SEQUENCE" (LIST BYTE1 BYTE2))) - (RETURN CODE)) - (BIN STREAM) - (SETQ BYTE3 (\PEEKBIN STREAM NOERROR)) (* ; - "PEEK the last, no need to back it up") - (\BACKFILEPTR STREAM) - (\BACKFILEPTR STREAM) - (if (AND BYTE3 (IGEQ BYTE3 128)) - then (SETQ CODE (LOGOR (LLSH (LOADBYTE BYTE1 0 4) - 12) - (LLSH (LOADBYTE BYTE2 0 6) - 6) - (LOADBYTE BYTE3 0 6))) - elseif NOERROR - else (ERROR "INVALID UTF8 SEQUENCE" (LIST BYTE1 BYTE2 BYTE3))) - else (* ; "4 bytes") - (BIN STREAM) - (CL:UNLESS (AND (SETQ BYTE2 (\PEEKBIN STREAM NOERROR)) - (IGEQ BYTE2 128)) - (\BACKFILEPTR STREAM) - (OR NOERROR (ERROR "INVALID UTF8 SEQUENCE" (LIST BYTE1 BYTE2))) - (RETURN CODE)) - (BIN STREAM) - (CL:UNLESS (AND (SETQ BYTE3 (\PEEKBIN STREAM NOERROR)) - (IGEQ BYTE3 128)) - (\BACKFILEPTR STREAM) - (\BACKFILEPTR STREAM) - (OR NOERROR (ERROR "INVALID UTF8 SEQUENCE" (LIST BYTE1 BYTE2 BYTE3))) - (RETURN CODE)) - (BIN STREAM) - (SETQ BYTE4 (\PEEKBIN STREAM NOERROR)) - (\BACKFILEPTR STREAM) - (\BACKFILEPTR STREAM) - (\BACKFILEPTR STREAM) - (if (AND BYTE4 (IGEQ BYTE4 128)) - then (SETQ CODE (LOGOR (LLSH (LOADBYTE BYTE1 0 3) - 18) - (LLSH (LOADBYTE BYTE2 0 6) - 12) - (LLSH (LOADBYTE BYTE3 0 6) - 6) - (LOADBYTE BYTE4 0 6))) - elseif NOERROR - else (ERROR "INVALID UTF8 SEQUENCE" (LIST BYTE1 BYTE2 BYTE3 BYTE4] - (CL:WHEN (AND CODE (NOT RAW)) - (SETQ CODE (UNICODE.TRANSLATE (UNICODE.SMALLP CODE) - *UNICODETOMCCS*))) - (RETURN CODE]) - -(\UTF8.BACKCCODEFN - [LAMBDA (STREAM COUNTP RAW) (* ; "Edited 19-Jul-2022 15:30 by rmk") - (* ; "Edited 6-Aug-2021 16:04 by rmk:") - - (* ;; "\BACKFILEPTR is NIL at beginning of FILE. Presumably a little bit more efficient if we decoded the UTF8 bytes backwards and didn't do the peek, but probably not worth the complexity. ") - - (DECLARE (USEDFREE *BYTECOUNTER*)) - (BIND (C _ 0) WHILE (IF (\BACKFILEPTR STREAM) - THEN (ADD C -1) - (EQ 2 (LRSH (\PEEKBIN STREAM) - 6)) - ELSE (CL:WHEN COUNTP (SETQ *BYTECOUNTER* C)) - (RETURN NIL)) REPEATUNTIL (EQ C -4) - FINALLY (CL:WHEN COUNTP (SETQ *BYTECOUNTER* C)) - (RETURN (UTF8.PEEKCCODEFN STREAM NIL RAW]) -) -(DEFINEQ - -(UTF16BE.OUTCHARFN - [LAMBDA (STREAM CHARCODE RAW) (* ; "Edited 24-Apr-2025 15:44 by rmk") - (* ; "Edited 31-Jan-2024 00:32 by rmk") - (* ; "Edited 8-Aug-2021 13:09 by rmk:") - (* ; "Edited 30-Jan-2020 23:08 by rmk:") - - (* ;; "PRINT UTF16 sequence for CHARCODE. Do not do MCCS to UNICODE translation if RAW.") - - (* ;; "Not sure about EOL conversion if truly %"raw%"") - - (IF (EQ CHARCODE (CHARCODE EOL)) - THEN (FREPLACE (STREAM CHARPOSITION) OF STREAM WITH 0) - ELSE (CHANGE (FFETCH (STREAM CHARPOSITION) OF STREAM) - (IPLUS16 1 DATUM))) - (FOR C INSIDE (CL:IF RAW - CHARCODE - (UNICODE.TRANSLATE CHARCODE *MCCSTOUNICODE*)) DO (\WOUT STREAM C]) - -(UTF16BE.INCCODEFN - [LAMBDA (STREAM COUNTP RAW) (* ; "Edited 24-Apr-2025 15:45 by rmk") - (* ; "Edited 10-Mar-2024 12:00 by rmk") - (* ; "Edited 6-Aug-2021 16:05 by rmk:") - - (* ;; - "Do not do UNICODE to MCCS translation if RAW. Test for SMALLPin case of funky EOF behavior") - - (DECLARE (USEDFREE *BYTECOUNTER*)) - (LET (CODE BYTE1 BYTE2 COUNT) - (IF [AND (SMALLP (SETQ BYTE1 (\BIN STREAM))) - (SMALLP (SETQ BYTE2 (\BIN STREAM] - THEN (SETQ COUNT 2) - (SETQ CODE (create WORD - HIBYTE _ (\BIN STREAM) - LOBYTE _ (\BIN STREAM))) - (CL:UNLESS RAW - (SETQ CODE (UNICODE.TRANSLATE CODE *UNICODETOMCCS*))) - (CL:WHEN COUNTP (SETQ *BYTECOUNTER* COUNT)) - CODE - ELSE (ERROR "ODD NUMBER OF BYTES IN UTF16 FILE" STREAM]) - -(UTF16BE.PEEKCCODEFN - [LAMBDA (STREAM NOERROR RAW) (* ; "Edited 24-Apr-2025 15:45 by rmk") - (* ; "Edited 10-Mar-2024 12:01 by rmk") - (* ; "Edited 14-Jun-2021 22:58 by rmk:") - - (* ;; "Could be that the caller takes care of backing up the file position if the number of binned-bytes is returned.") - - (* ;; "Do not do UNICODE to MCCS translation if RAW") - - (LET (BYTE1 BYTE2 CODE) - (SETQ BYTE1 (\PEEKBIN STREAM NOERROR)) - (IF BYTE1 - THEN (\BIN STREAM) - (SETQ BYTE2 (\PEEKBIN STREAM NOERROR)) - (\BACKFILEPTR STREAM) - (IF BYTE2 - THEN (SETQ CODE (create WORD - HIBYTE _ BYTE1 - LOBYTE _ BYTE2)) - (CL:IF RAW - CODE - (UNICODE.TRANSLATE CODE *UNICODETOMCCS*)) - ELSEIF NOERROR - THEN NIL) - ELSEIF NOERROR - THEN NIL - ELSE (ERROR "INVALID UTF16 CHARACTER" (LIST BYTE1 BYTE2]) - -(\UTF16BE.BACKCCODEFN - [LAMBDA (STREAM COUNTP RAW) (* ; "Edited 24-Apr-2025 15:28 by rmk") - (* ; "Edited 10-Mar-2024 12:02 by rmk") - (* ; "Edited 19-Jul-2022 15:14 by rmk") - (* ; "Edited 6-Aug-2021 16:07 by rmk:") - - (* ;; "\BACKFILEPTR is NIL at beginning of FILE, do nothing.") - - (DECLARE (USEDFREE *BYTECOUNTER*)) - (CL:WHEN (\BACKFILEPTR STREAM) - (LET (CODE (BYTE2 (\PEEKBIN STREAM))) - (IF (\BACKFILEPTR STREAM) - THEN (CL:WHEN COUNTP (SETQ *BYTECOUNTER* -2)) - (SETQ CODE (create WORD - HIBYTE _ (\PEEKBIN STREAM) - LOBYTE _ BYTE2)) - (CL:IF RAW - CODE - (UNICODE.TRANSLATE CODE *UNICODETOMCCS*)) - ELSEIF COUNTP - THEN (SETQ *BYTECOUNTER* -1) - NIL)))]) -) -(DEFINEQ - -(UTF16LE.OUTCHARFN - [LAMBDA (STREAM CHARCODE RAW) (* ; "Edited 24-Apr-2025 15:45 by rmk") - (* ; "Edited 10-Mar-2024 11:58 by rmk") - (* ; "Edited 8-Aug-2021 13:09 by rmk:") - (* ; "Edited 30-Jan-2020 23:08 by rmk:") - - (* ;; "PRINT UTF16 sequence for CHARCODE. Do not do MCCS to UNICODE translation if RAW.") - - (* ;; "Not sure about EOL conversion if truly %"raw%"") - - (IF (EQ CHARCODE (CHARCODE EOL)) - THEN (FREPLACE (STREAM CHARPOSITION) OF STREAM WITH 0) - ELSE (CHANGE (FFETCH (STREAM CHARPOSITION) OF STREAM) - (IPLUS16 1 DATUM))) - (FOR C INSIDE (CL:IF RAW - CHARCODE - (UNICODE.TRANSLATE CHARCODE *MCCSTOUNICODE*)) - DO (BOUT STREAM (fetch LOBYTE of CHARCODE)) - (BOUT STREAM (fetch HIBYTE of CHARCODE]) - -(UTF16LE.INCCODEFN - [LAMBDA (STREAM COUNTP RAW) (* ; "Edited 24-Apr-2025 15:45 by rmk") - (* ; "Edited 10-Mar-2024 12:03 by rmk") - (* ; "Edited 6-Aug-2021 16:05 by rmk:") - - (* ;; - "Do not do UNICODE to MCCS translation if RAW. Test for SMALLPin case of funky EOF behavior") - - (DECLARE (USEDFREE *BYTECOUNTER*)) - (LET (CODE BYTE1 BYTE2 COUNT) - (IF [AND (SMALLP (SETQ BYTE1 (\BIN STREAM))) - (SMALLP (SETQ BYTE2 (\BIN STREAM] - THEN (SETQ COUNT 2) - (SETQ CODE (create WORD - LOBYTE _ (\BIN STREAM) - HIBYTE _ (\BIN STREAM))) - (CL:UNLESS RAW - (SETQ CODE (UNICODE.TRANSLATE CODE *UNICODETOMCCS*))) - (CL:WHEN COUNTP (SETQ *BYTECOUNTER* COUNT)) - CODE - ELSE (ERROR "ODD NUMBER OF BYTES IN UTF16 FILE" STREAM]) - -(UTF16LE.PEEKCCODEFN - [LAMBDA (STREAM NOERROR RAW) (* ; "Edited 24-Apr-2025 15:46 by rmk") - (* ; "Edited 10-Mar-2024 11:43 by rmk") - (* ; "Edited 14-Jun-2021 22:58 by rmk:") - - (* ;; "Could be that the caller takes care of backing up the file position if the number of binned-bytes is returned.") - - (* ;; "Do not do UNICODE to MCCS translation if RAW") - - (LET (BYTE1 BYTE2 CODE) - (SETQ BYTE1 (\PEEKBIN STREAM NOERROR)) - (IF BYTE1 - THEN (\BIN STREAM) - (SETQ BYTE2 (\PEEKBIN STREAM NOERROR)) - (\BACKFILEPTR STREAM) - (IF BYTE2 - THEN (SETQ CODE (LOGOR (LLSH BYTE2 8) - BYTE1)) - (CL:IF RAW - CODE - (UNICODE.TRANSLATE CODE *UNICODETOMCCS*)) - ELSEIF NOERROR - THEN NIL) - ELSEIF NOERROR - THEN NIL - ELSE (ERROR "INVALID UTF16 CHARACTER" (LIST BYTE1 BYTE2]) - -(\UTF16LE.BACKCCODEFN - [LAMBDA (STREAM COUNTP RAW) (* ; "Edited 24-Apr-2025 15:28 by rmk") - (* ; "Edited 10-Mar-2024 12:04 by rmk") - (* ; "Edited 19-Jul-2022 15:14 by rmk") - (* ; "Edited 6-Aug-2021 16:07 by rmk:") - - (* ;; "\BACKFILEPTR is NIL at beginning of FILE, do nothing.") - - (DECLARE (USEDFREE *BYTECOUNTER*)) - (CL:WHEN (\BACKFILEPTR STREAM) - (LET (CODE (BYTE2 (\PEEKBIN STREAM))) - (IF (\BACKFILEPTR STREAM) - THEN (CL:WHEN COUNTP (SETQ *BYTECOUNTER* -2)) - (SETQ CODE (create WORD - HIBYTE _ BYTE2 - LOBYTE _ (\PEEKBIN STREAM))) - (CL:IF RAW - CODE - (UNICODE.TRANSLATE CODE *UNICODETOMCCS*)) - ELSEIF COUNTP - THEN (SETQ *BYTECOUNTER* -1) - NIL)))]) -) -(DEFINEQ - -(READBOM - [LAMBDA (STREAM COUNTP) (* ; "Edited 17-Jan-2025 11:29 by rmk") - (* ; "Edited 11-Mar-2024 23:53 by rmk") - (* ; "Edited 10-Mar-2024 13:01 by rmk") - - (* ;; "If COUNTP, this must be under a generic \INCCODE that binds *BYTECOUNTER*") - - (* ;; "Reads and decodes the BOM bytes. If BOM ispresent, the stream is left at the first following byte, otherwise the stream is reset to its position on entry (presumably 0).") - - (* ;; "I used the UNHEXTRING constants so that the hex bytes are visible in the code, maybe there's another function that does that?") - - (DECLARE (USEDFREE *BYTECOUNTER*)) - (SELECTC (\PEEKBIN STREAM T) - ((HEXNUM? "EF") - (BIN STREAM) - (if (EQ (CONSTANT (HEXNUM? "BB")) - (\PEEKBIN STREAM T)) - then (BIN STREAM) - (if (EQ (CONSTANT (HEXNUM? "BF")) - (\PEEKBIN STREAM T)) - then (BIN STREAM) - (CL:WHEN COUNTP (add *BYTECOUNTER* 3)) - :UTF-8 - else (\BACKFILEPTR STREAM)) - else (\BACKFILEPTR STREAM))) - ((HEXNUM? "FE") - (BIN STREAM) - (if (EQ (CONSTANT (HEXNUM? "FF")) - (\PEEKBIN STREAM T)) - then (BIN STREAM) - (CL:WHEN COUNTP (add *BYTECOUNTER* 2)) - :UTF-16BE - else (\BACKFILEPTR STREAM))) - ((HEXNUM? "FF") - (BIN STREAM) - (if (EQ (CONSTANT (HEXNUM? "FE")) - (\PEEKBIN STREAM T)) - then (BIN STREAM) - (CL:WHEN COUNTP (add *BYTECOUNTER* 2)) - :UTF-16LE - else (\BACKFILEPTR STREAM))) - NIL]) - -(WRITEBOM - [LAMBDA (STREAM FORMAT) (* ; "Edited 17-Jan-2025 11:29 by rmk") - (* ; "Edited 16-Mar-2024 20:53 by rmk") - (* ; "Edited 11-Mar-2024 23:53 by rmk") - (* ; "Edited 10-Mar-2024 13:01 by rmk") - - (* ;; "Writes a BOM that represents FORMAT (:UTF-8, :UTF16-BE, :UTF16-LE") - - (SELECTQ FORMAT - (:UTF-8 (BOUT STREAM (CONSTANT (HEXNUM? "EF"))) - (BOUT STREAM (CONSTANT (HEXNUM? "BB"))) - (BOUT STREAM (CONSTANT (HEXNUM? "BF")))) - (:UTF-16BE (BOUT STREAM (CONSTANT (HEXNUM? "FE"))) - (BOUT STREAM (CONSTANT (HEXNUM? "FF")))) - (:UTF-16LE (BOUT STREAM (CONSTANT (HEXNUM? "FF"))) - (BOUT STREAM (HEXNUM? "FE"))) - NIL]) -) - -(RPAQ? EXTERNALEOL 'LF) -(DEFINEQ - -(MAKE-UNICODE-FORMATS - [LAMBDA (EXTERNALEOL) (* ; "Edited 5-Feb-2026 11:06 by rmk") - (* ; "Edited 17-Jan-2025 18:38 by rmk") - (* ; "Edited 10-Mar-2024 11:55 by rmk") - (* ; "Edited 8-Dec-2023 15:19 by rmk") - (* ; "Edited 19-Jul-2022 15:36 by rmk") - (* ; "Edited 6-Aug-2021 16:08 by rmk:") - - (* ;; "RAW formats do not do XCCS/Unicode translation, just deal with the byte encoding.") - - (* ;; "The EXTERNALEOL specifies the EOLCONVENTION of the stream, particularly to produce output files with the desired convention. On input the macro \CHECKEOLC (LLREAD) coerces only that coding to the internal EOL, which is a mistake.") - - (MAKE-EXTERNALFORMAT :UTF-8 (FUNCTION UTF8.INCCODEFN) - (FUNCTION UTF8.PEEKCCODEFN) - (FUNCTION \UTF8.BACKCCODEFN) - (FUNCTION UTF8.OUTCHARFN) - NIL EXTERNALEOL NIL (FUNCTION MTOUTF8STRING) - NIL - (FUNCTION NILL) - (FUNCTION UTF8TOMSTRING)) - (MAKE-EXTERNALFORMAT :UTF-8-RAW [FUNCTION (LAMBDA (STREAM COUNTP) - (UTF8.INCCODEFN STREAM COUNTP T] - [FUNCTION (LAMBDA (STREAM NOERROR) - (UTF8.PEEKCCODEFN STREAM NOERROR T] - [FUNCTION (LAMBDA (STREAM COUNTP) - (\UTF8.BACKCCODEFN STREAM COUNTP T] - [FUNCTION (LAMBDA (STREAM CHARCODE) - (UTF8.OUTCHARFN STREAM CHARCODE T] - NIL EXTERNALEOL NIL NIL NIL (FUNCTION NILL)) - (MAKE-EXTERNALFORMAT :UTF-16BE (FUNCTION UTF16BE.INCCODEFN) - (FUNCTION UTF16BE.PEEKCCODEFN) - (FUNCTION \UTF16BE.BACKCCODEFN) - (FUNCTION UTF16BE.OUTCHARFN) - NIL EXTERNALEOL NIL NIL NIL (FUNCTION NILL)) - (MAKE-EXTERNALFORMAT :UTF-16BE-RAW [FUNCTION (LAMBDA (STREAM COUNTP) - (UTF16BE.INCCODEFN STREAM COUNTP T] - [FUNCTION (LAMBDA (STREAM NOERROR) - (UTF16BE.PEEKCCODEFN STREAM NOERROR T] - [FUNCTION (LAMBDA (STREAM COUNTP) - (\UTF16BE.BACKCCODEFN STREAM COUNTP T] - [FUNCTION (LAMBDA (STREAM CHARCODE) - (UTF16BE.OUTCHARFN STREAM CHARCODE T] - NIL EXTERNALEOL NIL NIL NIL (FUNCTION NILL)) - (MAKE-EXTERNALFORMAT :UTF-16LE (FUNCTION UTF16LE.INCCODEFN) - (FUNCTION UTF16LE.PEEKCCODEFN) - (FUNCTION \UTF16LE.BACKCCODEFN) - (FUNCTION UTF16LE.OUTCHARFN) - NIL EXTERNALEOL NIL NIL NIL (FUNCTION NILL)) - (MAKE-EXTERNALFORMAT :UTF-16LE-RAW [FUNCTION (LAMBDA (STREAM COUNTP) - (UTF16LE.INCCODEFN STREAM COUNTP T] - [FUNCTION (LAMBDA (STREAM NOERROR) - (UTF16LE.PEEKCCODEFN STREAM NOERROR T] - [FUNCTION (LAMBDA (STREAM COUNTP) - (\UTF16LE.BACKCCODEFN STREAM COUNTP T] - [FUNCTION (LAMBDA (STREAM CHARCODE) - (UTF16LE.OUTCHARFN STREAM CHARCODE T] - NIL EXTERNALEOL NIL NIL NIL (FUNCTION NILL)) - (\INSTALL.EXTERNALFORMAT (create EXTERNALFORMAT using (FIND-FORMAT :UTF-8) - NAME _ :UTF-8-SLUG OUTCHARFN _ - (FUNCTION UTF8.SLUG.OUTCHARFN]) -) - -(MAKE-UNICODE-FORMATS EXTERNALEOL) - -(ADDTOVAR *DEFAULT-EXTERNALFORMATS* (UNIX :UTF-8)) -(DEFINEQ - -(UTF8.BINCODE - [LAMBDA (STREAM RAW) (* ; "Edited 24-Apr-2025 15:28 by rmk") - (* ; "Edited 4-Feb-2024 01:06 by rmk") - (* ; "Edited 1-Feb-2024 11:21 by rmk") - (* ; "Edited 28-Dec-2023 13:32 by rmk") - (* ; "Edited 6-Aug-2021 16:02 by rmk:") - (* ; "Edited 6-Aug-2020 17:13 by rmk:") - - (* ;; "Decodes a UTF8 character code by binning from STREAM ") - - (* ;; "The validity of STREAM is guaranteed by the caller (presumably TEDIT), we aren't testing here for the validity of the trailing bytes.") - - (* ;; "This doesn't do EOL conversion or translation, unlike UTF8.INCCODEFN.") - - (LET ((BYTE1 (BIN STREAM)) - CODE) - [SETQ CODE (if (ILEQ BYTE1 127) - then BYTE1 - elseif (ILEQ BYTE1 223) - then (* ; "2 bytes") - (LOGOR (LLSH (LOADBYTE BYTE1 0 5) - 6) - (LOADBYTE (BIN STREAM) - 0 6)) - elseif (ILEQ BYTE1 239) - then (* ; "3 bytes") - (LOGOR (LLSH (LOADBYTE BYTE1 0 4) - 12) - (LLSH (LOADBYTE (BIN STREAM) - 0 6) - 6) - (LOADBYTE (BIN STREAM) - 0 6)) - else (* ; "4 bytes") - (LOGOR (LLSH (LOADBYTE BYTE1 0 3) - 18) - (LLSH (LOADBYTE (BIN STREAM) - 0 6) - 12) - (LLSH (LOADBYTE (BIN STREAM) - 0 6) - 6) - (LOADBYTE (BIN STREAM) - 0 6] - (CL:IF RAW - CODE - (UNICODE.TRANSLATE CODE *UNICODETOMCCS*))]) - -(\UTF8.FETCHCODE - [LAMBDA (CODESIZE BUFFER BYTEOFFSET) (* ; "Edited 28-Dec-2023 13:32 by rmk") - (* ; "Edited 6-Aug-2021 16:02 by rmk:") - (* ; "Edited 6-Aug-2020 17:13 by rmk:") - - (* ;; "Decodes a UTF8 byte sequence of size CODESIZE in BUFFER starting at BYTEOFFSET.") - - (* ;; "The validity of the thesize, buffer, and offset are guaranteed by the caller.") - - (LET ((BYTE1 (\GETBASEBYTE BUFFER BYTEOFFSET)) - BYTE2 BYTE3 BYTE4) - (SELECTQ CODESIZE - (2 (SETQ BYTE2 (\UTF8.GETBASEBYTE BUFFER (IPLUS 1 BYTEOFFSET))) - (LOGOR (LLSH (LOADBYTE BYTE1 0 5) - 6) - (LOADBYTE BYTE2 0 6))) - (3 (SETQ BYTE2 (\UTF8.GETBASEBYTE BUFFER (IPLUS 1 BYTEOFFSET))) - (SETQ BYTE3 (\UTF8.GETBASEBYTE BUFFER (IPLUS 2 BYTEOFFSET))) - (LOGOR (LLSH (LOADBYTE BYTE1 0 4) - 12) - (LLSH (LOADBYTE BYTE2 0 6) - 6) - (LOADBYTE BYTE3 0 6))) - (4 (SETQ BYTE2 (\UTF8.GETBASEBYTE BUFFER (IPLUS 1 BYTEOFFSET))) - (SETQ BYTE3 (\UTF8.GETBASEBYTE BUFFER (IPLUS 2 BYTEOFFSET))) - (SETQ BYTE4 (\UTF8.GETBASEBYTE BUFFER (IPLUS 3 BYTEOFFSET))) - (LOGOR (LLSH (LOADBYTE BYTE1 0 3) - 18) - (LLSH (LOADBYTE BYTE2 0 6) - 12) - (LLSH (LOADBYTE BYTE3 0 6) - 6) - (LOADBYTE BYTE4 0 6))) - (1 BYTE1) - (SHOULDNT]) -) -(DEFINEQ - -(UTF8.VALIDATE - [LAMBDA (STREAM BYTE) (* ; "Edited 2-Feb-2024 12:03 by rmk") - (* ; "Edited 28-Dec-2023 11:57 by rmk") - (* ; "Edited 6-Aug-2021 16:02 by rmk:") - (* ; "Edited 6-Aug-2020 17:13 by rmk:") - - (* ;; "Returns the codesize if the bytes starting at STREAM's current position form a valid UTF-8 sequence.") - - (* ;; "If BYTE is provided, it is interpreted as the just-read header byte with the stream is positioned just after it.") - - (* ;; "Test for smallp because the stream's End-of-file operation may suppress the error--otherwise an error will happen if the streams runs out of necessary bytes.") - - (* ;; "For valid sequences, returns the same value as UTF8-SIZE-FROM-BYTE1, but this reads/validates the rest of the bytes. On a non-NILreturn the stream is positioned before the header byte of the next putative code. The stream position is uncertain on a NIL return.") - - (* ;; "") - - (* ;; "Distinguish on the header byte BYTE. Not SMALLP presumably if ENDOFSTREAMOP did something unusual.") - - (CL:UNLESS BYTE - (SETQ BYTE (BIN STREAM))) - (CL:WHEN (SMALLP BYTE) - (if (ILEQ BYTE 127) - then 1 - elseif (ILEQ BYTE 223) - then (* ; " 2 bytes") - (CL:UNLESS (OR [NOT (SMALLP (SETQ BYTE (BIN STREAM] - (ILESSP BYTE 128)) - 2) - elseif (ILEQ BYTE 239) - then (* ; "3 bytes") - (CL:UNLESS (OR (OR [NOT (SMALLP (SETQ BYTE (BIN STREAM] - (ILESSP BYTE 128)) - (OR [NOT (SMALLP (SETQ BYTE (BIN STREAM] - (ILESSP BYTE 128))) - 3) - else (* ; "4 bytes") - (CL:UNLESS (OR (OR [NOT (SMALLP (SETQ BYTE (BIN STREAM] - (ILESSP BYTE 128)) - (OR [NOT (SMALLP (SETQ BYTE (BIN STREAM] - (ILESSP BYTE 128)) - (OR [NOT (SMALLP (SETQ BYTE (BIN STREAM] - (ILESSP BYTE 128))) - 4)))]) - -(NUTF8-BYTE1-BYTES - [LAMBDA (BYTE1) (* ; "Edited 3-Feb-2024 15:00 by rmk") - (* ; "Edited 8-Jan-2024 10:57 by rmk") - (* ; "Edited 28-Jun-2022 00:02 by rmk") - (* ; "Edited 10-Aug-2020 12:35 by rmk:") - - (* ;; "Returns the number of bytes in a UTF8 code representation whose first byte is BYTEE1. ") - - (IF (ILEQ BYTE1 127) - THEN 1 - ELSEIF (ILEQ BYTE1 223) - THEN 2 - ELSEIF (ILEQ BYTE1 239) - THEN 3 - ELSE 4]) - -(NUTF8-CODE-BYTES - [LAMBDA (CODE) (* ; "Edited 3-Feb-2024 14:42 by rmk") - (* ; "Edited 8-Jan-2024 10:57 by rmk") - (* ; "Edited 28-Jun-2022 00:02 by rmk") - (* ; "Edited 10-Aug-2020 12:35 by rmk:") - - (* ;; "Returns the number of bytes needed to encode in UTF8 a number headed by BYTE. ") - - (IF (ILESSP CODE 128) - THEN 1 - ELSEIF (ILESSP CODE 2048) - THEN (* ; "x800") - 2 - ELSEIF (ILESSP CODE 65536) - THEN (* ; "x10000") - 3 - ELSEIF (ILESSP CODE 2097152) - THEN (* ; "x200000") - 4 - ELSE (ERROR "INVALID UTF-8 CODE"]) - -(NUTF8-STRING-BYTES - [LAMBDA (STRING RAW) (* ; "Edited 2-Sep-2025 10:40 by rmk") - (* ; "Edited 24-Apr-2025 15:37 by rmk") - (* ; "Edited 3-Feb-2024 21:32 by rmk") - (* ; "Edited 10-Aug-2020 09:06 by rmk:") - - (* ;; "Returns the number of bytes it would take to represent STRING in UTF8, assuming it is an MCCS string unless RAWFLG. ") - - (for I C from 1 while (SETQ C (NTHCHARCODE STRING I)) sum (NUTF8-CODE-BYTES (CL:IF RAW - C - (MTOUCODE C))]) - -(N-MCHARS - [LAMBDA (UTF8STRING) (* ; "Edited 9-Sep-2025 08:35 by rmk") - - (* ;; "Returns the number of MCCS characters coded in UTF8STRING") - - (for I B from 1 while (SETQ B (NTHCHARCODE UTF8STRING I)) by (NUTF8-BYTE1-BYTES B) count T]) -) -(DECLARE%: EVAL@COMPILE DONTCOPY -(DECLARE%: EVAL@COMPILE - -(PUTPROPS UNICODE.TRANSLATE MACRO [OPENLAMBDA (CODE TRANSLATION-TABLE DONTFAKE RETURNALL) - - (* ;; "If RETURNALL and there are alternatives in the RANG, the list is returned. Othewise just the first one if the fake flag allows ") - - (LET [(RANGE (OR (GETHASH CODE TRANSLATION-TABLE) - (UNICODE.UNMAPPED CODE TRANSLATION-TABLE - DONTFAKE] - (CL:WHEN RANGE - (if (AND RETURNALL (CDR RANGE)) - then RANGE - else (SETQ RANGE (CAR RANGE)) - (CL:IF DONTFAKE - (TRUECODEP RANGE TRANSLATION-TABLE) - RANGE)))]) - -(PUTPROPS \UTF8.GETBASEBYTE MACRO ((BASE OFFSET ERROR?) (* ; - "Fetches the OFFSET'th byte from BASE, checking for UTF-8 validity if ERROR?") - (IF ERROR? - THEN (LET ((BYTE (\GETBASEBYTE BASE OFFSET))) - (CL:WHEN (ILESSP BYTE 128) - (ERROR "INVALID UTF8 BYTE" BYTE)) - BYTE) - ELSE (\GETBASEBYTE BASE OFFSET)))) - -(PUTPROPS UNICODE.SMALLP MACRO [OPENLAMBDA (UNICODE) (* ; - "Cananonicalizes a large UNICODE for EQ hash-testing") - (OR (SMALLP UNICODE) - (CAR (OR (MEMBER UNICODE *LARGEUNICODES*) - (PUSH *LARGEUNICODES* UNICODE]) -) -) - - - -(* ;; "") - - - - -(* ;; -"These come after the translation tables have been loaded, since the Unix file names needed to read the mapping files depend on the UTF8 string coercions. Those functions are defined as EVQ in UFS, cannot be used until the tables exist. This assumes that previous files have only 7-bit MCCS characters in their names." -) - -(DEFINEQ - -(MTOUCODE - [LAMBDA (MCODE) (* ; "Edited 4-Sep-2025 15:10 by rmk") - (* ; "Edited 24-Apr-2025 10:19 by rmk") - (* ; "Edited 9-Aug-2020 09:04 by rmk:") - (UNICODE.TRANSLATE MCODE *MCCSTOUNICODE*]) - -(UTOMCODE - [LAMBDA (UNICODE) (* ; "Edited 23-Oct-2025 08:23 by rmk") - (* ; "Edited 24-Apr-2025 10:17 by rmk") - (* ; "Edited 16-Jan-2025 23:46 by rmk") - (* ; "Edited 9-Aug-2020 09:04 by rmk:") - (UNICODE.TRANSLATE (UNICODE.SMALLP UNICODE) - *UNICODETOMCCS*]) - -(MTOUCODE? - [LAMBDA (MCODE) (* ; "Edited 4-Sep-2025 15:09 by rmk") - (* ; "Edited 24-Apr-2025 10:18 by rmk") - (* ; "Edited 20-Jan-2025 20:38 by rmk") - (* ; "Edited 18-Jan-2025 11:44 by rmk") - (* ; "Edited 15-Jan-2025 19:51 by rmk") - (* ; "Edited 14-Jan-2025 13:14 by rmk") - (* ; "Edited 9-Aug-2020 09:04 by rmk:") - - (* ;; "Returns the Unix range-code(s) corresponding to MCODE if there are true mapppings, otherwise NIL. Alternative codes are returned in a list, the code itself is returned for a singleton.") - - (UNICODE.TRANSLATE MCODE *MCCSTOUNICODE* T T]) - -(UTOMCODE? - [LAMBDA (UNICODE) (* ; "Edited 23-Oct-2025 08:24 by rmk") - (* ; "Edited 24-Apr-2025 10:18 by rmk") - (* ; "Edited 19-Jan-2025 21:14 by rmk") - (* ; "Edited 18-Jan-2025 11:46 by rmk") - (* ; "Edited 15-Jan-2025 19:51 by rmk") - (* ; "Edited 14-Jan-2025 13:14 by rmk") - (* ; "Edited 9-Aug-2020 09:04 by rmk:") - - (* ;; "Returns the MCCS range-code(s) corresponding to UNICODE if there are true mapppings, otherwise NIL. ") - - (* ;; - " NOTE: Alternative codes are returned in a list, the code itself is returned for a singleton.") - - (* ;; "Canonicalize unicodes outside of the 16-bit plane") - - (UNICODE.TRANSLATE (UNICODE.SMALLP UNICODE) - *UNICODETOMCCS* T T]) - -(MTOUSTRING - [LAMBDA (MSTRING DESTRUCTIVE) (* ; "Edited 2-Sep-2025 12:19 by rmk") - (* ; "Edited 29-Apr-2025 12:01 by rmk") - - (* ;; "Converts MCCS codes in MSTRING to Unicodes.") - - (for I MCODE (USTRING _ (CL:IF DESTRUCTIVE - MSTRING - (CONCAT MSTRING))) from 1 while (SETQ MCODE (NTHCHARCODE MSTRING I)) - do (RPLCHARCODE USTRING I (MTOUCODE MCODE)) finally (RETURN USTRING]) - -(UTOMSTRING - [LAMBDA (USTRING DESTRUCTIVE) (* ; "Edited 2-Sep-2025 12:18 by rmk") - (* ; "Edited 29-Apr-2025 12:00 by rmk") - - (* ;; "Converts Unicodes to MCCS codes in USTRING.") - - (for I UCODE (MSTRING _ (CL:IF DESTRUCTIVE - USTRING - (CONCAT USTRING))) from 1 while (SETQ UCODE (NTHCHARCODE USTRING I)) - do (RPLCHARCODE MSTRING I (UTOMCODE UCODE)) finally (RETURN MSTRING]) - -(MTOUTF8STRING - [LAMBDA (MSTRING) (* ; "Edited 31-Jan-2026 19:15 by rmk") - (* ; "Edited 9-Sep-2025 07:51 by rmk") - (* ; "Edited 4-Sep-2025 15:13 by rmk") - (* ; "Edited 2-Sep-2025 11:12 by rmk") - (* ; "Edited 24-Apr-2025 15:37 by rmk") - (* ; "Edited 3-Feb-2024 14:55 by rmk") - (* ; "Edited 10-Aug-2020 21:42 by rmk:") - - (* ;; - "Produces a string that contains the UTF8 bytes that represent the characters in MSTRING. ") - - (* ;; "The resulting string will not be directly interpretable inside Medley.") - - (if (if (STRINGP MSTRING) - then [OR (ffetch (STRINGP FATSTRINGP) of MSTRING) - (thereis C instring MSTRING suchthat (OR (IGEQ C 128) - (NEQ C (MTOUCODE C] - elseif (LITATOM MSTRING) - then [OR (ffetch (LITATOM FATPNAMEP) of MSTRING) - (thereis C inatom MSTRING suchthat (OR (IGEQ C 128) - (NEQ C (MTOUCODE C] - else T) - then (LET [(USTR (ALLOCSTRING (NUTF8-STRING-BYTES MSTRING] - (for I UCODE MCODE (SINDEX _ 0) from 1 while (SETQ MCODE (NTHCHARCODE MSTRING I)) - do (SETQ UCODE (MTOUCODE MCODE)) - (if (ILESSP UCODE 128) - then (RPLCHARCODE USTR (ADD SINDEX 1) - UCODE) - elseif (ILESSP UCODE 2048) - then (* ; "x800") - (RPLCHARCODE USTR (ADD SINDEX 1) - (LOGOR (LLSH 3 6) - (LRSH UCODE 6))) - (RPLCHARCODE USTR (ADD SINDEX 1) - (LOGOR (LLSH 2 6) - (LOADBYTE UCODE 0 6))) - elseif (ILESSP UCODE 65536) - then (* ; "x10000") - (RPLCHARCODE USTR (ADD SINDEX 1) - (LOGOR (LLSH 7 5) - (LRSH UCODE 12))) - (RPLCHARCODE USTR (ADD SINDEX 1) - (LOGOR (LLSH 2 6) - (LOADBYTE UCODE 6 6))) - (RPLCHARCODE USTR (ADD SINDEX 1) - (LOGOR (LLSH 2 6) - (LOADBYTE UCODE 0 6))) - elseif (ILESSP UCODE 2097152) - then (* ; "x200000") - (RPLCHARCODE USTR (ADD SINDEX 1) - (LOGOR (LLSH 15 4) - (LRSH UCODE 18))) - (RPLCHARCODE USTR (ADD SINDEX 1) - (LOGOR (LLSH 2 6) - (LOADBYTE UCODE 12 6))) - (RPLCHARCODE USTR (ADD SINDEX 1) - (LOGOR (LLSH 2 6) - (LOADBYTE UCODE 6 6))) - (RPLCHARCODE USTR (ADD SINDEX 1) - (LOGOR (LLSH 2 6) - (LOADBYTE UCODE 0 6))) - else (SHOULDNT))) - USTR) - else MSTRING]) - -(UTF8TOMSTRING - [LAMBDA (UTF8STRING) (* ; "Edited 22-Oct-2025 22:00 by rmk") - (* ; "Edited 16-Oct-2025 14:39 by rmk") - (* ; "Edited 9-Sep-2025 08:59 by rmk") - (CL:UNLESS (OR (STRINGP UTF8STRING) - (LITATOM UTF8STRING)) - (SETQ UTF8STRING (MKSTRING UTF8STRING))) - (CL:WHEN (ffetch (STRINGP FATSTRINGP) of UTF8STRING) - (\ILLEGAL.ARG UTF8STRING)) - (LET* ((NMCHARS (N-MCHARS UTF8STRING)) - (MSTRING (ALLOCSTRING NMCHARS))) - [for M NBYTES BYTE1 (BASE _ (ffetch (STRINGP BASE) of UTF8STRING)) from 1 to NMCHARS - as OFFSET from (fetch (STRINGP OFFST) of MSTRING) by NBYTES - do (SETQ BYTE1 (\GETBASEBYTE BASE OFFSET)) - (SETQ NBYTES (NUTF8-BYTE1-BYTES BYTE1)) - (RPLCHARCODE MSTRING M (UTOMCODE (\UTF8.FETCHCODE NBYTES BASE OFFSET] - MSTRING]) -) -(DEFINEQ - -(XTOUCODE - [LAMBDA (XCODE) (* ; "Edited 4-Sep-2025 15:09 by rmk") - (* ; "Edited 24-May-2025 23:16 by rmk") - (* ; "Edited 24-Apr-2025 15:27 by rmk") - (* ; "Edited 9-Aug-2020 09:04 by rmk:") - (UNICODE.TRANSLATE (XTOMCODE XCODE) - *MCCSTOUNICODE*]) - -(UTOXCODE - [LAMBDA (UNICODE) (* ; "Edited 24-May-2025 23:17 by rmk") - (* ; "Edited 24-Apr-2025 15:28 by rmk") - (* ; "Edited 16-Jan-2025 23:46 by rmk") - (* ; "Edited 9-Aug-2020 09:04 by rmk:") - (MTOXCODE (UNICODE.TRANSLATE UNICODE *UNICODETOMCCS*]) - -(XTOUCODE? - [LAMBDA (XCCSCODE) (* ; "Edited 24-May-2025 23:18 by rmk") - (* ; "Edited 24-Apr-2025 15:27 by rmk") - (* ; "Edited 20-Jan-2025 20:38 by rmk") - (* ; "Edited 18-Jan-2025 11:44 by rmk") - (* ; "Edited 15-Jan-2025 19:51 by rmk") - (* ; "Edited 14-Jan-2025 13:14 by rmk") - (* ; "Edited 9-Aug-2020 09:04 by rmk:") - - (* ;; "Returns the Unix range-code(s) corresponding to XCCSCODE if there are true mapppings, otherwise NIL. Alternative codes are returned in a list, the code itself is returned for a singleton.") - - (UNICODE.TRANSLATE (XTOMCODE XCCSCODE) - *MCCSTOUNICODE* T T]) - -(UTOXCODE? - [LAMBDA (UNICODE) (* ; "Edited 24-May-2025 23:19 by rmk") - (* ; "Edited 24-Apr-2025 15:28 by rmk") - (* ; "Edited 19-Jan-2025 21:14 by rmk") - (* ; "Edited 18-Jan-2025 11:46 by rmk") - (* ; "Edited 15-Jan-2025 19:51 by rmk") - (* ; "Edited 14-Jan-2025 13:14 by rmk") - (* ; "Edited 9-Aug-2020 09:04 by rmk:") - - (* ;; "Returns the XCCS range-code(s) corresponding to UNICODE if there are true mapppings, otherwise NIL. ") - - (* ;; - " NOTE: Alternative codes are returned in a list, the code itself is returned for a singleton.") - - (MTOXCODE (UNICODE.TRANSLATE UNICODE *UNICODETOMCCS* T T]) - -(XTOUSTRING - [LAMBDA (XSTRING DESTRUCTIVE) (* ; "Edited 2-Sep-2025 12:00 by rmk") - (* ; "Edited 29-Apr-2025 12:01 by rmk") - - (* ;; "Converts XCCS codes in XSTRING to Unicodes.") - - (for I UCODE XCODE (USTRING _ (CL:IF DESTRUCTIVE - XSTRING - (CONCAT XSTRING))) from 1 while (SETQ XCODE (NTHCHARCODE - XSTRING I)) - do (RPLCHARCODE USTRING I (XTOUCODE XCODE)) finally (RETURN USTRING]) - -(UTOXSTRING - [LAMBDA (USTRING DESTRUCTIVE) (* ; "Edited 2-Sep-2025 11:54 by rmk") - (* ; "Edited 29-Apr-2025 12:00 by rmk") - - (* ;; "Converts Unicodes in USTRING to XCCS codes.") - - (for I XCODE UCODE (XSTRING _ (CL:IF DESTRUCTIVE - USTRING - (CONCAT USTRING))) from 1 while (SETQ UCODE (NTHCHARCODE - USTRING I)) - unless (EQ UCODE (SETQ XCODE (UTOXCODE UCODE))) do (RPLCHARCODE XSTRING I XCODE) - finally (RETURN XSTRING]) - -(XTOUTF8STRING - [LAMBDA (XSTRING) (* ; "Edited 4-Sep-2025 18:37 by rmk") - (* ; "Edited 2-Sep-2025 11:37 by rmk") - (* ; "Edited 29-Apr-2025 12:53 by rmk") - (* ; "Edited 24-Apr-2025 15:42 by rmk") - (* ; "Edited 3-Feb-2024 14:55 by rmk") - (* ; "Edited 10-Aug-2020 21:42 by rmk:") - - (* ;; "Produces a string that contains the UTF8 bytes that represent the characters in XSTRING. Applies the ") - - (* ;; "The resulting string will not be interpretable inside Medley.") - - (for I C (MSTRING _ (CONCAT XSTRING)) from 1 while (SETQ C (NTHCHARCODE XSTRING I)) - do (RPLCHARCODE MSTRING I (XTOMCODE C)) finally (RETURN (MTOUTF8STRING MSTRING]) -) - - - -(* ;; "") - - - - -(* ; "Write Unicode mapping files") - -(DEFINEQ - -(WRITE-UNICODE-MAPPING - [LAMBDA (MAPPING INCLUDECHARSETS FILE EMPTYOK) (* ; "Edited 4-Jan-2024 22:44 by rmk") - (* ; "Edited 16-Aug-2020 16:56 by rmk:") - - (* ;; "Writes a symbol unicode mapping file. Mapping is a list of (XCCS-code Unicode) pairs, which may contain codes in multiple character sets.") - - (* ;; "If FILE is NIL, it defaults to a name XCCS- followed by the octal character sets in the mapping, in the unicode/XEROX directory.") - - (* ;; "The output lines are of the form x0XXXx0UUUU# Unicode-char") - - (* ;; - "If INCLUDECHARSETS=T then the mappings are split up into separate per-character set files.") - - (* ;; "Otherwise, all and only mappings included in thos charsets are included in a single output file--an implicit subset.") - - (IF (AND (EQ INCLUDECHARSETS T) - (NULL FILE)) - THEN (IF MAPPING - THEN (FOR CSI F IN XCCS-SET-NAMES WHEN (SETQ F (WRITE-UNICODE-MAPPING MAPPING - (CAR CSI) - NIL T)) COLLECT F) - ELSE (PRINTOUT T "THERE ARE NO MAPPINGS" T) - NIL) - ELSE - (LET - (IMAPPING CSETINFO RANGES) - (CL:MULTIPLE-VALUE-SETQ (IMAPPING CSETINFO RANGES) - (WRITE-UNICODE-INCLUDED MAPPING INCLUDECHARSETS)) - (IF IMAPPING - THEN (CL:WITH-OPEN-FILE - (STREAM (WRITE-UNICODE-MAPPING-FILENAME FILE CSETINFO RANGES) - :DIRECTION :OUTPUT :IF-EXISTS :NEW-VERSION :EXTERNAL-FORMAT :UTF-8-RAW) - (WRITE-UNICODE-MAPPING-HEADER STREAM CSETINFO RANGES) - (SORT IMAPPING T) - (FOR M CSET LEFTC FIRSTRIGHTC CSI IN IMAPPING - DO (SETQ LEFTC (CAR M)) - (SETQ FIRSTRIGHTC (CADR M)) - (CL:UNLESS (EQ CSET (LRSH LEFTC 8)) - (SETQ CSET (LRSH LEFTC 8)) - (SETQ CSI (ASSOC CSET CSETINFO)) - (PRINTOUT STREAM T "# " .P2 (CADR CSI) - " " - (CADDR CSI) - T)) - (PRINTOUT STREAM "0x" (HEXSTRING LEFTC 4) - %# - (FOR RIGHTC IN (CDR M) DO (PRINTOUT NIL " " "0x" (HEXSTRING RIGHTC 4))) - " # " - (SELECTC FIRSTRIGHTC - (UNDEFINEDCODE - (* ;; "FFFF") - - "UNDEFINED") - (MISSINGCODE - (* ;; "FFFE") - - "MISSING") - (IF (ILESSP FIRSTRIGHTC 32) - THEN (* ; "Control chars") - [CONCAT "^" (CHARACTER (IPLUS FIRSTRIGHTC (CHARCODE @] - ELSE (CHARACTER FIRSTRIGHTC))) - T)) - (FULLNAME STREAM)) - ELSEIF (NOT EMPTYOK) - THEN (PRINTOUT T "THERE ARE NO MAPPINGS") - (CL:WHEN INCLUDECHARSETS - (PRINTOUT T " FOR " .PPVTL (MKLIST INCLUDECHARSETS) - T)) - NIL]) - -(WRITE-UNICODE-INCLUDED - [LAMBDA (MAPPING INCLUDECHARSETS) (* ; "Edited 4-Aug-2020 17:47 by rmk:") - - (* ;; "CSETINFO is a list of (num string name) for each included character set.") - - (LET (CHARSETS CSETINFO RANGES ICSETS IMAPPING) - - (* ;; "Normalize the INCLUDECHARSETS, then reduce MAPPING to the included mappings") - - [SETQ ICSETS (FOR C POS KNOWN INSIDE (OR INCLUDECHARSETS (FOR CSI IN - XCCS-SET-NAMES - COLLECT (CAR CSI))) - JOIN [SETQ KNOWN (OR (SASSOC C XCCS-SET-NAMES) - (FIND N IN XCCS-SET-NAMES - SUCHTHAT (EQ C (CADR N))) - (HELP "UNKNOWN CHARACTER SET" (OCTALSTRING C] - (IF (SETQ POS (STRPOS "-" (CAR KNOWN))) - THEN (FOR I FROM (CL:PARSE-INTEGER (SUBSTRING - (CAR KNOWN) - 1 - (SUB1 POS)) - :RADIX 8) - TO (CL:PARSE-INTEGER (SUBSTRING (CAR KNOWN) - (ADD1 POS)) - :RADIX 8) - COLLECT (LIST I (OCTALSTRING I) - (CADR KNOWN))) - ELSE (CONS (CONS (CL:PARSE-INTEGER (CAR KNOWN) - :RADIX 8) - KNOWN] - (SETQ IMAPPING (FOR M CSI IN MAPPING WHEN (SETQ CSI (ASSOC (LRSH (CAR M) - 8) - ICSETS)) - COLLECT - - (* ;; "The attested subset of INCLUDED") - - (CL:UNLESS (MEMB CSI CSETINFO) - (PUSH CSETINFO CSI)) - M)) - - (* ;; "Sort as numbers, not octal strings, then group into consecutive ranges") - - (SETQ CSETINFO (SORT CSETINFO T)) - [SETQ RANGES (FOR CTAIL C START END ON (FOR CSI IN CSETINFO - COLLECT (CAR CSI)) WHILE CTAIL - COLLECT (SETQ START (CAR CTAIL)) - (SETQ END START) - (CONS START (WHILE [AND (CDR CTAIL) - (EQ END (SUB1 (CADR CTAIL] - COLLECT (SETQ CTAIL (CDR CTAIL)) - (SETQ END (CAR CTAIL] - - (* ;; "Split out groups of less than 3. But if a range exhaustively covers a known subset (like JIS), replace by the name") - - [SETQ RANGES (FOR R STR KNOWN LAST IN RANGES - JOIN (SETQ LAST (CAR (LAST R))) - (IF (EQ (CAR R) - LAST) - THEN (CONS (OCTALSTRING (CAR R))) - ELSEIF (SETQ KNOWN (SASSOC (SETQ STR (CONCAT (OCTALSTRING - (CAR R)) - "-" - (OCTALSTRING LAST))) - XCCS-SET-NAMES)) - THEN (CONS (CADR KNOWN)) - ELSEIF (CDDR R) - THEN (CONS STR) - ELSE (LIST (OCTALSTRING (CAR R)) - (OCTALSTRING LAST] - (CL:VALUES IMAPPING CSETINFO RANGES]) - -(WRITE-UNICODE-MAPPING-HEADER - [LAMBDA (STREAM CSETINFO RANGES) (* ; "Edited 5-Jan-2024 13:24 by rmk") - (* ; "Edited 4-Aug-2020 17:38 by rmk:") - - (* ;; "Writes the standard per-file header information") - - (FOR LINE IN UNICODE-MAPPING-HEADER - DO (PRINTOUT STREAM "#" 2) - (SELECTQ LINE - (XCCSCHARACTERSETS - (PRINTOUT STREAM " XCCS charset") - (IF (CDR CSETINFO) - THEN (PRINTOUT STREAM "s:" -4) - (FOR R IN RANGES DO (PRINTOUT STREAM R " ")) - ELSE (* ; "Singleton") - (PRINTOUT STREAM ": " -4 (CADAR CSETINFO) - " " - (CADDAR CSETINFO))) - (TERPRI STREAM)) - (DATE (PRINTOUT STREAM " Date:" -13 (DATE (DATEFORMAT NO.TIME NO.LEADING.SPACES) - ) - T)) - (PRINTOUT STREAM LINE T))) - (TERPRI STREAM]) - -(WRITE-UNICODE-MAPPING-FILENAME - [LAMBDA (FILE CSETINFO RANGES) (* ; "Edited 4-Aug-2020 19:34 by rmk:") - (PACKFILENAME 'BODY [OR FILE (CONCATLIST - (CONS 'XCCS- (IF (CDR CSETINFO) - THEN (FOR RTAIL R ON RANGES - JOIN (SETQ R (CAR RTAIL)) - (SETQ R - (CL:IF (LISTP R) - (LIST (CAR R) - "-" - (CDR R)) - (CONS R))) - (CL:IF (CDR RTAIL) - (NCONC1 R ",")) - R) - ELSE (LIST (CADAR CSETINFO) - "=" - (CADDAR CSETINFO] - 'DIRECTORY - (CAR UNICODEDIRECTORIES) - 'EXTENSION - 'TXT]) -) -(DEFINEQ - -(XCCS-UTF8-AFTER-OPEN - [LAMBDA (STREAM ACCESS PARAMETERS) (* ; "Edited 3-Jan-2024 10:27 by rmk") - (* ; "Edited 13-Aug-2020 11:54 by rmk:") - - (* ;; - "If added to STREAM-AFTER-OPEN-FNS, causes mapping files to be opened as UTF-8. For development") - - (CL:WHEN (AND (STRPOS "XCCS-" (U-CASE (FULLNAME STREAM))) - [EQ 'TXT (U-CASE (FILENAMEFIELD (FULLNAME STREAM) - 'EXTENSION] - (NOT (ASSOC 'EXTERNALFORMAT PARAMETERS))) - (STREAMPROP STREAM 'EXTERNALFORMAT :UTF-8))]) -) - - - -(* ;; "Automate dumping of a documentation prefix") - -(DECLARE%: EVAL@COMPILE DONTCOPY -(DECLARE%: EVAL@COMPILE - -(RPAQ MISSINGCODE (CL:PARSE-INTEGER "FFFE" :RADIX 16)) - -(RPAQ UNDEFINEDCODE (CL:PARSE-INTEGER "FFFF" :RADIX 16)) - - -(CONSTANTS (MISSINGCODE (CL:PARSE-INTEGER "FFFE" :RADIX 16)) - (UNDEFINEDCODE (CL:PARSE-INTEGER "FFFF" :RADIX 16))) -) -) - -(RPAQQ UNICODE-MAPPING-HEADER - ("" " Name: XCCS (Version 2.0) to Unicode" " Unicode version: 3.0" - XCCSCHARACTERSETS " Table version: 0.1" " Table format: Format A" - DATE " Author: Ron Kaplan " "" - "This file contains mappings from the Xerox Character Code Standard (version" - "2.0, 1990) into Unicode 3.0. standard codes. That is an extension of the" - "version of XCCS corresponding to the fonts in the Medley system." "" - "The format of this file conforms to the format of the other Unicode-supplied" - "mapping files:" " Three white-space (tab or spaces) separated columns:" - " Column 1 is the XCCS code (as hex 0xXXXX)" - " Column 2 is the corresponding Unicode (as hex 0xXXXX)" - " Column 3 (after #) is a comment column. For convenience, it contains the" - " Unicode character itself and the Unicode character names when available." - "Unicode FFFF is used for undefined XCCS codes (Column 3 = UNDEFINED" - "Unicode FFFE is used for XCCS codes that have not yet been filled in." - "(Column 3 = MISSING)" "" "This file is encoded in UTF-8, so that the Unicode characters" - "are properly displayed in Column 3 and can be edited by standard" - "Unicode-enabled editors (e.g. Mac Textedit)." "" - "This file can also be read by the function" - "READ-UNICODE-MAPPING in the UNICODE Medley library package." "" - "The entries are in XCCS order and grouped by character sets. In front of" - "the mappings, for convenience, there is a line with the octal XCCS" - "character set, after #." "" - "Note that a given XCCS code might map to codes in several different Unicode" - "positions, since there are repetitions in the Unicode standard." "" - "For more details, see the associated README.TXT file." "" - "Any comments or problems, contact ")) -(DEFINEQ - -(UTF8HEXSTRING - [LAMBDA (CHARCODE) (* ; "Edited 10-Aug-2020 08:33 by rmk:") - - (* ;; "Utility to produces the UTF8 hexstring representing CODE") - - (HEXSTRING (IF (ILESSP CHARCODE 128) - THEN CHARCODE - ELSEIF (ILESSP CHARCODE 2048) - THEN (* ; "x800") - (LOGOR (LLSH (LOGOR (LLSH 3 6) - (LRSH CHARCODE 6)) - 8) - (LOGOR (LLSH 2 6) - (LOADBYTE CHARCODE 0 6))) - ELSEIF (ILESSP CHARCODE 65536) - THEN (* ; "x10000") - (LOGOR (LLSH (LOGOR (LLSH 7 5) - (LRSH CHARCODE 12)) - 16) - (LLSH (LOGOR (LLSH 2 6) - (LOADBYTE CHARCODE 6 6)) - 8) - (LOGOR (LLSH 2 6) - (LOADBYTE CHARCODE 0 6))) - ELSEIF (ILESSP CHARCODE 2097152) - THEN (* ; "x200000") - (LOGOR (LLSH (LOGOR (LLSH 15 4) - (LRSH CHARCODE 18)) - 24) - (LLSH (LOGOR (LLSH 2 6) - (LOADBYTE CHARCODE 12 6)) - 16) - (LLSH (LOGOR (LLSH 2 6) - (LOADBYTE CHARCODE 6 6)) - 8) - (LOGOR (LLSH 2 6) - (LOADBYTE CHARCODE 0 6))) - ELSE (ERROR "CHARCODE too big for UTF8" CHARCODE]) -) - - - -(* ; "debugging") - -(DEFINEQ - -(SHOWCHARS - [LAMBDA (FONT FROMCHAR TOCHAR ONELINE) (* ; "Edited 5-Oct-2025 17:41 by rmk") - (* ; "Edited 7-Sep-2025 20:29 by rmk") - (* ; "Edited 2-Sep-2025 10:26 by rmk") - (* ; "Edited 24-Jul-2025 11:30 by rmk") - (* ; "Edited 8-Jun-2025 20:05 by rmk") - (* ; "Edited 26-Jan-2024 14:18 by mth") - (* ; "Edited 1-Aug-2020 09:27 by rmk:") - [SETQ FONT (FONTCREATE (OR FONT '(CLASSIC 12] - (RESETLST - [LET ((OLDFONT (DSPFONT NIL T)) - CHARS) - (CL:UNLESS (CHARCODEP FROMCHAR) - (SETQ FROMCHAR (OR (CHARCODE.DECODE FROMCHAR T) - FROMCHAR))) - (SETQ CHARS (if (LISTP FROMCHAR) - elseif (CHARCODEP FROMCHAR) - then (CL:UNLESS (CHARCODEP TOCHAR) - (SETQ TOCHAR (OR (CHARCODE.DECODE TOCHAR) - FROMCHAR))) - (for C from FROMCHAR to TOCHAR collect C) - else (CHCON FROMCHAR))) - [RESETSAVE OLDFONT '(PROGN (DSPFONT OLDVALUE] - (TERPRI) - (for C in CHARS do (PRINTOUT T .FONT OLDFONT (CONCAT (OCTALSTRING (\CHARSET C)) - "," - (OCTALSTRING (\CHAR8CODE C))) - 10 .FONT FONT (CHARACTER C)) - (CL:UNLESS ONELINE (PRINTOUT T T]) - (TERPRI]) -) -(DECLARE%: DOEVAL@LOAD DONTCOPY -(DECLARE%: EVAL@COMPILE - -(PUTPROPS HEXCHAR MACRO ((CODE) - (HEXSTRING CODE))) - -(PUTPROPS OCTALCHAR MACRO [(CODE) - (CONCAT (OCTALSTRING (\CHARSET CODE)) - "," - (OCTALSTRING (LOGAND CODE 255]) -) -) -(DECLARE%: EVAL@COMPILE DONTCOPY - -(FILESLOAD (LOADCOMP) - UNICODE-EXPORTS) -) - -(PUTPROPS UNICODE FILETYPE :TCOMPL) -(DECLARE%: DONTCOPY - (FILEMAP (NIL (3379 18917 (UTF8.OUTCHARFN 3389 . 6405) (UTF8.SLUG.OUTCHARFN 6407 . 7071) ( -UTF8.INCCODEFN 7073 . 12926) (UTF8.PEEKCCODEFN 12928 . 17935) (\UTF8.BACKCCODEFN 17937 . 18915)) ( -18918 23608 (UTF16BE.OUTCHARFN 18928 . 19947) (UTF16BE.INCCODEFN 19949 . 21074) (UTF16BE.PEEKCCODEFN -21076 . 22416) (\UTF16BE.BACKCCODEFN 22418 . 23606)) (23609 28332 (UTF16LE.OUTCHARFN 23619 . 24735) ( -UTF16LE.INCCODEFN 24737 . 25862) (UTF16LE.PEEKCCODEFN 25864 . 27140) (\UTF16LE.BACKCCODEFN 27142 . -28330)) (28333 31380 (READBOM 28343 . 30412) (WRITEBOM 30414 . 31378)) (31410 35163 ( -MAKE-UNICODE-FORMATS 31420 . 35161)) (35260 39754 (UTF8.BINCODE 35270 . 37958) (\UTF8.FETCHCODE 37960 - . 39752)) (39755 45382 (UTF8.VALIDATE 39765 . 42362) (NUTF8-BYTE1-BYTES 42364 . 43101) ( -NUTF8-CODE-BYTES 43103 . 44160) (NUTF8-STRING-BYTES 44162 . 45058) (N-MCHARS 45060 . 45380)) (47864 -57575 (MTOUCODE 47874 . 48261) (UTOMCODE 48263 . 48789) (MTOUCODE? 48791 . 49824) (UTOMCODE? 49826 . -50995) (MTOUSTRING 50997 . 51582) (UTOMSTRING 51584 . 52169) (MTOUTF8STRING 52171 . 56460) ( -UTF8TOMSTRING 56462 . 57573)) (57576 63278 (XTOUCODE 57586 . 58104) (UTOXCODE 58106 . 58614) ( -XTOUCODE? 58616 . 59677) (UTOXCODE? 59679 . 60762) (XTOUSTRING 60764 . 61457) (UTOXSTRING 61459 . -62200) (XTOUTF8STRING 62202 . 63276)) (63341 74609 (WRITE-UNICODE-MAPPING 63351 . 67101) ( -WRITE-UNICODE-INCLUDED 67103 . 71825) (WRITE-UNICODE-MAPPING-HEADER 71827 . 73075) ( -WRITE-UNICODE-MAPPING-FILENAME 73077 . 74607)) (74610 75286 (XCCS-UTF8-AFTER-OPEN 74620 . 75284)) ( -77811 80028 (UTF8HEXSTRING 77821 . 80026)) (80055 82097 (SHOWCHARS 80065 . 82095))))) -STOP diff --git a/library/UNICODE-TABLES b/library/UNICODE-TABLES index 71d05c08..cd429286 100644 --- a/library/UNICODE-TABLES +++ b/library/UNICODE-TABLES @@ -1,19 +1,22 @@ -(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10 FORMAT UTF-8) -(FILECREATED "22-Oct-2025 23:28:42" {WMEDLEY}UNICODE-TABLES.;4 34028 +(FILECREATED "22-Feb-2026 10:44:33" {WMEDLEY}UNICODE-TABLES.;20 44960 :EDIT-BY rmk - :CHANGES-TO (VARS UNICODE-TABLESCOMS) + :CHANGES-TO (FNS ALL-UNICODE-MAPPINGS GET-MCCS-UNICODE-MAPPING INVERT-UNICODE-MAPPING + MAKE-UNICODE-TRANSLATION-TABLES MERGE-UNICODE-TRANSLATION-TABLES + READ-UNICODE-MAPPING-FILENAMES) + (VARS UNICODE-TABLESCOMS) - :PREVIOUS-DATE "16-Oct-2025 16:47:54" {WMEDLEY}UNICODE-TABLES.;3) + :PREVIOUS-DATE "22-Feb-2026 09:15:20" {WMEDLEY}UNICODE-TABLES.;16) (PRETTYCOMPRINT UNICODE-TABLESCOMS) (RPAQQ UNICODE-TABLESCOMS [ - (* ;; "Read Unicode mapping tables. A separate file before UNICODE in the loadup, because the tables must be loaded while UTF8TOMCODE and MCODETOUTF8 are still equivalenced to EVQ. This file has to come before UNICODE in the loadup sequence.") + (* ;; "This is code for reading/writing the XCCS-to-UNICODE mapping tables. It runs offline, when UNICODE-UTF8 is modified. ") (COMS (* ; "Read Unicode mapping files") (INITVARS (UNICODEDIRECTORIES NIL)) @@ -22,22 +25,32 @@ (FNS READ-UNICODE-MAPPING-FILENAMES READ-UNICODE-MAPPING)) (COMS (* ;  "Make translation tables for UTF external formats") - (FNS MAKE-UNICODE-TRANSLATION-TABLES XCCSTOMCCS-MAPPING - MERGE-UNICODE-TRANSLATION-TABLES UNICODE.UNMAPPED UNICODE-EXTEND-TRANSLATION?) + (FNS MAKE-UNICODE-TRANSLATION-TABLES GET-MCCS-UNICODE-MAPPING INVERT-UNICODE-MAPPING + XCCSTOMCCS-MAPPING) (FNS ALL-UNICODE-MAPPINGS XCCSJAPANESECHARSETS) - (INITVARS (*MCCSTOUNICODE*) - (*UNICODETOMCCS*) - (*MCCS-LOADED-CHARSETS*) - (*UNICODE-LOADED-CHARSETS*) - (*LARGEUNICODES*)) - [DECLARE%: DONTEVAL@LOAD DOCOPY (P (MAKE-UNICODE-TRANSLATION-TABLES 'ALL] + (COMS (* ; "Write Unicode mapping files") + (FNS WRITE-UNICODE-MAPPING WRITE-UNICODE-INCLUDED WRITE-UNICODE-MAPPING-HEADER + WRITE-UNICODE-MAPPING-FILENAME) + (FNS XCCS-UTF8-AFTER-OPEN) + + (* ;; "Automate dumping of a documentation prefix") + + [DECLARE%: EVAL@COMPILE DONTCOPY (CONSTANTS (MISSINGCODE (CL:PARSE-INTEGER "FFFE" + :RADIX 16)) + (UNDEFINEDCODE (CL:PARSE-INTEGER "FFFF" + :RADIX 16] + (VARS UNICODE-MAPPING-HEADER)) + (FNS UTF8HEXSTRING) + (COMS (* ; "debugging") + (FNS SHOWCHARS) + (DECLARE%: DOEVAL@LOAD DONTCOPY (MACROS HEXCHAR OCTALCHAR))) (DECLARE%: EVAL@COMPILE DONTCOPY (FILES (LOADCOMP) UNICODE-EXPORTS]) (* ;; -"Read Unicode mapping tables. A separate file before UNICODE in the loadup, because the tables must be loaded while UTF8TOMCODE and MCODETOUTF8 are still equivalenced to EVQ. This file has to come before UNICODE in the loadup sequence." +"This is code for reading/writing the XCCS-to-UNICODE mapping tables. It runs offline, when UNICODE-UTF8 is modified. " ) @@ -94,7 +107,8 @@ (DEFINEQ (READ-UNICODE-MAPPING-FILENAMES - [LAMBDA (FILESPEC) (* ; "Edited 16-Oct-2025 16:43 by rmk") + [LAMBDA (FILESPEC) (* ; "Edited 21-Feb-2026 18:14 by rmk") + (* ; "Edited 16-Oct-2025 16:43 by rmk") (* ; "Edited 4-Sep-2025 00:11 by rmk") (* ; "Edited 27-Jan-2025 16:46 by rmk") (* ; "Edited 21-Jan-2025 22:51 by rmk") @@ -107,51 +121,47 @@ (* ;; "FILESPEC can be a file name, character-set name, the name of a collection of character sets, an XCCS character code, or a list of those. Maps those into the names of files that contain the indicated Unicode mappings.") - (CL:REMOVE-DUPLICATES [for F X CSI inside (if (EQ FILESPEC 'ALL) - then - (* ;; + (for F X CSI inside (if (EQ FILESPEC 'ALL) + then + (* ;;  "Perhaps should figure out which files in the directories and subdirectories are relevant?") - (for N in XCCS-CHARSETS - collect (CAR N)) - else FILESPEC) - join - (* ;; "Last case hopes to pick up all the tables that are grouped together in a subdirectory (e.g. if F is JIS)") + (for N in XCCS-CHARSETS collect (CAR N)) + else FILESPEC) + join + (* ;; "Last case hopes to pick up all the tables that are grouped together in a subdirectory (e.g. if F is JIS)") - (OR (CL:WHEN (CHARCODEP F) (* ; + [OR (CL:WHEN (CHARCODEP F) (* ;  "An XCCS code can retrieve its character set") - (for D FN (FOCTAL _ (OCTALSTRING (LRSH F 8))) inside - UNICODEDIRECTORIES - when (SETQ FN (FILDIR (PACKFILENAME 'DIRECTORY D - 'BODY - (CONCAT 'XCCS- FOCTAL - '=*) - 'EXTENSION - 'TXT - 'VERSION ""))) - do (RETURN FN))) - (MKLIST (FINDFILE (PACKFILENAME 'BODY F 'EXTENSION 'TXT - 'VERSION "") - T UNICODEDIRECTORIES)) - (for D inside UNICODEDIRECTORIES - when [SETQ $$VAL (OR (FILDIR (PACKFILENAME 'NAME - (CONCAT "XCCS-*=" F) - 'EXTENSION - 'TXT - 'VERSION "" 'BODY D)) - (FILDIR (PACKFILENAME 'NAME - (CONCAT "XCCS-" F "=*") - 'EXTENSION - 'TXT - 'VERSION "" 'BODY D] - do (RETURN $$VAL)) - (AND (SETQ CSI (ASSOC F XCCS-CHARSETS)) - (READ-UNICODE-MAPPING-FILENAMES (CDR CSI))) - (for D inside UNICODEDIRECTORIES - when (DIRECTORYNAMEP (SETQ D (CONCAT D ">" F ">"))) - join (FILDIR (CONCAT D ">*.TXT;"] - :TEST - (FUNCTION STRING.EQUAL]) + (for D FN (FOCTAL ← (OCTALSTRING (LRSH F 8))) inside UNICODEDIRECTORIES + when (SETQ FN (DIRECTORY (PACKFILENAME 'DIRECTORY D 'BODY (CONCAT 'XCCS- + FOCTAL + '=*) + 'EXTENSION + 'TXT + 'VERSION ""))) do (RETURN FN))) + (MKLIST (FINDFILE (PACKFILENAME 'BODY F 'EXTENSION 'TXT 'VERSION "") + T UNICODEDIRECTORIES)) + (for D inside UNICODEDIRECTORIES + when [SETQ $$VAL (OR (DIRECTORY (PACKFILENAME 'NAME (CONCAT "XCCS-*=" F) + 'EXTENSION + 'TXT + 'VERSION "" 'BODY D)) + (DIRECTORY (PACKFILENAME 'NAME (CONCAT "XCCS-" F "=*") + 'EXTENSION + 'TXT + 'VERSION "" 'BODY D] + do (RETURN $$VAL)) + (AND (SETQ CSI (ASSOC F XCCS-CHARSETS)) + (READ-UNICODE-MAPPING-FILENAMES (CDR CSI))) + (for D inside UNICODEDIRECTORIES when (DIRECTORYNAMEP (SETQ D + (CONCAT D ">" F ">"))) + join (DIRECTORY (CONCAT D ">*.TXT;"] + finally (* ; + "CL:REMOVE-DUPLICATES doesn't exist in MAKEINIT") + (RETURN (for FTAIL on $$VAL unless (thereis FF in (CDR FTAIL) + suchthat (STRING-EQUAL (CAR FTAIL) + FF)) collect (CAR FTAIL]) (READ-UNICODE-MAPPING [LAMBDA (FILESPEC PRINT NOERROR) (* ; "Edited 16-Oct-2025 11:25 by rmk") @@ -179,7 +189,7 @@ (* ;; "") (RESETLST - (for FILE STREAM [SEPBITTABLE _ (MAKEBITTABLE (CHARCODE (TAB SPACE] in ( + (for FILE STREAM [SEPBITTABLE ← (MAKEBITTABLE (CHARCODE (TAB SPACE] in (  READ-UNICODE-MAPPING-FILENAMES FILESPEC) join @@ -221,7 +231,8 @@ (DEFINEQ (MAKE-UNICODE-TRANSLATION-TABLES - [LAMBDA (MAPPING REINSTALL) (* ; "Edited 11-Oct-2025 11:54 by rmk") + [LAMBDA (MAPPING REINSTALL) (* ; "Edited 21-Feb-2026 22:42 by rmk") + (* ; "Edited 11-Oct-2025 11:54 by rmk") (* ; "Edited 4-Sep-2025 00:30 by rmk") (* ; "Edited 24-Apr-2025 15:47 by rmk") (* ; "Edited 31-Jan-2025 17:46 by rmk") @@ -232,26 +243,13 @@ (* ; "Edited 3-Feb-2024 00:24 by rmk") (* ; "Edited 30-Jan-2024 09:54 by rmk") (* ; "Edited 21-Aug-2021 13:12 by rmk:") + (SETQ MAPPING (GET-MCCS-UNICODE-MAPPING MAPPING)) - (* ;; "MAPPING is the list of numeric code correspondence pairs constructed by applying READ-UNICODE-MAPPING to XCCS-to-Unicode mapping files. This applies the XCCS-to-MCCS translations, and then updates or produces two recoding arrays, one maps left-side codes into right-side codes (e.g. MCCS or ISO8859-1 to Unicode), for printing, the other maps right-side (Unicode) codes to corresponding right-side codes (e.g. MCCS).") - (* ; "Edited 17-Aug-2020 08:46 by rmk:") - (CL:UNLESS [AND (LISTP MAPPING) - (FOR PAIR R IN MAPPING AS I TO 10 - ALWAYS (AND (LISTP PAIR) - (CHARCODEP (CAR PAIR)) - [FIXP (SETQ R (CAR (MKLIST (CADR PAIR] - (CHARCODEP (IABS R] - - (* ;; "Seems like the argument is not already a list of mapping pairs (perhaps with a combiner), presumably a list of charsets to be read.") - - (SETQ MAPPING (READ-UNICODE-MAPPING MAPPING))) - (SETQ MAPPING (XCCSTOMCCS-MAPPING MAPPING)) - - (* ;; "This updates or produces two recoding arrays, one maps left-side codes into right-side codes (e.g. XCCS or ISO8859-1 to Unicode), for printing, the other maps right-side (Unicode) codes to corresponding right-side codes (e.g. XCCS).") + (* ;; "This updates or produces two recoding arrays, one maps left-side codes into right-side codes (e.g. MCCS to Unicode), for printing, the other maps right-side (Unicode) codes to corresponding right-side codes (e.g. MCCS).") (* ;; "") - (* ;; "If REINSTALL is T, the new mapping vectors replace the current maps in the *XCCSTOUNICODE* and *UNICODETOXCCS* global variables. Otherwise we create new tables (mostly for comparison and debugging).") + (* ;; "If REINSTALL is T, the new mapping vectors replace the current maps in the *MCCSTOUNICODE* and *UNICODETOMCCS* global variables. Otherwise we create new tables (mostly for comparison and debugging).") (* ;; "") @@ -270,6 +268,55 @@ (SETQ *NEXT-PRIVATE-UNICODE* FIRST-PRIVATE-UNICODE)) (MERGE-UNICODE-TRANSLATION-TABLES NIL MAPPING]) +(GET-MCCS-UNICODE-MAPPING + [LAMBDA (MAPPING) (* ; "Edited 22-Feb-2026 00:29 by rmk") + + (* ;; "MAPPING is the list of numeric code correspondence pairs mapping MCCS-to-Unicode, or a specification of XCCS-to-Unicode files to be read and converted to MCCS-to-UNICODE.") + + (SORT (if [AND (LISTP MAPPING) + (for PAIR R in MAPPING as I to 10 + always (AND (LISTP PAIR) + (CHARCODEP (CAR PAIR)) + [FIXP (SETQ R (CAR (MKLIST (CADR PAIR] + (CHARCODEP (IABS R] + then + (* ;; "The argument is already a list of MCCS-to-UNICODE mapping pairs") + + MAPPING + else + (* ;; "Mapping files are is read as XCCS-UNICODE, make it MCCS") + + (XCCSTOMCCS-MAPPING (READ-UNICODE-MAPPING MAPPING))) + T]) + +(INVERT-UNICODE-MAPPING + [LAMBDA (MAPPING) (* ; "Edited 22-Feb-2026 00:39 by rmk") + + (* ;; "MAPPING is a list of pairs that map domain codes to range codes (presumably MCCS to UNICODE). This produces an inverted list of pairs that map the range into the domain (Unicode to MCCS) ") + + (LET (INVERTED) + (SETQ INVERTED (SORT (for P D R OLDR in MAPPING eachtime (SETQ D (CAR P)) + (SETQ R (CADR P)) + + (* ;; + "We don't do combiners, but we are allowing non-SMALLP's") + unless (OR (LISTP D) + (LISTP R)) collect (LIST R D)) + T)) + + (* ;; "If MAPPING contains two pairs that map to the same U (e.g. (M1 U) and (M2 U)), we want the inverse table to collect them into a single pair (U M1 M2) instead of two pairs (U M1) (U M2), with the lowest M code first. Those pairs represent alternative inverse mappings. There are no duplicates/alternative table entries in the M-to-U direction.") + + (* ;; "The SORT above means that multiple inverted pairs for the same U will be next to each other in the list.") + + [for PTAIL PTAIL2 U MS on INVERTED eachtime (SETQ U (CAAR PTAIL)) + when (SETQ MS (for old PTAIL2 P2 on PTAIL eachtime (SETQ P2 (CADR PTAIL2)) + while (EQ U (CAR P2)) collect (CADR P2))) + do (RPLACD PTAIL (CDR PTAIL2)) + (RPLACD (CAR PTAIL) + (SORT (CONS (CADR (CAR PTAIL)) + MS] + INVERTED]) + (XCCSTOMCCS-MAPPING [LAMBDA (XTOUMAPPING) (* ; "Edited 11-Oct-2025 12:57 by rmk") @@ -292,152 +339,12 @@ XTOMCODES))) finally (push XTOUMAPPING (CHARCODE (DEL DEL))) (RETURN XTOUMAPPING]) - -(MERGE-UNICODE-TRANSLATION-TABLES - [LAMBDA (INVERSE MAPPING TABLE INVERSETABLE) (* ; "Edited 11-Oct-2025 10:24 by rmk") - (* ; "Edited 24-Apr-2025 15:28 by rmk") - (* ; "Edited 1-Feb-2025 21:42 by rmk") - (* ; "Edited 26-Jan-2025 12:58 by rmk") - (* ; "Edited 22-Jan-2025 08:20 by rmk") - (* ; "Edited 19-Jan-2025 15:58 by rmk") - (* ; "Edited 18-Jan-2025 11:49 by rmk") - (* ; "Edited 27-Mar-2024 12:10 by rmk") - (* ; "Edited 3-Feb-2024 12:46 by rmk") - (* ; "Edited 31-Jan-2024 10:06 by rmk") - - (* ;; "MAPPINGS is a list of pairs that map domain codes to range codes. TABLE and INVERSETABLE default to *MCCSTOUNICODE* *UNICODETOMCCS* respectively. ") - - (CL:UNLESS TABLE - [SETQ TABLE (OR *MCCSTOUNICODE* (SETQ *MCCSTOUNICODE* (HASHARRAY (LENGTH MAPPING]) - (CL:UNLESS INVERSETABLE - [SETQ INVERSETABLE (OR *UNICODETOMCCS* (SETQ *UNICODETOMCCS* (HASHARRAY (LENGTH MAPPING]) - (for M D R OLDR in MAPPING first (CL:IF INVERSE (swap TABLE INVERSETABLE)) - eachtime (SETQ D (CAR M)) - (SETQ R (CADR M)) - - (* ;; "We don't do combiners, but we are allowing non-SMALLP's") - unless (OR (LISTP D) - (LISTP R)) do - (* ;; "The (CONS R OLDR) deals with alternatives: (U X1) (U X2) => (U (X1 X2)), lowest code first. Those are only possible in the U-to-X direction when the tables contain (X1 U) and (X2 U). There are no duplicates/alternative table entries in the X-to-U direction.") - - (SETQ OLDR (GETHASH D TABLE)) - (CL:UNLESS (MEMB R OLDR) - (PUTHASH D (SORT (CONS R OLDR)) - TABLE)) - (swap D R) - (SETQ OLDR (GETHASH D INVERSETABLE)) - (CL:UNLESS (MEMB R OLDR) - (PUTHASH D (SORT (CONS R OLDR)) - INVERSETABLE))) - (LIST TABLE INVERSETABLE]) - -(UNICODE.UNMAPPED - [LAMBDA (CODE TABLE DONTFAKE) (* ; "Edited 24-Apr-2025 15:48 by rmk") - (* ; "Edited 22-Jan-2025 08:19 by rmk") - (* ; "Edited 19-Jan-2025 22:02 by rmk") - (* ; "Edited 18-Jan-2025 12:02 by rmk") - (* ; "Edited 2-Feb-2024 23:52 by rmk") - (* ; "Edited 31-Jan-2024 10:07 by rmk") - (* ; "Edited 11-Aug-2020 20:23 by rmk:") - - (* ;; "This is the slow fall-out when UNICODE.TRANSLATE determines that CODE has no fast mapping in TRANSLATION-TABLE.") - - (* ;; "") - - (* ;; "If we have not already installed the mapping segment for that code, we try to retrieve it from the numberic file. If that segment mapping doesn't exist or doesn't have an entry for CODE, we fake up a mapping with a negative range in both directions. One way or the other, there will be an entry for that segment in both mapping vectors.") - - (* ;; "") - - (PROG ((INVERSE (EQ TABLE *UNICODETOMCCS*)) - RANGE HASH) - - (* ;; "If we already looked up CODE's character set in a file, then we have already filled in its information in the translation table. If it didn't have a code for a particular character, then we fake it here. Faked codes are negative, so we can detect them easily, and interpret them with IABS.") - - (CL:WHEN (AND (UNICODE-EXTEND-TRANSLATION? CODE TABLE) - (SETQ RANGE (GETHASH CODE TABLE))) - - (* ;; "We might have gotten the segment that didn't have an entry for CODE.") - - (RETURN RANGE)) - - (* ;; "") - - (CL:UNLESS DONTFAKE - - (* ;; "Our attempt at extending the known tables did not provide a mapping for CODE. So we fake it up with the next unused private code in the code space. ") - - (* ;; "The number of possible faked mappings is determined by the number of private-use Unicodes, since the MCCS character space is pretty sparse. The codes don't have to come from the same part of the code space, and the NEXTCODEs are saved in global variables. The last available codes are constants.") - - (CL:WHEN (IEQP *NEXT-PRIVATE-MCCSCODE* LAST-PRIVATE-MCCSCODE) - (* ; - "Same number of available codes both ways") - (ERROR "EXHAUSTED RANGE FOR UNMAPPED CODES")) - (if INVERSE - then (SETQ RANGE *NEXT-PRIVATE-MCCSCODE*) - (add *NEXT-PRIVATE-MCCSCODE* 1) - else (SETQ RANGE *NEXT-PRIVATE-UNICODE*) - (add *NEXT-PRIVATE-UNICODE* 1)) - (MERGE-UNICODE-TRANSLATION-TABLES INVERSE (CONS (LIST CODE RANGE))) - - (* ;; "CONS because of LIST convention so we can eventually distinguish combiners.") - - (RETURN (CONS RANGE)))]) - -(UNICODE-EXTEND-TRANSLATION? - [LAMBDA (CODE TABLE) (* ; "Edited 11-Oct-2025 09:49 by rmk") - (* ; "Edited 4-Sep-2025 00:34 by rmk") - (* ; "Edited 29-Jun-2025 16:44 by rmk") - (* ; "Edited 24-Apr-2025 15:49 by rmk") - (* ; "Edited 26-Jan-2025 11:26 by rmk") - (* ; "Edited 21-Jan-2025 22:31 by rmk") - (* ; "Edited 18-Jan-2025 12:40 by rmk") - (* ; "Edited 13-Jan-2025 23:50 by rmk") - (* ; "Edited 26-Aug-2024 16:49 by rmk") - (* ; "Edited 27-Mar-2024 23:02 by rmk") - (* ; "Edited 5-Feb-2024 13:48 by rmk") - (* ; "Edited 3-Feb-2024 12:40 by rmk") - - (* ;; "There is currently no mapping for CODE in TABLE, hopefully just because the relevant character-set mapping has not been installed. We infer from TABLE whether CODE is an MCCS or UNICODE code and look for the proper mapping table (forward or inverted) for its character set. ") - - (* ;; "We record which character sets we have already expanded so we don't do them again.") - - (LET ((CHARSET (\CHARSET CODE)) - (INVERSE (EQ TABLE *UNICODETOMCCS*)) - MAPPING FILE) - - (* ;; "If we already looked for CHARSET in the file and found anything, it has already been merged. Otherwise, it would just fail again") - - (CL:UNLESS (MEMB CHARSET (CL:IF INVERSE - *UNICODE-LOADED-CHARSETS* - *MCCS-LOADED-CHARSETS*)) - - (* ;; "Don't try this charset again.") - - (CL:IF INVERSE - (push *UNICODE-LOADED-CHARSETS* CHARSET) - (push *MCCS-LOADED-CHARSETS* CHARSET)) - (SETQ FILE (FINDFILE (CL:IF INVERSE - 'UNICODE-TO-MCCS-MAPPINGS - 'MCCS-TO-UNICODE-MAPPINGS) - T UNICODEDIRECTORIES)) - - (* ;; "The mappings files are indexed by CHARSET.") - - (CL:WHEN [AND FILE (SETQ MAPPING (CL:WITH-OPEN-FILE (STREAM FILE :INPUT) - (CL:WHEN (FILEPOS (CONCAT "[" CHARSET " ") - STREAM NIL NIL NIL T) - (READ STREAM] - - (* ;; - "Merge MAPPING into both tables, respecting the direction indicated by TABLE. ") - - (MERGE-UNICODE-TRANSLATION-TABLES INVERSE MAPPING) - T))]) ) (DEFINEQ (ALL-UNICODE-MAPPINGS - [LAMBDA (INVERTED FILE) (* ; "Edited 24-Apr-2025 15:51 by rmk") + [LAMBDA (INVERTED FILE) (* ; "Edited 22-Feb-2026 10:42 by rmk") + (* ; "Edited 24-Apr-2025 15:51 by rmk") (* ; "Edited 31-Jan-2025 17:46 by rmk") (* ; "Edited 26-Jan-2025 13:40 by rmk") (* ; "Edited 22-Jan-2025 14:07 by rmk") @@ -453,38 +360,32 @@ (* ;; "The first index level segments all the domain codes according to their character sets. The segments are sorted by character set, the pairs within each segment are sorted by their domain codes. ") (* ;; - "E.g. if INVERTED=NIL and given a XCCS code, the lookup for the corresponding Unicode(s) is") + "E.g. if INVERTED=NIL and given a MCCS code, the lookup for the corresponding Unicode(s) is") - (* ;; " (CADR (ASSOC MCCSCODE (\CHARSET MCCSCODE) INDEX)))).") + (* ;; " (CAR (GETMULTI INDEX (\CHARSET MCCSCODE) MCCSCODE).") (* ;; "If FILE is not NIL, the result is written to a file. If FILE is T, the file is either MCCS-TO-UNICODE-MAPPINGS.TXT or UNICODE-TO-MCCS-MAPPINGS.TXT, depending on INVERTED.") - (LET (INDEX) - (for PAIR DOMAIN RANGE CHARSET in (READ-UNICODE-MAPPING 'ALL) eachtime (SETQ DOMAIN - (CAR PAIR)) - (SETQ RANGE (CADR PAIR)) - - (* ;; - "(LISTP RANGE) is a combiner, ignored for now.") - unless (LISTP RANGE) do (CL:WHEN INVERTED (SWAP DOMAIN RANGE)) + (LET [INDEX (MAPPING (GET-MCCS-UNICODE-MAPPING 'ALL] + (for PAIR in (CL:IF INVERTED + (INVERT-UNICODE-MAPPING MAPPING) + MAPPING) unless (LISTP (CADR PAIR)) do + (* ;; + "(LISTP (CADR PAIR) is a combiner, ignored for now.") - (* ;; + (* ;;  "One segment for each high-byte character set. This aligns with UNICODE-EXTEND.TRANSLATION?") - [SETQ CHARSET (OR (ASSOC (\CHARSET DOMAIN) - INDEX) - (CAR (push INDEX (CONS (\CHARSET DOMAIN] + (* ;; "For alternative mappings (in the U-to-M direction) we end up with (D R1 R2 ...). (CAR (GETMULTI)) is the first (and almost always) the only one.") - (* ;; "For alternative mappings (in the U-to-M direction) we end up with (D R1 R2 ...). (CADR is the first (and almost always) the only one.") - - (pushnew [CDR (OR (ASSOC DOMAIN (CDR CHARSET)) - (CAR (push (CDR CHARSET) - (CONS DOMAIN] - RANGE)) + (PUSHMULTI-NEW INDEX + (\CHARSET (CAR PAIR)) + (CAR PAIR) + (CADR PAIR))) (* ;; "Push the charset mappings down an extra CONS, so that a subsequent READ will get them all after a FILEPOS search for super-paren [") - [for CS in INDEX do (for M in (CDR CS) when (CDDR M) do + (for CS in INDEX do (for M in (CDR CS) when (CDDR M) do (* ;;  "Sort the range alternatives, if any") @@ -494,7 +395,7 @@ (* ;; "Sort by domain codes and push down a level") (change (CDR CS) - (CONS (SORT DATUM T] + (SORT DATUM T))) (SETQ INDEX (SORT INDEX T)) (* ; "Sort character sets") (if FILE then (SETQ FILE (PACKFILENAME 'BODY (if (NEQ FILE T) @@ -544,18 +445,347 @@ (FULLNAME STREAM))))]) ) -(RPAQ? *MCCSTOUNICODE* ) -(RPAQ? *UNICODETOMCCS* ) -(RPAQ? *MCCS-LOADED-CHARSETS* ) +(* ; "Write Unicode mapping files") -(RPAQ? *UNICODE-LOADED-CHARSETS* ) +(DEFINEQ -(RPAQ? *LARGEUNICODES* ) -(DECLARE%: DONTEVAL@LOAD DOCOPY +(WRITE-UNICODE-MAPPING + [LAMBDA (MAPPING INCLUDECHARSETS FILE EMPTYOK) (* ; "Edited 4-Jan-2024 22:44 by rmk") + (* ; "Edited 16-Aug-2020 16:56 by rmk:") -(MAKE-UNICODE-TRANSLATION-TABLES 'ALL) + (* ;; "Writes a symbol unicode mapping file. Mapping is a list of (XCCS-code Unicode) pairs, which may contain codes in multiple character sets.") + + (* ;; "If FILE is NIL, it defaults to a name XCCS- followed by the octal character sets in the mapping, in the unicode/XEROX directory.") + + (* ;; "The output lines are of the form x0XXXx0UUUU# Unicode-char") + + (* ;; + "If INCLUDECHARSETS=T then the mappings are split up into separate per-character set files.") + + (* ;; "Otherwise, all and only mappings included in thos charsets are included in a single output file--an implicit subset.") + + (IF (AND (EQ INCLUDECHARSETS T) + (NULL FILE)) + THEN (IF MAPPING + THEN (FOR CSI F IN XCCS-SET-NAMES WHEN (SETQ F (WRITE-UNICODE-MAPPING MAPPING + (CAR CSI) + NIL T)) COLLECT F) + ELSE (PRINTOUT T "THERE ARE NO MAPPINGS" T) + NIL) + ELSE + (LET + (IMAPPING CSETINFO RANGES) + (CL:MULTIPLE-VALUE-SETQ (IMAPPING CSETINFO RANGES) + (WRITE-UNICODE-INCLUDED MAPPING INCLUDECHARSETS)) + (IF IMAPPING + THEN (CL:WITH-OPEN-FILE + (STREAM (WRITE-UNICODE-MAPPING-FILENAME FILE CSETINFO RANGES) + :DIRECTION :OUTPUT :IF-EXISTS :NEW-VERSION :EXTERNAL-FORMAT :UTF-8-RAW) + (WRITE-UNICODE-MAPPING-HEADER STREAM CSETINFO RANGES) + (SORT IMAPPING T) + (FOR M CSET LEFTC FIRSTRIGHTC CSI IN IMAPPING + DO (SETQ LEFTC (CAR M)) + (SETQ FIRSTRIGHTC (CADR M)) + (CL:UNLESS (EQ CSET (LRSH LEFTC 8)) + (SETQ CSET (LRSH LEFTC 8)) + (SETQ CSI (ASSOC CSET CSETINFO)) + (PRINTOUT STREAM T "# " .P2 (CADR CSI) + " " + (CADDR CSI) + T)) + (PRINTOUT STREAM "0x" (HEXSTRING LEFTC 4) + %# + (FOR RIGHTC IN (CDR M) DO (PRINTOUT NIL " " "0x" (HEXSTRING RIGHTC 4))) + " # " + (SELECTC FIRSTRIGHTC + (UNDEFINEDCODE + (* ;; "FFFF") + + "UNDEFINED") + (MISSINGCODE + (* ;; "FFFE") + + "MISSING") + (IF (ILESSP FIRSTRIGHTC 32) + THEN (* ; "Control chars") + [CONCAT "↑" (CHARACTER (IPLUS FIRSTRIGHTC (CHARCODE @] + ELSE (CHARACTER FIRSTRIGHTC))) + T)) + (FULLNAME STREAM)) + ELSEIF (NOT EMPTYOK) + THEN (PRINTOUT T "THERE ARE NO MAPPINGS") + (CL:WHEN INCLUDECHARSETS + (PRINTOUT T " FOR " .PPVTL (MKLIST INCLUDECHARSETS) + T)) + NIL]) + +(WRITE-UNICODE-INCLUDED + [LAMBDA (MAPPING INCLUDECHARSETS) (* ; "Edited 4-Aug-2020 17:47 by rmk:") + + (* ;; "CSETINFO is a list of (num string name) for each included character set.") + + (LET (CHARSETS CSETINFO RANGES ICSETS IMAPPING) + + (* ;; "Normalize the INCLUDECHARSETS, then reduce MAPPING to the included mappings") + + [SETQ ICSETS (FOR C POS KNOWN INSIDE (OR INCLUDECHARSETS (FOR CSI IN XCCS-SET-NAMES + COLLECT (CAR CSI))) + JOIN [SETQ KNOWN (OR (SASSOC C XCCS-SET-NAMES) + (FIND N IN XCCS-SET-NAMES + SUCHTHAT (EQ C (CADR N))) + (HELP "UNKNOWN CHARACTER SET" (OCTALSTRING C] + (IF (SETQ POS (STRPOS "-" (CAR KNOWN))) + THEN (FOR I FROM (CL:PARSE-INTEGER (SUBSTRING (CAR KNOWN) + 1 + (SUB1 POS)) + :RADIX 8) + TO (CL:PARSE-INTEGER (SUBSTRING (CAR KNOWN) + (ADD1 POS)) + :RADIX 8) COLLECT (LIST I (OCTALSTRING I) + (CADR KNOWN))) + ELSE (CONS (CONS (CL:PARSE-INTEGER (CAR KNOWN) + :RADIX 8) + KNOWN] + (SETQ IMAPPING (FOR M CSI IN MAPPING WHEN (SETQ CSI (ASSOC (LRSH (CAR M) + 8) + ICSETS)) + COLLECT + + (* ;; "The attested subset of INCLUDED") + + (CL:UNLESS (MEMB CSI CSETINFO) + (PUSH CSETINFO CSI)) + M)) + + (* ;; "Sort as numbers, not octal strings, then group into consecutive ranges") + + (SETQ CSETINFO (SORT CSETINFO T)) + [SETQ RANGES (FOR CTAIL C START END ON (FOR CSI IN CSETINFO COLLECT (CAR CSI)) WHILE CTAIL + COLLECT (SETQ START (CAR CTAIL)) + (SETQ END START) + (CONS START (WHILE [AND (CDR CTAIL) + (EQ END (SUB1 (CADR CTAIL] + COLLECT (SETQ CTAIL (CDR CTAIL)) + (SETQ END (CAR CTAIL] + + (* ;; "Split out groups of less than 3. But if a range exhaustively covers a known subset (like JIS), replace by the name") + + [SETQ RANGES (FOR R STR KNOWN LAST IN RANGES + JOIN (SETQ LAST (CAR (LAST R))) + (IF (EQ (CAR R) + LAST) + THEN (CONS (OCTALSTRING (CAR R))) + ELSEIF (SETQ KNOWN (SASSOC (SETQ STR (CONCAT (OCTALSTRING + (CAR R)) + "-" + (OCTALSTRING LAST))) + XCCS-SET-NAMES)) + THEN (CONS (CADR KNOWN)) + ELSEIF (CDDR R) + THEN (CONS STR) + ELSE (LIST (OCTALSTRING (CAR R)) + (OCTALSTRING LAST] + (CL:VALUES IMAPPING CSETINFO RANGES]) + +(WRITE-UNICODE-MAPPING-HEADER + [LAMBDA (STREAM CSETINFO RANGES) (* ; "Edited 5-Jan-2024 13:24 by rmk") + (* ; "Edited 4-Aug-2020 17:38 by rmk:") + + (* ;; "Writes the standard per-file header information") + + (FOR LINE IN UNICODE-MAPPING-HEADER + DO (PRINTOUT STREAM "#" 2) + (SELECTQ LINE + (XCCSCHARACTERSETS + (PRINTOUT STREAM " XCCS charset") + (IF (CDR CSETINFO) + THEN (PRINTOUT STREAM "s:" -4) + (FOR R IN RANGES DO (PRINTOUT STREAM R " ")) + ELSE (* ; "Singleton") + (PRINTOUT STREAM ": " -4 (CADAR CSETINFO) + " " + (CADDAR CSETINFO))) + (TERPRI STREAM)) + (DATE (PRINTOUT STREAM " Date:" -13 (DATE (DATEFORMAT NO.TIME NO.LEADING.SPACES) + ) + T)) + (PRINTOUT STREAM LINE T))) + (TERPRI STREAM]) + +(WRITE-UNICODE-MAPPING-FILENAME + [LAMBDA (FILE CSETINFO RANGES) (* ; "Edited 4-Aug-2020 19:34 by rmk:") + (PACKFILENAME 'BODY [OR FILE (CONCATLIST + (CONS 'XCCS- (IF (CDR CSETINFO) + THEN (FOR RTAIL R ON RANGES + JOIN (SETQ R (CAR RTAIL)) + (SETQ R (CL:IF (LISTP R) + (LIST (CAR R) + "-" + (CDR R)) + (CONS R))) + (CL:IF (CDR RTAIL) + (NCONC1 R ",")) + R) + ELSE (LIST (CADAR CSETINFO) + "=" + (CADDAR CSETINFO] + 'DIRECTORY + (CAR UNICODEDIRECTORIES) + 'EXTENSION + 'TXT]) +) +(DEFINEQ + +(XCCS-UTF8-AFTER-OPEN + [LAMBDA (STREAM ACCESS PARAMETERS) (* ; "Edited 3-Jan-2024 10:27 by rmk") + (* ; "Edited 13-Aug-2020 11:54 by rmk:") + + (* ;; + "If added to STREAM-AFTER-OPEN-FNS, causes mapping files to be opened as UTF-8. For development") + + (CL:WHEN (AND (STRPOS "XCCS-" (U-CASE (FULLNAME STREAM))) + [EQ 'TXT (U-CASE (FILENAMEFIELD (FULLNAME STREAM) + 'EXTENSION] + (NOT (ASSOC 'EXTERNALFORMAT PARAMETERS))) + (STREAMPROP STREAM 'EXTERNALFORMAT :UTF-8))]) +) + + + +(* ;; "Automate dumping of a documentation prefix") + +(DECLARE%: EVAL@COMPILE DONTCOPY +(DECLARE%: EVAL@COMPILE + +(RPAQ MISSINGCODE (CL:PARSE-INTEGER "FFFE" :RADIX 16)) + +(RPAQ UNDEFINEDCODE (CL:PARSE-INTEGER "FFFF" :RADIX 16)) + + +(CONSTANTS (MISSINGCODE (CL:PARSE-INTEGER "FFFE" :RADIX 16)) + (UNDEFINEDCODE (CL:PARSE-INTEGER "FFFF" :RADIX 16))) +) +) + +(RPAQQ UNICODE-MAPPING-HEADER + ("" " Name: XCCS (Version 2.0) to Unicode" " Unicode version: 3.0" + XCCSCHARACTERSETS " Table version: 0.1" " Table format: Format A" + DATE " Author: Ron Kaplan " "" + "This file contains mappings from the Xerox Character Code Standard (version" + "2.0, 1990) into Unicode 3.0. standard codes. That is an extension of the" + "version of XCCS corresponding to the fonts in the Medley system." "" + "The format of this file conforms to the format of the other Unicode-supplied" + "mapping files:" " Three white-space (tab or spaces) separated columns:" + " Column 1 is the XCCS code (as hex 0xXXXX)" + " Column 2 is the corresponding Unicode (as hex 0xXXXX)" + " Column 3 (after #) is a comment column. For convenience, it contains the" + " Unicode character itself and the Unicode character names when available." + "Unicode FFFF is used for undefined XCCS codes (Column 3 = UNDEFINED" + "Unicode FFFE is used for XCCS codes that have not yet been filled in." + "(Column 3 = MISSING)" "" "This file is encoded in UTF-8, so that the Unicode characters" + "are properly displayed in Column 3 and can be edited by standard" + "Unicode-enabled editors (e.g. Mac Textedit)." "" + "This file can also be read by the function" + "READ-UNICODE-MAPPING in the UNICODE Medley library package." "" + "The entries are in XCCS order and grouped by character sets. In front of" + "the mappings, for convenience, there is a line with the octal XCCS" + "character set, after #." "" + "Note that a given XCCS code might map to codes in several different Unicode" + "positions, since there are repetitions in the Unicode standard." "" + "For more details, see the associated README.TXT file." "" + "Any comments or problems, contact ")) +(DEFINEQ + +(UTF8HEXSTRING + [LAMBDA (CHARCODE) (* ; "Edited 10-Aug-2020 08:33 by rmk:") + + (* ;; "Utility to produces the UTF8 hexstring representing CODE") + + (HEXSTRING (IF (ILESSP CHARCODE 128) + THEN CHARCODE + ELSEIF (ILESSP CHARCODE 2048) + THEN (* ; "x800") + (LOGOR (LLSH (LOGOR (LLSH 3 6) + (LRSH CHARCODE 6)) + 8) + (LOGOR (LLSH 2 6) + (LOADBYTE CHARCODE 0 6))) + ELSEIF (ILESSP CHARCODE 65536) + THEN (* ; "x10000") + (LOGOR (LLSH (LOGOR (LLSH 7 5) + (LRSH CHARCODE 12)) + 16) + (LLSH (LOGOR (LLSH 2 6) + (LOADBYTE CHARCODE 6 6)) + 8) + (LOGOR (LLSH 2 6) + (LOADBYTE CHARCODE 0 6))) + ELSEIF (ILESSP CHARCODE 2097152) + THEN (* ; "x200000") + (LOGOR (LLSH (LOGOR (LLSH 15 4) + (LRSH CHARCODE 18)) + 24) + (LLSH (LOGOR (LLSH 2 6) + (LOADBYTE CHARCODE 12 6)) + 16) + (LLSH (LOGOR (LLSH 2 6) + (LOADBYTE CHARCODE 6 6)) + 8) + (LOGOR (LLSH 2 6) + (LOADBYTE CHARCODE 0 6))) + ELSE (ERROR "CHARCODE too big for UTF8" CHARCODE]) +) + + + +(* ; "debugging") + +(DEFINEQ + +(SHOWCHARS + [LAMBDA (FONT FROMCHAR TOCHAR ONELINE) (* ; "Edited 5-Oct-2025 17:41 by rmk") + (* ; "Edited 7-Sep-2025 20:29 by rmk") + (* ; "Edited 2-Sep-2025 10:26 by rmk") + (* ; "Edited 24-Jul-2025 11:30 by rmk") + (* ; "Edited 8-Jun-2025 20:05 by rmk") + (* ; "Edited 26-Jan-2024 14:18 by mth") + (* ; "Edited 1-Aug-2020 09:27 by rmk:") + [SETQ FONT (FONTCREATE (OR FONT '(CLASSIC 12] + (RESETLST + [LET ((OLDFONT (DSPFONT NIL T)) + CHARS) + (CL:UNLESS (CHARCODEP FROMCHAR) + (SETQ FROMCHAR (OR (CHARCODE.DECODE FROMCHAR T) + FROMCHAR))) + (SETQ CHARS (if (LISTP FROMCHAR) + elseif (CHARCODEP FROMCHAR) + then (CL:UNLESS (CHARCODEP TOCHAR) + (SETQ TOCHAR (OR (CHARCODE.DECODE TOCHAR) + FROMCHAR))) + (for C from FROMCHAR to TOCHAR collect C) + else (CHCON FROMCHAR))) + [RESETSAVE OLDFONT '(PROGN (DSPFONT OLDVALUE] + (TERPRI) + (for C in CHARS do (PRINTOUT T .FONT OLDFONT (CONCAT (OCTALSTRING (\CHARSET C)) + "," + (OCTALSTRING (\CHAR8CODE C))) + 10 .FONT FONT (CHARACTER C)) + (CL:UNLESS ONELINE (PRINTOUT T T]) + (TERPRI]) +) +(DECLARE%: DOEVAL@LOAD DONTCOPY +(DECLARE%: EVAL@COMPILE + +(PUTPROPS HEXCHAR MACRO ((CODE) + (HEXSTRING CODE))) + +(PUTPROPS OCTALCHAR MACRO [(CODE) + (CONCAT (OCTALSTRING (\CHARSET CODE)) + "," + (OCTALSTRING (LOGAND CODE 255]) +) ) (DECLARE%: EVAL@COMPILE DONTCOPY @@ -563,9 +793,12 @@ UNICODE-EXPORTS) ) (DECLARE%: DONTCOPY - (FILEMAP (NIL (3341 12542 (READ-UNICODE-MAPPING-FILENAMES 3351 . 8301) (READ-UNICODE-MAPPING 8303 . -12540)) (12609 26839 (MAKE-UNICODE-TRANSLATION-TABLES 12619 . 16379) (XCCSTOMCCS-MAPPING 16381 . 17598 -) (MERGE-UNICODE-TRANSLATION-TABLES 17600 . 20253) (UNICODE.UNMAPPED 20255 . 23579) ( -UNICODE-EXTEND-TRANSLATION? 23581 . 26837)) (26840 33676 (ALL-UNICODE-MAPPINGS 26850 . 32339) ( -XCCSJAPANESECHARSETS 32341 . 33674))))) + (FILEMAP (NIL (4107 12829 (READ-UNICODE-MAPPING-FILENAMES 4117 . 8586) (READ-UNICODE-MAPPING 8588 . +12827)) (12896 19704 (MAKE-UNICODE-TRANSLATION-TABLES 12906 . 15666) (GET-MCCS-UNICODE-MAPPING 15668 + . 16688) (INVERT-UNICODE-MAPPING 16690 . 18483) (XCCSTOMCCS-MAPPING 18485 . 19702)) (19705 26328 ( +ALL-UNICODE-MAPPINGS 19715 . 24991) (XCCSJAPANESECHARSETS 24993 . 26326)) (26373 37135 ( +WRITE-UNICODE-MAPPING 26383 . 30127) (WRITE-UNICODE-INCLUDED 30129 . 34441) ( +WRITE-UNICODE-MAPPING-HEADER 34443 . 35691) (WRITE-UNICODE-MAPPING-FILENAME 35693 . 37133)) (37136 +37812 (XCCS-UTF8-AFTER-OPEN 37146 . 37810)) (40337 42426 (UTF8HEXSTRING 40347 . 42424)) (42453 44495 ( +SHOWCHARS 42463 . 44493))))) STOP diff --git a/library/UNICODE-TABLES.LCOM b/library/UNICODE-TABLES.LCOM index d339e0387a9749117c7a6c380916635e867659f1..88ca0dcbb108845066791b79fc9bd3bbcddf85ec 100644 GIT binary patch literal 17736 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 literal 10901 zcmb7KYiuLeb>?HewrP7S%A1WtEEdB-J(DG ztKNR++?gRMQI@^J4(GnkeVlW?^SF~J8S|!XBm6}-OT@(=E!B*YWvqPrtD74)x7W7+@M~?`EIK74$x}5iy_%j9kr85w3QDsn zB`$7mulv;2-@LcI^E+WuMW9yq@1Jvi+mL-PQap}^fxah3yV)k(~l~jD{#9gG- z&$ViyrBmvRm^DgfD_K|(+jnk@*c=__)+;M zFXnBOX1I_Q^G>m)Td2s0V$;NLS}fzKiFsj)lpvlr>qZepCF^acWHyXq%W0UH1NAwv zTr4(|*nOjEw6McabRrZ8&UL;Sz`w`$FZ83S&{F(+onY{9&EC`HZtUtGmoL5_3itl2 zG8xsMGJ9t$liZgd&(Wxf@XyQ-x^J1m56sZ}mFlxpcmG`V5x*>nX#82{Oy}UDvv&P zEk_5ho}(pw`kVbve}yH*Rxi+!VnO^mvCwL)?_7}U;pg+Tlhq5nmv{F+{YU4#+sv!w zYJOWi-{1dqKaj|%inwkU9lNNC48#e-1yRDQBB)YtiF95Qo^-8{5JMhkvVN=Pk4bBa zAQ&V0q<%un&v@OmT*f1<bX*sW(Is;XZD^O?BqutbuPfbl_{6#A>syIRCl(Y(} zc8L}y6zvdQOv(DzY&D>&VkRX>YX}hQB8!4G+c0X*6(d<{*DVt#Vl)9+X;l*ir?eu{ ziYBfYji%|?BAuEMtz{fpN)yI%%dojt!wThjWK}sv%c%YsEuG^r8WuS;M$O7GYHmPY z%}VlWc9^`H(ZuCxp@I(UJl@=CR1GNO;=&5BWQe;$NG-gx$Uxhdd}K;TK%yUyzT-!GBG}FHhrTCMV*&IJ{@@ zjvok%teUZw#pk?_ff*)(Tor`z@t_?oOYoEFe;8XyS~Ce}6S zH6sk0QC7ir^hS&7BzJ*{DCFf46YyFv$EZouz74&GSD-D43xwKB%2xIv!r{h%Vz4shfTis4)Ljvo;i?U{*=Y6jW1CCVvNx#w?cmGRA zyS>F#fV`!P_cI$z5g53^BqRa%-I?5cifi4n+ZW5?Iaep%-4Fbg=}g?-kl=Lg{=YjD z&N&{k`P+{Vei^M#pxHUc-FweD6Fk}NU#?!bZ&1B+;r1uI7#`1!fG=2sqI13*Ta5vn zY5WC`{yW3u@4x4~)Cq;&?u0J(otGwI9qitV&Y5oP>o@kF+;Glc1cL7Uopa{m*Y}^; zmfU8|wJ+t+^8TkgfduKe2a;)EPtkIk#{6rLWkuMnvWFKC>O2Wh-Dz4vgKhU3E|m-t zN})l)n(cy%H0q2dY_`ylf0jHRsAi!0LqyfI<`Y#_KqUbZd<+&@l@!@%K&XTY$R^=Z z1i|BA8YQ1`>lI8WdnlOC9i~9pK~kEknqzzb~P)NfL^(SL7ysCUo z7>$P05P1MEJVI93978+P0DY$pbd&(sDh7Pp<2&^;##>tKJ4Hyam#+qk`UXMHvv z5$TLbBuJ}a5ocTFhSOdsPl<%#STK`U47)}6Z_Q6lK?peP6Y^ZY}yY2>)I$Q@-2BDfodmO6ll!i43r319~Mh3&{gHvw6UGKalIZ7^U; z1TKVwfp9bWa)=Rz1)m@6we(*(9h?XxU@{2PcwULMIA?Lab_FxHU`oewijf+enK?Wb zbyE>yweKId8oJ%IbUHjY`tS}Q3kH)}H6-kkFYLXgu`j~s2A(Q>1h^}-<%VHGqF|qR z+b$=u&;NKj5D3k6!uQYiHzRWZ*xMhP;oii?@2_;fOb!@7w!Y*3 z{!0GJUOaf{H5xkIovYalZ8aWe^YizJ4nF|+(v{_*2WLIH{VkVpzdOfZN(_Sqtr?Al z&pcukhP2?c?Ggkln>o3^0uQ6CH{lgEbodczm`lT6Xq8#Xh8p0#QF7{5*UjxQMdZMs)E+3vT?kK*?Q2vC&qeiT ztZ?s3waIJI=(Em5xL4$+x!457SLN=*m2mINU6@$5q=GH!M^@C|6+#r{uyTV<#VARf~bkm>crk(2W-=d(0{-;08s(|@qY^bS0bTg z(?ZJvTM=2{9WVJbc%k71Pm$-E3~E%aQAIv81vEWT>fQ563!pJUhX)|+A&MGMLmR~$ z!c@=cQ+(4v=jTEbz~$#p1p=oE2j^K)dy_h=C_h+<1@@cz)yfA~i*7I3 z>F0izqU-{HX78Ny+y~!AtdAB_tilzzOJ(??}V%<_yb} zi-Z7u@=D>aUORcas+90~pwZCcy#=2MgaUy&J9dk_Sjd)i(%B^?{S&i#0eU~IJ>z7@ zQ>2VM4Cv3e7+Lk_xksMf#lvOu zZPuQ*_$dK!+kB_Y#hBEuKN~5TZ}aBg;^)Q{K7(tW2Va$`Nv5z74L!xp1J+qwu5oYT z;pEi^5wjwDvwl)kaiW5fHA6VWCk<1MRF&s1gTp6EF&r0)jRc$}KWC+-7;wQW1?f7; zI7Bg-lc>QqqB}=Q0udkSFB0LN2j%%?O$v0pb)lKNx$Xhlpz2(6#7iLvAK#K5Ao&sZ z1<5fV297p*fPb__$$!SMBaRx2HDZAyd;MHcL4s@I@7Pq&K<89Qd&yXaFl($Ka8m+r z1_2k1y;>(24F)7^NSH4N7v;-HWoTUOqO>CN=SAe@9}JHfX?0QOw2M0AJo*v`8Sw*f zWMkc!A5tOn004itic*U*kAV1DHo~OK7vPwDfnduQ1cChGLDvlOe(* z7|W0YVK6(66UU<%o#Piov2l}l@CEQAY()NpQh+XEQU;JxeNb1*7b34AuS@Wr@!f?q zT!fl#()|oZQ?SX>!AvJm<1C@?6p{^t6;VBX8UeQ8%g+PYq9Qneov41g67HRTvAnk) zycYbh8VcSBALQnKP_sU|{vGR4`CKnzJ?h5FvE|^$mK{3RJ7agOZp;qFzS0i`->;dW z^Y58>qF4!C-TNC7xuI4sIIr(rBriP_ z`cX$-xqQWS)jygWMp7QI^pY1AbCDl1{dhAZ@pVuy8{s75(kB{vj*A1lb}T1DFe>XNlCGhiwKHxrRxfR*7aeLsbjZy{OtkogEH?f z)KW_BxOr9N+X1q+v6S?#0aSRhv*tX^DY7I@T*ac@X}91=<7yO5QYa{4q(V~Y!azl0 za3~Ltw3#P3h_?~09*f)x%*3(KO`bg8QRLjT{ZxeF#)@9oZDf~RX>WcmNIV`4eRU%5 z>6KTI=z<1F-wB~w;5_+Gi*<>6W8I|DjFJymS%w%mC>$pqzx3lVgr@(37&7jBJPes( z2*K?U0K-QRfCga)Qmn|0l5;eVr*{q`_#iKJ=Ycsc!#oyCr{`av1vW6ovwlR^P9q%r zwkgd3Y3tv!uIQbO$8XE@JC~Oxk5fi&KJ<9O)5K@EVMr6taD_AB`#uxF4|z4#?XGuA zaN~Z)s&PL{`bf7w;qD*Lec%3`&Apk;O!k9H?}aL^mEWf%`jcGs;={fFHA%UVuB}yd zL;y(A_!oa9$3rP=KOK&+lnAp)>&2oSP)#sj24258CFthtO>^l>$*s(Zsf6PB}oJih#n5>H-{8hJbh__?;KjK6@2tS=DX!dqMLi= zZy_RyMqOWA9Mgo{%(Qs*ReZvnv3Yl`^Txg3MeD7#H+I&!PLdFJ-q_hiJ$J!( zBY)5(D(%+%426w!kFvJa0VLuLc`Q_mHIU!g-Pqg|>)(1~vTv^15 zTHTEuxt8wQ4prkDmd{=nw(zYth{~mS1ZgHZ89}=jzmY_ibrqTm#?>{4w zB{k^ylM7C(OdT@3nn=xQ7|Fq~3@@c^S8Znrm!$CwlXc5jD!!EiSpxZZHkDMe+^jeB z0+Gb0WzO9Y$O_%tGk0ZZ|n2JOl+7xY#e7l7!KH~-+Xt|;hr@HPq5#8L9ba@>F~DfPD160T(VG`Xxu zD@vCuvfbaFzjG-@M@9N@4P7>Pbt2+Rt}n8Xn<4Ewj5eOuc{t)>j$c1EkK!wHEFS5NB_}O$bjBQ? zHcv!^KbA~KX5+Ecj9(m`jhGW@b1Yt$JZ7dM!U*)VwRKYq<0zJnObEXi=$*`-?F|Nk zgCZCh4GoS4`~9NZzr1?>LcWmAh}9wr{j>Q*WFj6p_4$Vj`Lk6FN$r^&f^ zTsX(n*VpG4nWYVkq**8ZL4VH;W@H$nfuT_&xYrECaBwg%Bt|0>v2^d)DY15bMU0L| z&E$zlsyA(k?#X1Tt?8(H#OTayBb0E{#rSCzE1yVz{k)Mi^pT#6(ccn)CR@8*+*4cnOG98jG0d5pKW7(pAN*3O;3!eYqf8{J&SMxbta{@I{wXjpI_&@3@-ms<3-C^039N^||kE=U4 z+%F=tv(~H#4vvU3V<5K(4h-n0(6D|A8tTay(YeO3oi^C7b3;S=DHu{uBRUDCw2aIp z6Xwheq-`J|PDIjCGZhtvY9wOC!N3E<;#gvQJe9UoonxYZpdl$Ztkzs$fNJ&Ix2*<9NDu?b@4TTaP3_{;iKaK?;MXzulhTm#(`g$^BV=Q8`I|vDMX^<_po~_5|3j zzrTsJ^@pnB)*t8>iAZ8BGAly;gGvj8AcRUER5e3zM5P%c_EW!p8VratGm*&jSS$&t z?T5xVrUW)^k^DkzgOJ<$Gy~=0=In`x%Aj&aupupk9_!1E3~HGV4LD>z6bh2rf6R=> zCRpM`Dsplzk{pltMJUiZFF4fSvR=>_YL(X}jNy@1nZgLQ%u}LHG^-Q#el6@$#7Wqt zh?B5O5hq~}C}DRhrKBZSt;PucG3=eUSf?oYj+ehaw)IlHL3raVqDpu_;}l*g*0%7H)WT{iiRiO! zWPf19Hj<&?kS(p)tv{w*YyDkeH?03t9d4JDi1OXh^Skf9Dqj?`_3V7-UzwK=M3+4|U-bOn?v($+ zd=W2|aBfUvok4|loXRceSlZfEcVZu7a4h10NVfv^T{#W*UkpE0y0Zz&uiPBW|9zkL z+tJr@zZPYj540`82k`jr2lBD>Q&%^$F5%>14UQo_jWXM>MV7EE3|k$Rg?*?`vJosH zVH?Y`xnSxvfWwf&dfH4hB0=63Ird6TfFPu#juotZV1A8LxUA@;)j0`77$rQ)xkwz#)$U0sV_vaSJ-ZC%TchK07F zQgCABhoV}(c#N|UdWPbJhhs*ma^7U%;%Biufhg#G38${oO=XaO)vEavNk7Dp>D9 z$^0o|38JCX{218K>O9&5SFI%IH5jTVB5iH!NR4ue9pnGll$~koxUi}8o>F$~6Bq&L zB%SvUq3S@JzaLcxEmFs4C-;-8o7pE--NRDV4X~|54XPuS#wAOVxE%4E^_|>&WvyW+kNWmc6x2 z5D3&{oml=$m)qr0PNhuY=R4(r3b;)m@mx~yzef%o^;`#Pg2U4 zDSWt7{)D6A?oRnX%d#H3Y+-lj@_(THr)nHk-o`66SS{r0HVi0yt^0=@bgSQ@gq)ir z2k@;XL+A~Z8ifJvH3o4e0X(T*#v%fyh+l@;RLsxD(vcea$%6rhE3Zem&SKIYGsBbL zDc@5G7kLR$b?Fm<&)i+vIMZmfV2Uy1<}X? zP}idZ`y@6C!2QxZz;i)nA_R9OyOIaxFT6eUj!6yTNWq?ZzoB0+bwv}JxfsT#Xp*p7 zvr`c>5D1_m9S1aJDUgJQ3}9yaV27j&);25l&ZAZP!D{=>Tq~_QaA@5A`*ybiUSnLWDzU+6Awekr(*TUiaTrS9eC zSEC*Q?>U!YM=v+OAl%K(uL<{t)|Pnw61FhI9X@3bK`f>*)!aUX;y^oX6qYD(c}trBj~ay1L1ie|(Rx zI4Nn83@aBLfv=a&xa&?F$$2Y5KriLsFf%BAWuLcp)ag?*k^6oHb5iJGSOnoX!C7Kl z1aSt#J*thajwXQJ#0g67k_*H15E$&d_IB^Nu&DgeF81QY|{R(4nQ1yw;R|_%(hJ^v=Nvqr;IN(~> z9Yk*Hx&t`+vC-XFgvnsw08EkrFp}q6BC5oK(Xcs+f}^*f3JfDlzmB7)Hw`kV$SSHe4J=;&f6OfYgSHDXE5$ zxV{X}vL`G!2n5GwGh-KmvzP|wm4V%=@?K%G28dYaJrITgcfYEq&SaS^lC+Z%U_B>gZvOC*c5T+= zWGX`82G{}2O-|x4nQSMumx`T^0LOlFA4TGfz1?AW!x@Se_$L)}W$en^r=m6)>9FmZ zui)J&_sA@>;6aJgHc9JG5q)TB-%fc{wWNxh1utqnuBqMn2+y~&^L*5I8(AB81Stk2 z6}9H#6G?1Pz?yb61|KC;0Fw=NXvVdhug{|qkGYMYiL;*l?#sfYS?Q0c#*^sWD<-ViK=x4$fSalXoJy~_zdQg468Z`jUq9-@#?c(bt2 z=b{m-Q74Jh5v-Mt82mRSM;;g5>dd$Y3-U3H*bM^mFo~aOWEj@V=(%Zow3yE3^a7); zAhlJv6u$oaiVuNM;p+(fP>z2*daIB7Mw@k#y$MQFwCA%Kdr+*mmA=D( z1P0`87|_a<*P?Pj7{`A>01*sY!@{=c+#Z}_SwIpREBZRh%l-uZGN47ITbN($a~p^P zXT1Mm2*%pE|V`;-8^vljEk- z^x06&9=cR`G<1#PS`S@K?w2?8IRY)DOZFT(O%e*bmhd=Cwsyy>+j?^v!Bh_=UW!lu_#M}C z@#(i;qtL9c$1>dL&L76MKa&6T>6I&wmwuA#EM>x(PlGTOqOY5+8_sYAA zcUxV|rkk$61yrD%P&G$|nEdHA$;s6WKtlvktBU`Iozhfws#-!vQ`gtDW1;Ia98H!k z*exzOT9i@N_4Ur{XzPXy9lu?l;ppktZetO(j(`$JDw`kv+c0UiAp|We=qUzp#P1Z^ z0ci1>cc^gZdq3Owp|MX8J8=j2 zfv;syz#n5FUYj?0L7WIQ!D&Gp4A^bZM%jMBDaZp4n6tCysa|qz^s1l^iem%(psN~_ zu?0xxuw9I=Z(tX%tErs`PVIGyvmuTY1q__AAty$xv1JI|I6}aydsU?XhwSibKrw>X zDX515p?c)tY`RNAvDpb$98N8nRB(`Bb5%P*J$?%;p|r_&S#-Z6MeD5VQd78W3A9gip8UTo*ow_?-Dc!GJB-zE1> zue|$uBKhu{r9US_V$?CAf!({Uj}5qz>Nk-F=-&jb!egOVMNtiLj5>u^65Q`(AUJPq zAPo=N8925gC(L*sLWb#dNmq3)G2|mLt@y8gxqI4l#C;W@Es!a|Iy}SxP0?~M*oi4C zI8=?#grMm7kpYVAm&gweKAhy&VJ;Y>x+D#kc{J6*RWa9nP#kUv8Cl6T0Cyfa8GUxB z$aeOGh=d300C2M)t18_bcyIw>-HLXz3meTn%P;@%3G z!5(!qh0C-dX%EUfrdK6>`X-=zU&ga_%>C*Uq~7_DM(>BCK=1#8(fcb5-Y z2T*-CxmMUM*G~`|=KAHkr4?0TqV!ux$dS-y)dom6fl?PVGID(qUY;71>i4QW_Tz+7 zryUCBMkv)5(mkObl#uFO$_(jVJ@lYG9Yg3sH-lG0ttYX)FXoe&==9EafV!owgyYpMJMyap3`{B;l zIJ@L8h?Dw~&&fjg3UfF2|D}`sEE~-6Gg;ArA%T;>nOV3=fmraHH2B^b?a(-+5~l{_ z^P-Iy9ue4UXCSU#mPfd&e1K;j@fS*h5ilZCVW{N;)=@q{Ayms@bHk|`{*a^C|5-mf zhy96I3Y(!5eu_o$&tX?Y*J>yH0+IOs+wT*&?Ft?14?F{h9PY#1j#qx`X=}{_QYvq> z`nbhIOFkQc|Co;Nu-*i!##6Kxqm#Spx|49rb!Q(RIh=VfdIQE8(szU=1qh28d_Q;+ z_Xc8$Q;EC4fqbEro(*9J27>)ys>;FrF86%CI6bqbk;{#6C2N8Ky0}_WA*guk(NuRQ&@f_s1c09mqksOcDO+?t;9Km&Q(xVRUCbK@C z>IL)n62Vi5Ik@AH+qKWk@06#;woZi0f%z`U&@gZAH^OmuF3&LrpV{_)`Sq#oJ8-?} zH10evlzuk-;P*;@!@R0QAun0q*D=$kg5Eh{@v!?X>#%3B)4kYUu{u3&I31GZ$HuI7 z%g6L&(zg6_=pZq2zQc0|7pXG1b%YbFyQM^uxQ%ap(J>&z&_B1iyY5J-m>KW4GtcL` z)KK%e{2{&pUXclv&E0YGt_L-r(#2=u-82*+%pqQ^R4g5{l5hlT7%AOsy#Vc?eOXfiV2`&eW)MUF`^f;W6omQ838{*+UWZlzwCMG5L z6dJxB0e%eQ#AlKZmdbK}?YdC-j2X&s(_ge}ze(fLPmZ+*tQUCeFEyOq{qmP^iE zyjxl}>u$GvKLXF_Z{Q7{t}C3va$C5Kck#rwDSl|+m){?NKV*7cg@UlbMVC|VY1`RF1B z)a6<1+WfF$i3b;tqUAkEf3nLuwixujXa%>stmB=hGaV<7T0!sjIjg_(bUZe7zuOB+ z_k;Xa&{O`T)sG+d%1?I6_v2wPh%ESKv3iHBP7J^YJzBbAb<*ONer&aOb}a@fR^PVI z3Lv)+Q$?-P^H$(N5Tx`!-HU@2v^dBszY9!Lk2&wxTHErJv_9^pNi#z$}q$aCRdWk@tO6Ry9e zt6H=8Btvzl6=rFw6g;`GwAN7>#kW)byi^vdfaxiZFdOO$`_#i&=^kp$9aHa)LbOTy zppGrrAYgCZzahLunD}$Y~zozOTXL*)|OHq|1ch=M&0gLGJ^gqm2*%h555L2CR1qA0&b~pujbS8te@lxmHygTGRz`u0v%Il^QDtIz!^`&Fjt>YKl@Cj@P z`($@LfHyGCLj9Y-r-w$tjC`PY$87ov3)>R&A9me$s@8-9E_ z0StX#OJ=2On~Z+64VOk*%%;s){D%BWHG!M$Chhr62;r)_)PTG*1Ff|Rqi^y^jYk_ziX=lJuCFUepxR((r6P$J! z&~?}_Af5IU*cgw4iRJb}Zka&Mlfda-DN8(G{=-zcJSt^{XU!>9g6v%WI46%C*}5~# zPyC0~1j3{Ep0Ml!ej?y3IQ4qR>1+k=5zQBqu}FM^K%Bjk1c1}p7ZH=P0+5={2NiJ8 zCSwu>j(s$UReX=5hPo7Ndx_9M(Kellk^rkrHgGOcuIgM-bdxAgdB%SW^l?*Y)QjOw z*H<_=s(e@2KIgm|mWPAaO6MgJ=^Ik|DD&#ouzh-I7ra&)*Cjt0Rv&`8N+tENWb<0r zz9MT?7lK$2Gpr7uG!fr2ww*)d<{`_%F3iTyC*kZyADv+ru1?NykU7sNS8j8dCd}UK z=4tf)VfQ3qG9hC;!Su%`CN2JUQ7d;Kya%&5UO^3rITp!MkMJba`;yqZVPr zWEW1XbcQUSH!25HnSP&Ths#dmiY~vgw5S4wwww&DsmveIb-0jvnLqrB+U=4h`y&}X z1U(|XkwNS=l>I=AG7;0H3*H>cjW=v%ctNn(%DO1?0^30!ACT_KI*?{yKk7tS6p-y` ziyWY;ccUNc97(6G8AMw0b{NNK`VE?l;!=~e`J;gmEB3+HL4hCx(m_hk&=F9cDjyp# zISXfDLVYSLTEkhbD)iKtyE)G zXejcE1t35~bly^u zZ6c+vO{6qw6RD1{d)21C(97N>+)PDsEE!8bMk>5pTTxtZ65S`~aLyy*lMoY0zNU9M zkvAi{o82X_Z8BY!LNRj!Vn@9k18L2Q>igiI$$a;%wCG~w}C>=o6f zsxOTVSSn5`Lw(jqg}iXMxh|ASAUDkS!{KI4;)n#bp#lafs0~;v7D3DvC?zQMQ=PlE`eV;*+II z_(c(0!cb~mWU?2s5JPI6szV&a`oZTnB+p z(pOIBCR4}7@=~$5%Hn!)9k~~a8~Fmatwx`HCcnM`p-$)W&;aY}7ipLqxup$pVJ-V~ ze)Zxyk6%r5wODvo4E3JPZ?LA|?Z?tG99WU=H~gp_)-2eWVLyH&R26xtQVeHpsKmr z{PS!14PHssnl;O%wOCWXaGe_%!b0Z?6QcP6pLQoSZOV3Dt64YOXz1~``OS+Pt5E1* ziHrESE?8&voLCZ>)n%-0aYOPh7WZ8K85;kdas|8q)0>1Zwp*QPlF+u1IjZvm`6qE% z#cw-Y21&)(C!ee;n%9}EsYA6`E48)ok04*04jXSHt-5CZO!n->C!fUB^#a)z7v-uG zZkw=Jm&7e|qEV5cZL&%dchM88iE8Z@YKV4JAQiPqItm{x*3*bA%)mjFqWSSgjK7df z!B#z5X`u&cx*v6FYNy_B+gq=r0|($@W{ldTO zi0FO{N`SOturJU<3Qi#iKYdSG{nMc0X;~Dlg!%&hMn_7uvoxt#Q7tb-pwDnNDGNvh zBS$sKXhxWR>8Ppp4zb9st~rN3i{VZ$T_`LS#lv{+lh5G`tI&w>t3185mg&o8EJ#!;R1q8KNrmD&KdLTjR1O@*2Rp^gLd zkAPhHVwGS-lRhYYRfCicfvz;EWKz*Z25v>BH3SNvgh&fYc)kGMR1T>+8~>tCrrt(47#OinXFhv<3NBC zSN5)7yns(|XESKBMp?pr#fy>7t!1;~b2(_$-t`Mhu$0}fMFQUu=C}18v7WsE^3k`r zmsblH&lkz_rPgtr6M*C~GMbW_ENI*f!GdbR*14a-lH(u1lN zkm%uaIe?6%r>4mgCch53eO5MM&x!~Lz(bppYzF+55of{SN|YSr>dh93f*CHg3h>gM z?R&CMB$k#%nzlu#+apE7DfDP~seo~!bw+P!n?|c)7`0DOzCLgxnzjUjvDWf{VKie&2|l^DdhvpsT9rZI112pI!+NYi$|1cp92%aI z!S&<(sqPvcMK<+7{9FKb6ram)+o=g>a}tN5Kp4BeaOeWn9NV~j+JH9+GHnQ4<$ zZDsWm>p_t;o?k_sOcr{&fVrWv y99ZQ%+F*HJ-VhIi!hI`jH=5WA-kKx62d-9oGs13Gvh-pUo0Y^2zQsEXTERNALFORMAT.;123 51558 +(FILECREATED "22-Feb-2026 12:29:38" {WMEDLEY}EXTERNALFORMAT.;124 45411 :EDIT-BY rmk - :PREVIOUS-DATE "19-Feb-2026 13:32:00" {WMEDLEY}EXTERNALFORMAT.;122) + :CHANGES-TO (VARS EXTERNALFORMATCOMS) + + :PREVIOUS-DATE "20-Feb-2026 09:18:35" {WMEDLEY}EXTERNALFORMAT.;123) (PRETTYCOMPRINT EXTERNALFORMATCOMS) @@ -35,13 +37,6 @@ [COMS (* ; "NULL device, from FILEIO") (FNS \NULLDEVICE \NULL.OPENFILE) (DECLARE%: DONTEVAL@LOAD DOCOPY (P (\NULLDEVICE] - [COMS (* ; "ISO8859/1") - (FNS ISO1TOMCODE MTOISO1CODE \CREATE.ISO1.FORMAT \DUMMY-UTF8-FORMAT) - (FNS ISO1TOMSTRING MTOISO1STRING) - (VARS ISO1TOMCCS) - (GLOBALVARS ISO1TOMCCS) - (DECLARE%: DONTEVAL@LOAD DOCOPY (P (\CREATE.ISO1.FORMAT) - (\DUMMY-UTF8-FORMAT] (COMS (* ;; "Also from FILEIO.") @@ -736,166 +731,6 @@ -(* ; "ISO8859/1") - -(DEFINEQ - -(ISO1TOMCODE - [LAMBDA (ICODE) (* ; "Edited 5-Feb-2026 12:09 by rmk") - (* ; "Edited 2-Feb-2026 23:14 by rmk") - (* ; "Edited 7-Sep-2025 22:39 by rmk") - (* ; "Edited 3-Sep-2025 10:21 by rmk") - (* ; "Edited 7-Aug-2025 09:37 by rmk") - - (* ;; "ISO codes are 8bit, MCODES maybe not. Caller shouldn't pass a fat code.") - - (OR [CAR (find PAIR in ISO1TOMCCS suchthat (EQ ICODE (CADR PAIR] - ICODE]) - -(MTOISO1CODE - [LAMBDA (MCODE) (* ; "Edited 5-Feb-2026 12:26 by rmk") - (* ; "Edited 2-Feb-2026 22:58 by rmk") - (OR (CADR (ASSOC MCODE ISO1TOMCCS)) - MCODE]) - -(\CREATE.ISO1.FORMAT - [LAMBDA NIL (* ; "Edited 5-Feb-2026 10:42 by rmk") - (* ; "Edited 2-Feb-2026 23:37 by rmk") - (* ; "Edited 1-Feb-2026 11:18 by rmk") - (* ; "Edited 5-Aug-2021 22:15 by rmk:") - (* ; "Edited 9-Mar-99 17:19 by rmk:") - (* ; "Edited 7-Dec-95 16:24 by ") - (* ; "Edited 7-Dec-95 16:20 by ") - (MAKE-EXTERNALFORMAT :ISO8859/1 [FUNCTION (LAMBDA (STREAM COUNTP) - (ISO1TOMCODE (\THROUGHIN STREAM COUNTP] - [FUNCTION (LAMBDA (STREAM NOERRORFLG) - (ISO1TOMCODE (\PEEKBIN STREAM NOERRORFLG] - (FUNCTION \THROUGHBACKCCODE) - (FUNCTION NILL) - (FUNCTION NILL) - NIL NIL (FUNCTION MTOISO1STRING) - NIL - (FUNCTION NILL) - (FUNCTION ISO1TOMSTRING]) - -(\DUMMY-UTF8-FORMAT - [LAMBDA NIL (* ; "Edited 5-Feb-2026 15:58 by rmk") - (* ; "Edited 1-Feb-2026 13:16 by rmk") - - (* ;; "Works only for 7-bit codes, during the loadup") - - (\INSTALL.EXTERNALFORMAT (create EXTERNALFORMAT using (FIND-FORMAT :ISO8859/1) - NAME ← :UTF-8]) -) -(DEFINEQ - -(ISO1TOMSTRING - [LAMBDA (ISTRING DESTRUCTIVE) (* ; "Edited 5-Feb-2026 11:01 by rmk") - (* ; "Edited 2-Feb-2026 23:46 by rmk") - (* ; "Edited 2-Sep-2025 12:14 by rmk") - (* ; "Edited 29-Apr-2025 13:08 by rmk") - - (* ;; "Converts ISO8859/1 codes to MCCS codes in MSTRING.") - - (for I ICODE (MSTRING ← (CL:IF DESTRUCTIVE - ISTRING - (CONCAT ISTRING))) from 1 while (SETQ ICODE (NTHCHARCODE ISTRING I)) - do (RPLCHARCODE MSTRING I (ISO1TOMCODE ICODE)) finally (RETURN MSTRING]) - -(MTOISO1STRING - [LAMBDA (MSTRING DESTRUCTIVE) (* ; "Edited 2-Feb-2026 23:47 by rmk") - (* ; "Edited 2-Sep-2025 12:22 by rmk") - (* ; "Edited 29-Apr-2025 13:08 by rmk") - - (* ;; "Converts MCCS to ISO8859/1 codes in MSTRING.") - - (for I MCODE (ISTRING ← (CL:IF DESTRUCTIVE - MSTRING - (CONCAT MSTRING))) from 1 while (SETQ MCODE (NTHCHARCODE MSTRING I)) - do (RPLCHARCODE ISTRING I (MTOISO1CODE MCODE)) finally (RETURN ISTRING]) -) - -(RPAQQ ISO1TOMCCS - ((94 8593) - (95 8592) - (169 8216) - (170 8220) - (172 95) - (173 94) - (174 8594) - (175 8595) - (180 215) - (184 247) - (185 8217) - (186 8221) - (193 768) - (194 769) - (195 770) - (196 771) - (197 772) - (198 774) - (199 775) - (200 776) - (202 778) - (203 807) - (204 818) - (205 779) - (206 808) - (207 780) - (208 8213) - (209 185) - (210 174) - (211 169) - (212 8482) - (213 9834) - (220 8539) - (221 8540) - (222 8541) - (223 8542) - (224 8486) - (225 198) - (226 208) - (227 170) - (228 294) - (229 567) - (230 306) - (231 319) - (232 321) - (233 216) - (234 338) - (235 186) - (236 222) - (237 358) - (238 330) - (239 329) - (240 312) - (241 230) - (242 273) - (243 240) - (244 295) - (245 305) - (246 307) - (247 320) - (248 322) - (249 248) - (250 339) - (251 223) - (252 254) - (253 359) - (254 331))) -(DECLARE%: DOEVAL@COMPILE DONTCOPY - -(GLOBALVARS ISO1TOMCCS) -) -(DECLARE%: DONTEVAL@LOAD DOCOPY - -(\CREATE.ISO1.FORMAT) - -(\DUMMY-UTF8-FORMAT) -) - - - (* ;; "Also from FILEIO.") (DEFINEQ @@ -1006,16 +841,14 @@ (\CREATE.THROUGH16.EXTERNALFORMAT) ) (DECLARE%: DONTCOPY - (FILEMAP (NIL (7548 15469 (\EXTERNALFORMAT 7558 . 12157) (MAKE-EXTERNALFORMAT 12159 . 14996) ( -\EXTERNALFORMAT.DEFPRINT 14998 . 15467)) (15470 18335 (\INSTALL.EXTERNALFORMAT 15480 . 16837) ( -\REMOVE.EXTERNALFORMAT 16839 . 17586) (FIND-FORMAT 17588 . 18333)) (18753 33028 (\OUTCHAR 18763 . -19980) (\INCCODE 19982 . 21135) (\BACKCCODE 21137 . 22816) (\BACKCCODE.EOLC 22818 . 25008) (\PEEKCCODE - 25010 . 25335) (\PEEKCCODE.EOLC 25337 . 25716) (\INCCODE.EOLC 25718 . 27517) (\FORMATBYTESTREAM 27519 - . 29963) (\CHECKEOLC.CRLF 29965 . 33026)) (33029 36945 (MCCSTOFORMATBYTES 33039 . 35438) ( -FORMATBYTESTOMCCS 35440 . 36943)) (38356 40650 (\NULLDEVICE 38366 . 40318) (\NULL.OPENFILE 40320 . -40648)) (40731 43542 (ISO1TOMCODE 40741 . 41490) (MTOISO1CODE 41492 . 41782) (\CREATE.ISO1.FORMAT -41784 . 43057) (\DUMMY-UTF8-FORMAT 43059 . 43540)) (43543 45078 (ISO1TOMSTRING 43553 . 44371) ( -MTOISO1STRING 44373 . 45076)) (46507 51422 (\CREATE.THROUGH.EXTERNALFORMAT 46517 . 48186) ( -\CREATE.THROUGH16.EXTERNALFORMAT 48188 . 50379) (\THROUGHIN 50381 . 50805) (\THROUGHBACKCCODE 50807 . -51078) (\THROUGHOUTCHARFN 51080 . 51420))))) + (FILEMAP (NIL (7168 15089 (\EXTERNALFORMAT 7178 . 11777) (MAKE-EXTERNALFORMAT 11779 . 14616) ( +\EXTERNALFORMAT.DEFPRINT 14618 . 15087)) (15090 17955 (\INSTALL.EXTERNALFORMAT 15100 . 16457) ( +\REMOVE.EXTERNALFORMAT 16459 . 17206) (FIND-FORMAT 17208 . 17953)) (18373 32648 (\OUTCHAR 18383 . +19600) (\INCCODE 19602 . 20755) (\BACKCCODE 20757 . 22436) (\BACKCCODE.EOLC 22438 . 24628) (\PEEKCCODE + 24630 . 24955) (\PEEKCCODE.EOLC 24957 . 25336) (\INCCODE.EOLC 25338 . 27137) (\FORMATBYTESTREAM 27139 + . 29583) (\CHECKEOLC.CRLF 29585 . 32646)) (32649 36565 (MCCSTOFORMATBYTES 32659 . 35058) ( +FORMATBYTESTOMCCS 35060 . 36563)) (37976 40270 (\NULLDEVICE 37986 . 39938) (\NULL.OPENFILE 39940 . +40268)) (40360 45275 (\CREATE.THROUGH.EXTERNALFORMAT 40370 . 42039) (\CREATE.THROUGH16.EXTERNALFORMAT +42041 . 44232) (\THROUGHIN 44234 . 44658) (\THROUGHBACKCCODE 44660 . 44931) (\THROUGHOUTCHARFN 44933 + . 45273))))) STOP diff --git a/sources/EXTERNALFORMAT.LCOM b/sources/EXTERNALFORMAT.LCOM index 46992929fb708d7d8d524fc2fdb207fd2f78f198..5a9fc5f6bab3e8b5adbe7b6b9057f2611cd35a6b 100644 GIT binary patch delta 331 zcmcaq@hE*ly0DS1TWXT7k%5t!f}xR>k)@Tf#l$KzClgHtE+r#FBuO(XLrW_|b0vkO zqSWO4+=9%U)D(r(ih`nIRV#(O{F02!ymW=kJOw4UP#+%!Bg2XJMXj+JVPvYL$)(}u z>Er4gY|`zgvAk)^%&KXO%zN_O$-ectXy3@Lv)=Y6^e4R6}YUNJskbqU4wN) z{1r699D{-tTq8nUgZvzQ-28)l9YdV`eStO9~u!#w>%gLPeiwg4?LKzPOg=o1So zV^bvsuE_?Bs?3^PF_RTo#5SK}d@4UVRf~UfgPIx-leNO+rN)+%8?}`t|2O8I%xz-8 Z$Tiv8L~?SWn%w4MlNBr=#$-(!O#pg~ShD~C delta 2330 zcma)7&2Jl35Vsvv$P!Q!skqb+IH6mQ ztkk%7wcI#16uboZ`Lh0Fi4;MlS9{0Qe!g?)EN-MYEiwC=4h3nn= zM%?N5N;Rwpo9iP3T!vDFjO~4UEiVq9<^Oqe5cfJf>8w>dwK{~gz;asPFo@0XVi9tS zgv-#%K;q=a2{&1>tG5@F%7xK@(j}QO4zyGvZxVisFt{t~5N5KfO+CwKr zYc1)RCr1P^Fd#mJf7wIie1!<+3xu4(cqd^tvwpY+%S|uX*LtQLs|%IL!mr%4`M8*K zI3Jf9Pi5Fln%z!+wHddI7D+5x6JU)_cP&aH#+XR|eBFNQJfP{5h1cduN>)v+LvYBc zbZPO*)omkYYiEnTcj%KoUYZ%IR64!0c=-b*M`C+PH*T+j3;N)thWgMA8~l%jp~>@DIG=;#C-Rtsd2?J&TS(t^ z-#D1DFV76X9*>V*1gFvNjfR(ca~yVJ8i%80ogTMIl;J*4^b9jLqAn3#rF#l*6>wHt zot3CHS~z-cr9WP`mz^`%vFHr?B3^M$6(Lk8a!;o33J+qZQzR!nc8=JrfCxcv(Xrc-e$L!%#2^@eFtrNYIJ`D$YWx zHp>f&l zQ=AwD-p$w>v&;nqDlmdDA9Ns%BJ2~kP*Q^67%D;)nCmIDf&6%(U`%y*BO(Ne79OA* z5`(X4ltExV(q;ew2x_>%JI5=NC&@rED#kM{IdS5pE2*tQO5A~LRe_X*C%pl(WQ2Gv z2tg{O57Nul1I#2osS$?|6|!*3QyfILsssq1dW5&X$Sf+{XPOP6(28WVDXNSTNvuK= zoS^}>NFhtctTa{=vxh8M*F0nqgzX`VM@{u4DkL?Y@xpQFtuv1ZK0Wn9IF_0;)7ZU~ IK9a@%05rn<6#xJL diff --git a/sources/FILESETS b/sources/FILESETS index 0cc75efb..15ac01f1 100644 --- a/sources/FILESETS +++ b/sources/FILESETS @@ -1,12 +1,12 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED " 7-Aug-2025 10:11:01" {WMEDLEY}FILESETS.;24 6210 +(FILECREATED "23-Feb-2026 10:32:36" {WMEDLEY}FILESETS.;32 6226 :EDIT-BY rmk :CHANGES-TO (VARS 0LISPSET) - :PREVIOUS-DATE "10-Jun-2025 18:00:09" {WMEDLEY}FILESETS.;23) + :PREVIOUS-DATE "23-Feb-2026 09:36:51" {WMEDLEY}FILESETS.;31) (PRETTYCOMPRINT FILESETSCOMS) @@ -48,10 +48,10 @@ (RPAQQ FILESETS (0LISPSET 1LISPSET 2LISPSET 3LISPSET)) -(RPAQQ 0LISPSET (PACKAGE-CONVERSION-TABLE LLFAULT LLSUBRS LLBFS LLNEW FILEIO EXTERNALFORMAT IMAGEIO - LLBASIC LLGC LLARRAYELT LLINTERP LLMVS DEFSTRUCT-RUN-TIME SETF-RUNTIME - CMLSEQBASICS LLARITH LLFLOAT LLBIGNUM LLREAD IOCHAR MCCS LLCHAR LLSTK - LLDATATYPE LLKEY LLTIMER)) +(RPAQQ 0LISPSET (PACKAGE-CONVERSION-TABLE LLFAULT LLSUBRS LLBFS LLNEW FILEIO LLARRAYELT + EXTERNALFORMAT IOCHAR UNICODE-FORMATS IMAGEIO LLBASIC LLGC LLINTERP LLMVS + DEFSTRUCT-RUN-TIME SETF-RUNTIME CMLSEQBASICS LLARITH LLFLOAT LLBIGNUM LLREAD + MCCS LLCHAR LLSTK LLDATATYPE LLKEY LLTIMER)) (RPAQQ 1LISPSET (ASTACK DTDECLARE ATBL LLCODE ACODE COREIO AOFD ADIR PMAP VANILLADISK ATERM APRINT ABASIC diff --git a/sources/LLARRAYELT b/sources/LLARRAYELT index f546409a..1ad5146d 100644 --- a/sources/LLARRAYELT +++ b/sources/LLARRAYELT @@ -1,20 +1,19 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "15-Sep-94 11:08:59" {DSK}sources>LLARRAYELT.;7 155360 - changes to%: (RECORDS ARRAYP) +(FILECREATED "22-Feb-2026 13:54:48" {WMEDLEY}LLARRAYELT.;2 169614 - previous date%: "28-Jul-94 13:41:50" {DSK}sources>LLARRAYELT.;6) + :EDIT-BY rmk + :CHANGES-TO (VARS LLARRAYELTCOMS) + + :PREVIOUS-DATE "15-Sep-94 11:08:59" {WMEDLEY}LLARRAYELT.;1) -(* ; " -Copyright (c) 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994 by Venue & Xerox Corporation. All rights reserved. -") (PRETTYCOMPRINT LLARRAYELTCOMS) -(RPAQQ LLARRAYELTCOMS +(RPAQQ LLARRAYELTCOMS [(COMS (* ; - "Because we use the UNLESSINEW macro in this file, we need it when compiling.") + "Because we use the UNLESSINEW macro in this file, we need it when compiling.") (DECLARE%: EVAL@COMPILE DONTCOPY (FILES (SOURCE) RENAMEMACROS))) (PROPS (LLARRAYELT FILETYPE)) @@ -26,6 +25,10 @@ Copyright (c) 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, (FNS HARRAY HASHARRAY HARRAYP HARRAYPROP HARRAYSIZE CLRHASH MAPHASH GETHASH PUTHASH CL::PUTHASH REMHASH \HASHRECLAIM \HASHACCESS REHASH \COPYHARRAYP \HASHTABLE.DEFPRINT) + (COMS (* ; "Originally on MACHINEINDEPENDENT") + (FNS DMPHASH HASHOVERFLOW) + (DECLARE%: EVAL@COMPILE DONTCOPY (MACROS HASHOVERFLOW.ARRAYTEST + HASHOVERFLOW.UPDATEARRAY))) (FNS STRINGHASHBITS STRING-EQUAL-HASHBITS) (FNS \STRINGHASHBITS-UFN \STRING-EQUAL-HASHBITS-UFN) (DECLARE%: DONTCOPY (EXPORT (RECORDS HARRAYP) @@ -44,7 +47,7 @@ Copyright (c) 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, (DECLARE%: DONTCOPY (MACROS EQPTR BUCKETINDEX FREEBLOCKCHAIN.N) (CONSTANTS \MAXBUCKETINDEX) (* ; - "\ADDBASE2 and \ADDBASE4 do \ADDBASE of 2*N and 4*N without boxing") + "\ADDBASE2 and \ADDBASE4 do \ADDBASE of 2*N and 4*N without boxing") (EXPORT (MACROS \ADDBASE2 \ADDBASE4 HUNKSIZEFROMNUMBER \BYTELT \BYTESETA \WORDELT) (CONSTANTS * BLOCKGCTYPECONSTANTS) @@ -77,7 +80,7 @@ Copyright (c) 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, (FNS \ALLOCHUNK) (VARS \HUNK.PTRSIZES) (* ; - "Compiler needs \HUNK.PTRSIZES for creating closure environments") + "Compiler needs \HUNK.PTRSIZES for creating closure environments") (DECLARE%: EVAL@COMPILE DONTCOPY (EXPORT (MACROS HUNKSIZEFROMNUMBER)) (CONSTANTS \HUNK.UNBOXEDSIZES \HUNK.CODESIZES \HUNK.PTRSIZES) (GLOBALVARS \HUNKING? \UNBOXEDHUNK.TYPENUM.TABLE \CODEHUNK.TYPENUM.TABLE @@ -152,7 +155,7 @@ Copyright (c) 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, RENAMEMACROS) ) -(PUTPROPS LLARRAYELT FILETYPE :BCOMPL) +(PUTPROPS LLARRAYELT FILETYPE :BCOMPL) @@ -407,8 +410,8 @@ Copyright (c) 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, (DECLARE%: DONTCOPY (DECLARE%: EVAL@COMPILE -[PUTPROPS ARRAYSIZE DMACRO ((A) - (ffetch (ARRAYP LENGTH) of (\DTEST A 'ARRAYP] +(PUTPROPS ARRAYSIZE DMACRO [(A) + (ffetch (ARRAYP LENGTH) of (\DTEST A 'ARRAYP]) ) ) (DEFINEQ @@ -996,6 +999,108 @@ Copyright (c) 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992,  "Return T to say we printed it ourselves") T]) ) + + + +(* ; "Originally on MACHINEINDEPENDENT") + +(DEFINEQ + +(DMPHASH + [NLAMBDA L (* rmk%: " 6-Apr-84 14:30") + (MAPC L (FUNCTION (LAMBDA (ARRAYNAME) + (DECLARE (SPECVARS ARRAYNAME)) + (ERSETQ (PROG ((A (EVALV ARRAYNAME 'DMPHASH)) + AP) + [PRINT (LIST 'RPAQ ARRAYNAME + (COND + [(LISTP A) + (SETQ AP (CAR A)) + (LIST 'CONS [LIST 'HARRAY (HARRAYSIZE AP) + (KWOTE (HARRAYPROP + AP + 'OVERFLOW] + (KWOTE (CDR A] + (T (LIST 'HASHARRAY (HARRAYSIZE A) + (KWOTE (HARRAYPROP AP 'OVERFLOW] + (MAPHASH (OR AP A) + (FUNCTION (LAMBDA (VAL ITEM) + (PRINT (LIST 'PUTHASH (KWOTE ITEM) + (KWOTE VAL) + ARRAYNAME]) + +(HASHOVERFLOW + [LAMBDA (HARRAY) (* ; "Edited 26-Feb-91 13:16 by jds") + + (* ;; "Should be called from PUTHASH on hash overflow, but for implementations where PUTHASH calls ERRORX directly, may be called from ERRORX2 when the offender is a listp. HARRAY is guaranteed to be either HARRAYP or (LIST HARRAYP)") + + (PROG ((OLDARRAY (HASHOVERFLOW.ARRAYTEST HARRAY)) + NEWARRAY NEWSIZE OLDNUMKEYS OVACTION NEWOVFLW) + [COND + ((LISTP HARRAY) + (SETQ OVACTION (CDR HARRAY)) + + (* ;; "Get OVERFLOW method from original HARRAY since it would erroneously be ERROR if we got the method from the coerced OLDARRAY") + + (SETQ NEWOVFLW 'ERROR)) + (T (SETQ OVACTION (SETQ NEWOVFLW (HARRAYPROP OLDARRAY 'OVERFLOW] + (SETQ OLDNUMKEYS (HARRAYPROP OLDARRAY 'NUMKEYS)) + + (* ;; "Compute the new array size:") + + [SETQ NEWSIZE (SELECTQ OVACTION + (NIL + (* ;; "SIZE*1.5 --- favor to bbn, since pdp-11 doesnt have floatng point, and LRSH on other systems might be faster than IQUOTIENT") + + (* ;; + "[32749 IS THE BIGGEST PRIME < 32765, THE LIMIT ON ARRAY SIZES]") + + [IMAX (+ OLDNUMKEYS 3) + (IMIN 32749 (+ OLDNUMKEYS (LRSH (CL:1+ OLDNUMKEYS) + 1]) + (ERROR (do (ERRORX (LIST 26 HARRAY)))) + (if (FLOATP OVACTION) + then [IMAX (+ OLDNUMKEYS 3) + (IMIN 32760 (FIXR (FTIMES OLDNUMKEYS OVACTION] + elseif (FIXP OVACTION) + then (IMAX (+ OLDNUMKEYS 3) + (IMIN 32749 (+ OLDNUMKEYS OVACTION))) + elseif [AND (FNTYP OVACTION) + (NUMBERP (SETQ OVACTION (APPLY* OVACTION HARRAY] + then (if (FLOATP OVACTION) + then (* ; + "recompute NUMKEYS since OVACTION might have removed keys") + [IMAX (+ (SETQ OLDNUMKEYS (HARRAYPROP OLDARRAY + 'NUMKEYS)) + 3) + (IMIN 32749 (FIXR (FTIMES OLDNUMKEYS OVACTION] + else OVACTION) + else (* ; "Default: multiply by 1.5") + (SETQ OLDNUMKEYS (HARRAYPROP OLDARRAY 'NUMKEYS)) + (IMAX (+ OLDNUMKEYS 3) + (IMIN 32749 (+ OLDNUMKEYS (LRSH (CL:1+ OLDNUMKEYS) + 1] + [SETQ NEWARRAY (REHASH OLDARRAY (HASHARRAY NEWSIZE NEWOVFLW (HARRAYPROP OLDARRAY + 'HASHBITSFN) + (HARRAYPROP OLDARRAY 'EQUIVFN] + (HASHOVERFLOW.UPDATEARRAY HARRAY NEWARRAY OLDARRAY) + (RETURN HARRAY]) +) +(DECLARE%: EVAL@COMPILE DONTCOPY +(DECLARE%: EVAL@COMPILE + +[PROGN (PUTPROPS HASHOVERFLOW.ARRAYTEST MACRO [(HARRAY) + (CAR (OR (LISTP HARRAY) + (ERRORX (LIST 27 HARRAY]) + (PUTPROPS HASHOVERFLOW.ARRAYTEST DMACRO ((HARRAY) + (\DTEST HARRAY 'HARRAYP)))] + +[PROGN (PUTPROPS HASHOVERFLOW.UPDATEARRAY MACRO ((HARRAY NEWARRAY OLDARRAY) + (FRPLACA HARRAY NEWARRAY))) + (PUTPROPS HASHOVERFLOW.UPDATEARRAY DMACRO ((HARRAY NEWARRAY OLDARRAY) + (\COPYHARRAYP NEWARRAY OLDARRAY)))] +) +) (DEFINEQ (STRINGHASHBITS @@ -1048,20 +1153,20 @@ Copyright (c) 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, (DECLARE%: DONTCOPY (* "FOLLOWING DEFINITIONS EXPORTED")(DECLARE%: EVAL@COMPILE -(DATATYPE HARRAYP ((NULLSLOTS WORD) (* ; - "Number of NIL-NIL slots, which break chains") - (LASTINDEX WORD) (* ; "Slot offset of last slot. Used in probe computations computations. Microcode support for \ADDBASE4 would help") - (HARRAYPBASE POINTER) - (RECLAIMABLE FLAG) (* ; - "True if keys can go away when no other refs") - (OVERFLOWACTION POINTER) - (NUMSLOTS WORD) (* ; - "The maximum number of logical slots--returned by HARRAYSIZE") - (NUMKEYS WORD) (* ; - "The number of distinct keys in the array") - (HASHBITSFN POINTER) - (EQUIVFN POINTER) - (HASHUSERDATA POINTER))) +(DATATYPE HARRAYP ((NULLSLOTS WORD) (* ; + "Number of NIL-NIL slots, which break chains") + (LASTINDEX WORD) (* ; "Slot offset of last slot. Used in probe computations computations. Microcode support for \ADDBASE4 would help") + (HARRAYPBASE POINTER) + (RECLAIMABLE FLAG) (* ; + "True if keys can go away when no other refs") + (OVERFLOWACTION POINTER) + (NUMSLOTS WORD) (* ; + "The maximum number of logical slots--returned by HARRAYSIZE") + (NUMKEYS WORD) (* ; + "The number of distinct keys in the array") + (HASHBITSFN POINTER) + (EQUIVFN POINTER) + (HASHUSERDATA POINTER))) ) (/DECLAREDATATYPE 'HARRAYP '(WORD WORD POINTER FLAG POINTER WORD WORD POINTER POINTER POINTER) @@ -1078,14 +1183,14 @@ Copyright (c) 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, '14) (DECLARE%: EVAL@COMPILE -[PUTPROPS \EQHASHINGBITS MACRO (OPENLAMBDA (X) (* ; - "Spread out objects whose low bits are in small arithmetic progression, esp atoms") - (LOGXOR (\HILOC X) - (LOGXOR (LLSH (LOGAND (\LOLOC X) - 8191) - 3) - (LRSH (\LOLOC X) - 9] +(PUTPROPS \EQHASHINGBITS MACRO [OPENLAMBDA (X) (* ; + "Spread out objects whose low bits are in small arithmetic progression, esp atoms") + (LOGXOR (\HILOC X) + (LOGXOR (LLSH (LOGAND (\LOLOC X) + 8191) + 3) + (LRSH (\LOLOC X) + 9]) ) (* "END EXPORTED DEFINITIONS") @@ -1094,21 +1199,20 @@ Copyright (c) 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, (DECLARE%: EVAL@COMPILE (BLOCKRECORD HASHSLOT ((KEY POINTER) - (VALUE POINTER)) - [ACCESSFNS ((NEXTSLOT (\ADDBASE DATUM (UNFOLD WORDSPERCELL CELLSPERSLOT]) + (VALUE POINTER)) + [ACCESSFNS ((NEXTSLOT (\ADDBASE DATUM (UNFOLD WORDSPERCELL CELLSPERSLOT]) ) (DECLARE%: EVAL@COMPILE -[PUTPROPS \FIRSTINDEX MACRO ((BITS APTR1) - (IREMAINDER BITS (ADD1 (fetch (HARRAYP LASTINDEX) of APTR1] +(PUTPROPS \FIRSTINDEX MACRO [(BITS APTR1) + (IREMAINDER BITS (ADD1 (fetch (HARRAYP LASTINDEX) of APTR1]) -(PUTPROPS \HASHSLOT MACRO (= . \ADDBASE4)) +(PUTPROPS \HASHSLOT MACRO (= . \ADDBASE4)) -(PUTPROPS \REPROBE MACRO ((BITS HA) +(PUTPROPS \REPROBE MACRO ((BITS HA) (LOGOR [IREMAINDER (LOGXOR BITS (LRSH BITS 8)) - (IMIN 64 (ADD1 (fetch (HARRAYP LASTINDEX) - of HA] + (IMIN 64 (ADD1 (fetch (HARRAYP LASTINDEX) of HA] 1))) ) @@ -1145,15 +1249,15 @@ Copyright (c) 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, (ADDTOVAR SYSTEMRECLST (DATATYPE HARRAYP ((NULLSLOTS WORD) - (LASTINDEX WORD) - (HARRAYPBASE POINTER) - (RECLAIMABLE FLAG) - (OVERFLOWACTION POINTER) - (NUMSLOTS WORD) - (NUMKEYS WORD) - (HASHBITSFN POINTER) - (EQUIVFN POINTER) - (HASHUSERDATA POINTER))) + (LASTINDEX WORD) + (HARRAYPBASE POINTER) + (RECLAIMABLE FLAG) + (OVERFLOWACTION POINTER) + (NUMSLOTS WORD) + (NUMKEYS WORD) + (HASHBITSFN POINTER) + (EQUIVFN POINTER) + (HASHUSERDATA POINTER))) ) (RPAQQ \HASH.NULL.VALUE \Hash\Null\Value\) @@ -1277,14 +1381,14 @@ Copyright (c) 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, (DECLARE%: DONTCOPY (DECLARE%: EVAL@COMPILE -(PUTPROPS EQPTR DMACRO (= . EQ)) +(PUTPROPS EQPTR DMACRO (= . EQ)) -(PUTPROPS BUCKETINDEX MACRO ((N) +(PUTPROPS BUCKETINDEX MACRO ((N) (IMIN (INTEGERLENGTH N) \MAXBUCKETINDEX))) -[PUTPROPS FREEBLOCKCHAIN.N MACRO ((N) - (\ADDBASE2 \FREEBLOCKBUCKETS (BUCKETINDEX N] +(PUTPROPS FREEBLOCKCHAIN.N MACRO ((N) + (\ADDBASE2 \FREEBLOCKBUCKETS (BUCKETINDEX N)))) ) (DECLARE%: EVAL@COMPILE @@ -1297,43 +1401,43 @@ Copyright (c) 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, (* "FOLLOWING DEFINITIONS EXPORTED")(DECLARE%: EVAL@COMPILE -(PUTPROPS \ADDBASE2 MACRO (OPENLAMBDA (BASE N) - (\ADDBASE (\ADDBASE BASE N) - N))) +(PUTPROPS \ADDBASE2 MACRO (OPENLAMBDA (BASE N) + (\ADDBASE (\ADDBASE BASE N) + N))) -(PUTPROPS \ADDBASE4 MACRO (OPENLAMBDA (BASE N) - (\ADDBASE2 (\ADDBASE2 BASE N) - N))) +(PUTPROPS \ADDBASE4 MACRO (OPENLAMBDA (BASE N) + (\ADDBASE2 (\ADDBASE2 BASE N) + N))) -(PUTPROPS HUNKSIZEFROMNUMBER MACRO ((NTYPX) +(PUTPROPS HUNKSIZEFROMNUMBER MACRO ((NTYPX) (FOLDLO (fetch DTDSIZE of (\GETDTD NTYPX)) WORDSPERCELL))) -[PUTPROPS \BYTELT DMACRO (OPENLAMBDA (A J) - (\GETBASEBYTE (fetch (ARRAYP BASE) of A) - (IPLUS (fetch (ARRAYP OFFST) of A) - J] +(PUTPROPS \BYTELT DMACRO (OPENLAMBDA (A J) + (\GETBASEBYTE (fetch (ARRAYP BASE) of A) + (IPLUS (fetch (ARRAYP OFFST) of A) + J)))) -(PUTPROPS \BYTESETA DMACRO (OPENLAMBDA (A J V) - (\PUTBASEBYTE (fetch (ARRAYP BASE) of A) - (IPLUS (fetch (ARRAYP OFFST) of A) - J) - V))) +(PUTPROPS \BYTESETA DMACRO (OPENLAMBDA (A J V) + (\PUTBASEBYTE (fetch (ARRAYP BASE) of A) + (IPLUS (fetch (ARRAYP OFFST) of A) + J) + V))) -[PUTPROPS \WORDELT DMACRO (OPENLAMBDA (A J) - [CHECK (AND (ARRAYP A) - (EQ 0 (fetch (ARRAYP ORIG) of A)) - (EQ \ST.POS16 (fetch (ARRAYP TYP) of A] - (CHECK (IGREATERP (fetch (ARRAYP LENGTH) of A) - J)) - (\GETBASE (fetch (ARRAYP BASE) of A) - (IPLUS (fetch (ARRAYP OFFST) of A) - J] +(PUTPROPS \WORDELT DMACRO (OPENLAMBDA (A J) + [CHECK (AND (ARRAYP A) + (EQ 0 (fetch (ARRAYP ORIG) of A)) + (EQ \ST.POS16 (fetch (ARRAYP TYP) of A] + (CHECK (IGREATERP (fetch (ARRAYP LENGTH) of A) + J)) + (\GETBASE (fetch (ARRAYP BASE) of A) + (IPLUS (fetch (ARRAYP OFFST) of A) + J)))) ) (RPAQQ BLOCKGCTYPECONSTANTS ((CODEBLOCK.GCT 2) - (PTRBLOCK.GCT 1) - (UNBOXEDBLOCK.GCT 0))) + (PTRBLOCK.GCT 1) + (UNBOXEDBLOCK.GCT 0))) (DECLARE%: EVAL@COMPILE (RPAQQ CODEBLOCK.GCT 2) @@ -1348,33 +1452,24 @@ Copyright (c) 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, (UNBOXEDBLOCK.GCT 0)) ) -(RPAQQ ARRAYCONSTANTS (\ArrayBlockHeaderCells \ArrayBlockHeaderWords \ArrayBlockTrailerCells - \ArrayBlockTrailerWords (\ArrayBlockOverheadCells (IPLUS - \ArrayBlockHeaderCells - - \ArrayBlockTrailerCells - )) - (\ArrayBlockOverheadWords (IPLUS \ArrayBlockHeaderWords - \ArrayBlockTrailerWords)) - \ArrayBlockLinkingCells - (\MinArrayBlockSize (IPLUS \ArrayBlockOverheadCells - \ArrayBlockLinkingCells)) - (\MaxArrayBlockSize 65535) - (\MaxArrayNCells (IDIFFERENCE \MaxArrayBlockSize - \ArrayBlockOverheadCells)) - \MaxArrayLen - (\ABPASSWORDSHIFT 3) - (\ArrayBlockPassword (LRSH 43690 \ABPASSWORDSHIFT)) - (\FreeArrayFlagWord (LOGOR (LLSH \ArrayBlockPassword - \ABPASSWORDSHIFT) - (LLSH UNBOXEDBLOCK.GCT 1))) - (\UsedArrayFlagWord (LOGOR (LLSH \ArrayBlockPassword - \ABPASSWORDSHIFT) - 1)) - (\CodeArrayFlagWord (LOGOR (LLSH \ArrayBlockPassword - \ABPASSWORDSHIFT) - (LLSH CODEBLOCK.GCT 1) - 1)))) +(RPAQQ ARRAYCONSTANTS + (\ArrayBlockHeaderCells \ArrayBlockHeaderWords \ArrayBlockTrailerCells \ArrayBlockTrailerWords + (\ArrayBlockOverheadCells (IPLUS \ArrayBlockHeaderCells \ArrayBlockTrailerCells)) + (\ArrayBlockOverheadWords (IPLUS \ArrayBlockHeaderWords \ArrayBlockTrailerWords)) + \ArrayBlockLinkingCells + (\MinArrayBlockSize (IPLUS \ArrayBlockOverheadCells \ArrayBlockLinkingCells)) + (\MaxArrayBlockSize 65535) + (\MaxArrayNCells (IDIFFERENCE \MaxArrayBlockSize \ArrayBlockOverheadCells)) + \MaxArrayLen + (\ABPASSWORDSHIFT 3) + (\ArrayBlockPassword (LRSH 43690 \ABPASSWORDSHIFT)) + (\FreeArrayFlagWord (LOGOR (LLSH \ArrayBlockPassword \ABPASSWORDSHIFT) + (LLSH UNBOXEDBLOCK.GCT 1))) + (\UsedArrayFlagWord (LOGOR (LLSH \ArrayBlockPassword \ABPASSWORDSHIFT) + 1)) + (\CodeArrayFlagWord (LOGOR (LLSH \ArrayBlockPassword \ABPASSWORDSHIFT) + (LLSH CODEBLOCK.GCT 1) + 1)))) (DECLARE%: EVAL@COMPILE (RPAQQ \ArrayBlockHeaderCells 1) @@ -1404,14 +1499,14 @@ Copyright (c) 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, (RPAQ \ArrayBlockPassword (LRSH 43690 \ABPASSWORDSHIFT)) (RPAQ \FreeArrayFlagWord (LOGOR (LLSH \ArrayBlockPassword \ABPASSWORDSHIFT) - (LLSH UNBOXEDBLOCK.GCT 1))) + (LLSH UNBOXEDBLOCK.GCT 1))) (RPAQ \UsedArrayFlagWord (LOGOR (LLSH \ArrayBlockPassword \ABPASSWORDSHIFT) - 1)) + 1)) (RPAQ \CodeArrayFlagWord (LOGOR (LLSH \ArrayBlockPassword \ABPASSWORDSHIFT) - (LLSH CODEBLOCK.GCT 1) - 1)) + (LLSH CODEBLOCK.GCT 1) + 1)) (CONSTANTS \ArrayBlockHeaderCells \ArrayBlockHeaderWords \ArrayBlockTrailerCells @@ -1435,13 +1530,13 @@ Copyright (c) 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, ) (RPAQQ ARRAYTYPES ((\ST.BYTE 0) - (\ST.POS16 1) - (\ST.INT32 2) - (\ST.CODE 4) - (\ST.PTR 6) - (\ST.FLOAT 7) - (\ST.BIT 8) - (\ST.PTR2 11))) + (\ST.POS16 1) + (\ST.INT32 2) + (\ST.CODE 4) + (\ST.PTR 6) + (\ST.FLOAT 7) + (\ST.BIT 8) + (\ST.PTR2 11))) (DECLARE%: EVAL@COMPILE (RPAQQ \ST.BYTE 0) @@ -1487,52 +1582,51 @@ Copyright (c) 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, (DECLARE%: EVAL@COMPILE (BLOCKRECORD SEQUENCEDESCRIPTOR ((ORIG BITS 1) - (NIL BITS 1) - (READONLY FLAG) - (NIL BITS 1) - (BASE POINTER) - (TYP BITS 4) - (NIL BITS 4) - (LENGTH BITS 24) - (OFFST FIXP))) + (NIL BITS 1) + (READONLY FLAG) + (NIL BITS 1) + (BASE POINTER) + (TYP BITS 4) + (NIL BITS 4) + (LENGTH BITS 24) + (OFFST FIXP))) (DATATYPE ARRAYP ( - (* ;; "Describes an INTERLISP ARRAYP, as opposed to a CL array.") + (* ;; "Describes an INTERLISP ARRAYP, as opposed to a CL array.") - (ORIG BITS 1) (* ; "Origin, 0 or 1") - (NIL BITS 1) - (READONLY FLAG) (* ; "probably no READONLY arrays now") - (NIL BITS 1) - (BASE POINTER) - (TYP BITS 4) (* ; "Type of the contents") - (NIL BITS 4) - (LENGTH BITS 24) (* ; "Array's length") - (OFFST FIXP) (* ; - "Offset from BASE where the data really starts.") - ) + (ORIG BITS 1) (* ; "Origin, 0 or 1") + (NIL BITS 1) + (READONLY FLAG) (* ; "probably no READONLY arrays now") + (NIL BITS 1) + (BASE POINTER) + (TYP BITS 4) (* ; "Type of the contents") + (NIL BITS 4) + (LENGTH BITS 24) (* ; "Array's length") + (OFFST FIXP) (* ; + "Offset from BASE where the data really starts.") + ) - (* ;; "note that while ARRAYP is a DATATYPE, the allocation of it actually happens at MAKEINIT time under INITDATATYPE{NAMES}") + (* ;; "note that while ARRAYP is a DATATYPE, the allocation of it actually happens at MAKEINIT time under INITDATATYPE{NAMES}") - ) + ) (BLOCKRECORD ARRAYBLOCK ((PASSWORD BITS 13) - (GCTYPE BITS 2) (* ; "Unboxed, Pointers, or Code") - (INUSE FLAG) - (ARLEN WORD) - (FWD FULLXPOINTER) (* ; "Only when on free list") - (BKWD FULLXPOINTER)) - (BLOCKRECORD ARRAYBLOCK ((ABFLAGS WORD) + (GCTYPE BITS 2) (* ; "Unboxed, Pointers, or Code") + (INUSE FLAG) + (ARLEN WORD) + (FWD FULLXPOINTER) (* ; "Only when on free list") + (BKWD FULLXPOINTER)) + (BLOCKRECORD ARRAYBLOCK ((ABFLAGS WORD) (* ; "Used for header and trailer") - )) - [ACCESSFNS ARRAYBLOCK ((DAT (\ADDBASE DATUM \ArrayBlockHeaderWords)) - (TRAILER (\ADDBASE2 DATUM - (IDIFFERENCE (fetch - (ARRAYBLOCK ARLEN) - of DATUM) + )) + [ACCESSFNS ARRAYBLOCK ((DAT (\ADDBASE DATUM \ArrayBlockHeaderWords)) + (TRAILER (\ADDBASE2 DATUM (IDIFFERENCE + (fetch (ARRAYBLOCK ARLEN) + of DATUM) \ArrayBlockTrailerCells] - (TYPE? (AND (EQ 0 (NTYPX DATUM)) - (IGEQ (\HILOC DATUM) - \FirstArraySegment)))) + (TYPE? (AND (EQ 0 (NTYPX DATUM)) + (IGEQ (\HILOC DATUM) + \FirstArraySegment)))) ) (/DECLAREDATATYPE 'ARRAYP '((BITS 1) @@ -2273,8 +2367,8 @@ Copyright (c) 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, (DECLARE%: EVAL@COMPILE (BLOCKRECORD SAFTABLE ((SAFITEMS WORD) - (NIL WORD) - (SAFCELLS FIXP))) + (NIL WORD) + (SAFCELLS FIXP))) ) ) @@ -2484,7 +2578,7 @@ Copyright (c) 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, (DECLARE%: EVAL@COMPILE DONTCOPY (* "FOLLOWING DEFINITIONS EXPORTED")(DECLARE%: EVAL@COMPILE -(PUTPROPS HUNKSIZEFROMNUMBER MACRO ((NTYPX) +(PUTPROPS HUNKSIZEFROMNUMBER MACRO ((NTYPX) (FOLDLO (fetch DTDSIZE of (\GETDTD NTYPX)) WORDSPERCELL))) ) @@ -2494,8 +2588,7 @@ Copyright (c) 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, (DECLARE%: EVAL@COMPILE -(RPAQQ \HUNK.UNBOXEDSIZES - (1 2 3 4 5 6 7 8 9 10 12 14 16 20 24 28 32 40 48 64)) +(RPAQQ \HUNK.UNBOXEDSIZES (1 2 3 4 5 6 7 8 9 10 12 14 16 20 24 28 32 40 48 64)) (RPAQQ \HUNK.CODESIZES (12 16 20 24 28 32 36 42 50 64)) @@ -2721,49 +2814,49 @@ Copyright (c) 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, (DECLARE%: DONTCOPY (ADDTOVAR INITVALUES (\NxtArrayPage) - (\HUNKING?)) + (\HUNKING?)) (ADDTOVAR INITPTRS (\FREEBLOCKBUCKETS) - (\ArrayFrLst) - (\ArrayFrLst2) - (\UNBOXEDHUNK.TYPENUM.TABLE) - (\CODEHUNK.TYPENUM.TABLE) - (\PTRHUNK.TYPENUM.TABLE)) + (\ArrayFrLst) + (\ArrayFrLst2) + (\UNBOXEDHUNK.TYPENUM.TABLE) + (\CODEHUNK.TYPENUM.TABLE) + (\PTRHUNK.TYPENUM.TABLE)) (ADDTOVAR INEWCOMS (FNS \#BLOCKDATACELLS \PREFIXALIGNMENT? \ALLOCBLOCK \MAIKO.ALLOCBLOCK - \ALLOCBLOCK.NEW \MAKEFREEARRAYBLOCK \MERGEBACKWARD \LINKBLOCK \ALLOCHUNK) - (FNS PREINITARRAYS POSTINITARRAYS FILEARRAYBASE FILEBLOCKTRAILER FILECODEBLOCK - FILEPATCHBLOCK) - (FNS \SETUP.HUNK.TYPENUMBERS \COMPUTE.HUNK.TYPEDECLS \TURN.ON.HUNKING - \SETUP.TYPENUM.TABLE)) + \ALLOCBLOCK.NEW \MAKEFREEARRAYBLOCK \MERGEBACKWARD \LINKBLOCK \ALLOCHUNK) + (FNS PREINITARRAYS POSTINITARRAYS FILEARRAYBASE FILEBLOCKTRAILER FILECODEBLOCK + FILEPATCHBLOCK) + (FNS \SETUP.HUNK.TYPENUMBERS \COMPUTE.HUNK.TYPEDECLS \TURN.ON.HUNKING + \SETUP.TYPENUM.TABLE)) (ADDTOVAR MKI.SUBFNS (\IN.MAKEINIT . T) - (\ALLOCBLOCK.OLD . NILL) - (\MERGEFORWARD . NILL) - (\FIXCODENUM . I.FIXUPNUM) - (\FIXCODESYM . I.FIXUPSYM) - (\FIXCODEPTR . I.FIXUPPTR) - (\CHECKARRAYBLOCK . NILL) - (\ARRAYMERGING PROGN NIL)) + (\ALLOCBLOCK.OLD . NILL) + (\MERGEFORWARD . NILL) + (\FIXCODENUM . I.FIXUPNUM) + (\FIXCODESYM . I.FIXUPSYM) + (\FIXCODEPTR . I.FIXUPPTR) + (\CHECKARRAYBLOCK . NILL) + (\ARRAYMERGING PROGN NIL)) (ADDTOVAR EXPANDMACROFNS \ADDBASE2 \ADDBASE4 HUNKSIZEFROMNUMBER BUCKETINDEX FREEBLOCKCHAIN.N) (ADDTOVAR RDCOMS (FNS \CHECKARRAYBLOCK \PARSEARRAYSPACE \PARSEARRAYSPACE1)) (ADDTOVAR RD.SUBFNS (EQPTR . EQUAL) - (ARRAYBLOCKCHECKING . T)) + (ARRAYBLOCKCHECKING . T)) (ADDTOVAR RDPTRS (\FREEBLOCKBUCKETS)) (ADDTOVAR RDVALS (\ArrayFrLst) - (\ArrayFrLst2)) + (\ArrayFrLst2)) EVAL@COMPILE -(ADDTOVAR DONTCOMPILEFNS PREINITARRAYS POSTINITARRAYS FILEARRAYBASE FILEBLOCKTRAILER - FILECODEBLOCK FILEPATCHBLOCK) +(ADDTOVAR DONTCOMPILEFNS PREINITARRAYS POSTINITARRAYS FILEARRAYBASE FILEBLOCKTRAILER FILECODEBLOCK + FILEPATCHBLOCK) (ADDTOVAR DONTCOMPILEFNS \SETUP.HUNK.TYPENUMBERS \COMPUTE.HUNK.TYPEDECLS \TURN.ON.HUNKING - \SETUP.TYPENUM.TABLE) + \SETUP.TYPENUM.TABLE) ) @@ -2937,32 +3030,174 @@ EVAL@COMPILE (ADDTOVAR LAMA CL::PUTHASH HARRAYPROP) ) -(PUTPROPS LLARRAYELT COPYRIGHT ("Venue & Xerox Corporation" 1982 1983 1984 1985 1986 1987 1988 1989 -1990 1991 1992 1993 1994)) +(PRETTYCOMPRINT LLARRAYELTCOMS) + +(RPAQQ LLARRAYELTCOMS + [(COMS (* ; + "Because we use the UNLESSINEW macro in this file, we need it when compiling.") + (DECLARE%: EVAL@COMPILE DONTCOPY (FILES (SOURCE) + RENAMEMACROS))) + (PROPS (LLARRAYELT FILETYPE)) + (COMS (* ; "ARRAY entries") + (FNS AIN AOUT ARRAY ARRAYSIZE ARRAYTYP ARRAYORIG COPYARRAY) + (DECLARE%: DONTCOPY (MACROS ARRAYSIZE)) + (FNS ELT ELTD SETA SETD SUBARRAY)) + [COMS (* ; "HASHARRAY entries") + (FNS HARRAY HASHARRAY HARRAYP HARRAYPROP HARRAYSIZE CLRHASH MAPHASH GETHASH PUTHASH + CL::PUTHASH REMHASH \HASHRECLAIM \HASHACCESS REHASH \COPYHARRAYP + \HASHTABLE.DEFPRINT) + (COMS (* ; "Originally on MACHINEINDEPENDENT") + (FNS DMPHASH HASHOVERFLOW) + (DECLARE%: EVAL@COMPILE DONTCOPY (MACROS HASHOVERFLOW.ARRAYTEST + HASHOVERFLOW.UPDATEARRAY))) + (FNS STRINGHASHBITS STRING-EQUAL-HASHBITS) + (FNS \STRINGHASHBITS-UFN \STRING-EQUAL-HASHBITS-UFN) + (DECLARE%: DONTCOPY (EXPORT (RECORDS HARRAYP) + (MACROS \EQHASHINGBITS)) + (RECORDS HASHSLOT) + (MACROS \FIRSTINDEX \HASHSLOT \REPROBE) + (CONSTANTS (CELLSPERSLOT 2)) + (GLOBALVARS \HASH.NULL.VALUE SYSHASHARRAY)) + [DECLARE%: DONTEVAL@LOAD DOCOPY (P (DEFPRINT 'HARRAYP '\HASHTABLE.DEFPRINT] + (INITRECORDS HARRAYP) + (SYSRECORDS HARRAYP) + (VARS (\HASH.NULL.VALUE '\Hash\Null\Value\] + (COMS (* ; "System entries for CODE") + (FNS \CODEARRAY \FIXCODENUM \FIXCODEPTR \FIXCODESYM)) + (COMS (* ; "Internal") + (DECLARE%: DONTCOPY (MACROS EQPTR BUCKETINDEX FREEBLOCKCHAIN.N) + (CONSTANTS \MAXBUCKETINDEX) + (* ; + "\ADDBASE2 and \ADDBASE4 do \ADDBASE of 2*N and 4*N without boxing") + (EXPORT (MACROS \ADDBASE2 \ADDBASE4 HUNKSIZEFROMNUMBER \BYTELT \BYTESETA + \WORDELT) + (CONSTANTS * BLOCKGCTYPECONSTANTS) + (CONSTANTS * ARRAYCONSTANTS) + (CONSTANTS * ARRAYTYPES) + (CONSTANTS \MAX.CELLSPERHUNK) + (CONSTANTS (\IN.MAKEINIT)) + (RECORDS SEQUENCEDESCRIPTOR ARRAYP ARRAYBLOCK) + (GLOBALVARS \NxtArrayPage \FREEBLOCKBUCKETS \HUNKING?)) + (GLOBALVARS \ArrayFrLst \ArrayFrLst2 \RECLAIM.COUNTDOWN)) + (FNS \ALLOCBLOCK \MAIKO.ALLOCBLOCK \ALLOCBLOCK.OLD \ALLOCBLOCK.NEW \PREFIXALIGNMENT? + \MAKEFREEARRAYBLOCK \DELETEBLOCK? \LINKBLOCK \MERGEBACKWARD \MERGEFORWARD + \ARRAYBLOCKMERGER \#BLOCKDATACELLS \COPYARRAYBLOCK \RECLAIMARRAYBLOCK + \ADVANCE.ARRAY.SEGMENTS) + (ADDVARS (\MAIKO.MOVDS (\MAIKO.ALLOCBLOCK \ALLOCBLOCK))) + (FNS \BYTELT \BYTESETA \WORDELT) + (FNS \ARRAYTYPENAME) + (VARS (\ARRAYMERGING T)) + (GLOBALVARS \ARRAYMERGING) + (COMS (* ; "for STORAGE") + (FNS \SHOW.ARRAY.FREELISTS) + (INITVARS (\ABSTORAGETABLE NIL)) + (GLOBALVARS \ABSTORAGETABLE) + (DECLARE%: DONTCOPY (RECORDS SAFTABLE))) + (COMS (* ; "Debugging and RDSYS") + (FNS \CHECKARRAYBLOCK \PARSEARRAYSPACE \PARSEARRAYSPACE1) + (INITVARS (ARRAYBLOCKCHECKING)) + (GLOBALVARS ARRAYBLOCKCHECKING))) + (COMS (* ; "Basic hunking") + (FNS \ALLOCHUNK) + (VARS \HUNK.PTRSIZES) + (* ; + "Compiler needs \HUNK.PTRSIZES for creating closure environments") + (DECLARE%: EVAL@COMPILE DONTCOPY (EXPORT (MACROS HUNKSIZEFROMNUMBER)) + (CONSTANTS \HUNK.UNBOXEDSIZES \HUNK.CODESIZES \HUNK.PTRSIZES) + (GLOBALVARS \HUNKING? \UNBOXEDHUNK.TYPENUM.TABLE \CODEHUNK.TYPENUM.TABLE + \PTRHUNK.TYPENUM.TABLE)) + (COMS + (* ;; "Keep a list of all the hunks rejected due to poor page-straddling alignment, or to code falling off the end of a doublepage") + + (VARS (\HUNKREJECTS)) + (GLOBALVARS \HUNKREJECTS))) + [COMS (* ; "for MAKEINIT") + (FNS PREINITARRAYS POSTINITARRAYS FILEARRAYBASE FILEBLOCKTRAILER FILECODEBLOCK + FILEPATCHBLOCK) + (COMS (* ; "Hunk Initialization") + (FNS \SETUP.HUNK.TYPENUMBERS \COMPUTE.HUNK.TYPEDECLS \TURN.ON.HUNKING + \SETUP.TYPENUM.TABLE)) + (DECLARE%: DONTCOPY (ADDVARS (INITVALUES (\NxtArrayPage) + (\HUNKING?)) + (INITPTRS (\FREEBLOCKBUCKETS) + (\ArrayFrLst) + (\ArrayFrLst2) + (\UNBOXEDHUNK.TYPENUM.TABLE) + (\CODEHUNK.TYPENUM.TABLE) + (\PTRHUNK.TYPENUM.TABLE)) + (INEWCOMS (FNS \#BLOCKDATACELLS \PREFIXALIGNMENT? + \ALLOCBLOCK \MAIKO.ALLOCBLOCK \ALLOCBLOCK.NEW + \MAKEFREEARRAYBLOCK \MERGEBACKWARD \LINKBLOCK + \ALLOCHUNK) + (FNS PREINITARRAYS POSTINITARRAYS FILEARRAYBASE + FILEBLOCKTRAILER FILECODEBLOCK FILEPATCHBLOCK) + (FNS \SETUP.HUNK.TYPENUMBERS \COMPUTE.HUNK.TYPEDECLS + \TURN.ON.HUNKING \SETUP.TYPENUM.TABLE)) + (MKI.SUBFNS (\IN.MAKEINIT . T) + (\ALLOCBLOCK.OLD . NILL) + (\MERGEFORWARD . NILL) + (\FIXCODENUM . I.FIXUPNUM) + (\FIXCODESYM . I.FIXUPSYM) + (\FIXCODEPTR . I.FIXUPPTR) + (\CHECKARRAYBLOCK . NILL) + (\ARRAYMERGING PROGN NIL)) + (EXPANDMACROFNS \ADDBASE2 \ADDBASE4 HUNKSIZEFROMNUMBER + BUCKETINDEX FREEBLOCKCHAIN.N) + (RDCOMS (FNS \CHECKARRAYBLOCK \PARSEARRAYSPACE + \PARSEARRAYSPACE1)) + (RD.SUBFNS (EQPTR . EQUAL) + (ARRAYBLOCKCHECKING . T)) + (RDPTRS (\FREEBLOCKBUCKETS)) + (RDVALS (\ArrayFrLst) + (\ArrayFrLst2))) + EVAL@COMPILE + (ADDVARS (DONTCOMPILEFNS PREINITARRAYS POSTINITARRAYS FILEARRAYBASE + FILEBLOCKTRAILER FILECODEBLOCK FILEPATCHBLOCK) + (DONTCOMPILEFNS \SETUP.HUNK.TYPENUMBERS \COMPUTE.HUNK.TYPEDECLS + \TURN.ON.HUNKING \SETUP.TYPENUM.TABLE] + (COMS (* ; "Debugging aids") + (DECLARE%: EVAL@COMPILE DONTCOPY (GLOBALVARS \ArrayFrLst) + (CONSTANTS \ArrayBlockPassword) + (ADDVARS (DONTCOMPILEFNS \HUNKFIT? \AB.NEXT \AB.BACK))) + (FNS \HUNKFIT? \AB.NEXT \AB.BACK)) + (LOCALVARS . T) + (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA DMPHASH) + (NLAML) + (LAMA CL::PUTHASH + HARRAYPROP]) +(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS + +(ADDTOVAR NLAMA DMPHASH) + +(ADDTOVAR NLAML ) + +(ADDTOVAR LAMA CL::PUTHASH HARRAYPROP) +) (DECLARE%: DONTCOPY - (FILEMAP (NIL (9739 22117 (AIN 9749 . 12022) (AOUT 12024 . 14626) (ARRAY 14628 . 20213) (ARRAYSIZE -20215 . 20355) (ARRAYTYP 20357 . 20953) (ARRAYORIG 20955 . 21122) (COPYARRAY 21124 . 22115)) (22283 -29928 (ELT 22293 . 23722) (ELTD 23724 . 24649) (SETA 24651 . 26908) (SETD 26910 . 27904) (SUBARRAY -27906 . 29926)) (29963 55572 (HARRAY 29973 . 30193) (HASHARRAY 30195 . 34218) (HARRAYP 34220 . 34369) -(HARRAYPROP 34371 . 38406) (HARRAYSIZE 38408 . 38573) (CLRHASH 38575 . 39947) (MAPHASH 39949 . 41078) -(GETHASH 41080 . 44660) (PUTHASH 44662 . 44893) (CL::PUTHASH 44895 . 45607) (REMHASH 45609 . 45754) ( -\HASHRECLAIM 45756 . 47539) (\HASHACCESS 47541 . 53303) (REHASH 53305 . 54029) (\COPYHARRAYP 54031 . -54761) (\HASHTABLE.DEFPRINT 54763 . 55570)) (55573 56129 (STRINGHASHBITS 55583 . 55740) ( -STRING-EQUAL-HASHBITS 55742 . 56127)) (56130 58192 (\STRINGHASHBITS-UFN 56140 . 57246) ( -\STRING-EQUAL-HASHBITS-UFN 57248 . 58190)) (62479 67574 (\CODEARRAY 62489 . 63319) (\FIXCODENUM 63321 - . 63986) (\FIXCODEPTR 63988 . 65048) (\FIXCODESYM 65050 . 67572)) (79255 114491 (\ALLOCBLOCK 79265 . -83264) (\MAIKO.ALLOCBLOCK 83266 . 87458) (\ALLOCBLOCK.OLD 87460 . 92331) (\ALLOCBLOCK.NEW 92333 . -95339) (\PREFIXALIGNMENT? 95341 . 98884) (\MAKEFREEARRAYBLOCK 98886 . 99481) (\DELETEBLOCK? 99483 . -100588) (\LINKBLOCK 100590 . 102716) (\MERGEBACKWARD 102718 . 104079) (\MERGEFORWARD 104081 . 105178) -(\ARRAYBLOCKMERGER 105180 . 107365) (\#BLOCKDATACELLS 107367 . 108603) (\COPYARRAYBLOCK 108605 . -110173) (\RECLAIMARRAYBLOCK 110175 . 112304) (\ADVANCE.ARRAY.SEGMENTS 112306 . 114489)) (114553 116986 - (\BYTELT 114563 . 115362) (\BYTESETA 115364 . 116305) (\WORDELT 116307 . 116984)) (116987 117321 ( -\ARRAYTYPENAME 116997 . 117319)) (117444 121138 (\SHOW.ARRAY.FREELISTS 117454 . 121136)) (121451 -127201 (\CHECKARRAYBLOCK 121461 . 125836) (\PARSEARRAYSPACE 125838 . 126247) (\PARSEARRAYSPACE1 126249 - . 127199)) (127335 133601 (\ALLOCHUNK 127345 . 133599)) (134779 140675 (PREINITARRAYS 134789 . 135330 -) (POSTINITARRAYS 135332 . 138050) (FILEARRAYBASE 138052 . 138464) (FILEBLOCKTRAILER 138466 . 138761) -(FILECODEBLOCK 138763 . 139779) (FILEPATCHBLOCK 139781 . 140673)) (140712 146136 ( -\SETUP.HUNK.TYPENUMBERS 140722 . 141758) (\COMPUTE.HUNK.TYPEDECLS 141760 . 143040) (\TURN.ON.HUNKING -143042 . 143714) (\SETUP.TYPENUM.TABLE 143716 . 146134)) (148399 155000 (\HUNKFIT? 148409 . 149024) ( -\AB.NEXT 149026 . 152221) (\AB.BACK 152223 . 154998))))) + (FILEMAP (NIL (9935 22313 (AIN 9945 . 12218) (AOUT 12220 . 14822) (ARRAY 14824 . 20409) (ARRAYSIZE +20411 . 20551) (ARRAYTYP 20553 . 21149) (ARRAYORIG 21151 . 21318) (COPYARRAY 21320 . 22311)) (22488 +30133 (ELT 22498 . 23927) (ELTD 23929 . 24854) (SETA 24856 . 27113) (SETD 27115 . 28109) (SUBARRAY +28111 . 30131)) (30168 55777 (HARRAY 30178 . 30398) (HASHARRAY 30400 . 34423) (HARRAYP 34425 . 34574) +(HARRAYPROP 34576 . 38611) (HARRAYSIZE 38613 . 38778) (CLRHASH 38780 . 40152) (MAPHASH 40154 . 41283) +(GETHASH 41285 . 44865) (PUTHASH 44867 . 45098) (CL::PUTHASH 45100 . 45812) (REMHASH 45814 . 45959) ( +\HASHRECLAIM 45961 . 47744) (\HASHACCESS 47746 . 53508) (REHASH 53510 . 54234) (\COPYHARRAYP 54236 . +54966) (\HASHTABLE.DEFPRINT 54968 . 55775)) (55827 61097 (DMPHASH 55837 . 57451) (HASHOVERFLOW 57453 + . 61095)) (61873 62429 (STRINGHASHBITS 61883 . 62040) (STRING-EQUAL-HASHBITS 62042 . 62427)) (62430 +64492 (\STRINGHASHBITS-UFN 62440 . 63546) (\STRING-EQUAL-HASHBITS-UFN 63548 . 64490)) (68675 73770 ( +\CODEARRAY 68685 . 69515) (\FIXCODENUM 69517 . 70182) (\FIXCODEPTR 70184 . 71244) (\FIXCODESYM 71246 + . 73768)) (84170 119406 (\ALLOCBLOCK 84180 . 88179) (\MAIKO.ALLOCBLOCK 88181 . 92373) ( +\ALLOCBLOCK.OLD 92375 . 97246) (\ALLOCBLOCK.NEW 97248 . 100254) (\PREFIXALIGNMENT? 100256 . 103799) ( +\MAKEFREEARRAYBLOCK 103801 . 104396) (\DELETEBLOCK? 104398 . 105503) (\LINKBLOCK 105505 . 107631) ( +\MERGEBACKWARD 107633 . 108994) (\MERGEFORWARD 108996 . 110093) (\ARRAYBLOCKMERGER 110095 . 112280) ( +\#BLOCKDATACELLS 112282 . 113518) (\COPYARRAYBLOCK 113520 . 115088) (\RECLAIMARRAYBLOCK 115090 . +117219) (\ADVANCE.ARRAY.SEGMENTS 117221 . 119404)) (119468 121901 (\BYTELT 119478 . 120277) (\BYTESETA + 120279 . 121220) (\WORDELT 121222 . 121899)) (121902 122236 (\ARRAYTYPENAME 121912 . 122234)) (122359 + 126053 (\SHOW.ARRAY.FREELISTS 122369 . 126051)) (126358 132108 (\CHECKARRAYBLOCK 126368 . 130743) ( +\PARSEARRAYSPACE 130745 . 131154) (\PARSEARRAYSPACE1 131156 . 132106)) (132242 138508 (\ALLOCHUNK +132252 . 138506)) (139686 145582 (PREINITARRAYS 139696 . 140237) (POSTINITARRAYS 140239 . 142957) ( +FILEARRAYBASE 142959 . 143371) (FILEBLOCKTRAILER 143373 . 143668) (FILECODEBLOCK 143670 . 144686) ( +FILEPATCHBLOCK 144688 . 145580)) (145619 151043 (\SETUP.HUNK.TYPENUMBERS 145629 . 146665) ( +\COMPUTE.HUNK.TYPEDECLS 146667 . 147947) (\TURN.ON.HUNKING 147949 . 148621) (\SETUP.TYPENUM.TABLE +148623 . 151041)) (153219 159820 (\HUNKFIT? 153229 . 153844) (\AB.NEXT 153846 . 157041) (\AB.BACK +157043 . 159818))))) STOP diff --git a/sources/LLARRAYELT.LCOM b/sources/LLARRAYELT.LCOM index 307ee5084a7a200eaf175ee018a9cf641704f7f3..00bd047c59427603064cfd0d997806e006dd3b8e 100644 GIT binary patch delta 2614 zcmeHIOK%%h6!xRE;3C&aLmOF@I9O2ZNKWVBS4^dPYG2or%*>t4jP1CMls+aTQPVUE z6#^j`#DYZy5~|fjg#d{isEa(BRcXvmU=i4`Kp-I`q)N2}5@G}AUfYQsb;F*KX68Q5 z<2&bk=iYz5_y2f1@JZ!dC|*`IQnZNTkP^fsDOsMsnv?`71EQQyr}C*>4C1kCH*c&i zEzi4fa|L4XPF*J@jWpgp+g$aJcv1pFF-h#x%;d$1yqJx_)wTIO)%mwp*WP#~4=Xos zEiSDrz!I7&S2Yd#RmaE2W8hx7g|41vQ%c7Y2O+=sRLp}I7bFlf6B#iDc~VlH30$oA3B!eTU9IJj8AMHAm>^f{&!@x{|wFfC6t z986kDg6S&75G1iXNP$^(7&6>Vg!)l-0Gc3zt>*J%Ma3yrk`{5QmXR!5R38HqvGToA zRo5HIGPROiY7C>u?ni;MoW}(X%_h!t5(BNW*uFgy2>6x?L)PJXm`4<1kQa9z@ku?b z2e+$ysPkBieVJMJ!N@=^Gz^(V&0a3tGPZ;IzJk|UbfecId?DiB;eY-y4w}Ar(DY>2 zv>v$RKKKH?Zr#HY+~wL+>$iPz5wlw1H8U-W`I5!%)K)JN5Csu*#pBh7Tn1}_rGWH+ zN@`Fe0|Zl4!-|NxY`0EgdZIUyvp{RaDr>Y3qLl7B!=V60YS_q03GxQDbVY-S4DgzI z1Juj(Y^C~4$;=XpG3JAm0?SmU(N;%)kRN;86#yw~g504&r@UoNxxly~!5HSFNJt4; z;n~Dyiyboc^MJExkMYQrRKFfmL#DiR$RG3<)}yX}Xvlw=vBZfE4FxB8@rI8Fg4@3> zBGo0ihnDvlOQ6&tp4VaCJ|LTL!n26?lG*D>p_|e~0{m|t^ZERR!_4K-&*4IFTdeTP zbE?ih?3-Mi+CJkh2X`mk>$|_~K3ee}>+MhVj{*;wyyyF7{RdpyagFw!4d34_W5f3+ zH}vGQb1eZO5K2LC;qv&(Ay*1LJqaQO2r&^v%Pqn{n(Nm3zs`Z)a z8$Qo+%+u;t_^*H!m9qlO7OC0jHW3NBib`^U+3$8hF>4 z4ZHzS+oJY>$T;s$huF^Ga@Az_A>T}3vv3!-g9qG&UhL5PDgMGC+zK^+t*Xs4wWvST zRBP(VS&Lx8&*L=^XNQ)f7!F1gYJOF#L>U-%0v0r?l%PaAz)ZG%w62dr+-}$wDN?J% zV6yYd4On!Hb6e^!v+dgL@u;wWAu zXS)WBY}2;`^T4&lj@2D_PA`C%8tNXqF8pa-6h#)M;es0eE7C?pl~|tnm3y@ft_eQL z1*`%>hNK%BW?_>uiOW373i8hw`+zh}*^?l89;P!=!Xl$SInQeMy^aseMc@Gsc|l&r z*|NMaMJHHUr$r|MmZ+d&sL0Ty{}S9=pEqvruI~vS#hq@?2S1=K9M-)YH~|%`PK2vX z9=Q6h`XKC7pGT;{RNqFos^-|CY%so7&BiumpT;+<^YPIQ1~`A{Z!Ozf%UmT+9@4S- z1gdwFE@gM3>&+vx?e%?Ff1lWwt2gs2S-U?Ndd{I8&|mU|q)P&K;VCJyQ)p*Jo)zID t&QcZ-*5w+M8fa#$Yc=fEKug5BUIPXOVJuOKQ4RG9u2-UNICODE-FORMATS.;2 216288 + + :EDIT-BY rmk + + :CHANGES-TO (VARS UNICODE-FORMATSCOMS) + (FNS MAKE-UNICODE-FORMATS) + + :PREVIOUS-DATE "23-Feb-2026 08:52:29" {WMEDLEY}UNICODE-UTF8.;26) + + +(PRETTYCOMPRINT UNICODE-FORMATSCOMS) + +(RPAQQ UNICODE-FORMATSCOMS + ( + (* ;; "Defines the UTF-8 external format. This is part of the MAKEINIT, and therefore loads and uses the ALIST mapping that is created whenever the file is dumped. ") + + (FNS UTF8.OUTCHARFN UTF8.SLUG.OUTCHARFN UTF8.INCCODEFN UTF8.PEEKCCODEFN \UTF8.BACKCCODEFN) + (FNS UTF16BE.OUTCHARFN UTF16BE.INCCODEFN UTF16BE.PEEKCCODEFN \UTF16BE.BACKCCODEFN) + (FNS UTF16LE.OUTCHARFN UTF16LE.INCCODEFN UTF16LE.PEEKCCODEFN \UTF16LE.BACKCCODEFN) + (FNS READBOM WRITEBOM) + (FNS MAKE-UNICODE-FORMATS) + [DECLARE%: DONTEVAL@LOAD DOCOPY (P (MAKE-UNICODE-FORMATS 'LF] + (FNS UTF8.BINCODE \UTF8.FETCHCODE) + (FNS UTF8.VALIDATE NUTF8-BYTE1-BYTES NUTF8-CODE-BYTES NUTF8-STRING-BYTES N-MCHARS) + (COMS (* ; + "For MAKEINIT, before hashing--no need for XCCS") + (FNS MTOUCODE UTOMCODE MTOUCODE? UTOMCODE?)) + (FNS MTOUSTRING UTOMSTRING MTOUTF8STRING UTF8TOMSTRING) + (* ; + "XCCS is not so interesting in the loadup") + (FNS XTOUCODE UTOXCODE XTOUCODE? UTOXCODE? XTOUSTRING UTOXSTRING XTOUTF8STRING) + (FNS MERGE-UNICODE-TRANSLATION-TABLES UNICODE.UNMAPPED) + (DECLARE%: EVAL@COMPILE DONTCOPY (MACROS UNICODE.TRANSLATE \UTF8.GETBASEBYTE UNICODE.SMALLP + TRUECODEP)) + (ADDVARS (*DEFAULT-EXTERNALFORMATS* (UNIX :UTF-8))) + (INITVARS *MCCSTOUNICODE* *UNICODETOMCCS* *LARGEUNICODES*) + (GLOBALVARS *MCCSTOUNICODE* *UNICODETOMCCS* *LARGEUNICODES*) + (COMS + (* ;; "There are 6400 private Unicodes in 25 256-code charsets. For MCCS we map to a contiguous region of unused/reserved--private isn't big enough") + + (GLOBALVARS *NEXT-PRIVATE-UNICODE* *NEXT-PRIVATE-MCCSCODE*) + [DECLARE%: EVAL@COMPILE DONTCOPY (CONSTANTS (FIRST-PRIVATE-UNICODE (HEXNUM? "E000")) + (LAST-PRIVATE-UNICODE (HEXNUM? "F8FF")) + (FIRST-PRIVATE-MCCSCODE (CHARCODE "200,0")) + (LAST-PRIVATE-MCCSCODE (CHARCODE "230,377"] + (FNS UNICODE-INIT) + (P (UNICODE-INIT))) + (DECLARE%: EVAL@LOAD DONTCOPY (FILES UNICODE-TABLES)) + (E (PRINTOUT NIL "(MERGE-UNICODE-TRANSLATION-TABLES NIL (QUOTE " (GET-MCCS-UNICODE-MAPPING + 'ALL) + "))" T)))) + + + +(* ;; +"Defines the UTF-8 external format. This is part of the MAKEINIT, and therefore loads and uses the ALIST mapping that is created whenever the file is dumped. " +) + +(DEFINEQ + +(UTF8.OUTCHARFN + [LAMBDA (STREAM CHARCODE RAW) (* ; "Edited 24-Apr-2025 15:43 by rmk") + (* ; "Edited 20-Jan-2025 20:45 by rmk") + (* ; "Edited 31-Jan-2024 00:32 by rmk") + (* ; "Edited 8-Aug-2021 13:02 by rmk:") + (* ; "Edited 17-Aug-2020 08:45 by rmk:") + (* ; "Edited 30-Jan-2020 23:08 by rmk:") + + (* ;; "Perhaps the translation table should already do the mapping for EOL to LF, but that seems to be a separate property of the stream. Also, CRLF=2 bytes.") + + (* ;; "Print UTF8 sequence for CHARCODE. Do not do MCCS to Unicode translation if RAW.") + + (IF (EQ CHARCODE (CHARCODE EOL)) + THEN (FREPLACE (STREAM CHARPOSITION) OF STREAM WITH 0) + (\BOUTEOL STREAM) + ELSE (CHANGE (FFETCH (STREAM CHARPOSITION) OF STREAM) + (IPLUS16 1 DATUM)) + (FOR C INSIDE (CL:IF RAW + CHARCODE + (UNICODE.TRANSLATE CHARCODE *MCCSTOUNICODE*)) + DO (IF (ILESSP C 128) + THEN (\BOUT STREAM C) + ELSEIF (ILESSP C 2048) + THEN (* ; "x800") + (\BOUT STREAM (LOGOR (LLSH 3 6) + (LRSH C 6))) + (\BOUT STREAM (LOGOR (LLSH 2 6) + (LOADBYTE C 0 6))) + ELSEIF (ILESSP C 65536) + THEN (* ; "x10000") + (\BOUT STREAM (LOGOR (LLSH 7 5) + (LRSH C 12))) + (\BOUT STREAM (LOGOR (LLSH 2 6) + (LOADBYTE C 6 6))) + (\BOUT STREAM (LOGOR (LLSH 2 6) + (LOADBYTE C 0 6))) + ELSEIF (ILESSP C 2097152) + THEN (* ; "x200000") + (\BOUT STREAM (LOGOR (LLSH 15 4) + (LRSH C 18))) + (\BOUT STREAM (LOGOR (LLSH 2 6) + (LOADBYTE C 12 6))) + (\BOUT STREAM (LOGOR (LLSH 2 6) + (LOADBYTE C 6 6))) + (\BOUT STREAM (LOGOR (LLSH 2 6) + (LOADBYTE C 0 6))) + ELSE (ERROR "CHARCODE too big for UTF8" C]) + +(UTF8.SLUG.OUTCHARFN + [LAMBDA (STREAM CODE RAW) (* ; "Edited 24-Apr-2025 15:43 by rmk") + (* ; "Edited 21-Jan-2025 18:37 by rmk") + (* ; "Edited 14-Jan-2025 12:39 by rmk") + + (* ;; "Produces Unicode Representative FFFD as a slug for MCCS unmapped characters") + + (UTF8.OUTCHARFN STREAM (OR (CL:IF RAW + CODE + (XTOUCODE? CODE)) + (CONSTANT (HEXNUM? "FFFD"))) + T]) + +(UTF8.INCCODEFN + [LAMBDA (STREAM COUNTP RAW) (* ; "Edited 22-Feb-2026 14:13 by rmk") + (* ; "Edited 19-Feb-2026 11:31 by rmk") + (* ; "Edited 23-Oct-2025 08:31 by rmk") + (* ; "Edited 24-Apr-2025 15:44 by rmk") + (* ; "Edited 2-Feb-2024 11:44 by rmk") + (* ; "Edited 30-Jan-2024 22:56 by rmk") + (* ; "Edited 6-Aug-2021 16:02 by rmk:") + (* ; "Edited 6-Aug-2020 17:13 by rmk:") + + (* ;; "Do not do UNICODE to MCSS translation if RAW.") + + (* ;; "Test for smallp because the stream's End-of-file operation may suppress the error") + + (DECLARE (USEDFREE *BYTECOUNTER*)) + (LET (BYTE1 BYTE2 BYTE3 BYTE4 CODE (COUNT 1)) + (SETQ BYTE1 (\BIN STREAM)) + + (* ;; "Distinguish on header bytes (modulo peculiar EOF behavior--the caller will get whatever ended up in BYTE1") + + (CL:WHEN (SMALLP BYTE1) + [SETQ CODE (if (ILEQ BYTE1 127) + then + (* ;; + "Test first: Ascii is the common case. EOL requires its own translation") + + (SELCHARQ BYTE1 + (CR (SELECTC (fetch (STREAM EOLCONVENTION) of STREAM) + (CR.EOLC (* ; "Also eq BYTE1") + (CHARCODE EOL)) + (CRLF.EOLC (if (EQ (CHARCODE LF) + (\PEEKBIN STREAM T)) + then (\BIN STREAM) + (CL:WHEN COUNTP (SETQ COUNT 2)) + (CHARCODE EOL) + else BYTE1)) + BYTE1)) + (LF (CL:IF (EQ LF.EOLC (fetch (STREAM EOLCONVENTION) + of STREAM)) + (CHARCODE EOL) + BYTE1)) + BYTE1) + elseif (ILEQ BYTE1 223) + then (* ; "2 bytes") + (SETQ COUNT 2) + (SETQ BYTE2 (\BIN STREAM)) + (CL:WHEN (OR (NOT (SMALLP BYTE2)) + (ILESSP BYTE2 128)) + (ERROR "INVALID UTF8 SEQUENCE" (LIST BYTE1 BYTE2))) + (LOGOR (LLSH (LOADBYTE BYTE1 0 5) + 6) + (LOADBYTE BYTE2 0 6)) + elseif (ILEQ BYTE1 239) + then (* ; "3 bytes") + (SETQ BYTE2 (\BIN STREAM)) + (CL:WHEN (OR (NOT (SMALLP BYTE2)) + (ILESSP BYTE2 128)) + (ERROR "INVALID UTF8 SEQUENCE" (LIST BYTE1 BYTE2))) + (SETQ BYTE3 (\BIN STREAM)) + (CL:WHEN (OR (NOT (SMALLP BYTE3)) + (ILESSP BYTE3 128)) + (ERROR "INVALID UTF8 SEQUENCE" (LIST BYTE1 BYTE2 BYTE3))) + (SETQ COUNT 3) + (LOGOR (LLSH (LOADBYTE BYTE1 0 4) + 12) + (LLSH (LOADBYTE BYTE2 0 6) + 6) + (LOADBYTE BYTE3 0 6)) + else (* ; "4 bytes") + (SETQ BYTE2 (\BIN STREAM)) + (CL:WHEN (OR (NOT (SMALLP BYTE2)) + (ILESSP BYTE2 128)) + (ERROR "INVALID UTF8 SEQUENCE" (LIST BYTE1 BYTE2))) + (SETQ BYTE3 (\BIN STREAM)) + (CL:WHEN (OR (NOT (SMALLP BYTE3)) + (ILESSP BYTE3 128)) + (ERROR "INVALID UTF8 SEQUENCE" (LIST BYTE1 BYTE2 BYTE3))) + (SETQ BYTE4 (\BIN STREAM)) + (CL:WHEN (OR (NOT (SMALLP BYTE4)) + (ILESSP BYTE4 128)) + (ERROR "INVALID UTF8 SEQUENCE" (LIST BYTE1 BYTE2 BYTE3 BYTE4))) + (SETQ COUNT 4) + (LOGOR (LLSH (LOADBYTE BYTE1 0 3) + 18) + (LLSH (LOADBYTE BYTE2 0 6) + 12) + (LLSH (LOADBYTE BYTE3 0 6) + 6) + (LOADBYTE BYTE4 0 6]) + (CL:WHEN (FIXP CODE) (* ; + "Could be ENDOFSTREAMOP NIL, return NIL") + (CL:UNLESS RAW + (SETQ CODE (UNICODE.TRANSLATE (UNICODE.SMALLP (UNICODE.SMALLP CODE)) + *UNICODETOMCCS*)))) + (CL:WHEN COUNTP (SETQ *BYTECOUNTER* COUNT)) + CODE]) + +(UTF8.PEEKCCODEFN + [LAMBDA (STREAM NOERROR RAW) (* ; "Edited 22-Feb-2026 14:12 by rmk") + (* ; "Edited 23-Oct-2025 08:26 by rmk") + (* ; "Edited 24-Apr-2025 15:44 by rmk") + (* ; "Edited 2-Feb-2024 11:48 by rmk") + (* ; "Edited 14-Jun-2021 22:53 by rmk:") + + (* ;; "Modeled this after \EUCPEEK on LLREAD. In the multi-byte (non-ASCII) case, backs the file pointer to the beginning by the proper number of \BACKFILEPTRs, and returns a count of 0. Returns NIL if NOERROR and either invalid UTF8 or end of file.") + + (* ;; "Could be that the caller takes care of backing up the file position if the number of binned-bytes is returned.") + + (* ;; "Do not do UNICODE to MCCS translation if RAW") + + (PROG (BYTE1 BYTE2 BYTE3 BYTE4 CODE) + (SETQ BYTE1 (\PEEKBIN STREAM NOERROR)) + + (* ;; "Distinguish on header bytex") + + (CL:UNLESS BYTE1 (RETURN NIL)) + [if (ILEQ BYTE1 127) + then + (* ;; + "Test first: Ascii is the common case. No need to back up, since we peeked.") + + (SETQ CODE BYTE1) + elseif [ILEQ BYTE1 223 (* ; "2 bytes") + (BIN STREAM) + (SETQ BYTE2 (\PEEKBIN STREAM NOERROR)) + (\BACKFILEPTR STREAM) + (if (AND BYTE2 (IGEQ BYTE2 128)) + then (SETQ CODE (LOGOR (LLSH (LOADBYTE BYTE1 0 5) + 6) + (LOADBYTE BYTE2 0 6))) + elseif NOERROR + else (ERROR "INVALID UTF8 SEQUENCE" (LIST BYTE1 BYTE2] + elseif (ILEQ BYTE1 239) + then (* ; "3 bytes") + (BIN STREAM) + (CL:UNLESS (AND (SETQ BYTE2 (\PEEKBIN STREAM NOERROR)) + (IGEQ BYTE2 128)) + (\BACKFILEPTR STREAM) + (OR NOERROR (ERROR "INVALID UTF8 SEQUENCE" (LIST BYTE1 BYTE2))) + (RETURN CODE)) + (BIN STREAM) + (SETQ BYTE3 (\PEEKBIN STREAM NOERROR)) (* ; + "PEEK the last, no need to back it up") + (\BACKFILEPTR STREAM) + (\BACKFILEPTR STREAM) + (if (AND BYTE3 (IGEQ BYTE3 128)) + then (SETQ CODE (LOGOR (LLSH (LOADBYTE BYTE1 0 4) + 12) + (LLSH (LOADBYTE BYTE2 0 6) + 6) + (LOADBYTE BYTE3 0 6))) + elseif NOERROR + else (ERROR "INVALID UTF8 SEQUENCE" (LIST BYTE1 BYTE2 BYTE3))) + else (* ; "4 bytes") + (BIN STREAM) + (CL:UNLESS (AND (SETQ BYTE2 (\PEEKBIN STREAM NOERROR)) + (IGEQ BYTE2 128)) + (\BACKFILEPTR STREAM) + (OR NOERROR (ERROR "INVALID UTF8 SEQUENCE" (LIST BYTE1 BYTE2))) + (RETURN CODE)) + (BIN STREAM) + (CL:UNLESS (AND (SETQ BYTE3 (\PEEKBIN STREAM NOERROR)) + (IGEQ BYTE3 128)) + (\BACKFILEPTR STREAM) + (\BACKFILEPTR STREAM) + (OR NOERROR (ERROR "INVALID UTF8 SEQUENCE" (LIST BYTE1 BYTE2 BYTE3))) + (RETURN CODE)) + (BIN STREAM) + (SETQ BYTE4 (\PEEKBIN STREAM NOERROR)) + (\BACKFILEPTR STREAM) + (\BACKFILEPTR STREAM) + (\BACKFILEPTR STREAM) + (if (AND BYTE4 (IGEQ BYTE4 128)) + then (SETQ CODE (LOGOR (LLSH (LOADBYTE BYTE1 0 3) + 18) + (LLSH (LOADBYTE BYTE2 0 6) + 12) + (LLSH (LOADBYTE BYTE3 0 6) + 6) + (LOADBYTE BYTE4 0 6))) + elseif NOERROR + else (ERROR "INVALID UTF8 SEQUENCE" (LIST BYTE1 BYTE2 BYTE3 BYTE4] + (CL:WHEN (AND CODE (NOT RAW)) + (SETQ CODE (UNICODE.TRANSLATE (UNICODE.SMALLP (UNICODE.SMALLP CODE)) + *UNICODETOMCCS*))) + (RETURN CODE]) + +(\UTF8.BACKCCODEFN + [LAMBDA (STREAM COUNTP RAW) (* ; "Edited 19-Jul-2022 15:30 by rmk") + (* ; "Edited 6-Aug-2021 16:04 by rmk:") + + (* ;; "\BACKFILEPTR is NIL at beginning of FILE. Presumably a little bit more efficient if we decoded the UTF8 bytes backwards and didn't do the peek, but probably not worth the complexity. ") + + (DECLARE (USEDFREE *BYTECOUNTER*)) + (BIND (C ← 0) WHILE (IF (\BACKFILEPTR STREAM) + THEN (ADD C -1) + (EQ 2 (LRSH (\PEEKBIN STREAM) + 6)) + ELSE (CL:WHEN COUNTP (SETQ *BYTECOUNTER* C)) + (RETURN NIL)) REPEATUNTIL (EQ C -4) + FINALLY (CL:WHEN COUNTP (SETQ *BYTECOUNTER* C)) + (RETURN (UTF8.PEEKCCODEFN STREAM NIL RAW]) +) +(DEFINEQ + +(UTF16BE.OUTCHARFN + [LAMBDA (STREAM CHARCODE RAW) (* ; "Edited 24-Apr-2025 15:44 by rmk") + (* ; "Edited 31-Jan-2024 00:32 by rmk") + (* ; "Edited 8-Aug-2021 13:09 by rmk:") + (* ; "Edited 30-Jan-2020 23:08 by rmk:") + + (* ;; "PRINT UTF16 sequence for CHARCODE. Do not do MCCS to UNICODE translation if RAW.") + + (* ;; "Not sure about EOL conversion if truly %"raw%"") + + (IF (EQ CHARCODE (CHARCODE EOL)) + THEN (FREPLACE (STREAM CHARPOSITION) OF STREAM WITH 0) + ELSE (CHANGE (FFETCH (STREAM CHARPOSITION) OF STREAM) + (IPLUS16 1 DATUM))) + (FOR C INSIDE (CL:IF RAW + CHARCODE + (UNICODE.TRANSLATE CHARCODE *MCCSTOUNICODE*)) DO (\WOUT STREAM C]) + +(UTF16BE.INCCODEFN + [LAMBDA (STREAM COUNTP RAW) (* ; "Edited 19-Feb-2026 11:33 by rmk") + (* ; "Edited 24-Apr-2025 15:45 by rmk") + (* ; "Edited 10-Mar-2024 12:00 by rmk") + (* ; "Edited 6-Aug-2021 16:05 by rmk:") + + (* ;; + "Do not do UNICODE to MCCS translation if RAW. Test for SMALLPin case of funky EOF behavior") + + (DECLARE (USEDFREE *BYTECOUNTER*)) + (LET (CODE BYTE1 BYTE2 COUNT) + (IF [AND (SMALLP (SETQ BYTE1 (\BIN STREAM))) + (SMALLP (SETQ BYTE2 (\BIN STREAM] + THEN (SETQ COUNT 2) + (SETQ CODE (create WORD + HIBYTE ← (\BIN STREAM) + LOBYTE ← (\BIN STREAM))) + (CL:WHEN (FIXP CODE) (* ; "Funky ENDOFSTREAMOP ?") + (CL:UNLESS RAW + (SETQ CODE (UNICODE.TRANSLATE CODE *UNICODETOMCCS*)))) + (CL:WHEN COUNTP (SETQ *BYTECOUNTER* COUNT)) + CODE + ELSE (ERROR "ODD NUMBER OF BYTES IN UTF16 FILE" STREAM]) + +(UTF16BE.PEEKCCODEFN + [LAMBDA (STREAM NOERROR RAW) (* ; "Edited 24-Apr-2025 15:45 by rmk") + (* ; "Edited 10-Mar-2024 12:01 by rmk") + (* ; "Edited 14-Jun-2021 22:58 by rmk:") + + (* ;; "Could be that the caller takes care of backing up the file position if the number of binned-bytes is returned.") + + (* ;; "Do not do UNICODE to MCCS translation if RAW") + + (LET (BYTE1 BYTE2 CODE) + (SETQ BYTE1 (\PEEKBIN STREAM NOERROR)) + (IF BYTE1 + THEN (\BIN STREAM) + (SETQ BYTE2 (\PEEKBIN STREAM NOERROR)) + (\BACKFILEPTR STREAM) + (IF BYTE2 + THEN (SETQ CODE (create WORD + HIBYTE ← BYTE1 + LOBYTE ← BYTE2)) + (CL:IF RAW + CODE + (UNICODE.TRANSLATE CODE *UNICODETOMCCS*)) + ELSEIF NOERROR + THEN NIL) + ELSEIF NOERROR + THEN NIL + ELSE (ERROR "INVALID UTF16 CHARACTER" (LIST BYTE1 BYTE2]) + +(\UTF16BE.BACKCCODEFN + [LAMBDA (STREAM COUNTP RAW) (* ; "Edited 24-Apr-2025 15:28 by rmk") + (* ; "Edited 10-Mar-2024 12:02 by rmk") + (* ; "Edited 19-Jul-2022 15:14 by rmk") + (* ; "Edited 6-Aug-2021 16:07 by rmk:") + + (* ;; "\BACKFILEPTR is NIL at beginning of FILE, do nothing.") + + (DECLARE (USEDFREE *BYTECOUNTER*)) + (CL:WHEN (\BACKFILEPTR STREAM) + (LET (CODE (BYTE2 (\PEEKBIN STREAM))) + (IF (\BACKFILEPTR STREAM) + THEN (CL:WHEN COUNTP (SETQ *BYTECOUNTER* -2)) + (SETQ CODE (create WORD + HIBYTE ← (\PEEKBIN STREAM) + LOBYTE ← BYTE2)) + (CL:IF RAW + CODE + (UNICODE.TRANSLATE CODE *UNICODETOMCCS*)) + ELSEIF COUNTP + THEN (SETQ *BYTECOUNTER* -1) + NIL)))]) +) +(DEFINEQ + +(UTF16LE.OUTCHARFN + [LAMBDA (STREAM CHARCODE RAW) (* ; "Edited 24-Apr-2025 15:45 by rmk") + (* ; "Edited 10-Mar-2024 11:58 by rmk") + (* ; "Edited 8-Aug-2021 13:09 by rmk:") + (* ; "Edited 30-Jan-2020 23:08 by rmk:") + + (* ;; "PRINT UTF16 sequence for CHARCODE. Do not do MCCS to UNICODE translation if RAW.") + + (* ;; "Not sure about EOL conversion if truly %"raw%"") + + (IF (EQ CHARCODE (CHARCODE EOL)) + THEN (FREPLACE (STREAM CHARPOSITION) OF STREAM WITH 0) + ELSE (CHANGE (FFETCH (STREAM CHARPOSITION) OF STREAM) + (IPLUS16 1 DATUM))) + (FOR C INSIDE (CL:IF RAW + CHARCODE + (UNICODE.TRANSLATE CHARCODE *MCCSTOUNICODE*)) + DO (BOUT STREAM (fetch LOBYTE of CHARCODE)) + (BOUT STREAM (fetch HIBYTE of CHARCODE]) + +(UTF16LE.INCCODEFN + [LAMBDA (STREAM COUNTP RAW) (* ; "Edited 24-Apr-2025 15:45 by rmk") + (* ; "Edited 10-Mar-2024 12:03 by rmk") + (* ; "Edited 6-Aug-2021 16:05 by rmk:") + + (* ;; + "Do not do UNICODE to MCCS translation if RAW. Test for SMALLPin case of funky EOF behavior") + + (DECLARE (USEDFREE *BYTECOUNTER*)) + (LET (CODE BYTE1 BYTE2 COUNT) + (IF [AND (SMALLP (SETQ BYTE1 (\BIN STREAM))) + (SMALLP (SETQ BYTE2 (\BIN STREAM] + THEN (SETQ COUNT 2) + (SETQ CODE (create WORD + LOBYTE ← (\BIN STREAM) + HIBYTE ← (\BIN STREAM))) + (CL:UNLESS RAW + (SETQ CODE (UNICODE.TRANSLATE CODE *UNICODETOMCCS*))) + (CL:WHEN COUNTP (SETQ *BYTECOUNTER* COUNT)) + CODE + ELSE (ERROR "ODD NUMBER OF BYTES IN UTF16 FILE" STREAM]) + +(UTF16LE.PEEKCCODEFN + [LAMBDA (STREAM NOERROR RAW) (* ; "Edited 24-Apr-2025 15:46 by rmk") + (* ; "Edited 10-Mar-2024 11:43 by rmk") + (* ; "Edited 14-Jun-2021 22:58 by rmk:") + + (* ;; "Could be that the caller takes care of backing up the file position if the number of binned-bytes is returned.") + + (* ;; "Do not do UNICODE to MCCS translation if RAW") + + (LET (BYTE1 BYTE2 CODE) + (SETQ BYTE1 (\PEEKBIN STREAM NOERROR)) + (IF BYTE1 + THEN (\BIN STREAM) + (SETQ BYTE2 (\PEEKBIN STREAM NOERROR)) + (\BACKFILEPTR STREAM) + (IF BYTE2 + THEN (SETQ CODE (LOGOR (LLSH BYTE2 8) + BYTE1)) + (CL:IF RAW + CODE + (UNICODE.TRANSLATE CODE *UNICODETOMCCS*)) + ELSEIF NOERROR + THEN NIL) + ELSEIF NOERROR + THEN NIL + ELSE (ERROR "INVALID UTF16 CHARACTER" (LIST BYTE1 BYTE2]) + +(\UTF16LE.BACKCCODEFN + [LAMBDA (STREAM COUNTP RAW) (* ; "Edited 24-Apr-2025 15:28 by rmk") + (* ; "Edited 10-Mar-2024 12:04 by rmk") + (* ; "Edited 19-Jul-2022 15:14 by rmk") + (* ; "Edited 6-Aug-2021 16:07 by rmk:") + + (* ;; "\BACKFILEPTR is NIL at beginning of FILE, do nothing.") + + (DECLARE (USEDFREE *BYTECOUNTER*)) + (CL:WHEN (\BACKFILEPTR STREAM) + (LET (CODE (BYTE2 (\PEEKBIN STREAM))) + (IF (\BACKFILEPTR STREAM) + THEN (CL:WHEN COUNTP (SETQ *BYTECOUNTER* -2)) + (SETQ CODE (create WORD + HIBYTE ← BYTE2 + LOBYTE ← (\PEEKBIN STREAM))) + (CL:IF RAW + CODE + (UNICODE.TRANSLATE CODE *UNICODETOMCCS*)) + ELSEIF COUNTP + THEN (SETQ *BYTECOUNTER* -1) + NIL)))]) +) +(DEFINEQ + +(READBOM + [LAMBDA (STREAM COUNTP) (* ; "Edited 17-Jan-2025 11:29 by rmk") + (* ; "Edited 11-Mar-2024 23:53 by rmk") + (* ; "Edited 10-Mar-2024 13:01 by rmk") + + (* ;; "If COUNTP, this must be under a generic \INCCODE that binds *BYTECOUNTER*") + + (* ;; "Reads and decodes the BOM bytes. If BOM ispresent, the stream is left at the first following byte, otherwise the stream is reset to its position on entry (presumably 0).") + + (* ;; "I used the UNHEXTRING constants so that the hex bytes are visible in the code, maybe there's another function that does that?") + + (DECLARE (USEDFREE *BYTECOUNTER*)) + (SELECTC (\PEEKBIN STREAM T) + ((HEXNUM? "EF") + (BIN STREAM) + (if (EQ (CONSTANT (HEXNUM? "BB")) + (\PEEKBIN STREAM T)) + then (BIN STREAM) + (if (EQ (CONSTANT (HEXNUM? "BF")) + (\PEEKBIN STREAM T)) + then (BIN STREAM) + (CL:WHEN COUNTP (add *BYTECOUNTER* 3)) + :UTF-8 + else (\BACKFILEPTR STREAM)) + else (\BACKFILEPTR STREAM))) + ((HEXNUM? "FE") + (BIN STREAM) + (if (EQ (CONSTANT (HEXNUM? "FF")) + (\PEEKBIN STREAM T)) + then (BIN STREAM) + (CL:WHEN COUNTP (add *BYTECOUNTER* 2)) + :UTF-16BE + else (\BACKFILEPTR STREAM))) + ((HEXNUM? "FF") + (BIN STREAM) + (if (EQ (CONSTANT (HEXNUM? "FE")) + (\PEEKBIN STREAM T)) + then (BIN STREAM) + (CL:WHEN COUNTP (add *BYTECOUNTER* 2)) + :UTF-16LE + else (\BACKFILEPTR STREAM))) + NIL]) + +(WRITEBOM + [LAMBDA (STREAM FORMAT) (* ; "Edited 17-Jan-2025 11:29 by rmk") + (* ; "Edited 16-Mar-2024 20:53 by rmk") + (* ; "Edited 11-Mar-2024 23:53 by rmk") + (* ; "Edited 10-Mar-2024 13:01 by rmk") + + (* ;; "Writes a BOM that represents FORMAT (:UTF-8, :UTF16-BE, :UTF16-LE") + + (SELECTQ FORMAT + (:UTF-8 (BOUT STREAM (CONSTANT (HEXNUM? "EF"))) + (BOUT STREAM (CONSTANT (HEXNUM? "BB"))) + (BOUT STREAM (CONSTANT (HEXNUM? "BF")))) + (:UTF-16BE (BOUT STREAM (CONSTANT (HEXNUM? "FE"))) + (BOUT STREAM (CONSTANT (HEXNUM? "FF")))) + (:UTF-16LE (BOUT STREAM (CONSTANT (HEXNUM? "FF"))) + (BOUT STREAM (HEXNUM? "FE"))) + NIL]) +) +(DEFINEQ + +(MAKE-UNICODE-FORMATS + [LAMBDA (EXTERNALEOL) (* ; "Edited 23-Feb-2026 12:14 by rmk") + (* ; "Edited 22-Feb-2026 09:14 by rmk") + (* ; "Edited 5-Feb-2026 11:06 by rmk") + (* ; "Edited 17-Jan-2025 18:38 by rmk") + (* ; "Edited 10-Mar-2024 11:55 by rmk") + (* ; "Edited 8-Dec-2023 15:19 by rmk") + (* ; "Edited 19-Jul-2022 15:36 by rmk") + (* ; "Edited 6-Aug-2021 16:08 by rmk:") + + (* ;; "RAW formats do not do MCCS/Unicode translation, just deal with the byte encoding.") + + (* ;; "The EXTERNALEOL specifies the EOLCONVENTION of the stream, particularly to produce output files with the desired convention. On input the macro \CHECKEOLC (LLREAD) coerces only that coding to the internal EOL, which is a mistake.") + + (MAKE-EXTERNALFORMAT :UTF-8 (FUNCTION UTF8.INCCODEFN) + (FUNCTION UTF8.PEEKCCODEFN) + (FUNCTION \UTF8.BACKCCODEFN) + (FUNCTION UTF8.OUTCHARFN) + NIL + 'LF NIL (FUNCTION MTOUTF8STRING) + NIL + (FUNCTION NILL) + (FUNCTION UTF8TOMSTRING)) + + (* ;; "Don't remember what this is for:") + + (\INSTALL.EXTERNALFORMAT (create EXTERNALFORMAT using (FIND-FORMAT :UTF-8) + NAME ← :UTF-8-SLUG OUTCHARFN ← + (FUNCTION UTF8.SLUG.OUTCHARFN))) + (MAKE-EXTERNALFORMAT :UTF-8-RAW [FUNCTION (LAMBDA (STREAM COUNTP) + (UTF8.INCCODEFN STREAM COUNTP T] + [FUNCTION (LAMBDA (STREAM NOERROR) + (UTF8.PEEKCCODEFN STREAM NOERROR T] + [FUNCTION (LAMBDA (STREAM COUNTP) + (\UTF8.BACKCCODEFN STREAM COUNTP T] + [FUNCTION (LAMBDA (STREAM CHARCODE) + (UTF8.OUTCHARFN STREAM CHARCODE T] + NIL EXTERNALEOL NIL NIL NIL (FUNCTION NILL)) + (MAKE-EXTERNALFORMAT :UTF-16BE (FUNCTION UTF16BE.INCCODEFN) + (FUNCTION UTF16BE.PEEKCCODEFN) + (FUNCTION \UTF16BE.BACKCCODEFN) + (FUNCTION UTF16BE.OUTCHARFN) + NIL EXTERNALEOL NIL NIL NIL (FUNCTION NILL)) + (MAKE-EXTERNALFORMAT :UTF-16BE-RAW [FUNCTION (LAMBDA (STREAM COUNTP) + (UTF16BE.INCCODEFN STREAM COUNTP T] + [FUNCTION (LAMBDA (STREAM NOERROR) + (UTF16BE.PEEKCCODEFN STREAM NOERROR T] + [FUNCTION (LAMBDA (STREAM COUNTP) + (\UTF16BE.BACKCCODEFN STREAM COUNTP T] + [FUNCTION (LAMBDA (STREAM CHARCODE) + (UTF16BE.OUTCHARFN STREAM CHARCODE T] + NIL EXTERNALEOL NIL NIL NIL (FUNCTION NILL)) + (MAKE-EXTERNALFORMAT :UTF-16LE (FUNCTION UTF16LE.INCCODEFN) + (FUNCTION UTF16LE.PEEKCCODEFN) + (FUNCTION \UTF16LE.BACKCCODEFN) + (FUNCTION UTF16LE.OUTCHARFN) + NIL EXTERNALEOL NIL NIL NIL (FUNCTION NILL)) + (MAKE-EXTERNALFORMAT :UTF-16LE-RAW [FUNCTION (LAMBDA (STREAM COUNTP) + (UTF16LE.INCCODEFN STREAM COUNTP T] + [FUNCTION (LAMBDA (STREAM NOERROR) + (UTF16LE.PEEKCCODEFN STREAM NOERROR T] + [FUNCTION (LAMBDA (STREAM COUNTP) + (\UTF16LE.BACKCCODEFN STREAM COUNTP T] + [FUNCTION (LAMBDA (STREAM CHARCODE) + (UTF16LE.OUTCHARFN STREAM CHARCODE T] + NIL EXTERNALEOL NIL NIL NIL (FUNCTION NILL]) +) +(DECLARE%: DONTEVAL@LOAD DOCOPY + +(MAKE-UNICODE-FORMATS 'LF) +) +(DEFINEQ + +(UTF8.BINCODE + [LAMBDA (STREAM RAW) (* ; "Edited 24-Apr-2025 15:28 by rmk") + (* ; "Edited 4-Feb-2024 01:06 by rmk") + (* ; "Edited 1-Feb-2024 11:21 by rmk") + (* ; "Edited 28-Dec-2023 13:32 by rmk") + (* ; "Edited 6-Aug-2021 16:02 by rmk:") + (* ; "Edited 6-Aug-2020 17:13 by rmk:") + + (* ;; "Decodes a UTF8 character code by binning from STREAM ") + + (* ;; "The validity of STREAM is guaranteed by the caller (presumably TEDIT), we aren't testing here for the validity of the trailing bytes.") + + (* ;; "This doesn't do EOL conversion or translation, unlike UTF8.INCCODEFN.") + + (LET ((BYTE1 (BIN STREAM)) + CODE) + [SETQ CODE (if (ILEQ BYTE1 127) + then BYTE1 + elseif (ILEQ BYTE1 223) + then (* ; "2 bytes") + (LOGOR (LLSH (LOADBYTE BYTE1 0 5) + 6) + (LOADBYTE (BIN STREAM) + 0 6)) + elseif (ILEQ BYTE1 239) + then (* ; "3 bytes") + (LOGOR (LLSH (LOADBYTE BYTE1 0 4) + 12) + (LLSH (LOADBYTE (BIN STREAM) + 0 6) + 6) + (LOADBYTE (BIN STREAM) + 0 6)) + else (* ; "4 bytes") + (LOGOR (LLSH (LOADBYTE BYTE1 0 3) + 18) + (LLSH (LOADBYTE (BIN STREAM) + 0 6) + 12) + (LLSH (LOADBYTE (BIN STREAM) + 0 6) + 6) + (LOADBYTE (BIN STREAM) + 0 6] + (CL:IF RAW + CODE + (UNICODE.TRANSLATE CODE *UNICODETOMCCS*))]) + +(\UTF8.FETCHCODE + [LAMBDA (CODESIZE BUFFER BYTEOFFSET) (* ; "Edited 28-Dec-2023 13:32 by rmk") + (* ; "Edited 6-Aug-2021 16:02 by rmk:") + (* ; "Edited 6-Aug-2020 17:13 by rmk:") + + (* ;; "Decodes a UTF8 byte sequence of size CODESIZE in BUFFER starting at BYTEOFFSET.") + + (* ;; "The validity of the thesize, buffer, and offset are guaranteed by the caller.") + + (LET ((BYTE1 (\GETBASEBYTE BUFFER BYTEOFFSET)) + BYTE2 BYTE3 BYTE4) + (SELECTQ CODESIZE + (2 (SETQ BYTE2 (\UTF8.GETBASEBYTE BUFFER (IPLUS 1 BYTEOFFSET))) + (LOGOR (LLSH (LOADBYTE BYTE1 0 5) + 6) + (LOADBYTE BYTE2 0 6))) + (3 (SETQ BYTE2 (\UTF8.GETBASEBYTE BUFFER (IPLUS 1 BYTEOFFSET))) + (SETQ BYTE3 (\UTF8.GETBASEBYTE BUFFER (IPLUS 2 BYTEOFFSET))) + (LOGOR (LLSH (LOADBYTE BYTE1 0 4) + 12) + (LLSH (LOADBYTE BYTE2 0 6) + 6) + (LOADBYTE BYTE3 0 6))) + (4 (SETQ BYTE2 (\UTF8.GETBASEBYTE BUFFER (IPLUS 1 BYTEOFFSET))) + (SETQ BYTE3 (\UTF8.GETBASEBYTE BUFFER (IPLUS 2 BYTEOFFSET))) + (SETQ BYTE4 (\UTF8.GETBASEBYTE BUFFER (IPLUS 3 BYTEOFFSET))) + (LOGOR (LLSH (LOADBYTE BYTE1 0 3) + 18) + (LLSH (LOADBYTE BYTE2 0 6) + 12) + (LLSH (LOADBYTE BYTE3 0 6) + 6) + (LOADBYTE BYTE4 0 6))) + (1 BYTE1) + (SHOULDNT]) +) +(DEFINEQ + +(UTF8.VALIDATE + [LAMBDA (STREAM BYTE) (* ; "Edited 2-Feb-2024 12:03 by rmk") + (* ; "Edited 28-Dec-2023 11:57 by rmk") + (* ; "Edited 6-Aug-2021 16:02 by rmk:") + (* ; "Edited 6-Aug-2020 17:13 by rmk:") + + (* ;; "Returns the codesize if the bytes starting at STREAM's current position form a valid UTF-8 sequence.") + + (* ;; "If BYTE is provided, it is interpreted as the just-read header byte with the stream is positioned just after it.") + + (* ;; "Test for smallp because the stream's End-of-file operation may suppress the error--otherwise an error will happen if the streams runs out of necessary bytes.") + + (* ;; "For valid sequences, returns the same value as UTF8-SIZE-FROM-BYTE1, but this reads/validates the rest of the bytes. On a non-NILreturn the stream is positioned before the header byte of the next putative code. The stream position is uncertain on a NIL return.") + + (* ;; "") + + (* ;; "Distinguish on the header byte BYTE. Not SMALLP presumably if ENDOFSTREAMOP did something unusual.") + + (CL:UNLESS BYTE + (SETQ BYTE (BIN STREAM))) + (CL:WHEN (SMALLP BYTE) + (if (ILEQ BYTE 127) + then 1 + elseif (ILEQ BYTE 223) + then (* ; " 2 bytes") + (CL:UNLESS (OR [NOT (SMALLP (SETQ BYTE (BIN STREAM] + (ILESSP BYTE 128)) + 2) + elseif (ILEQ BYTE 239) + then (* ; "3 bytes") + (CL:UNLESS (OR (OR [NOT (SMALLP (SETQ BYTE (BIN STREAM] + (ILESSP BYTE 128)) + (OR [NOT (SMALLP (SETQ BYTE (BIN STREAM] + (ILESSP BYTE 128))) + 3) + else (* ; "4 bytes") + (CL:UNLESS (OR (OR [NOT (SMALLP (SETQ BYTE (BIN STREAM] + (ILESSP BYTE 128)) + (OR [NOT (SMALLP (SETQ BYTE (BIN STREAM] + (ILESSP BYTE 128)) + (OR [NOT (SMALLP (SETQ BYTE (BIN STREAM] + (ILESSP BYTE 128))) + 4)))]) + +(NUTF8-BYTE1-BYTES + [LAMBDA (BYTE1) (* ; "Edited 3-Feb-2024 15:00 by rmk") + (* ; "Edited 8-Jan-2024 10:57 by rmk") + (* ; "Edited 28-Jun-2022 00:02 by rmk") + (* ; "Edited 10-Aug-2020 12:35 by rmk:") + + (* ;; "Returns the number of bytes in a UTF8 code representation whose first byte is BYTEE1. ") + + (IF (ILEQ BYTE1 127) + THEN 1 + ELSEIF (ILEQ BYTE1 223) + THEN 2 + ELSEIF (ILEQ BYTE1 239) + THEN 3 + ELSE 4]) + +(NUTF8-CODE-BYTES + [LAMBDA (CODE) (* ; "Edited 3-Feb-2024 14:42 by rmk") + (* ; "Edited 8-Jan-2024 10:57 by rmk") + (* ; "Edited 28-Jun-2022 00:02 by rmk") + (* ; "Edited 10-Aug-2020 12:35 by rmk:") + + (* ;; "Returns the number of bytes needed to encode in UTF8 a number headed by BYTE. ") + + (IF (ILESSP CODE 128) + THEN 1 + ELSEIF (ILESSP CODE 2048) + THEN (* ; "x800") + 2 + ELSEIF (ILESSP CODE 65536) + THEN (* ; "x10000") + 3 + ELSEIF (ILESSP CODE 2097152) + THEN (* ; "x200000") + 4 + ELSE (ERROR "INVALID UTF-8 CODE"]) + +(NUTF8-STRING-BYTES + [LAMBDA (STRING RAW) (* ; "Edited 2-Sep-2025 10:40 by rmk") + (* ; "Edited 24-Apr-2025 15:37 by rmk") + (* ; "Edited 3-Feb-2024 21:32 by rmk") + (* ; "Edited 10-Aug-2020 09:06 by rmk:") + + (* ;; "Returns the number of bytes it would take to represent STRING in UTF8, assuming it is an MCCS string unless RAWFLG. ") + + (for I C from 1 while (SETQ C (NTHCHARCODE STRING I)) sum (NUTF8-CODE-BYTES (CL:IF RAW + C + (MTOUCODE C))]) + +(N-MCHARS + [LAMBDA (UTF8STRING) (* ; "Edited 9-Sep-2025 08:35 by rmk") + + (* ;; "Returns the number of MCCS characters coded in UTF8STRING") + + (for I B from 1 while (SETQ B (NTHCHARCODE UTF8STRING I)) by (NUTF8-BYTE1-BYTES B) count T]) +) + + + +(* ; "For MAKEINIT, before hashing--no need for XCCS") + +(DEFINEQ + +(MTOUCODE + [LAMBDA (MCODE) (* ; "Edited 22-Feb-2026 13:56 by rmk") + (UNICODE.TRANSLATE MCODE *MCCSTOUNICODE*]) + +(UTOMCODE + [LAMBDA (UCODE) (* ; "Edited 22-Feb-2026 13:57 by rmk") + (UNICODE.TRANSLATE (UNICODE.SMALLP UCODE) + *UNICODETOMCCS*]) + +(MTOUCODE? + [LAMBDA (MCODE) (* ; "Edited 22-Feb-2026 13:57 by rmk") + + (* ;; "Returns the Unix range-code(s) corresponding to MCODE if there are true mapppings, otherwise NIL. Alternative codes are returned in a list, the code itself is returned for a singleton.") + + (UNICODE.TRANSLATE MCODE *MCCSTOUNICODE* T T]) + +(UTOMCODE? + [LAMBDA (UCODE) (* ; "Edited 22-Feb-2026 13:58 by rmk") + + (* ;; "Returns the MCCS range-code(s) corresponding to UCODE if there are true mapppings, otherwise NIL. ") + + (* ;; + " NOTE: Alternative codes are returned in a list, the code itself is returned for a singleton.") + + (* ;; "Canonicalize unicodes outside of the 16-bit plane") + + (UNICODE.TRANSLATE (UNICODE.SMALLP UCODE) + *UNICODETOMCCS* T T]) +) +(DEFINEQ + +(MTOUSTRING + [LAMBDA (MSTRING DESTRUCTIVE) (* ; "Edited 2-Sep-2025 12:19 by rmk") + (* ; "Edited 29-Apr-2025 12:01 by rmk") + + (* ;; "Converts MCCS codes in MSTRING to Unicodes.") + + (for I MCODE (USTRING ← (CL:IF DESTRUCTIVE + MSTRING + (CONCAT MSTRING))) from 1 while (SETQ MCODE (NTHCHARCODE MSTRING I)) + do (RPLCHARCODE USTRING I (MTOUCODE MCODE)) finally (RETURN USTRING]) + +(UTOMSTRING + [LAMBDA (USTRING DESTRUCTIVE) (* ; "Edited 2-Sep-2025 12:18 by rmk") + (* ; "Edited 29-Apr-2025 12:00 by rmk") + + (* ;; "Converts Unicodes to MCCS codes in USTRING.") + + (for I UCODE (MSTRING ← (CL:IF DESTRUCTIVE + USTRING + (CONCAT USTRING))) from 1 while (SETQ UCODE (NTHCHARCODE USTRING I)) + do (RPLCHARCODE MSTRING I (UTOMCODE UCODE)) finally (RETURN MSTRING]) + +(MTOUTF8STRING + [LAMBDA (MSTRING) (* ; "Edited 31-Jan-2026 19:15 by rmk") + (* ; "Edited 9-Sep-2025 07:51 by rmk") + (* ; "Edited 4-Sep-2025 15:13 by rmk") + (* ; "Edited 2-Sep-2025 11:12 by rmk") + (* ; "Edited 24-Apr-2025 15:37 by rmk") + (* ; "Edited 3-Feb-2024 14:55 by rmk") + (* ; "Edited 10-Aug-2020 21:42 by rmk:") + + (* ;; + "Produces a string that contains the UTF8 bytes that represent the characters in MSTRING. ") + + (* ;; "The resulting string will not be directly interpretable inside Medley.") + + (if (if (STRINGP MSTRING) + then [OR (ffetch (STRINGP FATSTRINGP) of MSTRING) + (thereis C instring MSTRING suchthat (OR (IGEQ C 128) + (NEQ C (MTOUCODE C] + elseif (LITATOM MSTRING) + then [OR (ffetch (LITATOM FATPNAMEP) of MSTRING) + (thereis C inatom MSTRING suchthat (OR (IGEQ C 128) + (NEQ C (MTOUCODE C] + else T) + then (LET [(USTR (ALLOCSTRING (NUTF8-STRING-BYTES MSTRING] + (for I UCODE MCODE (SINDEX ← 0) from 1 while (SETQ MCODE (NTHCHARCODE MSTRING I)) + do (SETQ UCODE (MTOUCODE MCODE)) + (if (ILESSP UCODE 128) + then (RPLCHARCODE USTR (ADD SINDEX 1) + UCODE) + elseif (ILESSP UCODE 2048) + then (* ; "x800") + (RPLCHARCODE USTR (ADD SINDEX 1) + (LOGOR (LLSH 3 6) + (LRSH UCODE 6))) + (RPLCHARCODE USTR (ADD SINDEX 1) + (LOGOR (LLSH 2 6) + (LOADBYTE UCODE 0 6))) + elseif (ILESSP UCODE 65536) + then (* ; "x10000") + (RPLCHARCODE USTR (ADD SINDEX 1) + (LOGOR (LLSH 7 5) + (LRSH UCODE 12))) + (RPLCHARCODE USTR (ADD SINDEX 1) + (LOGOR (LLSH 2 6) + (LOADBYTE UCODE 6 6))) + (RPLCHARCODE USTR (ADD SINDEX 1) + (LOGOR (LLSH 2 6) + (LOADBYTE UCODE 0 6))) + elseif (ILESSP UCODE 2097152) + then (* ; "x200000") + (RPLCHARCODE USTR (ADD SINDEX 1) + (LOGOR (LLSH 15 4) + (LRSH UCODE 18))) + (RPLCHARCODE USTR (ADD SINDEX 1) + (LOGOR (LLSH 2 6) + (LOADBYTE UCODE 12 6))) + (RPLCHARCODE USTR (ADD SINDEX 1) + (LOGOR (LLSH 2 6) + (LOADBYTE UCODE 6 6))) + (RPLCHARCODE USTR (ADD SINDEX 1) + (LOGOR (LLSH 2 6) + (LOADBYTE UCODE 0 6))) + else (SHOULDNT))) + USTR) + else MSTRING]) + +(UTF8TOMSTRING + [LAMBDA (UTF8STRING) (* ; "Edited 22-Oct-2025 22:00 by rmk") + (* ; "Edited 16-Oct-2025 14:39 by rmk") + (* ; "Edited 9-Sep-2025 08:59 by rmk") + (CL:UNLESS (OR (STRINGP UTF8STRING) + (LITATOM UTF8STRING)) + (SETQ UTF8STRING (MKSTRING UTF8STRING))) + (CL:WHEN (ffetch (STRINGP FATSTRINGP) of UTF8STRING) + (\ILLEGAL.ARG UTF8STRING)) + (LET* ((NMCHARS (N-MCHARS UTF8STRING)) + (MSTRING (ALLOCSTRING NMCHARS))) + [for M NBYTES BYTE1 (BASE ← (ffetch (STRINGP BASE) of UTF8STRING)) from 1 to NMCHARS + as OFFSET from (fetch (STRINGP OFFST) of MSTRING) by NBYTES + do (SETQ BYTE1 (\GETBASEBYTE BASE OFFSET)) + (SETQ NBYTES (NUTF8-BYTE1-BYTES BYTE1)) + (RPLCHARCODE MSTRING M (UTOMCODE (\UTF8.FETCHCODE NBYTES BASE OFFSET] + MSTRING]) +) + + + +(* ; "XCCS is not so interesting in the loadup") + +(DEFINEQ + +(XTOUCODE + [LAMBDA (XCODE) (* ; "Edited 4-Sep-2025 15:09 by rmk") + (* ; "Edited 24-May-2025 23:16 by rmk") + (* ; "Edited 24-Apr-2025 15:27 by rmk") + (* ; "Edited 9-Aug-2020 09:04 by rmk:") + (UNICODE.TRANSLATE (XTOMCODE XCODE) + *MCCSTOUNICODE*]) + +(UTOXCODE + [LAMBDA (UNICODE) (* ; "Edited 24-May-2025 23:17 by rmk") + (* ; "Edited 24-Apr-2025 15:28 by rmk") + (* ; "Edited 16-Jan-2025 23:46 by rmk") + (* ; "Edited 9-Aug-2020 09:04 by rmk:") + (MTOXCODE (UNICODE.TRANSLATE UNICODE *UNICODETOMCCS*]) + +(XTOUCODE? + [LAMBDA (XCCSCODE) (* ; "Edited 24-May-2025 23:18 by rmk") + (* ; "Edited 24-Apr-2025 15:27 by rmk") + (* ; "Edited 20-Jan-2025 20:38 by rmk") + (* ; "Edited 18-Jan-2025 11:44 by rmk") + (* ; "Edited 15-Jan-2025 19:51 by rmk") + (* ; "Edited 14-Jan-2025 13:14 by rmk") + (* ; "Edited 9-Aug-2020 09:04 by rmk:") + + (* ;; "Returns the Unix range-code(s) corresponding to XCCSCODE if there are true mapppings, otherwise NIL. Alternative codes are returned in a list, the code itself is returned for a singleton.") + + (UNICODE.TRANSLATE (XTOMCODE XCCSCODE) + *MCCSTOUNICODE* T T]) + +(UTOXCODE? + [LAMBDA (UNICODE) (* ; "Edited 24-May-2025 23:19 by rmk") + (* ; "Edited 24-Apr-2025 15:28 by rmk") + (* ; "Edited 19-Jan-2025 21:14 by rmk") + (* ; "Edited 18-Jan-2025 11:46 by rmk") + (* ; "Edited 15-Jan-2025 19:51 by rmk") + (* ; "Edited 14-Jan-2025 13:14 by rmk") + (* ; "Edited 9-Aug-2020 09:04 by rmk:") + + (* ;; "Returns the XCCS range-code(s) corresponding to UNICODE if there are true mapppings, otherwise NIL. ") + + (* ;; + " NOTE: Alternative codes are returned in a list, the code itself is returned for a singleton.") + + (MTOXCODE (UNICODE.TRANSLATE UNICODE *UNICODETOMCCS* T T]) + +(XTOUSTRING + [LAMBDA (XSTRING DESTRUCTIVE) (* ; "Edited 2-Sep-2025 12:00 by rmk") + (* ; "Edited 29-Apr-2025 12:01 by rmk") + + (* ;; "Converts XCCS codes in XSTRING to Unicodes.") + + (for I UCODE XCODE (USTRING ← (CL:IF DESTRUCTIVE + XSTRING + (CONCAT XSTRING))) from 1 while (SETQ XCODE (NTHCHARCODE + XSTRING I)) + do (RPLCHARCODE USTRING I (XTOUCODE XCODE)) finally (RETURN USTRING]) + +(UTOXSTRING + [LAMBDA (USTRING DESTRUCTIVE) (* ; "Edited 2-Sep-2025 11:54 by rmk") + (* ; "Edited 29-Apr-2025 12:00 by rmk") + + (* ;; "Converts Unicodes in USTRING to XCCS codes.") + + (for I XCODE UCODE (XSTRING ← (CL:IF DESTRUCTIVE + USTRING + (CONCAT USTRING))) from 1 while (SETQ UCODE (NTHCHARCODE + USTRING I)) + unless (EQ UCODE (SETQ XCODE (UTOXCODE UCODE))) do (RPLCHARCODE XSTRING I XCODE) + finally (RETURN XSTRING]) + +(XTOUTF8STRING + [LAMBDA (XSTRING) (* ; "Edited 4-Sep-2025 18:37 by rmk") + (* ; "Edited 2-Sep-2025 11:37 by rmk") + (* ; "Edited 29-Apr-2025 12:53 by rmk") + (* ; "Edited 24-Apr-2025 15:42 by rmk") + (* ; "Edited 3-Feb-2024 14:55 by rmk") + (* ; "Edited 10-Aug-2020 21:42 by rmk:") + + (* ;; "Produces a string that contains the UTF8 bytes that represent the characters in XSTRING. Applies the ") + + (* ;; "The resulting string will not be interpretable inside Medley.") + + (for I C (MSTRING ← (CONCAT XSTRING)) from 1 while (SETQ C (NTHCHARCODE XSTRING I)) + do (RPLCHARCODE MSTRING I (XTOMCODE C)) finally (RETURN (MTOUTF8STRING MSTRING]) +) +(DEFINEQ + +(MERGE-UNICODE-TRANSLATION-TABLES + [LAMBDA (INVERSE MAPPING TABLE INVERSETABLE) (* ; "Edited 21-Feb-2026 23:52 by rmk") + (* ; "Edited 11-Oct-2025 10:24 by rmk") + (* ; "Edited 24-Apr-2025 15:28 by rmk") + (* ; "Edited 1-Feb-2025 21:42 by rmk") + (* ; "Edited 26-Jan-2025 12:58 by rmk") + (* ; "Edited 22-Jan-2025 08:20 by rmk") + (* ; "Edited 19-Jan-2025 15:58 by rmk") + (* ; "Edited 18-Jan-2025 11:49 by rmk") + (* ; "Edited 27-Mar-2024 12:10 by rmk") + (* ; "Edited 3-Feb-2024 12:46 by rmk") + (* ; "Edited 31-Jan-2024 10:06 by rmk") + + (* ;; "MAPPINGS is a list of pairs that map domain codes to range codes. TABLE and INVERSETABLE default to *MCCSTOUNICODE* *UNICODETOMCCS* respectively. ") + + (CL:UNLESS TABLE + [SETQ TABLE (OR *MCCSTOUNICODE* (SETQ *MCCSTOUNICODE* (HASHARRAY (LENGTH MAPPING]) + (CL:UNLESS INVERSETABLE + [SETQ INVERSETABLE (OR *UNICODETOMCCS* (SETQ *UNICODETOMCCS* (HASHARRAY (LENGTH MAPPING]) + (for M D R OLDR in MAPPING first (CL:IF INVERSE (swap TABLE INVERSETABLE)) + eachtime (SETQ D (CAR M)) + (SETQ R (CADR M)) + + (* ;; "We don't do combiners, but we are allowing non-SMALLP's") + unless (OR (LISTP D) + (LISTP R)) do + (* ;; "The (CONS R OLDR) deals with alternatives: (U X1) (U X2) => (U (X1 X2)), lowest code first. Those are only possible in the U-to-X direction when the tables contain (X1 U) and (X2 U). There are no duplicates/alternative table entries in the X-to-U direction.") + + (SETQ OLDR (GETHASH D TABLE)) + (CL:UNLESS (MEMB R OLDR) + (PUTHASH D (SORT (CONS R OLDR)) + TABLE)) + (swap D R) + (SETQ OLDR (GETHASH D INVERSETABLE)) + (CL:UNLESS (MEMB R OLDR) + (PUTHASH D (SORT (CONS R OLDR)) + INVERSETABLE))) + (LIST TABLE INVERSETABLE]) + +(UNICODE.UNMAPPED + [LAMBDA (CODE TABLE DONTFAKE) (* ; "Edited 22-Feb-2026 16:27 by rmk") + (* ; "Edited 24-Apr-2025 15:48 by rmk") + (* ; "Edited 22-Jan-2025 08:19 by rmk") + (* ; "Edited 19-Jan-2025 22:02 by rmk") + (* ; "Edited 18-Jan-2025 12:02 by rmk") + (* ; "Edited 2-Feb-2024 23:52 by rmk") + (* ; "Edited 31-Jan-2024 10:07 by rmk") + (* ; "Edited 11-Aug-2020 20:23 by rmk:") + + (* ;; "This is the fall-out when UNICODE.TRANSLATE determines that CODE has no mapping in TRANSLATION-TABLE. We assume that the tables are complete, so unless DONTFAKE, we make up a mapping with the next unused private code in the code space.") + + (* ;; "The number of possible faked mappings is determined by the number of private-use Unicodes, since the MCCS character space is pretty sparse. The codes don't have to come from the same part of the code space, and the NEXTCODEs are saved in global variables. The last available codes are constants.") + + (* ;; "") + + (CL:UNLESS DONTFAKE + (PROG ((INVERSE (EQ TABLE *UNICODETOMCCS*)) + RANGE HASH) + (CL:WHEN (IEQP *NEXT-PRIVATE-MCCSCODE* LAST-PRIVATE-MCCSCODE) + (* ; + "Same number of available codes both ways") + (ERROR "EXHAUSTED RANGE FOR UNMAPPED CODES")) + (if INVERSE + then (SETQ RANGE *NEXT-PRIVATE-MCCSCODE*) + (add *NEXT-PRIVATE-MCCSCODE* 1) + else (SETQ RANGE *NEXT-PRIVATE-UNICODE*) + (add *NEXT-PRIVATE-UNICODE* 1)) + (MERGE-UNICODE-TRANSLATION-TABLES INVERSE (CONS (LIST CODE RANGE))) + + (* ;; "CONS because of LIST convention so we can eventually distinguish combiners.") + + (RETURN (CONS RANGE))))]) +) +(DECLARE%: EVAL@COMPILE DONTCOPY +(DECLARE%: EVAL@COMPILE + +(PUTPROPS UNICODE.TRANSLATE MACRO [OPENLAMBDA (CODE TRANSLATION-TABLE DONTFAKE RETURNALL) + + (* ;; "If RETURNALL and there are alternatives in the RANG, the list is returned. Othewise just the first one if the fake flag allows ") + + (LET [(RANGE (OR (GETHASH CODE TRANSLATION-TABLE) + (UNICODE.UNMAPPED CODE TRANSLATION-TABLE + DONTFAKE] + (CL:WHEN RANGE + (if (AND RETURNALL (CDR RANGE)) + then RANGE + else (SETQ RANGE (CAR RANGE)) + (CL:IF DONTFAKE + (TRUECODEP RANGE TRANSLATION-TABLE) + RANGE)))]) + +(PUTPROPS \UTF8.GETBASEBYTE MACRO ((BASE OFFSET ERROR?) (* ; + "Fetches the OFFSET'th byte from BASE, checking for UTF-8 validity if ERROR?") + (IF ERROR? + THEN (LET ((BYTE (\GETBASEBYTE BASE OFFSET))) + (CL:WHEN (ILESSP BYTE 128) + (ERROR "INVALID UTF8 BYTE" BYTE)) + BYTE) + ELSE (\GETBASEBYTE BASE OFFSET)))) + +(PUTPROPS UNICODE.SMALLP MACRO [OPENLAMBDA (UNICODE) (* ; + "Cananonicalizes a large UNICODE for EQ hash-testing") + (OR (SMALLP UNICODE) + (CAR (OR (MEMBER UNICODE *LARGEUNICODES*) + (PUSH *LARGEUNICODES* UNICODE]) + +(PUTPROPS TRUECODEP MACRO (OPENLAMBDA (RANGE TABLE) + + (* ;; "Return NIL if RANGE is a fake range in TABLE, otherwise RANGE.") + + (CL:UNLESS (CL:IF (EQ TABLE *MCCSTOUNICODE*) + (AND (IGEQ RANGE FIRST-PRIVATE-UNICODE) + (ILEQ RANGE LAST-PRIVATE-UNICODE)) + (AND (IGEQ RANGE FIRST-PRIVATE-MCCSCODE) + (ILEQ RANGE LAST-PRIVATE-MCCSCODE))) + RANGE))) +) +) + +(ADDTOVAR *DEFAULT-EXTERNALFORMATS* (UNIX :UTF-8)) + +(RPAQ? *MCCSTOUNICODE* NIL) + +(RPAQ? *UNICODETOMCCS* NIL) + +(RPAQ? *LARGEUNICODES* NIL) +(DECLARE%: DOEVAL@COMPILE DONTCOPY + +(GLOBALVARS *MCCSTOUNICODE* *UNICODETOMCCS* *LARGEUNICODES*) +) + + + +(* ;; +"There are 6400 private Unicodes in 25 256-code charsets. For MCCS we map to a contiguous region of unused/reserved--private isn't big enough" +) + +(DECLARE%: DOEVAL@COMPILE DONTCOPY + +(GLOBALVARS *NEXT-PRIVATE-UNICODE* *NEXT-PRIVATE-MCCSCODE*) +) +(DECLARE%: EVAL@COMPILE DONTCOPY +(DECLARE%: EVAL@COMPILE + +(RPAQ FIRST-PRIVATE-UNICODE (HEXNUM? "E000")) + +(RPAQ LAST-PRIVATE-UNICODE (HEXNUM? "F8FF")) + +(RPAQ FIRST-PRIVATE-MCCSCODE (CHARCODE "200,0")) + +(RPAQ LAST-PRIVATE-MCCSCODE (CHARCODE "230,377")) + + +(CONSTANTS (FIRST-PRIVATE-UNICODE (HEXNUM? "E000")) + (LAST-PRIVATE-UNICODE (HEXNUM? "F8FF")) + (FIRST-PRIVATE-MCCSCODE (CHARCODE "200,0")) + (LAST-PRIVATE-MCCSCODE (CHARCODE "230,377"))) +) +) +(DEFINEQ + +(UNICODE-INIT + [LAMBDA NIL (* ; "Edited 23-Feb-2026 10:14 by rmk") + (SETQ *NEXT-PRIVATE-MCCSCODE* FIRST-PRIVATE-MCCSCODE) + (SETQ *NEXT-PRIVATE-UNICODE* FIRST-PRIVATE-UNICODE]) +) + +(UNICODE-INIT) +(DECLARE%: EVAL@LOAD DONTCOPY + +(FILESLOAD UNICODE-TABLES) +) +(MERGE-UNICODE-TRANSLATION-TABLES NIL (QUOTE ((0 0) (1 1) (2 2) (3 3) (4 4) (5 5) (6 6) (7 7) (8 8) (9 + 9) (10 10) (11 11) (12 12) (13 13) (14 14) (15 15) (16 16) (17 17) (18 18) (19 19) (20 20) (21 21) ( +22 22) (23 23) (24 24) (25 25) (26 26) (27 27) (28 28) (29 29) (30 30) (31 31) (32 32) (33 33) (34 34) + (35 35) (36 36) (37 37) (38 38) (39 39) (40 40) (41 41) (42 42) (43 43) (44 44) (45 45) (46 46) (47 +47) (48 48) (49 49) (50 50) (51 51) (52 52) (53 53) (54 54) (55 55) (56 56) (57 57) (58 58) (59 59) ( +60 60) (61 61) (62 62) (63 63) (64 64) (65 65) (66 66) (67 67) (68 68) (69 69) (70 70) (71 71) (72 72) + (73 73) (74 74) (75 75) (76 76) (77 77) (78 78) (79 79) (80 80) (81 81) (82 82) (83 83) (84 84) (85 +85) (86 86) (87 87) (88 88) (89 89) (90 90) (91 91) (92 92) (93 93) (94 8593) (95 8592) (96 96) (97 97 +) (98 98) (99 99) (100 100) (101 101) (102 102) (103 103) (104 104) (105 105) (106 106) (107 107) (108 + 108) (109 109) (110 110) (111 111) (112 112) (113 113) (114 114) (115 115) (116 116) (117 117) (118 +118) (119 119) (120 120) (121 121) (122 122) (123 123) (124 124) (125 125) (126 126) (127 127) (161 +161) (162 162) (163 163) (164 164) (165 165) (167 167) (169 8216) (170 8220) (171 171) (172 95) (173 +94) (174 8594) (175 8595) (176 176) (177 177) (178 178) (179 179) (180 215) (181 181) (182 182) (183 +183) (184 247) (185 8217) (186 8221) (187 187) (188 188) (189 189) (190 190) (191 191) (193 768) (194 +769) (195 770) (196 771) (197 772) (198 774) (199 775) (200 776) (202 778) (203 807) (204 818) (205 +779) (206 808) (207 780) (208 8213) (209 185) (210 174) (211 169) (212 8482) (213 9834) (220 8539) ( +221 8540) (222 8541) (223 8542) (224 8486) (225 198) (226 208) (227 170) (228 294) (229 567) (230 306) + (231 319) (232 321) (233 216) (234 338) (235 186) (236 222) (237 358) (238 330) (239 329) (240 312) ( +241 230) (242 273) (243 240) (244 295) (245 305) (246 307) (247 320) (248 322) (249 248) (250 339) ( +251 223) (252 254) (253 359) (254 331) (8481 12288) (8482 12289) (8483 12290) (8484 65292) (8485 65294 +) (8491 12441) (8492 12442) (8499 12541) (8500 12542) (8501 12445) (8502 12446) (8503 12291) (8504 +20189) (8505 12293) (8506 12294) (8507 43472) (8508 12540) (8510 8208) (8512 8918) (8513 8919) (8514 +8741) (8515 8873) (8516 8230) (8517 8229) (8518 8920) (8519 8921) (8520 10220) (8521 10221) (8522 +10214) (8523 10215) (8524 12308) (8525 12309) (8526 8922) (8527 8923) (8528 8826) (8529 8827) (8530 +8828) (8531 8829) (8532 8926) (8533 8927) (8534 12300) (8535 12301) (8536 12302) (8537 12303) (8538 +12304) (8539 12305) (8540 10949) (8541 10950) (8542 8912) (8543 8913) (8544 10901) (8545 10902) (8546 +8800) (8547 10885) (8548 10886) (8549 8804) (8550 8805) (8551 8734) (8552 8756) (8553 9794) (8554 9792 +) (8555 8244) (8556 8242) (8557 8243) (8558 8451) (8559 8874) (8560 8806) (8561 8807) (8562 10877) ( +8563 10878) (8564 8922) (8565 8923) (8566 8741) (8567 8861) (8568 8859) (8569 9734) (8570 9733) (8571 +9675) (8572 9679) (8573 9678) (8574 9671) (8609 8830) (8610 8831) (8611 10935) (8612 10936) (8613 8995 +) (8614 8994) (8615 124) (8616 8785) (8617 8791) (8618 8790) (8619 8796) (8620 8916) (8621 8720) (8622 + 10016) (8623 9671) (8624 8769) (8625 8936) (8626 8937) (8627 10937) (8628 10938) (8629 8740) (8630 +8742) (8631 8876) (8632 8877) (8633 8878) (8634 8879) (8635 8938) (8636 8939) (8637 8940) (8638 8941) +(8639 8772) (8640 8777) (8641 10955) (8642 10956) (8643 8840) (8644 8841) (8645 8842) (8646 8843) ( +8647 10955) (8648 10956) (8649 8814) (8650 8815) (8651 8780) (8652 8775) (8656 8832) (8657 8833) (8658 + 8928) (8659 8929) (8660 10933) (8661 10934) (8662 8928) (8665 8820) (8666 8821) (8672 8816) (8673 +8817) (8674 10887) (8675 10888) (8676 8934) (8677 8935) (8678 8816) (8679 8817) (8686 8930) (8687 8931 +) (8688 8816) (8689 8817) (8690 8808) (8691 8809) (8692 8808) (8693 8809) (8737 9670) (8738 9633) ( +8739 9632) (8740 9651) (8741 9650) (8742 9661) (8743 9660) (8744 8251) (8745 12306) (8746 8216) (8747 +8242) (8748 8243) (8750 12307) (8751 8862) (8752 8863) (8753 8864) (8754 8865) (8756 8813) (8760 12298 +) (8761 12299) (8764 8258) (8765 8485) (8766 8241) (8768 8647) (8769 8649) (8770 8648) (8771 8650) ( +8772 8666) (8773 8667) (8774 8606) (8775 8608) (8776 8639) (8777 8643) (8778 8638) (8779 8642) (8780 +8610) (8781 8611) (8782 8619) (8783 8620) (8784 8624) (8785 8625) (8786 8621) (8787 8888) (8788 8788) +(8789 8789) (8790 8636) (8791 8637) (8792 8640) (8793 8641) (8794 8618) (8795 8617) (8796 10229) (8797 + 10230) (8798 10232) (8799 10233) (8800 8657) (8801 8659) (8802 8786) (8803 8787) (8804 8781) (8805 +10927) (8806 10928) (8807 10231) (8808 10234) (8809 10234) (8810 8748) (8811 8614) (8812 8904) (8813 +11089) (8814 9838) (8815 8995) (8816 9653) (8817 8810) (8818 8811) (8819 8853) (8820 8854) (8821 8855) + (8822 8856) (8823 8764) (8824 8776) (8825 8733) (8827 9663) (8828 8487) (8829 8768) (8830 9711) (8865 + (38 818)) (8866 8801) (8867 9049) (8868 9080) (8869 9079) (8870 8472) (8871 8709) (8872 8476) (8873 +8465) (8874 8868) (8875 8846) (8876 8871) (8877 8852) (8878 8851) (8879 8846) (8880 8849) (8881 8850) +(8882 8743) (8883 8744) (8884 9652) (8885 9662) (8886 8852) (8887 8720) (8888 8738) (8889 8717) (8890 +8951) (8891 9657) (8892 9667) (8893 8857) (8894 8765) (8896 94) (8897 (65 818)) (8898 (66 818)) (8899 +(67 818)) (8900 (68 818)) (8901 (69 818)) (8902 (70 818)) (8903 (71 818)) (8904 (72 818)) (8905 (73 +818)) (8906 (74 818)) (8907 (75 818)) (8908 (76 818)) (8909 (77 818)) (8910 (78 818)) (8911 (79 818)) +(8912 (80 818)) (8913 (81 818)) (8914 (82 818)) (8915 (83 818)) (8916 (84 818)) (8917 (85 818)) (8918 +(86 818)) (8919 (87 818)) (8920 (88 818)) (8921 (89 818)) (8922 (90 818)) (8923 9122) (8924 9125) ( +8927 9647) (8935 8474) (8936 8461) (8938 8853) (8939 8855) (8940 8857) (8941 8356) (8942 8626) (8943 +8627) (8944 8729) (8945 8988) (8946 8989) (8947 8990) (8948 8991) (8949 8858) (8994 168) (8995 180) ( +8996 175) (8997 728) (8998 729) (8999 39) (9000 730) (9001 733) (9002 731) (9003 711) (9004 184) (9008 + 183) (9009 832) (9010 833) (9011 770) (9012 771) (9013 772) (9014 774) (9015 775) (9016 776) (9018 +778) (9019 807) (9021 779) (9022 808) (9023 780) (9024 398) (9025 385) (9026 394) (9027 408) (9028 416 +) (9029 431) (9030 399) (9031 418) (9032 437) (9036 415) (9038 400) (9039 404) (9040 406) (9041 390) ( +9042 425) (9043 434) (9044 439) (9045 440) (9046 391) (9047 401) (9048 420) (9049 428) (9050 435) ( +9053 413) (9056 96) (9057 595) (9058 599) (9059 409) (9060 417) (9061 432) (9062 477) (9063 419) (9064 + 438) (9065 447) (9066 410) (9068 629) (9077 441) (9078 392) (9079 402) (9080 421) (9081 429) (9082 +436) (9086 8254) (9121 703) (9122 8216) (9124 450) (9125 451) (9126 448) (9127 449) (9129 384) (9130 +403) (9131 405) (9132 9837) (9134 8471) (9135 8485) (9136 700) (9137 699) (9138 8218) (9139 865) (9144 + 8407) (9145 824) (9146 770) (9147 771) (9148 9839) (9149 697) (9150 698) (9151 785) (9152 777) (9153 +823) (9154 8417) (9155 773) (9157 768) (9158 769) (9160 8406) (9161 776) (9162 781) (9163 789) (9164 +786) (9166 795) (9167 821) (9168 782) (9169 808) (9170 807) (9171 806) (9172 805) (9173 814) (9174 803 +) (9175 804) (9176 816) (9177 819) (9178 809) (9179 813) (9180 817) (9181 65056) (9182 65057) (9183 +65059) (9184 8401) (9186 783) (9200 831) (9201 784) (9204 788) (9205 790) (9206 791) (9207 792) (9208 +793) (9209 794) (9210 815) (9211 822) (9212 825) (9213 826) (9214 827) (9249 12353) (9250 12354) (9251 + 12355) (9252 12356) (9253 12357) (9254 12358) (9255 12359) (9256 12360) (9257 12361) (9258 12362) ( +9259 12363) (9260 12364) (9261 12365) (9262 12366) (9263 12367) (9264 12368) (9265 12369) (9266 12370) + (9267 12371) (9268 12372) (9269 12373) (9270 12374) (9271 12375) (9272 12376) (9273 12377) (9274 +12378) (9275 12379) (9276 12380) (9277 12381) (9278 12382) (9279 12383) (9280 12384) (9281 12385) ( +9282 12386) (9283 12387) (9284 12388) (9285 12389) (9286 12390) (9287 12391) (9288 12392) (9289 12393) + (9290 12394) (9291 12395) (9292 12396) (9293 12397) (9294 12398) (9295 12399) (9296 12400) (9297 +12401) (9298 12402) (9299 12403) (9300 12404) (9301 12405) (9302 12406) (9303 12407) (9304 12408) ( +9305 12409) (9306 12410) (9307 12411) (9308 12412) (9309 12413) (9310 12414) (9311 12415) (9312 12416) + (9313 12417) (9314 12418) (9315 12419) (9316 12420) (9317 12421) (9318 12422) (9319 12423) (9320 +12424) (9321 12425) (9322 12426) (9323 12427) (9324 12428) (9325 12429) (9326 12430) (9327 12431) ( +9328 12432) (9329 12433) (9330 12434) (9331 12435) (9377 12549) (9378 12550) (9379 12551) (9380 12552) + (9381 12553) (9382 12554) (9383 12555) (9384 12556) (9385 12557) (9386 12558) (9387 12559) (9388 +12560) (9389 12561) (9390 12562) (9391 12563) (9392 12564) (9393 12565) (9394 12566) (9395 12567) ( +9396 12568) (9397 12569) (9398 12570) (9399 12571) (9400 12572) (9401 12573) (9402 12574) (9403 12575) + (9404 12576) (9405 12577) (9406 12578) (9407 12579) (9408 12580) (9409 12581) (9410 12582) (9411 +12583) (9412 12584) (9413 12585) (9414 714) (9415 711) (9416 715) (9417 729) (9418 713) (9419 12587) ( +9420 12586) (9421 12588) (9505 12449) (9506 12450) (9507 12451) (9508 12452) (9509 12453) (9510 12454) + (9511 12455) (9512 12456) (9513 12457) (9514 12458) (9515 12459) (9516 12460) (9517 12461) (9518 +12462) (9519 12463) (9520 12464) (9521 12465) (9522 12466) (9523 12467) (9524 12468) (9525 12469) ( +9526 12470) (9527 12471) (9528 12472) (9529 12473) (9530 12474) (9531 12475) (9532 12476) (9533 12477) + (9534 12478) (9535 12479) (9536 12480) (9537 12481) (9538 12482) (9539 12483) (9540 12484) (9541 +12485) (9542 12486) (9543 12487) (9544 12488) (9545 12489) (9546 12490) (9547 12491) (9548 12492) ( +9549 12493) (9550 12494) (9551 12495) (9552 12496) (9553 12497) (9554 12498) (9555 12499) (9556 12500) + (9557 12501) (9558 12502) (9559 12503) (9560 12504) (9561 12505) (9562 12506) (9563 12507) (9564 +12508) (9565 12509) (9566 12510) (9567 12511) (9568 12512) (9569 12513) (9570 12514) (9571 12515) ( +9572 12516) (9573 12517) (9574 12518) (9575 12519) (9576 12520) (9577 12521) (9578 12522) (9579 12523) + (9580 12524) (9581 12525) (9582 12526) (9583 12527) (9584 12528) (9585 12529) (9586 12530) (9587 +12531) (9588 12532) (9589 12533) (9590 12534) (9591 12535) (9592 12536) (9593 12537) (9594 12538) ( +9595 12539) (9762 894) (9763 835) (9764 900) (9765 787) (9766 788) (9767 837) (9769 8158) (9770 8157) +(9771 901) (9772 8159) (9773 8128) (9774 8189) (9775 8175) (9776 1010) (9777 900) (9778 890) (9779 +8125) (9780 884) (9781 885) (9782 8174) (9783 8173) (9785 8142) (9786 8141) (9787 903) (9788 8143) ( +9789 8129) (9790 8127) (9791 8190) (9792 990) (9793 913) (9794 914) (9796 915) (9797 916) (9798 917) ( +9799 986) (9800 988) (9801 918) (9802 919) (9803 920) (9804 921) (9805 922) (9806 923) (9807 924) ( +9808 925) (9809 926) (9810 927) (9811 928) (9812 984) (9813 929) (9814 931) (9816 932) (9817 933) ( +9818 934) (9819 935) (9820 936) (9821 937) (9822 992) (9824 991) (9825 945) (9826 946) (9827 976) ( +9828 947) (9829 948) (9830 949) (9831 987) (9832 989) (9833 950) (9834 951) (9835 952) (9836 953) ( +9837 954) (9838 955) (9839 956) (9840 957) (9841 958) (9842 959) (9843 960) (9844 985) (9845 961) ( +9846 963) (9847 962) (9848 964) (9849 965) (9850 966) (9851 967) (9852 968) (9853 969) (9854 993) ( +9904 1001) (9905 1003) (9906 1005) (9907 1007) (9920 836) (9921 8158) (9922 8142) (9923 8159) (9924 +8143) (9925 769) (9926 768) (9927 834) (9928 8158) (9929 8157) (9930 8142) (9931 8141) (9932 776) ( +9933 901) (9934 8173) (9935 8129) (9936 902) (9937 904) (9938 905) (9939 906) (9940 908) (9941 910) ( +9942 911) (9943 938) (9944 939) (9945 (938 769)) (9946 (939 769)) (9948 994) (9949 996) (9950 998) ( +9952 979) (9953 980) (9968 940) (9969 941) (9970 942) (9971 943) (9972 972) (9973 973) (9974 974) ( +9975 970) (9976 971) (9977 912) (9978 944) (9979 1011) (9980 995) (9981 997) (9982 999) (10017 1040) ( +10018 1041) (10019 1042) (10020 1043) (10021 1044) (10022 1045) (10023 1025) (10024 1046) (10025 1047) + (10026 1048) (10027 1049) (10028 1050) (10029 1051) (10030 1052) (10031 1053) (10032 1054) (10033 +1055) (10034 1056) (10035 1057) (10036 1058) (10037 1059) (10038 1060) (10039 1061) (10040 1062) ( +10041 1063) (10042 1064) (10043 1065) (10044 1066) (10045 1067) (10046 1068) (10047 1069) (10048 1070) + (10049 1071) (10050 1168) (10051 1026) (10052 1027) (10053 1028) (10054 1029) (10055 1030) (10056 +1031) (10057 1032) (10058 1033) (10059 1034) (10060 1035) (10061 1036) (10062 1038) (10065 1072) ( +10066 1073) (10067 1074) (10068 1075) (10069 1076) (10070 1077) (10071 1105) (10072 1078) (10073 1079) + (10074 1080) (10075 1081) (10076 1082) (10077 1083) (10078 1084) (10079 1085) (10080 1086) (10081 +1087) (10082 1088) (10083 1089) (10084 1090) (10085 1091) (10086 1092) (10087 1093) (10088 1094) ( +10089 1095) (10090 1096) (10091 1097) (10092 1098) (10093 1099) (10094 1100) (10095 1101) (10096 1102) + (10097 1103) (10098 1169) (10099 1106) (10100 1107) (10101 1108) (10102 1109) (10103 1110) (10104 +1111) (10105 1112) (10106 1113) (10107 1114) (10108 1115) (10109 1116) (10110 1118) (10145 1039) ( +10146 1122) (10147 1138) (10148 1140) (10149 1130) (10150 1306) (10151 1308) (10152 1198) (10153 (1040 + 769)) (10154 1234) (10155 1232) (10156 1236) (10157 1170) (10158 1172) (10159 (1045 769)) (10160 1238 +) (10161 1244) (10162 1174) (10163 1246) (10164 1176) (10165 (1048 769)) (10166 1252) (10167 1250) ( +10168 1178) (10170 1180) (10171 1184) (10172 1182) (10173 1186) (10174 1188) (10175 (1054 769)) (10176 + 1254) (10178 1190) (10179 1194) (10181 1196) (10182 1204) (10183 (1059 769)) (10184 1264) (10185 1266 +) (10187 1262) (10188 1202) (10189 1276) (10190 1268) (10191 1216) (10193 1119) (10194 1123) (10195 +1139) (10196 1141) (10197 1131) (10198 1307) (10199 1309) (10200 1199) (10201 (1072 769)) (10202 1235) + (10203 1233) (10204 1237) (10205 1171) (10206 1173) (10207 (1077 769)) (10208 1239) (10209 1245) ( +10210 1175) (10211 1247) (10212 1177) (10213 (1080 769)) (10214 1253) (10215 1251) (10216 1179) (10218 + 1181) (10219 1185) (10220 1183) (10221 1187) (10222 1189) (10223 (1086 769)) (10224 1255) (10226 1191 +) (10227 1195) (10229 1197) (10230 1205) (10231 (1091 769)) (10232 1265) (10233 1267) (10235 1263) ( +10236 1203) (10237 1277) (10238 1269) (10273 9472) (10274 9474) (10275 9484) (10276 9488) (10277 9496) + (10278 9492) (10279 9500) (10280 9516) (10281 9508) (10282 9524) (10283 9532) (10284 9473) (10285 +9475) (10286 9487) (10287 9491) (10288 9499) (10289 9495) (10290 9507) (10291 9523) (10292 9515) ( +10293 9531) (10294 9547) (10295 9504) (10296 9519) (10297 9512) (10298 9527) (10299 9535) (10300 9501) + (10301 9520) (10302 9509) (10303 9528) (10304 9538) (10305 9550) (10306 9551) (10307 9545) (10308 +9543) (10309 9544) (10310 9546) (10311 9548) (10313 9486) (10314 9490) (10315 9498) (10316 9494) ( +10317 9485) (10318 9489) (10319 9497) (10320 9569) (10321 9570) (10322 9558) (10323 9557) (10324 9571) + (10325 9553) (10326 9559) (10327 9565) (10328 9564) (10329 9563) (10330 9566) (10331 9567) (10332 +9562) (10333 9556) (10334 9577) (10335 9574) (10336 9568) (10337 9552) (10338 9580) (10339 9575) ( +10340 9576) (10341 9572) (10342 9573) (10343 9561) (10344 9560) (10345 9554) (10346 9555) (10347 9579) + (10348 9578) (10363 9493) (10444 9502) (10445 9503) (10446 9505) (10447 9506) (10448 9476) (10449 +9477) (10450 9478) (10451 9479) (10452 9480) (10453 9481) (10454 9482) (10455 9483) (10456 9549) ( +10457 9581) (10458 9582) (10459 9583) (10460 9584) (10461 9585) (10462 9586) (10463 9608) (10530 5792) + (10532 5794) (10535 5798) (10539 5800) (10546 5809) (10549 5810) (10551 5812) (10554 5815) (10555 +5813) (10557 5817) (10559 5818) (10560 5819) (10564 5820) (10567 5822) (10570 5823) (10571 5825) ( +10572 5827) (10582 5831) (10585 5832) (10607 5839) (10608 5840) (10610 5842) (10615 5846) (10616 5847) + (10618 5848) (10620 5849) (10622 5850) (10623 5852) (10658 5853) (10659 5855) (10661 5805) (10662 +5806) (10663 5854) (10664 5841) (10665 5829) (10666 5807) (10667 5801) (10669 5873) (10671 5802) ( +10673 5803) (10674 5796) (10677 5795) (10678 5856) (10680 5857) (10721 66352) (10722 66353) (10723 +66354) (10724 66355) (10725 66356) (10726 66357) (10727 66358) (10728 66359) (10729 66360) (10730 ( +66361 776)) (10731 66361) (10732 66362) (10733 66363) (10734 66364) (10735 66365) (10736 66366) (10737 + 66367) (10738 66368) (10739 66369) (10740 66370) (10741 66371) (10742 66372) (10743 66373) (10744 +66374) (10745 66375) (10746 66376) (10747 66377) (10748 66378) (10785 1206) (10786 1227) (10787 1208) +(10788 (1069 769)) (10790 (1070 769)) (10792 (1071 769)) (10794 (1066 769)) (10795 1272) (10796 (1067 +769)) (10797 (769 1028)) (10798 1240) (10799 1212) (10800 1214) (10801 1192) (10802 (1198 769)) (10803 + 1200) (10807 (1025 769)) (10808 1242) (10809 1248) (10810 1219) (10811 1258) (10816 1170) (10817 1256 +) (10818 1217) (10819 1210) (10822 1223) (10827 1142) (10833 1207) (10834 1228) (10835 1209) (10836 ( +1101 769)) (10838 (1102 769)) (10840 (1103 769)) (10842 (1098 769)) (10843 1273) (10844 (1099 769)) ( +10845 (1108 769)) (10846 1241) (10847 1213) (10848 1215) (10849 1193) (10850 (1199 769)) (10851 1201) +(10855 (1105 769)) (10856 1243) (10857 1249) (10858 1220) (10859 1259) (10864 1171) (10865 1257) ( +10866 1218) (10867 1211) (10870 1224) (10875 1143) (10914 1146) (10920 1120) (10924 1124) (10927 1126) + (10929 1128) (10930 1132) (10931 1134) (10932 1136) (10934 1152) (10943 1150) (10944 1148) (10951 +1144) (10952 1156) (10957 1154) (10962 1147) (10967 1145) (10968 1121) (10972 1125) (10975 1127) ( +10977 1129) (10978 1133) (10979 1135) (10980 1137) (10982 1153) (10991 1151) (10992 1149) (10999 1155) + (11809 9472) (11810 9135) (11811 9473) (11827 65079) (11828 65080) (12068 65075) (12070 65073) (12075 + 8942) (12076 65072) (12077 65077) (12078 65078) (12079 65081) (12080 65082) (12081 65079) (12082 +65080) (12089 65089) (12090 65090) (12091 65091) (12092 65092) (12093 65083) (12094 65084) (12096 +12353) (12097 12357) (12098 12357) (12099 12359) (12100 12361) (12101 12387) (12102 12419) (12103 +12421) (12104 12423) (12105 12430) (12106 12449) (12107 12451) (12108 12453) (12109 12455) (12110 +12457) (12111 12483) (12112 12515) (12113 12517) (12114 12519) (12115 12526) (12116 12533) (12117 +12534) (12130 12307) (12193 65087) (12194 65088) (12216 65076) (12224 12832) (12225 12833) (12226 +12834) (12227 12835) (12228 12836) (12229 12837) (12230 12838) (12231 12839) (12232 12840) (12233 +12841) (12257 12337) (12258 12338) (12264 65085) (12265 65086) (12273 12339) (12274 12340) (12275 +12341) (12321 20124) (12322 21782) (12323 23043) (12324 38463) (12325 21696) (12326 24859) (12327 +25384) (12328 23030) (12329 36898) (12330 33909) (12331 33564) (12332 31312) (12333 24746) (12334 +25569) (12335 28197) (12336 26093) (12337 33894) (12338 33446) (12339 39925) (12340 26771) (12341 +22311) (12342 26017) (12343 25201) (12344 23451) (12345 22992) (12346 34427) (12347 39156) (12348 +32098) (12349 32190) (12350 39822) (12351 25110) (12352 31903) (12353 34999) (12354 23433) (12355 +24245) (12356 25353) (12357 26263) (12358 26696) (12359 38343) (12360 38797) (12361 26447) (12362 +20197) (12363 20234) (12364 20301) (12365 20381) (12366 20553) (12367 22258) (12368 22839) (12369 +22996) (12370 23041) (12371 23561) (12372 24799) (12373 24847) (12374 24944) (12375 26131) (12376 +26885) (12377 28858) (12378 30031) (12379 30064) (12380 31227) (12381 32173) (12382 32239) (12383 +32963) (12384 33806) (12385 34915) (12386 35586) (12387 36949) (12388 36986) (12389 21307) (12390 +20117) (12391 20133) (12392 22495) (12393 32946) (12394 37057) (12395 30959) (12396 19968) (12397 +22769) (12398 28322) (12399 36920) (12400 31282) (12401 33576) (12402 33419) (12403 39983) (12404 +20801) (12405 21360) (12406 21693) (12407 21729) (12408 22240) (12409 23035) (12410 24341) (12411 +39154) (12412 28139) (12413 32996) (12414 34093) (12577 38498) (12578 38512) (12579 38560) (12580 +38907) (12581 21515) (12582 21491) (12583 23431) (12584 28879) (12585 32701) (12586 36802) (12587 +38632) (12588 21359) (12589 40284) (12590 31418) (12591 19985) (12592 30867) (12593 33276) (12594 +28198) (12595 22040) (12596 21764) (12597 27421) (12598 34074) (12599 39995) (12600 23013) (12601 +21417) (12602 28006) (12603 29916) (12604 38287) (12605 22082) (12606 20113) (12607 36939) (12608 +38642) (12609 33615) (12610 39180) (12611 21473) (12612 21942) (12613 23344) (12614 24433) (12615 +26144) (12616 26355) (12617 26628) (12618 27704) (12619 27891) (12620 27945) (12621 29787) (12622 +30408) (12623 31310) (12624 38964) (12625 33521) (12626 34907) (12627 35424) (12628 37613) (12629 +28082) (12630 30123) (12631 30410) (12632 39365) (12633 24742) (12634 35585) (12635 36234) (12636 +38322) (12637 27022) (12638 21421) (12639 20870) (12640 22290) (12641 22576) (12642 22852) (12643 +23476) (12644 24310) (12645 24616) (12646 25513) (12647 25588) (12648 27839) (12649 28436) (12650 +28814) (12651 28948) (12652 29017) (12653 29141) (12654 29503) (12655 32257) (12656 33398) (12657 +33489) (12658 34199) (12659 36960) (12660 37467) (12661 40219) (12662 22633) (12663 26044) (12664 +27738) (12665 29989) (12666 20985) (12667 22830) (12668 22885) (12669 24448) (12670 24540) (12833 +25276) (12834 26106) (12835 27178) (12836 27431) (12837 27572) (12838 29579) (12839 32705) (12840 +35158) (12841 40236) (12842 40206) (12843 40644) (12844 23713) (12845 27798) (12846 33659) (12847 +20740) (12848 23627) (12849 25014) (12850 33222) (12851 26742) (12852 29281) (12853 20057) (12854 +20474) (12855 21368) (12856 24681) (12857 28201) (12858 31311) (12859 38899) (12860 19979) (12861 +21270) (12862 20206) (12863 20309) (12864 20285) (12865 20385) (12866 20339) (12867 21152) (12868 +21487) (12869 22025) (12870 22799) (12871 23233) (12872 23478) (12873 23521) (12874 31185) (12875 +26247) (12876 26524) (12877 26550) (12878 27468) (12879 27827) (12880 28779) (12881 29634) (12882 +31117) (12883 31166) (12884 31292) (12885 31623) (12886 33457) (12887 33499) (12888 33540) (12889 +33655) (12890 33775) (12891 33747) (12892 34662) (12893 35506) (12894 22057) (12895 36008) (12896 +36838) (12897 36942) (12898 38686) (12899 34442) (12900 20420) (12901 23784) (12902 25105) (12903 +29273) (12904 30011) (12905 33253) (12906 33469) (12907 34558) (12908 36032) (12909 38597) (12910 +39187) (12911 39381) (12912 20171) (12913 20250) (12914 35299) (12915 22238) (12916 22602) (12917 +22730) (12918 24315) (12919 24555) (12920 24618) (12921 24724) (12922 24674) (12923 25040) (12924 +25106) (12925 25296) (12926 25913) (13089 39745) (13090 26214) (13091 26800) (13092 28023) (13093 +28784) (13094 30028) (13095 30342) (13096 32117) (13097 33445) (13098 34809) (13099 38283) (13100 +38542) (13101 35997) (13102 20977) (13103 21182) (13104 22806) (13105 21683) (13106 23475) (13107 +23830) (13108 24936) (13109 27010) (13110 28079) (13111 30861) (13112 33995) (13113 34903) (13114 +35442) (13115 37799) (13116 39608) (13117 28012) (13118 39336) (13119 34521) (13120 22435) (13121 +26623) (13122 34510) (13123 37390) (13124 21123) (13125 22151) (13126 21508) (13127 24275) (13128 +25313) (13129 25785) (13130 26684) (13131 26680) (13132 27579) (13133 29554) (13134 30906) (13135 +31339) (13136 35226) (13137 35282) (13138 36203) (13139 36611) (13140 37101) (13141 38307) (13142 +38548) (13143 38761) (13144 23398) (13145 23731) (13146 27005) (13147 38989) (13148 38990) (13149 +25499) (13150 31520) (13151 27179) (13152 27263) (13153 26806) (13154 39949) (13155 28511) (13156 +21106) (13157 21917) (13158 24688) (13159 25324) (13160 27963) (13161 28167) (13162 28369) (13163 +33883) (13164 35088) (13165 36676) (13166 19988) (13167 39993) (13168 21494) (13169 26907) (13170 +27194) (13171 38788) (13172 26666) (13173 20828) (13174 31427) (13175 33970) (13176 37340) (13177 +37772) (13178 22107) (13179 40232) (13180 26658) (13181 33541) (13182 33841) (13345 31909) (13346 +21000) (13347 33477) (13348 29926) (13349 20094) (13350 20355) (13351 20896) (13352 23506) (13353 +21002) (13354 21208) (13355 21223) (13356 24059) (13357 21914) (13358 22570) (13359 23014) (13360 +23436) (13361 23448) (13362 23515) (13363 24178) (13364 24185) (13365 24739) (13366 24863) (13367 +24931) (13368 25022) (13369 25563) (13370 25954) (13371 26577) (13372 26707) (13373 26874) (13374 +27454) (13375 27475) (13376 27735) (13377 28450) (13378 28567) (13379 28485) (13380 29872) (13381 +29976) (13382 30435) (13383 30475) (13384 31487) (13385 31649) (13386 31777) (13387 32233) (13388 +32566) (13389 32752) (13390 32925) (13391 33382) (13392 33694) (13393 35251) (13394 35532) (13395 +36011) (13396 36996) (13397 37969) (13398 38291) (13399 38289) (13400 38306) (13401 38501) (13402 +38867) (13403 39208) (13404 33304) (13405 20024) (13406 21547) (13407 23736) (13408 24012) (13409 +29609) (13410 30284) (13411 30524) (13412 23721) (13413 32747) (13414 36107) (13415 38593) (13416 +38929) (13417 38996) (13418 39000) (13419 20225) (13420 20238) (13421 21361) (13422 21916) (13423 +22120) (13424 22522) (13425 22855) (13426 23305) (13427 23492) (13428 23696) (13429 24076) (13430 +24190) (13431 24524) (13432 25582) (13433 26426) (13434 26071) (13435 26082) (13436 26399) (13437 +26827) (13438 26820) (13601 27231) (13602 24112) (13603 27589) (13604 27671) (13605 27773) (13606 +30079) (13607 31048) (13608 23395) (13609 31232) (13610 32000) (13611 24509) (13612 35215) (13613 +35352) (13614 36020) (13615 36215) (13616 36556) (13617 36637) (13618 39138) (13619 39438) (13620 +39740) (13621 20096) (13622 20605) (13623 20736) (13624 22931) (13625 23452) (13626 25135) (13627 +25216) (13628 25836) (13629 27450) (13630 29344) (13631 30097) (13632 31047) (13633 32681) (13634 +34811) (13635 35516) (13636 35696) (13637 25516) (13638 33738) (13639 38816) (13640 21513) (13641 +21507) (13642 21931) (13643 26708) (13644 27224) (13645 35440) (13646 30759) (13647 26485) (13648 +40653) (13649 21364) (13650 23458) (13651 33050) (13652 34384) (13653 36870) (13654 19992) (13655 +20037) (13656 20167) (13657 20241) (13658 21450) (13659 21560) (13660 23470) (13661 24339) (13662 +24613) (13663 25937) (13664 26429) (13665 27714) (13666 27762) (13667 27875) (13668 28792) (13669 +29699) (13670 31350) (13671 31406) (13672 31496) (13673 32026) (13674 31998) (13675 32102) (13676 +26087) (13677 29275) (13678 21435) (13679 23621) (13680 24040) (13681 25298) (13682 25312) (13683 +25369) (13684 28192) (13685 34394) (13686 35377) (13687 36317) (13688 37624) (13689 28417) (13690 +31142) (13691 39770) (13692 20136) (13693 20139) (13694 20140) (13857 20379) (13858 20384) (13859 +20689) (13860 20807) (13861 31478) (13862 20849) (13863 20982) (13864 21332) (13865 21281) (13866 +21375) (13867 21483) (13868 21932) (13869 22659) (13870 23777) (13871 24375) (13872 24394) (13873 +24623) (13874 24656) (13875 24685) (13876 25375) (13877 25945) (13878 27211) (13879 27841) (13880 +29378) (13881 29421) (13882 30703) (13883 33016) (13884 33029) (13885 33288) (13886 34126) (13887 +37111) (13888 37857) (13889 38911) (13890 39255) (13891 39514) (13892 20208) (13893 20957) (13894 +23597) (13895 26241) (13896 26989) (13897 23616) (13898 26354) (13899 26997) (13900 29577) (13901 +26704) (13902 31873) (13903 20677) (13904 21220) (13905 22343) (13906 24062) (13907 37670) (13908 +26020) (13909 27427) (13910 27453) (13911 29748) (13912 31105) (13913 31165) (13914 31563) (13915 +32202) (13916 33465) (13917 33740) (13918 34943) (13919 35167) (13920 35641) (13921 36817) (13922 +37329) (13923 21535) (13924 37504) (13925 20061) (13926 20534) (13927 21477) (13928 21306) (13929 +29399) (13930 29590) (13931 30697) (13932 33510) (13933 36527) (13934 39366) (13935 39368) (13936 +39378) (13937 20855) (13938 24858) (13939 34398) (13940 21936) (13941 31354) (13942 20598) (13943 +23507) (13944 36935) (13945 38533) (13946 20018) (13947 27355) (13948 37351) (13949 23633) (13950 +23624) (14113 25496) (14114 31391) (14115 27795) (14116 38772) (14117 36705) (14118 31402) (14119 +29066) (14120 38536) (14121 31874) (14122 26647) (14123 32368) (14124 26705) (14125 37740) (14126 +21234) (14127 21531) (14128 34219) (14129 35347) (14130 32676) (14131 36557) (14132 37089) (14133 +21350) (14134 34952) (14135 31041) (14136 20418) (14137 20670) (14138 21009) (14139 20804) (14140 +21843) (14141 22317) (14142 29674) (14143 22411) (14144 22865) (14145 24418) (14146 24452) (14147 +24693) (14148 24950) (14149 24935) (14150 25001) (14151 25522) (14152 25658) (14153 25964) (14154 +26223) (14155 26690) (14156 28179) (14157 30054) (14158 31293) (14159 31995) (14160 32076) (14161 +32153) (14162 32331) (14163 32619) (14164 33550) (14165 33610) (14166 34509) (14167 35336) (14168 +35427) (14169 35686) (14170 36605) (14171 38938) (14172 40335) (14173 33464) (14174 36814) (14175 +39912) (14176 21127) (14177 25119) (14178 25731) (14179 28608) (14180 38553) (14181 26689) (14182 +20625) (14183 27424) (14184 27770) (14185 28500) (14186 31348) (14187 32080) (14188 34880) (14189 +35363) (14190 26376) (14191 20214) (14192 20537) (14193 20518) (14194 20581) (14195 20860) (14196 +21048) (14197 21091) (14198 21927) (14199 22287) (14200 22533) (14201 23244) (14202 24314) (14203 +25010) (14204 25080) (14205 25331) (14206 25458) (14369 26908) (14370 27177) (14371 29309) (14372 +29356) (14373 29486) (14374 30740) (14375 30831) (14376 32121) (14377 30476) (14378 32937) (14379 +35211) (14380 35609) (14381 36066) (14382 36562) (14383 36963) (14384 37749) (14385 38522) (14386 +38997) (14387 39443) (14388 40568) (14389 20803) (14390 21407) (14391 21427) (14392 24187) (14393 +24358) (14394 28187) (14395 28304) (14396 29572) (14397 29694) (14398 32067) (14399 33335) (14400 +35328) (14401 35578) (14402 38480) (14403 20046) (14404 20491) (14405 21476) (14406 21628) (14407 +22266) (14408 22993) (14409 23396) (14410 24049) (14411 24235) (14412 24359) (14413 25144) (14414 +25925) (14415 26543) (14416 28246) (14417 29392) (14418 31946) (14419 34996) (14420 32929) (14421 +32993) (14422 33776) (14423 34382) (14424 35463) (14425 36328) (14426 37431) (14427 38599) (14428 +39015) (14429 40723) (14430 20116) (14431 20114) (14432 20237) (14433 21320) (14434 21577) (14435 +21566) (14436 23087) (14437 24460) (14438 24481) (14439 24735) (14440 26791) (14441 27278) (14442 +29786) (14443 30849) (14444 35486) (14445 35492) (14446 35703) (14447 37264) (14448 20062) (14449 +39881) (14450 20132) (14451 20348) (14452 20399) (14453 20505) (14454 20502) (14455 20809) (14456 +20844) (14457 21151) (14458 21177) (14459 21246) (14460 21402) (14461 21475) (14462 21521) (14625 +21518) (14626 21897) (14627 22353) (14628 22434) (14629 22909) (14630 23380) (14631 23389) (14632 +23439) (14633 24037) (14634 24039) (14635 24055) (14636 24184) (14637 24195) (14638 24218) (14639 +24247) (14640 24344) (14641 24658) (14642 24908) (14643 25239) (14644 25304) (14645 25511) (14646 +25915) (14647 26114) (14648 26179) (14649 26356) (14650 26477) (14651 26657) (14652 26775) (14653 +27083) (14654 27743) (14655 27946) (14656 28009) (14657 28207) (14658 28317) (14659 30002) (14660 +30343) (14661 30828) (14662 31295) (14663 31968) (14664 32005) (14665 32024) (14666 32094) (14667 +32177) (14668 32789) (14669 32771) (14670 32943) (14671 32945) (14672 33108) (14673 33167) (14674 +33322) (14675 33618) (14676 34892) (14677 34913) (14678 35611) (14679 36002) (14680 36092) (14681 +37066) (14682 37237) (14683 37489) (14684 30783) (14685 37628) (14686 38308) (14687 38477) (14688 +38917) (14689 39321) (14690 39640) (14691 40251) (14692 21083) (14693 21163) (14694 21495) (14695 +21512) (14696 22741) (14697 25335) (14698 28640) (14699 35946) (14700 36703) (14701 40633) (14702 +20811) (14703 21051) (14704 21578) (14705 22269) (14706 31296) (14707 37239) (14708 40288) (14709 +40658) (14710 29508) (14711 28425) (14712 33136) (14713 29969) (14714 24573) (14715 24794) (14716 +39592) (14717 29403) (14718 36796) (14881 27492) (14882 38915) (14883 20170) (14884 22256) (14885 +22372) (14886 22718) (14887 23130) (14888 24680) (14889 25031) (14890 26127) (14891 26118) (14892 +26681) (14893 26801) (14894 28151) (14895 30165) (14896 32058) (14897 33390) (14898 39746) (14899 +20123) (14900 20304) (14901 21449) (14902 21766) (14903 23919) (14904 24038) (14905 24046) (14906 +26619) (14907 27801) (14908 29811) (14909 30722) (14910 35408) (14911 37782) (14912 35039) (14913 +22352) (14914 24231) (14915 25387) (14916 20661) (14917 20652) (14918 20877) (14919 26368) (14920 +21705) (14921 22622) (14922 22971) (14923 23472) (14924 24425) (14925 25165) (14926 25505) (14927 +26685) (14928 27507) (14929 28168) (14930 28797) (14931 37319) (14932 29312) (14933 30741) (14934 +30758) (14935 31085) (14936 25998) (14937 32048) (14938 33756) (14939 35009) (14940 36617) (14941 +38555) (14942 21092) (14943 22312) (14944 26448) (14945 32618) (14946 36001) (14947 20916) (14948 +22338) (14949 38442) (14950 22586) (14951 27018) (14952 32948) (14953 21682) (14954 23822) (14955 +22524) (14956 30869) (14957 40442) (14958 20316) (14959 21066) (14960 21643) (14961 25662) (14962 +26152) (14963 26388) (14964 26613) (14965 31364) (14966 31574) (14967 32034) (14968 37679) (14969 +26716) (14970 39853) (14971 31545) (14972 21273) (14973 20874) (14974 21047) (15137 23519) (15138 +25334) (15139 25774) (15140 25830) (15141 26413) (15142 27578) (15143 34217) (15144 38609) (15145 +30352) (15146 39894) (15147 25420) (15148 37638) (15149 39851) (15150 30399) (15151 26194) (15152 +19977) (15153 20632) (15154 21442) (15155 23665) (15156 24808) (15157 25746) (15158 25955) (15159 +26719) (15160 29158) (15161 29642) (15162 29987) (15163 31639) (15164 32386) (15165 34453) (15166 +35715) (15167 36059) (15168 37240) (15169 39184) (15170 26028) (15171 26283) (15172 27531) (15173 +20181) (15174 20180) (15175 20282) (15176 20351) (15177 21050) (15178 21496) (15179 21490) (15180 +21987) (15181 22235) (15182 22763) (15183 22987) (15184 22985) (15185 23039) (15186 23376) (15187 +23629) (15188 24066) (15189 24107) (15190 24535) (15191 24605) (15192 25351) (15193 25903) (15194 +23388) (15195 26031) (15196 26045) (15197 26088) (15198 26525) (15199 27490) (15200 27515) (15201 +27663) (15202 29509) (15203 31049) (15204 31169) (15205 31992) (15206 32025) (15207 32043) (15208 +32930) (15209 33026) (15210 33267) (15211 35222) (15212 35422) (15213 35433) (15214 35430) (15215 +35468) (15216 35566) (15217 36039) (15218 36060) (15219 38604) (15220 39164) (15221 27503) (15222 +20107) (15223 20284) (15224 20365) (15225 20816) (15226 23383) (15227 23546) (15228 24904) (15229 +25345) (15230 26178) (15393 27425) (15394 28363) (15395 27835) (15396 29246) (15397 29885) (15398 +30164) (15399 30913) (15400 31034) (15401 32780) (15402 32819) (15403 33258) (15404 33940) (15405 +36766) (15406 27728) (15407 40575) (15408 24335) (15409 35672) (15410 40235) (15411 31482) (15412 +36600) (15413 23437) (15414 38635) (15415 19971) (15416 21489) (15417 22519) (15418 22833) (15419 +23241) (15420 23460) (15421 24713) (15422 28287) (15423 28422) (15424 30142) (15425 36074) (15426 +23455) (15427 34048) (15428 31712) (15429 20594) (15430 26612) (15431 33437) (15432 23649) (15433 +34122) (15434 32286) (15435 33294) (15436 20889) (15437 23556) (15438 25448) (15439 36198) (15440 +26012) (15441 29038) (15442 31038) (15443 32023) (15444 32773) (15445 35613) (15446 36554) (15447 +36974) (15448 34503) (15449 37034) (15450 20511) (15451 21242) (15452 23610) (15453 26451) (15454 +28796) (15455 29237) (15456 37196) (15457 37320) (15458 37675) (15459 33509) (15460 23490) (15461 +24369) (15462 24825) (15463 20027) (15464 21462) (15465 23432) (15466 25163) (15467 26417) (15468 +27530) (15469 29417) (15470 29664) (15471 31278) (15472 33131) (15473 36259) (15474 37202) (15475 +39318) (15476 20754) (15477 21463) (15478 21610) (15479 23551) (15480 25480) (15481 27193) (15482 +32172) (15483 38656) (15484 22234) (15485 21454) (15486 21608) (15649 23447) (15650 23601) (15651 +24030) (15652 20462) (15653 24833) (15654 25342) (15655 27954) (15656 31168) (15657 31179) (15658 +32066) (15659 32333) (15660 32722) (15661 33261) (15662 33311) (15663 33936) (15664 34886) (15665 +35186) (15666 35728) (15667 36468) (15668 36655) (15669 36913) (15670 37195) (15671 37228) (15672 +38598) (15673 37276) (15674 20160) (15675 20303) (15676 20805) (15677 21313) (15678 24467) (15679 +25102) (15680 26580) (15681 27713) (15682 28171) (15683 29539) (15684 32294) (15685 37325) (15686 +37507) (15687 21460) (15688 22809) (15689 23487) (15690 28113) (15691 31069) (15692 32302) (15693 +31899) (15694 22654) (15695 29087) (15696 20986) (15697 34899) (15698 36848) (15699 20426) (15700 +23803) (15701 26149) (15702 30636) (15703 31459) (15704 33308) (15705 39423) (15706 20934) (15707 +24490) (15708 26092) (15709 26991) (15710 27529) (15711 28147) (15712 28310) (15713 28516) (15714 +30462) (15715 32020) (15716 24033) (15717 36981) (15718 37255) (15719 38918) (15720 20966) (15721 +21021) (15722 25152) (15723 26257) (15724 26329) (15725 28186) (15726 24246) (15727 32210) (15728 +32626) (15729 26360) (15730 34223) (15731 34295) (15732 35576) (15733 21161) (15734 21465) (15735 +22899) (15736 24207) (15737 24464) (15738 24661) (15739 37604) (15740 38500) (15741 20663) (15742 +20767) (15905 21213) (15906 21280) (15907 21319) (15908 21484) (15909 21736) (15910 21830) (15911 +21809) (15912 22039) (15913 22888) (15914 22974) (15915 23100) (15916 23477) (15917 23558) (15918 +23567) (15919 23569) (15920 23578) (15921 24196) (15922 24202) (15923 24288) (15924 24432) (15925 +25215) (15926 25220) (15927 25307) (15928 25484) (15929 25463) (15930 26119) (15931 26124) (15932 +26157) (15933 26230) (15934 26494) (15935 26786) (15936 27167) (15937 27189) (15938 27836) (15939 +28040) (15940 28169) (15941 28248) (15942 28988) (15943 28966) (15944 29031) (15945 30151) (15946 +30465) (15947 30813) (15948 30977) (15949 31077) (15950 31216) (15951 31456) (15952 31505) (15953 +31911) (15954 32057) (15955 32918) (15956 33750) (15957 33931) (15958 34121) (15959 34909) (15960 +35059) (15961 35359) (15962 35388) (15963 35412) (15964 35443) (15965 35937) (15966 36062) (15967 +37284) (15968 37478) (15969 37758) (15970 37912) (15971 38556) (15972 38808) (15973 19978) (15974 +19976) (15975 19998) (15976 20055) (15977 20887) (15978 21104) (15979 22478) (15980 22580) (15981 +22732) (15982 23330) (15983 24120) (15984 24773) (15985 25854) (15986 26465) (15987 26454) (15988 +27972) (15989 29366) (15990 30067) (15991 31331) (15992 33976) (15993 35698) (15994 37304) (15995 +37664) (15996 22065) (15997 22516) (15998 39166) (16161 25325) (16162 26893) (16163 27542) (16164 +29165) (16165 32340) (16166 32887) (16167 33394) (16168 35302) (16169 39135) (16170 34645) (16171 +36785) (16172 23611) (16173 20280) (16174 20449) (16175 20405) (16176 21767) (16177 23072) (16178 +23517) (16179 23529) (16180 24515) (16181 24910) (16182 25391) (16183 26032) (16184 26187) (16185 +26862) (16186 27035) (16187 28024) (16188 28145) (16189 30003) (16190 30137) (16191 30495) (16192 +31070) (16193 31206) (16194 32051) (16195 33251) (16196 33455) (16197 34218) (16198 35242) (16199 +35386) (16200 36523) (16201 36763) (16202 36914) (16203 37341) (16204 38663) (16205 20154) (16206 +20161) (16207 20995) (16208 22645) (16209 22764) (16210 23563) (16211 29978) (16212 23613) (16213 +33102) (16214 35338) (16215 36805) (16216 38499) (16217 38765) (16218 31525) (16219 35535) (16220 +38920) (16221 37218) (16222 22259) (16223 21416) (16224 36887) (16225 21561) (16226 22402) (16227 +24101) (16228 25512) (16229 27700) (16230 28810) (16231 30561) (16232 31883) (16233 32736) (16234 +34928) (16235 36930) (16236 37204) (16237 37648) (16238 37656) (16239 38543) (16240 29790) (16241 +39620) (16242 23815) (16243 23913) (16244 25968) (16245 26530) (16246 36264) (16247 38619) (16248 +25454) (16249 26441) (16250 26905) (16251 33733) (16252 38935) (16253 38592) (16254 35070) (16417 +28548) (16418 25722) (16419 23544) (16420 19990) (16421 28716) (16422 30045) (16423 26159) (16424 +20932) (16425 21046) (16426 21218) (16427 22995) (16428 24449) (16429 24615) (16430 25104) (16431 +25919) (16432 25972) (16433 26143) (16434 26228) (16435 26866) (16436 26646) (16437 27491) (16438 +28165) (16439 29298) (16440 29983) (16441 30427) (16442 31934) (16443 32854) (16444 22768) (16445 +35069) (16446 35199) (16447 35488) (16448 35475) (16449 35531) (16450 36893) (16451 37266) (16452 +38738) (16453 38745) (16454 25993) (16455 31246) (16456 33030) (16457 38587) (16458 24109) (16459 +24796) (16460 25114) (16461 26021) (16462 26132) (16463 26512) (16464 30707) (16465 31309) (16466 +31821) (16467 32318) (16468 33034) (16469 36012) (16470 36196) (16471 36321) (16472 36447) (16473 +30889) (16474 20999) (16475 25305) (16476 25509) (16477 25666) (16478 25240) (16479 35373) (16480 +31363) (16481 31680) (16482 35500) (16483 38634) (16484 32118) (16485 33292) (16486 34633) (16487 +20185) (16488 20808) (16489 21315) (16490 21344) (16491 23459) (16492 23554) (16493 23574) (16494 +24029) (16495 25126) (16496 25159) (16497 25776) (16498 26643) (16499 26676) (16500 27849) (16501 +27973) (16502 27927) (16503 26579) (16504 28508) (16505 29006) (16506 29053) (16507 26059) (16508 +31359) (16509 31661) (16510 32218) (16673 32330) (16674 32680) (16675 33146) (16676 33307) (16677 +33337) (16678 34214) (16679 35438) (16680 36046) (16681 36341) (16682 36984) (16683 36983) (16684 +37549) (16685 37521) (16686 38275) (16687 39854) (16688 21069) (16689 21892) (16690 28472) (16691 +28982) (16692 20840) (16693 31109) (16694 32341) (16695 33203) (16696 31950) (16697 22092) (16698 +22609) (16699 23720) (16700 25514) (16701 26366) (16702 26365) (16703 26970) (16704 29401) (16705 +30095) (16706 30094) (16707 30990) (16708 31062) (16709 31199) (16710 31895) (16711 32032) (16712 +32068) (16713 34311) (16714 35380) (16715 38459) (16716 36961) (16717 40736) (16718 20711) (16719 +21109) (16720 21452) (16721 21474) (16722 20489) (16723 21930) (16724 22766) (16725 22863) (16726 +29245) (16727 23435) (16728 23652) (16729 21277) (16730 24803) (16731 24819) (16732 25436) (16733 +25475) (16734 25407) (16735 25531) (16736 25805) (16737 26089) (16738 26361) (16739 24035) (16740 +27085) (16741 27133) (16742 28437) (16743 29157) (16744 20105) (16745 30185) (16746 30456) (16747 +31379) (16748 31967) (16749 32207) (16750 32156) (16751 32865) (16752 33609) (16753 33624) (16754 +33900) (16755 33980) (16756 34299) (16757 35013) (16758 36208) (16759 36865) (16760 36973) (16761 +37783) (16762 38684) (16763 39442) (16764 20687) (16765 22679) (16766 24974) (16929 33235) (16930 +34101) (16931 36104) (16932 36896) (16933 20419) (16934 20596) (16935 21063) (16936 21363) (16937 +24687) (16938 25417) (16939 26463) (16940 28204) (16941 36275) (16942 36895) (16943 20439) (16944 +23646) (16945 36042) (16946 26063) (16947 32154) (16948 21330) (16949 34966) (16950 20854) (16951 +25539) (16952 23384) (16953 23403) (16954 23562) (16955 25613) (16956 26449) (16957 36956) (16958 +20182) (16959 22810) (16960 22826) (16961 27760) (16962 35409) (16963 21822) (16964 22549) (16965 +22949) (16966 24816) (16967 25171) (16968 26561) (16969 33333) (16970 26965) (16971 38464) (16972 +39364) (16973 39464) (16974 20307) (16975 22534) (16976 23550) (16977 32784) (16978 23729) (16979 +24111) (16980 24453) (16981 24608) (16982 24907) (16983 25140) (16984 26367) (16985 27888) (16986 +28382) (16987 32974) (16988 33151) (16989 33492) (16990 34955) (16991 36024) (16992 36864) (16993 +36910) (16994 38538) (16995 40667) (16996 39899) (16997 20195) (16998 21488) (16999 22823) (17000 +31532) (17001 37261) (17002 38988) (17003 40441) (17004 28381) (17005 28711) (17006 21331) (17007 +21828) (17008 23429) (17009 25176) (17010 25246) (17011 25299) (17012 27810) (17013 28655) (17014 +29730) (17015 35351) (17016 37944) (17017 28609) (17018 35582) (17019 33592) (17020 20967) (17021 +34552) (17022 21482) (17185 21481) (17186 20294) (17187 36948) (17188 36784) (17189 22890) (17190 +33073) (17191 24061) (17192 31466) (17193 36799) (17194 26842) (17195 35895) (17196 29432) (17197 +40008) (17198 27197) (17199 35504) (17200 20025) (17201 21336) (17202 22022) (17203 22374) (17204 +25285) (17205 25506) (17206 26086) (17207 27470) (17208 28129) (17209 28251) (17210 28845) (17211 +30701) (17212 31471) (17213 31658) (17214 32187) (17215 32829) (17216 32966) (17217 34507) (17218 +35477) (17219 37723) (17220 22243) (17221 22727) (17222 24382) (17223 26029) (17224 26262) (17225 +27264) (17226 27573) (17227 30007) (17228 35527) (17229 20516) (17230 30693) (17231 22320) (17232 +24347) (17233 24677) (17234 26234) (17235 27744) (17236 30196) (17237 31258) (17238 32622) (17239 +33268) (17240 34584) (17241 36933) (17242 39347) (17243 31689) (17244 30044) (17245 31481) (17246 +31569) (17247 33988) (17248 36880) (17249 31209) (17250 31378) (17251 33590) (17252 23265) (17253 +30528) (17254 20013) (17255 20210) (17256 23449) (17257 24544) (17258 25277) (17259 26172) (17260 +26609) (17261 27880) (17262 34411) (17263 34935) (17264 35387) (17265 37198) (17266 37619) (17267 +39376) (17268 27159) (17269 28710) (17270 29482) (17271 33511) (17272 33879) (17273 36015) (17274 +19969) (17275 20806) (17276 20939) (17277 21899) (17278 23541) (17441 24086) (17442 24115) (17443 +24193) (17444 24340) (17445 24373) (17446 24427) (17447 24500) (17448 25074) (17449 25361) (17450 +26274) (17451 26397) (17452 28526) (17453 29266) (17454 30010) (17455 30522) (17456 32884) (17457 +33081) (17458 33144) (17459 34678) (17460 35519) (17461 35548) (17462 36229) (17463 36339) (17464 +37530) (17465 38263) (17466 38914) (17467 40165) (17468 21189) (17469 25431) (17470 30452) (17471 +26389) (17472 27784) (17473 29645) (17474 36035) (17475 37806) (17476 38515) (17477 27941) (17478 +22684) (17479 26894) (17480 27084) (17481 36861) (17482 37786) (17483 30171) (17484 36890) (17485 +22618) (17486 26626) (17487 25524) (17488 27131) (17489 20291) (17490 28460) (17491 26584) (17492 +36795) (17493 34086) (17494 32180) (17495 37716) (17496 26943) (17497 28528) (17498 22378) (17499 +22775) (17500 23340) (17501 32044) (17502 29226) (17503 21514) (17504 37347) (17505 40372) (17506 +20141) (17507 20302) (17508 20572) (17509 20597) (17510 21059) (17511 35998) (17512 21576) (17513 +22564) (17514 23450) (17515 24093) (17516 24213) (17517 24237) (17518 24311) (17519 24351) (17520 +24716) (17521 25269) (17522 25402) (17523 25552) (17524 26799) (17525 27712) (17526 30855) (17527 +31118) (17528 31243) (17529 32224) (17530 33351) (17531 35330) (17532 35558) (17533 36420) (17534 +36883) (17697 37048) (17698 37165) (17699 37336) (17700 40718) (17701 27877) (17702 25688) (17703 +25826) (17704 25973) (17705 28404) (17706 30340) (17707 31515) (17708 36969) (17709 37841) (17710 +28346) (17711 21746) (17712 24505) (17713 25764) (17714 36685) (17715 36845) (17716 37444) (17717 +20856) (17718 22635) (17719 22825) (17720 23637) (17721 24215) (17722 28155) (17723 32399) (17724 +29980) (17725 36028) (17726 36578) (17727 39003) (17728 28857) (17729 20253) (17730 27583) (17731 +28593) (17732 30000) (17733 38651) (17734 20814) (17735 21520) (17736 22581) (17737 22615) (17738 +22956) (17739 23648) (17740 24466) (17741 26007) (17742 26460) (17743 28193) (17744 30331) (17745 +33759) (17746 36077) (17747 36884) (17748 37117) (17749 37709) (17750 30757) (17751 30778) (17752 +21162) (17753 24230) (17754 22303) (17755 22900) (17756 24594) (17757 20498) (17758 20826) (17759 +20908) (17760 20941) (17761 20992) (17762 21776) (17763 22612) (17764 22616) (17765 22871) (17766 +23445) (17767 23798) (17768 23947) (17769 24764) (17770 25237) (17771 25645) (17772 26481) (17773 +26691) (17774 26812) (17775 26847) (17776 30423) (17777 28120) (17778 28271) (17779 28059) (17780 +28783) (17781 29128) (17782 24403) (17783 30168) (17784 31095) (17785 31561) (17786 31572) (17787 +31570) (17788 31958) (17789 32113) (17790 21040) (17953 33891) (17954 34153) (17955 34276) (17956 +35342) (17957 35588) (17958 35910) (17959 36367) (17960 36867) (17961 36879) (17962 37913) (17963 +38518) (17964 38957) (17965 39472) (17966 38360) (17967 20685) (17968 21205) (17969 21516) (17970 +22530) (17971 23566) (17972 24999) (17973 25758) (17974 27934) (17975 30643) (17976 31461) (17977 +33012) (17978 33796) (17979 36947) (17980 37509) (17981 23776) (17982 40199) (17983 21311) (17984 +24471) (17985 24499) (17986 28060) (17987 29305) (17988 30563) (17989 31167) (17990 31716) (17991 +27602) (17992 29420) (17993 35501) (17994 26627) (17995 27233) (17996 20984) (17997 31361) (17998 +26932) (17999 23626) (18000 40182) (18001 33515) (18002 23493) (18003 37193) (18004 28702) (18005 +22136) (18006 23663) (18007 24775) (18008 25958) (18009 27788) (18010 35930) (18011 36929) (18012 +38931) (18013 21585) (18014 26311) (18015 37389) (18016 22856) (18017 37027) (18018 20869) (18019 +20045) (18020 20970) (18021 34201) (18022 35598) (18023 28760) (18024 25466) (18025 37707) (18026 +26978) (18027 39348) (18028 32260) (18029 30071) (18030 21335) (18031 26976) (18032 36575) (18033 +38627) (18034 27741) (18035 20108) (18036 23612) (18037 24336) (18038 36841) (18039 21250) (18040 +36049) (18041 32905) (18042 34425) (18043 24319) (18044 26085) (18045 20083) (18046 20837) (18209 +22914) (18210 23615) (18211 38894) (18212 20219) (18213 22922) (18214 24525) (18215 35469) (18216 +28641) (18217 31152) (18218 31074) (18219 23527) (18220 33905) (18221 29483) (18222 29105) (18223 +24180) (18224 24565) (18225 25467) (18226 25754) (18227 29123) (18228 31896) (18229 20035) (18230 +24316) (18231 20043) (18232 22492) (18233 22178) (18234 24745) (18235 28611) (18236 32013) (18237 +33021) (18238 33075) (18239 33215) (18240 36786) (18241 35223) (18242 34468) (18243 24052) (18244 +25226) (18245 25773) (18246 35207) (18247 26487) (18248 27874) (18249 27966) (18250 29750) (18251 +30772) (18252 23110) (18253 32629) (18254 33453) (18255 39340) (18256 20467) (18257 24259) (18258 +25309) (18259 25490) (18260 25943) (18261 26479) (18262 30403) (18263 29260) (18264 32972) (18265 +32954) (18266 36649) (18267 37197) (18268 20493) (18269 22521) (18270 23186) (18271 26757) (18272 +26995) (18273 29028) (18274 29437) (18275 36023) (18276 22770) (18277 36064) (18278 38506) (18279 +36889) (18280 34687) (18281 31204) (18282 30695) (18283 33833) (18284 20271) (18285 21093) (18286 +21338) (18287 25293) (18288 26575) (18289 27850) (18290 30333) (18291 31636) (18292 31893) (18293 +33334) (18294 34180) (18295 36843) (18296 26333) (18297 28448) (18298 29190) (18299 32283) (18300 +33707) (18301 39361) (18302 40614) (18465 20989) (18466 31665) (18467 30834) (18468 31672) (18469 +32903) (18470 31560) (18471 27368) (18472 24161) (18473 32908) (18474 30033) (18475 30048) (18476 +20843) (18477 37474) (18478 28300) (18479 30330) (18480 37271) (18481 39658) (18482 20240) (18483 +32624) (18484 25244) (18485 31567) (18486 38309) (18487 40169) (18488 22138) (18489 22617) (18490 +34532) (18491 38588) (18492 20276) (18493 21028) (18494 21322) (18495 21453) (18496 21467) (18497 +24070) (18498 25644) (18499 26001) (18500 26495) (18501 27710) (18502 27726) (18503 29256) (18504 +29359) (18505 29677) (18506 30036) (18507 32321) (18508 33324) (18509 34281) (18510 36009) (18511 +31684) (18512 37318) (18513 29033) (18514 38930) (18515 39151) (18516 25405) (18517 26217) (18518 +30058) (18519 30436) (18520 30928) (18521 34115) (18522 34542) (18523 21290) (18524 21329) (18525 +21542) (18526 22915) (18527 24199) (18528 24444) (18529 24754) (18530 25161) (18531 25209) (18532 +25259) (18533 26000) (18534 27604) (18535 27852) (18536 30130) (18537 30382) (18538 30865) (18539 +31192) (18540 32203) (18541 32631) (18542 32933) (18543 34987) (18544 35513) (18545 36027) (18546 +36991) (18547 38750) (18548 39131) (18549 27147) (18550 31800) (18551 20633) (18552 23614) (18553 +24494) (18554 26503) (18555 27608) (18556 29749) (18557 30473) (18558 32654) (18721 40763) (18722 +26570) (18723 31255) (18724 21305) (18725 30091) (18726 39661) (18727 24422) (18728 33181) (18729 +33777) (18730 32920) (18731 24380) (18732 24517) (18733 30050) (18734 31558) (18735 36924) (18736 +26727) (18737 23019) (18738 23195) (18739 32016) (18740 30334) (18741 35628) (18742 20469) (18743 +24426) (18744 27161) (18745 27703) (18746 28418) (18747 29922) (18748 31080) (18749 34920) (18750 +35413) (18751 35961) (18752 24287) (18753 25551) (18754 30149) (18755 31186) (18756 33495) (18757 +37672) (18758 37618) (18759 33948) (18760 34541) (18761 39981) (18762 21697) (18763 24428) (18764 +25996) (18765 27996) (18766 28693) (18767 36007) (18768 36051) (18769 38971) (18770 25935) (18771 +29942) (18772 19981) (18773 20184) (18774 22496) (18775 22827) (18776 23142) (18777 23500) (18778 +20904) (18779 24067) (18780 24220) (18781 24598) (18782 25206) (18783 25975) (18784 26023) (18785 +26222) (18786 28014) (18787 29238) (18788 31526) (18789 33104) (18790 33178) (18791 33433) (18792 +35676) (18793 36000) (18794 36070) (18795 36212) (18796 38428) (18797 38468) (18798 20398) (18799 +25771) (18800 27494) (18801 33310) (18802 33889) (18803 34154) (18804 37096) (18805 23553) (18806 +26963) (18807 39080) (18808 33914) (18809 34135) (18810 20239) (18811 21103) (18812 24489) (18813 +24133) (18814 26381) (18977 31119) (18978 33145) (18979 35079) (18980 35206) (18981 28149) (18982 +24343) (18983 25173) (18984 27832) (18985 20175) (18986 29289) (18987 39826) (18988 20998) (18989 +21563) (18990 22132) (18991 22707) (18992 24996) (18993 25198) (18994 28954) (18995 22894) (18996 +31881) (18997 31966) (18998 32027) (18999 38640) (19000 25991) (19001 32862) (19002 19993) (19003 +20341) (19004 20853) (19005 22592) (19006 24163) (19007 24179) (19008 24330) (19009 26564) (19010 +20006) (19011 34109) (19012 38281) (19013 38491) (19014 31859) (19015 38913) (19016 20731) (19017 +22721) (19018 30294) (19019 30887) (19020 21029) (19021 30629) (19022 34065) (19023 31622) (19024 +20559) (19025 22793) (19026 29255) (19027 31687) (19028 32232) (19029 36794) (19030 36820) (19031 +36941) (19032 20415) (19033 21193) (19034 23081) (19035 24321) (19036 38829) (19037 20445) (19038 +33303) (19039 37610) (19040 22275) (19041 25429) (19042 27497) (19043 29995) (19044 35036) (19045 +36628) (19046 31298) (19047 21215) (19048 22675) (19049 24917) (19050 25098) (19051 26286) (19052 +27597) (19053 31807) (19054 33769) (19055 20515) (19056 20472) (19057 21253) (19058 21574) (19059 +22577) (19060 22857) (19061 23453) (19062 23792) (19063 23791) (19064 23849) (19065 24214) (19066 +25265) (19067 25447) (19068 25918) (19069 26041) (19070 26379) (19233 27861) (19234 27873) (19235 +28921) (19236 30770) (19237 32299) (19238 32990) (19239 33459) (19240 33804) (19241 34028) (19242 +34562) (19243 35090) (19244 35370) (19245 35914) (19246 37030) (19247 37586) (19248 39165) (19249 +40179) (19250 40300) (19251 20047) (19252 20129) (19253 20621) (19254 21078) (19255 22346) (19256 +22952) (19257 24125) (19258 24536) (19259 24537) (19260 25151) (19261 26292) (19262 26395) (19263 +26576) (19264 26834) (19265 20882) (19266 32033) (19267 32938) (19268 33192) (19269 35584) (19270 +35980) (19271 36031) (19272 37502) (19273 38450) (19274 21536) (19275 38956) (19276 21271) (19277 +20693) (19278 21340) (19279 22696) (19280 25778) (19281 26420) (19282 29287) (19283 30566) (19284 +31302) (19285 37350) (19286 21187) (19287 27809) (19288 27526) (19289 22528) (19290 24140) (19291 +22868) (19292 26412) (19293 32763) (19294 20961) (19295 30406) (19296 25705) (19297 30952) (19298 +39764) (19299 40635) (19300 22475) (19301 22969) (19302 26151) (19303 26522) (19304 27598) (19305 +21737) (19306 27097) (19307 24149) (19308 33180) (19309 26517) (19310 39850) (19311 26622) (19312 +40018) (19313 26717) (19314 20134) (19315 20451) (19316 21448) (19317 25273) (19318 26411) (19319 +27819) (19320 36804) (19321 20397) (19322 32365) (19323 40639) (19324 19975) (19325 24930) (19326 +28288) (19489 28459) (19490 34067) (19491 21619) (19492 26410) (19493 39749) (19494 24051) (19495 +31637) (19496 23724) (19497 23494) (19498 34588) (19499 28234) (19500 34001) (19501 31252) (19502 +33032) (19503 22937) (19504 31885) (19505 27665) (19506 30496) (19507 21209) (19508 22818) (19509 +28961) (19510 29279) (19511 30683) (19512 38695) (19513 40289) (19514 26891) (19515 23167) (19516 +23064) (19517 20901) (19518 21517) (19519 21629) (19520 26126) (19521 30431) (19522 36855) (19523 +37528) (19524 40180) (19525 23018) (19526 29277) (19527 28357) (19528 20813) (19529 26825) (19530 +32191) (19531 32236) (19532 38754) (19533 40634) (19534 25720) (19535 27169) (19536 33538) (19537 +22916) (19538 23391) (19539 27611) (19540 29467) (19541 30450) (19542 32178) (19543 32791) (19544 +33945) (19545 20786) (19546 26408) (19547 40665) (19548 30446) (19549 26466) (19550 21247) (19551 +39173) (19552 23588) (19553 25147) (19554 31870) (19555 36016) (19556 21839) (19557 24758) (19558 +32011) (19559 38272) (19560 21249) (19561 20063) (19562 20918) (19563 22812) (19564 29242) (19565 +32822) (19566 37326) (19567 24357) (19568 30690) (19569 21380) (19570 24441) (19571 32004) (19572 +34220) (19573 35379) (19574 36493) (19575 38742) (19576 26611) (19577 34222) (19578 37971) (19579 +24841) (19580 24840) (19581 27833) (19582 30290) (19745 35565) (19746 36664) (19747 21807) (19748 +20305) (19749 20778) (19750 21191) (19751 21451) (19752 23461) (19753 24189) (19754 24736) (19755 +24962) (19756 25558) (19757 26377) (19758 26586) (19759 28263) (19760 28044) (19761 29494) (19762 +29495) (19763 30001) (19764 31056) (19765 35029) (19766 35480) (19767 36938) (19768 37009) (19769 +37109) (19770 38596) (19771 34701) (19772 22805) (19773 20104) (19774 20313) (19775 19982) (19776 +35465) (19777 36671) (19778 38928) (19779 20653) (19780 24188) (19781 22934) (19782 23481) (19783 +24248) (19784 25562) (19785 25594) (19786 25793) (19787 26332) (19788 26954) (19789 27096) (19790 +27915) (19791 28342) (19792 29076) (19793 29992) (19794 31407) (19795 32650) (19796 32768) (19797 +33865) (19798 33993) (19799 35201) (19800 35617) (19801 36362) (19802 36965) (19803 38525) (19804 +39178) (19805 24958) (19806 25233) (19807 27442) (19808 27779) (19809 28020) (19810 32716) (19811 +32764) (19812 28096) (19813 32645) (19814 34746) (19815 35064) (19816 26469) (19817 33713) (19818 +38972) (19819 38647) (19820 27931) (19821 32097) (19822 33853) (19823 37226) (19824 20081) (19825 +21365) (19826 23888) (19827 27396) (19828 28651) (19829 34253) (19830 34349) (19831 35239) (19832 +21033) (19833 21519) (19834 23653) (19835 26446) (19836 26792) (19837 29702) (19838 29827) (20001 +30178) (20002 35023) (20003 35041) (20004 37324) (20005 38626) (20006 38520) (20007 24459) (20008 +29575) (20009 31435) (20010 33870) (20011 25504) (20012 30053) (20013 21129) (20014 27969) (20015 +28316) (20016 29705) (20017 30041) (20018 30827) (20019 31890) (20020 38534) (20021 31452) (20022 +40845) (20023 20406) (20024 24942) (20025 26053) (20026 34396) (20027 20102) (20028 20142) (20029 +20698) (20030 20001) (20031 20940) (20032 23534) (20033 26009) (20034 26753) (20035 28092) (20036 +29471) (20037 30274) (20038 30637) (20039 31260) (20040 31975) (20041 33391) (20042 35538) (20043 +36988) (20044 37327) (20045 38517) (20046 38936) (20047 21147) (20048 32209) (20049 20523) (20050 +21400) (20051 26519) (20052 28107) (20053 29136) (20054 29747) (20055 33256) (20056 36650) (20057 +38563) (20058 40023) (20059 40607) (20060 29792) (20061 22593) (20062 28057) (20063 32047) (20064 +39006) (20065 20196) (20066 20278) (20067 20363) (20068 20919) (20069 21169) (20070 23994) (20071 +24604) (20072 29618) (20073 31036) (20074 33491) (20075 37428) (20076 38583) (20077 38646) (20078 +38666) (20079 40599) (20080 40802) (20081 26278) (20082 27508) (20083 21015) (20084 21155) (20085 +28872) (20086 35010) (20087 24265) (20088 24651) (20089 24976) (20090 28451) (20091 29001) (20092 +31806) (20093 32244) (20094 32879) (20257 34030) (20258 36899) (20259 37676) (20260 21570) (20261 +39791) (20262 27347) (20263 28809) (20264 36034) (20265 36335) (20266 38706) (20267 21172) (20268 +23105) (20269 24266) (20270 24324) (20271 26391) (20272 27004) (20273 27028) (20274 28010) (20275 +28431) (20276 29282) (20277 29436) (20278 31725) (20279 32769) (20280 32894) (20281 34635) (20282 +37070) (20283 20845) (20284 40595) (20285 31108) (20286 32907) (20287 37682) (20288 35542) (20289 +20525) (20290 21644) (20291 35441) (20292 27498) (20293 36036) (20294 33031) (20295 24785) (20296 +26528) (20297 40434) (20298 20121) (20299 20120) (20300 39952) (20301 35435) (20302 34241) (20303 +34152) (20304 26880) (20305 28286) (20306 30871) (20307 33109) (20513 24332) (20514 19984) (20515 +19989) (20516 20010) (20517 20017) (20518 20022) (20519 20028) (20520 20031) (20521 20034) (20522 +20054) (20523 20056) (20524 20098) (20525 20101) (20526 35947) (20527 20106) (20528 33298) (20529 +24333) (20530 20110) (20531 20126) (20532 20127) (20533 20128) (20534 20130) (20535 20144) (20536 +20147) (20537 20150) (20538 20174) (20539 20173) (20540 20164) (20541 20166) (20542 20162) (20543 +20183) (20544 20190) (20545 20205) (20546 20191) (20547 20215) (20548 20233) (20549 20314) (20550 +20272) (20551 20315) (20552 20317) (20553 20311) (20554 20295) (20555 20342) (20556 20360) (20557 +20367) (20558 20376) (20559 20347) (20560 20329) (20561 20336) (20562 20369) (20563 20335) (20564 +20358) (20565 20374) (20566 20760) (20567 20436) (20568 20447) (20569 20430) (20570 20440) (20571 +20443) (20572 20433) (20573 20442) (20574 20432) (20575 20452) (20576 20453) (20577 20506) (20578 +20520) (20579 20500) (20580 20522) (20581 20517) (20582 20485) (20583 20252) (20584 20470) (20585 +20513) (20586 20521) (20587 20524) (20588 20478) (20589 20463) (20590 20497) (20591 20486) (20592 +20547) (20593 20551) (20594 26371) (20595 20565) (20596 20560) (20597 20552) (20598 20570) (20599 +20566) (20600 20588) (20601 20600) (20602 20608) (20603 20634) (20604 20613) (20605 20660) (20606 +20658) (20769 20681) (20770 20682) (20771 20659) (20772 20674) (20773 20694) (20774 20702) (20775 +20709) (20776 20717) (20777 20707) (20778 20718) (20779 20729) (20780 20725) (20781 20745) (20782 +20737) (20783 20738) (20784 20758) (20785 20757) (20786 20756) (20787 20762) (20788 20769) (20789 +20794) (20790 20791) (20791 20796) (20792 20795) (20793 20799) (20794 20800) (20795 20818) (20796 +20812) (20797 20820) (20798 20834) (20799 31480) (20800 20841) (20801 20842) (20802 20846) (20803 +20864) (20804 20866) (20805 22232) (20806 20876) (20807 20873) (20808 20879) (20809 20881) (20810 +20883) (20811 20885) (20812 20886) (20813 20900) (20814 20902) (20815 20898) (20816 20905) (20817 +20906) (20818 20907) (20819 20915) (20820 20913) (20821 20914) (20822 20912) (20823 20917) (20824 +20925) (20825 20933) (20826 20937) (20827 20955) (20828 20960) (20829 34389) (20830 20969) (20831 +20973) (20832 20976) (20833 20981) (20834 20990) (20835 20996) (20836 21003) (20837 21012) (20838 +21006) (20839 21031) (20840 21034) (20841 21038) (20842 21043) (20843 21049) (20844 21071) (20845 +21060) (20846 21067) (20847 21068) (20848 21086) (20849 21076) (20850 21098) (20851 21108) (20852 +21097) (20853 21107) (20854 21119) (20855 21117) (20856 21133) (20857 21140) (20858 21138) (20859 +21105) (20860 21128) (20861 21137) (20862 36776) (21025 36775) (21026 21164) (21027 21165) (21028 +21180) (21029 21173) (21030 21185) (21031 21197) (21032 21207) (21033 21214) (21034 21219) (21035 +21222) (21036 39149) (21037 21216) (21038 21235) (21039 21237) (21040 21240) (21041 21241) (21042 +21254) (21043 21256) (21044 30008) (21045 21261) (21046 21264) (21047 21263) (21048 21269) (21049 +21274) (21050 21283) (21051 21295) (21052 21297) (21053 21299) (21054 21304) (21055 21312) (21056 +21318) (21057 21317) (21058 19991) (21059 21321) (21060 21325) (21061 20950) (21062 21342) (21063 +21353) (21064 21358) (21065 22808) (21066 21371) (21067 21367) (21068 21378) (21069 21398) (21070 +21408) (21071 21414) (21072 21413) (21073 21422) (21074 21424) (21075 21430) (21076 21443) (21077 +31762) (21078 38617) (21079 21471) (21080 26364) (21081 29166) (21082 21486) (21083 21480) (21084 +21485) (21085 21498) (21086 21505) (21087 21565) (21088 21568) (21089 21548) (21090 21549) (21091 +21564) (21092 21550) (21093 21558) (21094 21545) (21095 21533) (21096 21582) (21097 21647) (21098 +21621) (21099 21646) (21100 21599) (21101 21617) (21102 21623) (21103 21616) (21104 21650) (21105 +21627) (21106 21632) (21107 21622) (21108 21636) (21109 21648) (21110 21638) (21111 21703) (21112 +21666) (21113 21688) (21114 21669) (21115 21676) (21116 21700) (21117 21704) (21118 21672) (21281 +21675) (21282 21698) (21283 21668) (21284 21694) (21285 21692) (21286 21720) (21287 21733) (21288 +21734) (21289 21775) (21290 21780) (21291 21757) (21292 21742) (21293 21741) (21294 21754) (21295 +21730) (21296 21817) (21297 21824) (21298 21859) (21299 21836) (21300 21806) (21301 21852) (21302 +21829) (21303 21846) (21304 21847) (21305 21816) (21306 21811) (21307 21853) (21308 21913) (21309 +21888) (21310 21679) (21311 21898) (21312 21919) (21313 21883) (21314 21886) (21315 21912) (21316 +21918) (21317 21934) (21318 21884) (21319 21891) (21320 21929) (21321 21895) (21322 21928) (21323 +21978) (21324 21957) (21325 21983) (21326 21956) (21327 21980) (21328 21988) (21329 21972) (21330 +22036) (21331 22007) (21332 22038) (21333 22014) (21334 22013) (21335 22043) (21336 22009) (21337 +22094) (21338 22096) (21339 29151) (21340 22068) (21341 22070) (21342 22066) (21343 22072) (21344 +22123) (21345 22116) (21346 22063) (21347 22124) (21348 22122) (21349 22150) (21350 22144) (21351 +22154) (21352 22176) (21353 22164) (21354 22159) (21355 22181) (21356 22190) (21357 22198) (21358 +22196) (21359 22210) (21360 22204) (21361 22209) (21362 22211) (21363 22208) (21364 22216) (21365 +22222) (21366 22225) (21367 22227) (21368 22231) (21369 22254) (21370 22265) (21371 22272) (21372 +22271) (21373 22276) (21374 22281) (21537 22280) (21538 22283) (21539 22285) (21540 22291) (21541 +22296) (21542 22294) (21543 21959) (21544 22300) (21545 22310) (21546 22327) (21547 22328) (21548 +22350) (21549 22331) (21550 22336) (21551 22351) (21552 22377) (21553 22464) (21554 22408) (21555 +22369) (21556 22399) (21557 22409) (21558 22419) (21559 22432) (21560 22451) (21561 22436) (21562 +22442) (21563 22448) (21564 22467) (21565 22470) (21566 22484) (21567 22482) (21568 22483) (21569 +22538) (21570 22486) (21571 22499) (21572 22539) (21573 22553) (21574 22557) (21575 22642) (21576 +22561) (21577 22626) (21578 22603) (21579 22640) (21580 27584) (21581 22610) (21582 22589) (21583 +22649) (21584 22661) (21585 22713) (21586 22687) (21587 22699) (21588 22714) (21589 22750) (21590 +22715) (21591 22712) (21592 22702) (21593 22725) (21594 22739) (21595 22737) (21596 22743) (21597 +22745) (21598 22744) (21599 22757) (21600 22748) (21601 22756) (21602 22751) (21603 22767) (21604 +22778) (21605 22777) (21606 22779) (21607 22780) (21608 22781) (21609 22786) (21610 22794) (21611 +22800) (21612 22811) (21613 26790) (21614 22821) (21615 22828) (21616 22829) (21617 22834) (21618 +22840) (21619 22846) (21620 31442) (21621 22869) (21622 22864) (21623 22862) (21624 22874) (21625 +22872) (21626 22882) (21627 22880) (21628 22887) (21629 22892) (21630 22889) (21793 22904) (21794 +22913) (21795 22941) (21796 20318) (21797 20395) (21798 22947) (21799 22962) (21800 22982) (21801 +23016) (21802 23004) (21803 22925) (21804 23001) (21805 23002) (21806 23077) (21807 23071) (21808 +23057) (21809 23068) (21810 23049) (21811 23066) (21812 23104) (21813 23148) (21814 23113) (21815 +23093) (21816 23094) (21817 23138) (21818 23146) (21819 23194) (21820 23228) (21821 23230) (21822 +23243) (21823 23234) (21824 23229) (21825 23267) (21826 23255) (21827 23270) (21828 23273) (21829 +23254) (21830 23290) (21831 23291) (21832 23308) (21833 23307) (21834 23318) (21835 23346) (21836 +23248) (21837 23338) (21838 23350) (21839 23358) (21840 23363) (21841 23365) (21842 23360) (21843 +23377) (21844 23381) (21845 23386) (21846 23387) (21847 23397) (21848 23401) (21849 23408) (21850 +23411) (21851 23413) (21852 23416) (21853 25992) (21854 23418) (21855 23424) (21856 23427) (21857 +23462) (21858 23480) (21859 23491) (21860 23495) (21861 23497) (21862 23508) (21863 23504) (21864 +23524) (21865 23526) (21866 23522) (21867 23518) (21868 23525) (21869 23531) (21870 23536) (21871 +23542) (21872 23539) (21873 23557) (21874 23559) (21875 23560) (21876 23565) (21877 23571) (21878 +23584) (21879 23586) (21880 23592) (21881 23608) (21882 23609) (21883 23617) (21884 23622) (21885 +23630) (21886 23635) (22049 23632) (22050 23631) (22051 23409) (22052 23660) (22053 23662) (22054 +20066) (22055 23670) (22056 23673) (22057 23692) (22058 23697) (22059 23700) (22060 22939) (22061 +23723) (22062 23739) (22063 23734) (22064 23740) (22065 23735) (22066 23749) (22067 23742) (22068 +23751) (22069 23769) (22070 23785) (22071 23805) (22072 23802) (22073 23789) (22074 23948) (22075 +23786) (22076 23819) (22077 23829) (22078 23831) (22079 23900) (22080 23839) (22081 23835) (22082 +23825) (22083 23828) (22084 23842) (22085 23834) (22086 23833) (22087 23832) (22088 23884) (22089 +23890) (22090 23886) (22091 23883) (22092 23916) (22093 23923) (22094 23926) (22095 23943) (22096 +23940) (22097 23938) (22098 23970) (22099 23965) (22100 23980) (22101 23982) (22102 23997) (22103 +23952) (22104 23991) (22105 23996) (22106 24009) (22107 24013) (22108 24019) (22109 24018) (22110 +24022) (22111 24027) (22112 24043) (22113 24050) (22114 24053) (22115 24075) (22116 24090) (22117 +24089) (22118 24081) (22119 24091) (22120 24118) (22121 24119) (22122 24132) (22123 24131) (22124 +24128) (22125 24142) (22126 24151) (22127 24148) (22128 24159) (22129 24162) (22130 24164) (22131 +24135) (22132 24181) (22133 24182) (22134 24186) (22135 40636) (22136 24191) (22137 24224) (22138 +24257) (22139 24258) (22140 24264) (22141 24272) (22142 24271) (22305 24278) (22306 24291) (22307 +24285) (22308 24282) (22309 24283) (22310 24290) (22311 24289) (22312 24296) (22313 24297) (22314 +24300) (22315 24305) (22316 24307) (22317 24304) (22318 24308) (22319 24312) (22320 24318) (22321 +24323) (22322 24329) (22323 24413) (22324 24412) (22325 24331) (22326 24337) (22327 24342) (22328 +24361) (22329 24365) (22330 24376) (22331 24385) (22332 24392) (22333 24396) (22334 24398) (22335 +24367) (22336 24401) (22337 24406) (22338 24407) (22339 24409) (22340 24417) (22341 24429) (22342 +24435) (22343 24439) (22344 24451) (22345 24450) (22346 24447) (22347 24458) (22348 24456) (22349 +24465) (22350 24455) (22351 24478) (22352 24473) (22353 24472) (22354 24480) (22355 24488) (22356 +24493) (22357 24508) (22358 24534) (22359 24571) (22360 24548) (22361 24568) (22362 24561) (22363 +24541) (22364 24755) (22365 24575) (22366 24609) (22367 24672) (22368 24601) (22369 24592) (22370 +24617) (22371 24590) (22372 24625) (22373 24603) (22374 24597) (22375 24619) (22376 24614) (22377 +24591) (22378 24634) (22379 24666) (22380 24641) (22381 24682) (22382 24695) (22383 24671) (22384 +24650) (22385 24646) (22386 24653) (22387 24675) (22388 24643) (22389 24676) (22390 24642) (22391 +24684) (22392 24683) (22393 24665) (22394 24705) (22395 24717) (22396 24807) (22397 24707) (22398 +24730) (22561 24708) (22562 24731) (22563 24726) (22564 24727) (22565 24722) (22566 24743) (22567 +24715) (22568 24801) (22569 24760) (22570 24800) (22571 24787) (22572 24756) (22573 24560) (22574 +24765) (22575 24774) (22576 24757) (22577 24792) (22578 24909) (22579 24853) (22580 24838) (22581 +24822) (22582 24823) (22583 24832) (22584 24820) (22585 24826) (22586 24835) (22587 24865) (22588 +24827) (22589 24817) (22590 24845) (22591 24846) (22592 24903) (22593 24894) (22594 24872) (22595 +24871) (22596 24906) (22597 24895) (22598 24892) (22599 24876) (22600 24884) (22601 24893) (22602 +24898) (22603 24900) (22604 24947) (22605 24951) (22606 24920) (22607 24921) (22608 24922) (22609 +24939) (22610 24948) (22611 24943) (22612 24933) (22613 24945) (22614 24927) (22615 24925) (22616 +24915) (22617 24949) (22618 24985) (22619 24982) (22620 24967) (22621 25004) (22622 24980) (22623 +24986) (22624 24970) (22625 24977) (22626 25003) (22627 25006) (22628 25036) (22629 25034) (22630 +25033) (22631 25079) (22632 25032) (22633 25027) (22634 25030) (22635 25018) (22636 25035) (22637 +32633) (22638 25037) (22639 25062) (22640 25059) (22641 25078) (22642 25082) (22643 25076) (22644 +25087) (22645 25085) (22646 25084) (22647 25086) (22648 25088) (22649 25096) (22650 25097) (22651 +25101) (22652 25100) (22653 25108) (22654 25115) (22817 25118) (22818 25121) (22819 25130) (22820 +25134) (22821 25136) (22822 25138) (22823 25139) (22824 25153) (22825 25166) (22826 25182) (22827 +25187) (22828 25179) (22829 25184) (22830 25192) (22831 25212) (22832 25218) (22833 25225) (22834 +25214) (22835 25234) (22836 25235) (22837 25238) (22838 25300) (22839 25219) (22840 25236) (22841 +25303) (22842 25297) (22843 25275) (22844 25295) (22845 25343) (22846 25286) (22847 25812) (22848 +25288) (22849 25308) (22850 25292) (22851 25290) (22852 25282) (22853 25287) (22854 25243) (22855 +25289) (22856 25356) (22857 25326) (22858 25329) (22859 25383) (22860 25346) (22861 25352) (22862 +25327) (22863 25333) (22864 25424) (22865 25406) (22866 25421) (22867 25628) (22868 25423) (22869 +25494) (22870 25486) (22871 25472) (22872 25515) (22873 25462) (22874 25507) (22875 25487) (22876 +25481) (22877 25503) (22878 25525) (22879 25451) (22880 25449) (22881 25534) (22882 25577) (22883 +25536) (22884 25542) (22885 25571) (22886 25545) (22887 25554) (22888 25590) (22889 25540) (22890 +25622) (22891 25652) (22892 25606) (22893 25619) (22894 25638) (22895 25654) (22896 25885) (22897 +25623) (22898 25640) (22899 25615) (22900 25703) (22901 25711) (22902 25718) (22903 25678) (22904 +25898) (22905 25749) (22906 25747) (22907 25765) (22908 25769) (22909 25736) (22910 25788) (23073 +25818) (23074 25810) (23075 25797) (23076 25799) (23077 25787) (23078 25816) (23079 25794) (23080 +25841) (23081 25831) (23082 33289) (23083 25824) (23084 25825) (23085 25260) (23086 25827) (23087 +25839) (23088 25900) (23089 25846) (23090 25844) (23091 25842) (23092 25850) (23093 25856) (23094 +25853) (23095 25880) (23096 25884) (23097 25861) (23098 25892) (23099 25891) (23100 25899) (23101 +25908) (23102 25909) (23103 25911) (23104 25910) (23105 25912) (23106 30027) (23107 25928) (23108 +25942) (23109 25941) (23110 25933) (23111 25944) (23112 25950) (23113 25949) (23114 25970) (23115 +25976) (23116 25986) (23117 25987) (23118 35722) (23119 26011) (23120 26015) (23121 26027) (23122 +26039) (23123 26051) (23124 26054) (23125 26049) (23126 26052) (23127 26060) (23128 26066) (23129 +26075) (23130 26073) (23131 26080) (23132 26081) (23133 26097) (23134 26482) (23135 26122) (23136 +26115) (23137 26107) (23138 26483) (23139 26165) (23140 26166) (23141 26164) (23142 26140) (23143 +26191) (23144 26180) (23145 26185) (23146 26177) (23147 26206) (23148 26205) (23149 26212) (23150 +26215) (23151 26216) (23152 26207) (23153 26210) (23154 26224) (23155 26243) (23156 26248) (23157 +26254) (23158 26249) (23159 26244) (23160 26264) (23161 26269) (23162 26305) (23163 26297) (23164 +26313) (23165 26302) (23166 26300) (23329 26308) (23330 26296) (23331 26326) (23332 26330) (23333 +26336) (23334 26175) (23335 26342) (23336 26345) (23337 26352) (23338 26357) (23339 26359) (23340 +26383) (23341 26390) (23342 26398) (23343 26406) (23344 26407) (23345 38712) (23346 26414) (23347 +26431) (23348 26422) (23349 26433) (23350 26424) (23351 26423) (23352 26438) (23353 26462) (23354 +26464) (23355 26457) (23356 26467) (23357 26468) (23358 26505) (23359 26480) (23360 26537) (23361 +26492) (23362 26474) (23363 26508) (23364 26507) (23365 26534) (23366 26529) (23367 26501) (23368 +26551) (23369 26607) (23370 26548) (23371 26604) (23372 26547) (23373 26601) (23374 26552) (23375 +26596) (23376 26590) (23377 26589) (23378 26594) (23379 26606) (23380 26553) (23381 26574) (23382 +26566) (23383 26599) (23384 27292) (23385 26654) (23386 26694) (23387 26665) (23388 26688) (23389 +26701) (23390 26674) (23391 26702) (23392 26803) (23393 26667) (23394 26713) (23395 26723) (23396 +26743) (23397 26751) (23398 26783) (23399 26767) (23400 26797) (23401 26772) (23402 26781) (23403 +26779) (23404 26755) (23405 27310) (23406 26809) (23407 26740) (23408 26805) (23409 26784) (23410 +26810) (23411 26895) (23412 26765) (23413 26750) (23414 26881) (23415 26826) (23416 26888) (23417 +26840) (23418 26914) (23419 26918) (23420 26849) (23421 26892) (23422 26829) (23585 26836) (23586 +26855) (23587 26837) (23588 26934) (23589 26898) (23590 26884) (23591 26839) (23592 26851) (23593 +26917) (23594 26873) (23595 26848) (23596 26863) (23597 26920) (23598 26922) (23599 26906) (23600 +26915) (23601 26913) (23602 26822) (23603 27001) (23604 26999) (23605 26972) (23606 27000) (23607 +26987) (23608 26964) (23609 27006) (23610 26990) (23611 26937) (23612 26996) (23613 26941) (23614 +26969) (23615 26928) (23616 26977) (23617 26974) (23618 26973) (23619 27009) (23620 26986) (23621 +27058) (23622 27054) (23623 27088) (23624 27071) (23625 27073) (23626 27091) (23627 27070) (23628 +27086) (23629 23528) (23630 27082) (23631 27101) (23632 27067) (23633 27075) (23634 27047) (23635 +27182) (23636 27025) (23637 27040) (23638 27036) (23639 27029) (23640 27060) (23641 27102) (23642 +27112) (23643 27138) (23644 27163) (23645 27135) (23646 27402) (23647 27129) (23648 27122) (23649 +27111) (23650 27141) (23651 27057) (23652 27166) (23653 27117) (23654 27156) (23655 27115) (23656 +27146) (23657 27154) (23658 27329) (23659 27171) (23660 27155) (23661 27204) (23662 27148) (23663 +27250) (23664 27190) (23665 27256) (23666 27207) (23667 27234) (23668 27225) (23669 27238) (23670 +27208) (23671 27192) (23672 27170) (23673 27280) (23674 27277) (23675 27296) (23676 27268) (23677 +27298) (23678 27299) (23841 27287) (23842 34327) (23843 27323) (23844 27331) (23845 27330) (23846 +27320) (23847 27315) (23848 27308) (23849 27358) (23850 27345) (23851 27359) (23852 27306) (23853 +27354) (23854 27370) (23855 27387) (23856 27397) (23857 34326) (23858 27386) (23859 27410) (23860 +27414) (23861 39729) (23862 27423) (23863 27448) (23864 27447) (23865 30428) (23866 27449) (23867 +39150) (23868 27463) (23869 27459) (23870 27465) (23871 27472) (23872 27481) (23873 27476) (23874 +27483) (23875 27487) (23876 27489) (23877 27512) (23878 27513) (23879 27519) (23880 27520) (23881 +27524) (23882 27523) (23883 27533) (23884 27544) (23885 27541) (23886 27550) (23887 27556) (23888 +27562) (23889 27563) (23890 27567) (23891 27570) (23892 27569) (23893 27571) (23894 27575) (23895 +27580) (23896 27590) (23897 27595) (23898 27603) (23899 27615) (23900 27628) (23901 27627) (23902 +27635) (23903 27631) (23904 40638) (23905 27656) (23906 27667) (23907 27668) (23908 27675) (23909 +27684) (23910 27683) (23911 27742) (23912 27733) (23913 27746) (23914 27754) (23915 27778) (23916 +27789) (23917 27802) (23918 27777) (23919 27803) (23920 27774) (23921 27752) (23922 27763) (23923 +27794) (23924 27792) (23925 27844) (23926 27889) (23927 27859) (23928 27837) (23929 27863) (23930 +27845) (23931 27869) (23932 27822) (23933 27825) (23934 27838) (24097 27834) (24098 27867) (24099 +27887) (24100 27865) (24101 27882) (24102 27935) (24103 34893) (24104 27958) (24105 27947) (24106 +27965) (24107 27960) (24108 27929) (24109 27957) (24110 27955) (24111 27922) (24112 27916) (24113 +28003) (24114 28051) (24115 28004) (24116 27994) (24117 28025) (24118 27993) (24119 28046) (24120 +28053) (24121 28644) (24122 28037) (24123 28153) (24124 28181) (24125 28170) (24126 28085) (24127 +28103) (24128 28134) (24129 28088) (24130 28102) (24131 28140) (24132 28126) (24133 28108) (24134 +28136) (24135 28114) (24136 28101) (24137 28154) (24138 28121) (24139 28132) (24140 28117) (24141 +28138) (24142 28142) (24143 28205) (24144 28270) (24145 28206) (24146 28185) (24147 28274) (24148 +28255) (24149 28222) (24150 28195) (24151 28267) (24152 28203) (24153 28278) (24154 28237) (24155 +28191) (24156 28227) (24157 28218) (24158 28238) (24159 28196) (24160 28415) (24161 28189) (24162 +28216) (24163 28290) (24164 28330) (24165 28312) (24166 28361) (24167 28343) (24168 28371) (24169 +28349) (24170 28335) (24171 28356) (24172 28338) (24173 28372) (24174 28373) (24175 28303) (24176 +28325) (24177 28354) (24178 28319) (24179 28481) (24180 28433) (24181 28748) (24182 28396) (24183 +28408) (24184 28414) (24185 28479) (24186 28402) (24187 28465) (24188 28399) (24189 28466) (24190 +28364) (24353 28478) (24354 28435) (24355 28407) (24356 28550) (24357 28538) (24358 28536) (24359 +28545) (24360 28544) (24361 28527) (24362 28507) (24363 28659) (24364 28525) (24365 28546) (24366 +28540) (24367 28504) (24368 28558) (24369 28561) (24370 28610) (24371 28518) (24372 28595) (24373 +28579) (24374 28577) (24375 28580) (24376 28601) (24377 28614) (24378 28586) (24379 28639) (24380 +28629) (24381 28652) (24382 28628) (24383 28632) (24384 28657) (24385 28654) (24386 28635) (24387 +28681) (24388 28683) (24389 28666) (24390 28689) (24391 28673) (24392 28687) (24393 28670) (24394 +28699) (24395 28698) (24396 28532) (24397 28701) (24398 28696) (24399 28703) (24400 28720) (24401 +28734) (24402 28722) (24403 28753) (24404 28771) (24405 28825) (24406 28818) (24407 28847) (24408 +28913) (24409 28844) (24410 28856) (24411 28851) (24412 28846) (24413 28895) (24414 28875) (24415 +28893) (24416 28889) (24417 28937) (24418 28925) (24419 28956) (24420 28953) (24421 29029) (24422 +29013) (24423 29064) (24424 29030) (24425 29026) (24426 29004) (24427 29014) (24428 29036) (24429 +29071) (24430 29179) (24431 29060) (24432 29077) (24433 29096) (24434 29100) (24435 29143) (24436 +29113) (24437 29118) (24438 29138) (24439 29129) (24440 29140) (24441 29134) (24442 29152) (24443 +29164) (24444 29159) (24445 29173) (24446 29180) (24609 29177) (24610 29183) (24611 29197) (24612 +29200) (24613 29211) (24614 29224) (24615 29229) (24616 29228) (24617 29232) (24618 29234) (24619 +29243) (24620 29244) (24621 29247) (24622 29248) (24623 29254) (24624 29259) (24625 29272) (24626 +29300) (24627 29310) (24628 29314) (24629 29313) (24630 29319) (24631 29330) (24632 29334) (24633 +29346) (24634 29351) (24635 29369) (24636 29362) (24637 29379) (24638 29382) (24639 29380) (24640 +29390) (24641 29394) (24642 29410) (24643 29408) (24644 29409) (24645 29433) (24646 29431) (24647 +20495) (24648 29463) (24649 29450) (24650 29468) (24651 29462) (24652 29469) (24653 29492) (24654 +29487) (24655 29481) (24656 29477) (24657 29502) (24658 29518) (24659 29519) (24660 40664) (24661 +29527) (24662 29546) (24663 29544) (24664 29552) (24665 29560) (24666 29557) (24667 29563) (24668 +29562) (24669 29640) (24670 29619) (24671 29646) (24672 29627) (24673 29632) (24674 29669) (24675 +29678) (24676 29662) (24677 29858) (24678 29701) (24679 29807) (24680 29733) (24681 29688) (24682 +29746) (24683 29754) (24684 29781) (24685 29759) (24686 29791) (24687 29785) (24688 29761) (24689 +29788) (24690 29801) (24691 29808) (24692 29795) (24693 29802) (24694 29814) (24695 29822) (24696 +29835) (24697 29854) (24698 29863) (24699 29898) (24700 29903) (24701 29908) (24702 29681) (24865 +29920) (24866 29923) (24867 29927) (24868 29929) (24869 29934) (24870 29938) (24871 29936) (24872 +29937) (24873 29944) (24874 29943) (24875 29956) (24876 29955) (24877 29957) (24878 29964) (24879 +29966) (24880 29965) (24881 29973) (24882 29971) (24883 29982) (24884 29990) (24885 29996) (24886 +30012) (24887 30020) (24888 30029) (24889 30026) (24890 30025) (24891 30043) (24892 30022) (24893 +30042) (24894 30057) (24895 30052) (24896 30055) (24897 30059) (24898 30061) (24899 30072) (24900 +30070) (24901 30086) (24902 30087) (24903 30068) (24904 30090) (24905 30089) (24906 30082) (24907 +30100) (24908 30106) (24909 30109) (24910 30117) (24911 30115) (24912 30146) (24913 30131) (24914 +30147) (24915 30133) (24916 30141) (24917 30136) (24918 30140) (24919 30129) (24920 30157) (24921 +30154) (24922 30162) (24923 30169) (24924 30179) (24925 30174) (24926 30206) (24927 30207) (24928 +30204) (24929 30209) (24930 30192) (24931 30202) (24932 30194) (24933 30195) (24934 30219) (24935 +30221) (24936 30217) (24937 30239) (24938 30247) (24939 30240) (24940 30241) (24941 30242) (24942 +30244) (24943 30260) (24944 30256) (24945 30267) (24946 30279) (24947 30280) (24948 30278) (24949 +30300) (24950 30296) (24951 30305) (24952 30306) (24953 30312) (24954 30313) (24955 30314) (24956 +30311) (24957 30316) (24958 30320) (25121 30322) (25122 30326) (25123 30328) (25124 30332) (25125 +30336) (25126 30339) (25127 30344) (25128 30347) (25129 30350) (25130 30358) (25131 30355) (25132 +30361) (25133 30362) (25134 30384) (25135 30388) (25136 30392) (25137 30393) (25138 30394) (25139 +30402) (25140 30413) (25141 30422) (25142 30418) (25143 30430) (25144 30433) (25145 30437) (25146 +30439) (25147 30442) (25148 34351) (25149 30459) (25150 30472) (25151 30471) (25152 30468) (25153 +30505) (25154 30500) (25155 30494) (25156 30501) (25157 30502) (25158 30491) (25159 30519) (25160 +30520) (25161 30535) (25162 30554) (25163 30568) (25164 30571) (25165 30555) (25166 30565) (25167 +30591) (25168 30590) (25169 30585) (25170 30606) (25171 30603) (25172 30609) (25173 30624) (25174 +30622) (25175 30640) (25176 30646) (25177 30649) (25178 30655) (25179 30652) (25180 30653) (25181 +30651) (25182 30663) (25183 30669) (25184 30679) (25185 30682) (25186 30684) (25187 30691) (25188 +30702) (25189 30716) (25190 30732) (25191 30738) (25192 31014) (25193 30752) (25194 31018) (25195 +30789) (25196 30862) (25197 30836) (25198 30854) (25199 30844) (25200 30874) (25201 30860) (25202 +30883) (25203 30901) (25204 30890) (25205 30895) (25206 30929) (25207 30918) (25208 30923) (25209 +30932) (25210 30910) (25211 30908) (25212 30917) (25213 30922) (25214 30956) (25377 30951) (25378 +30938) (25379 30973) (25380 30964) (25381 30983) (25382 30994) (25383 30993) (25384 31001) (25385 +31020) (25386 31019) (25387 31040) (25388 31072) (25389 31063) (25390 31071) (25391 31066) (25392 +31061) (25393 31059) (25394 31098) (25395 31103) (25396 31114) (25397 31133) (25398 31143) (25399 +40779) (25400 31146) (25401 31150) (25402 31155) (25403 31161) (25404 31162) (25405 31177) (25406 +31189) (25407 31207) (25408 31212) (25409 31201) (25410 31203) (25411 31240) (25412 31245) (25413 +31256) (25414 31257) (25415 31264) (25416 31263) (25417 31104) (25418 31281) (25419 31291) (25420 +31294) (25421 31287) (25422 31299) (25423 31319) (25424 31305) (25425 31329) (25426 31330) (25427 +31337) (25428 40861) (25429 31344) (25430 31353) (25431 31357) (25432 31368) (25433 31383) (25434 +31381) (25435 31384) (25436 31382) (25437 31401) (25438 31432) (25439 31408) (25440 31414) (25441 +31429) (25442 31428) (25443 31423) (25444 36995) (25445 31431) (25446 31434) (25447 31437) (25448 +31439) (25449 31445) (25450 31443) (25451 31449) (25452 31450) (25453 31453) (25454 31457) (25455 +31458) (25456 31462) (25457 31469) (25458 31472) (25459 31490) (25460 31503) (25461 31498) (25462 +31494) (25463 31539) (25464 31512) (25465 31513) (25466 31518) (25467 31541) (25468 31528) (25469 +31542) (25470 31568) (25633 31610) (25634 31492) (25635 31565) (25636 31499) (25637 31564) (25638 +31557) (25639 31605) (25640 31589) (25641 31604) (25642 31591) (25643 31600) (25644 31601) (25645 +31596) (25646 31598) (25647 31645) (25648 31640) (25649 31647) (25650 31629) (25651 31644) (25652 +31642) (25653 31627) (25654 31634) (25655 31631) (25656 31581) (25657 31641) (25658 31691) (25659 +31681) (25660 31692) (25661 31695) (25662 31668) (25663 31686) (25664 31709) (25665 31721) (25666 +31761) (25667 31764) (25668 31718) (25669 31717) (25670 31840) (25671 31744) (25672 31751) (25673 +31763) (25674 31731) (25675 31735) (25676 31767) (25677 31757) (25678 31734) (25679 31779) (25680 +31783) (25681 31786) (25682 31775) (25683 31799) (25684 31787) (25685 31805) (25686 31820) (25687 +31811) (25688 31828) (25689 31823) (25690 31808) (25691 31824) (25692 31832) (25693 31839) (25694 +31844) (25695 31830) (25696 31845) (25697 31852) (25698 31861) (25699 31875) (25700 31888) (25701 +31908) (25702 31917) (25703 31906) (25704 31915) (25705 31905) (25706 31912) (25707 31923) (25708 +31922) (25709 31921) (25710 31918) (25711 31929) (25712 31933) (25713 31936) (25714 31941) (25715 +31938) (25716 31960) (25717 31954) (25718 31964) (25719 31970) (25720 39739) (25721 31983) (25722 +31986) (25723 31988) (25724 31990) (25725 31994) (25726 32006) (25889 32002) (25890 32028) (25891 +32021) (25892 32010) (25893 32069) (25894 32075) (25895 32046) (25896 32050) (25897 32063) (25898 +32053) (25899 32070) (25900 32115) (25901 32086) (25902 32078) (25903 32114) (25904 32104) (25905 +32110) (25906 32079) (25907 32099) (25908 32147) (25909 32137) (25910 32091) (25911 32143) (25912 +32125) (25913 32155) (25914 32186) (25915 32174) (25916 32163) (25917 32181) (25918 32199) (25919 +32189) (25920 32171) (25921 32317) (25922 32162) (25923 32175) (25924 32220) (25925 32184) (25926 +32159) (25927 32176) (25928 32216) (25929 32221) (25930 32228) (25931 32222) (25932 32251) (25933 +32242) (25934 32225) (25935 32261) (25936 32266) (25937 32291) (25938 32289) (25939 32274) (25940 +32305) (25941 32287) (25942 32265) (25943 32267) (25944 32290) (25945 32326) (25946 32358) (25947 +32315) (25948 32309) (25949 32313) (25950 32323) (25951 32311) (25952 32306) (25953 32314) (25954 +32359) (25955 32349) (25956 32342) (25957 32350) (25958 32345) (25959 32346) (25960 32377) (25961 +32362) (25962 32361) (25963 32380) (25964 32379) (25965 32387) (25966 32213) (25967 32381) (25968 +36782) (25969 32383) (25970 32392) (25971 32393) (25972 32396) (25973 32402) (25974 32400) (25975 +32403) (25976 32404) (25977 32406) (25978 32398) (25979 32411) (25980 32412) (25981 32568) (25982 +32570) (26145 32581) (26146 32588) (26147 32589) (26148 32590) (26149 32592) (26150 32593) (26151 +32597) (26152 32596) (26153 32600) (26154 32607) (26155 32608) (26156 32616) (26157 32617) (26158 +32615) (26159 32632) (26160 32642) (26161 32646) (26162 32643) (26163 32648) (26164 32647) (26165 +32652) (26166 32660) (26167 32670) (26168 32669) (26169 32666) (26170 32675) (26171 32687) (26172 +32690) (26173 32697) (26174 32686) (26175 32694) (26176 32696) (26177 35697) (26178 32709) (26179 +32710) (26180 32714) (26181 32725) (26182 32724) (26183 32737) (26184 32742) (26185 32745) (26186 +32755) (26187 32761) (26188 39132) (26189 32774) (26190 32772) (26191 32779) (26192 32786) (26193 +32792) (26194 32793) (26195 32796) (26196 32801) (26197 32808) (26198 32831) (26199 32827) (26200 +32842) (26201 32838) (26202 32850) (26203 32856) (26204 32858) (26205 32863) (26206 32866) (26207 +32872) (26208 32883) (26209 32882) (26210 32880) (26211 32886) (26212 32889) (26213 32893) (26214 +32895) (26215 32900) (26216 32902) (26217 32901) (26218 32923) (26219 32915) (26220 32922) (26221 +32941) (26222 20880) (26223 32940) (26224 32987) (26225 32997) (26226 32985) (26227 32989) (26228 +32964) (26229 32986) (26230 32982) (26231 33033) (26232 33007) (26233 33009) (26234 33051) (26235 +33065) (26236 33059) (26237 33071) (26238 33099) (26401 38539) (26402 33094) (26403 33086) (26404 +33107) (26405 33105) (26406 33020) (26407 33137) (26408 33134) (26409 33125) (26410 33126) (26411 +33140) (26412 33155) (26413 33160) (26414 33162) (26415 33152) (26416 33154) (26417 33184) (26418 +33173) (26419 33188) (26420 33187) (26421 33119) (26422 33171) (26423 33193) (26424 33200) (26425 +33205) (26426 33214) (26427 33208) (26428 33213) (26429 33216) (26430 33218) (26431 33210) (26432 +33225) (26433 33229) (26434 33233) (26435 33241) (26436 33240) (26437 33224) (26438 33242) (26439 +33247) (26440 33248) (26441 33255) (26442 33274) (26443 33275) (26444 33278) (26445 33281) (26446 +33282) (26447 33285) (26448 33287) (26449 33290) (26450 33293) (26451 33296) (26452 33302) (26453 +33321) (26454 33323) (26455 33336) (26456 33331) (26457 33344) (26458 33369) (26459 33368) (26460 +33373) (26461 33370) (26462 33375) (26463 33380) (26464 33378) (26465 33384) (26466 33386) (26467 +33387) (26468 33326) (26469 33393) (26470 33399) (26471 33400) (26472 33406) (26473 33421) (26474 +33426) (26475 33451) (26476 33439) (26477 33467) (26478 33452) (26479 33505) (26480 33507) (26481 +33503) (26482 33490) (26483 33524) (26484 33523) (26485 33530) (26486 33683) (26487 33539) (26488 +33531) (26489 33529) (26490 33502) (26491 33542) (26492 33500) (26493 33545) (26494 33497) (26657 +33589) (26658 33588) (26659 33558) (26660 33586) (26661 33585) (26662 33600) (26663 33593) (26664 +33616) (26665 33605) (26666 33583) (26667 33579) (26668 33559) (26669 33560) (26670 33669) (26671 +33690) (26672 33706) (26673 33695) (26674 33698) (26675 33686) (26676 33571) (26677 33678) (26678 +33671) (26679 33674) (26680 33660) (26681 33717) (26682 33651) (26683 33653) (26684 33696) (26685 +33673) (26686 33704) (26687 33780) (26688 33811) (26689 33771) (26690 33742) (26691 33789) (26692 +33795) (26693 33752) (26694 33803) (26695 33729) (26696 33783) (26697 33799) (26698 33760) (26699 +33778) (26700 33805) (26701 33826) (26702 33824) (26703 33725) (26704 33848) (26705 34054) (26706 +33787) (26707 33901) (26708 33834) (26709 33852) (26710 34138) (26711 33924) (26712 33911) (26713 +33899) (26714 33965) (26715 33902) (26716 33922) (26717 33897) (26718 33862) (26719 33836) (26720 +33903) (26721 33913) (26722 33845) (26723 33994) (26724 33890) (26725 33977) (26726 33983) (26727 +33951) (26728 34009) (26729 33997) (26730 33979) (26731 34010) (26732 34000) (26733 33985) (26734 +33990) (26735 34006) (26736 33953) (26737 34081) (26738 34047) (26739 34036) (26740 34071) (26741 +34072) (26742 34092) (26743 34079) (26744 34069) (26745 34068) (26746 34044) (26747 34112) (26748 +34147) (26749 34136) (26750 34120) (26913 34113) (26914 34306) (26915 34123) (26916 34133) (26917 +34176) (26918 34212) (26919 34184) (26920 34193) (26921 34186) (26922 34216) (26923 34157) (26924 +34196) (26925 34203) (26926 34282) (26927 34183) (26928 34204) (26929 34167) (26930 34174) (26931 +34192) (26932 34249) (26933 34234) (26934 34255) (26935 34233) (26936 34256) (26937 34261) (26938 +34269) (26939 34277) (26940 34268) (26941 34297) (26942 34314) (26943 34323) (26944 34315) (26945 +34302) (26946 34298) (26947 34310) (26948 34338) (26949 34330) (26950 34352) (26951 34367) (26952 +34381) (26953 20053) (26954 34388) (26955 34399) (26956 34407) (26957 34417) (26958 34451) (26959 +34467) (26960 34473) (26961 34474) (26962 34443) (26963 34444) (26964 34486) (26965 34479) (26966 +34500) (26967 34502) (26968 34480) (26969 34505) (26970 34851) (26971 34475) (26972 34516) (26973 +34526) (26974 34537) (26975 34540) (26976 34527) (26977 34523) (26978 34543) (26979 34578) (26980 +34566) (26981 34568) (26982 34560) (26983 34563) (26984 34555) (26985 34577) (26986 34569) (26987 +34573) (26988 34553) (26989 34570) (26990 34612) (26991 34623) (26992 34615) (26993 34619) (26994 +34597) (26995 34601) (26996 34586) (26997 34656) (26998 34655) (26999 34680) (27000 34636) (27001 +34638) (27002 34676) (27003 34647) (27004 34664) (27005 34670) (27006 34649) (27169 34643) (27170 +34659) (27171 34666) (27172 34821) (27173 34722) (27174 34719) (27175 34690) (27176 34735) (27177 +34763) (27178 34749) (27179 34752) (27180 34768) (27181 38614) (27182 34731) (27183 34756) (27184 +34739) (27185 34759) (27186 34758) (27187 34747) (27188 34799) (27189 34802) (27190 34784) (27191 +34831) (27192 34829) (27193 34814) (27194 34806) (27195 34807) (27196 34830) (27197 34770) (27198 +34833) (27199 34838) (27200 34837) (27201 34850) (27202 34849) (27203 34865) (27204 34870) (27205 +34873) (27206 34855) (27207 34875) (27208 34884) (27209 34882) (27210 34898) (27211 34905) (27212 +34910) (27213 34914) (27214 34923) (27215 34945) (27216 34942) (27217 34974) (27218 34933) (27219 +34941) (27220 34997) (27221 34930) (27222 34946) (27223 34967) (27224 34962) (27225 34990) (27226 +34969) (27227 34978) (27228 34957) (27229 34980) (27230 34992) (27231 35007) (27232 34993) (27233 +35011) (27234 35012) (27235 35028) (27236 35032) (27237 35033) (27238 35037) (27239 35065) (27240 +35074) (27241 35068) (27242 35060) (27243 35048) (27244 35058) (27245 35076) (27246 35084) (27247 +35082) (27248 35091) (27249 35139) (27250 35102) (27251 35109) (27252 35114) (27253 35115) (27254 +35137) (27255 35140) (27256 35131) (27257 35126) (27258 35128) (27259 35148) (27260 35101) (27261 +35168) (27262 35166) (27425 35174) (27426 35172) (27427 35181) (27428 35178) (27429 35183) (27430 +35188) (27431 35191) (27432 35198) (27433 35203) (27434 35208) (27435 35210) (27436 35219) (27437 +35224) (27438 35233) (27439 35241) (27440 35238) (27441 35244) (27442 35247) (27443 35250) (27444 +35258) (27445 35261) (27446 35263) (27447 35264) (27448 35290) (27449 35292) (27450 35293) (27451 +35303) (27452 35316) (27453 35320) (27454 35331) (27455 35350) (27456 35344) (27457 35340) (27458 +35355) (27459 35357) (27460 35365) (27461 35382) (27462 35393) (27463 35419) (27464 35410) (27465 +35398) (27466 35400) (27467 35452) (27468 35437) (27469 35436) (27470 35426) (27471 35461) (27472 +35458) (27473 35460) (27474 35496) (27475 35489) (27476 35473) (27477 35493) (27478 35494) (27479 +35482) (27480 35491) (27481 35524) (27482 35533) (27483 35522) (27484 35546) (27485 35563) (27486 +35571) (27487 35559) (27488 35556) (27489 35569) (27490 35604) (27491 35552) (27492 35554) (27493 +35575) (27494 35550) (27495 35547) (27496 35596) (27497 35591) (27498 35610) (27499 35553) (27500 +35606) (27501 35600) (27502 35607) (27503 35616) (27504 35635) (27505 38827) (27506 35622) (27507 +35627) (27508 35646) (27509 35624) (27510 35649) (27511 35660) (27512 35663) (27513 35662) (27514 +35657) (27515 35670) (27516 35675) (27517 35674) (27518 35691) (27681 35679) (27682 35692) (27683 +35695) (27684 35700) (27685 35709) (27686 35712) (27687 35724) (27688 35726) (27689 35730) (27690 +35731) (27691 35734) (27692 35737) (27693 35738) (27694 35898) (27695 35905) (27696 35903) (27697 +35912) (27698 35916) (27699 35918) (27700 35920) (27701 35925) (27702 35938) (27703 35948) (27704 +35960) (27705 35962) (27706 35970) (27707 35977) (27708 35973) (27709 35978) (27710 35981) (27711 +35982) (27712 35988) (27713 35964) (27714 35992) (27715 25117) (27716 36013) (27717 36010) (27718 +36029) (27719 36018) (27720 36019) (27721 36014) (27722 36022) (27723 36040) (27724 36033) (27725 +36068) (27726 36067) (27727 36058) (27728 36093) (27729 36090) (27730 36091) (27731 36100) (27732 +36101) (27733 36106) (27734 36103) (27735 36111) (27736 36109) (27737 36112) (27738 40782) (27739 +36115) (27740 36045) (27741 36116) (27742 36118) (27743 36199) (27744 36205) (27745 36209) (27746 +36211) (27747 36225) (27748 36249) (27749 36290) (27750 36286) (27751 36282) (27752 36303) (27753 +36314) (27754 36310) (27755 36300) (27756 36315) (27757 36299) (27758 36330) (27759 36331) (27760 +36319) (27761 36323) (27762 36348) (27763 36360) (27764 36361) (27765 36351) (27766 36381) (27767 +36382) (27768 36368) (27769 36383) (27770 36418) (27771 36405) (27772 36400) (27773 36404) (27774 +36426) (27937 36423) (27938 36425) (27939 36428) (27940 36432) (27941 36424) (27942 36441) (27943 +36452) (27944 36448) (27945 36394) (27946 36451) (27947 36437) (27948 36470) (27949 36466) (27950 +36476) (27951 36481) (27952 36487) (27953 36485) (27954 36484) (27955 36491) (27956 36490) (27957 +36499) (27958 36497) (27959 36500) (27960 36505) (27961 36522) (27962 36513) (27963 36524) (27964 +36528) (27965 36550) (27966 36529) (27967 36542) (27968 36549) (27969 36552) (27970 36555) (27971 +36571) (27972 36579) (27973 36604) (27974 36603) (27975 36587) (27976 36606) (27977 36618) (27978 +36613) (27979 36629) (27980 36626) (27981 36633) (27982 36627) (27983 36636) (27984 36639) (27985 +36635) (27986 36620) (27987 36646) (27988 36659) (27989 36667) (27990 36665) (27991 36677) (27992 +36674) (27993 36670) (27994 36684) (27995 36681) (27996 36678) (27997 36686) (27998 36695) (27999 +36700) (28000 36706) (28001 36707) (28002 36708) (28003 36764) (28004 36767) (28005 36771) (28006 +36781) (28007 36783) (28008 36791) (28009 36826) (28010 36837) (28011 36834) (28012 36842) (28013 +36847) (28014 36999) (28015 36852) (28016 36869) (28017 36857) (28018 36858) (28019 36881) (28020 +36885) (28021 36897) (28022 36877) (28023 36894) (28024 36886) (28025 36875) (28026 36903) (28027 +36918) (28028 36917) (28029 36921) (28030 36856) (28193 36943) (28194 36944) (28195 36945) (28196 +36946) (28197 36878) (28198 36937) (28199 36926) (28200 36950) (28201 36952) (28202 36958) (28203 +36968) (28204 36975) (28205 36982) (28206 38568) (28207 36978) (28208 36994) (28209 36989) (28210 +36993) (28211 36992) (28212 37002) (28213 37001) (28214 37007) (28215 37032) (28216 37039) (28217 +37041) (28218 37045) (28219 37090) (28220 37092) (28221 25160) (28222 37083) (28223 37122) (28224 +37138) (28225 37145) (28226 37170) (28227 37168) (28228 37194) (28229 37206) (28230 37208) (28231 +37219) (28232 37221) (28233 37225) (28234 37235) (28235 37234) (28236 37259) (28237 37257) (28238 +37250) (28239 37282) (28240 37291) (28241 37295) (28242 37290) (28243 37301) (28244 37300) (28245 +37306) (28246 37312) (28247 37313) (28248 37321) (28249 37323) (28250 37328) (28251 37334) (28252 +37343) (28253 37345) (28254 37339) (28255 37372) (28256 37365) (28257 37366) (28258 37406) (28259 +37375) (28260 37396) (28261 37420) (28262 37397) (28263 37393) (28264 37470) (28265 37463) (28266 +37445) (28267 37449) (28268 37476) (28269 37448) (28270 37525) (28271 37439) (28272 37451) (28273 +37456) (28274 37532) (28275 37526) (28276 37523) (28277 37531) (28278 37466) (28279 37583) (28280 +37561) (28281 37559) (28282 37609) (28283 37647) (28284 37626) (28285 37700) (28286 37678) (28449 +37657) (28450 37666) (28451 37658) (28452 37667) (28453 37690) (28454 37685) (28455 37691) (28456 +37724) (28457 37728) (28458 37756) (28459 37742) (28460 37718) (28461 37808) (28462 37804) (28463 +37805) (28464 37780) (28465 37817) (28466 37846) (28467 37847) (28468 37864) (28469 37861) (28470 +37848) (28471 37827) (28472 37853) (28473 37840) (28474 37832) (28475 37860) (28476 37914) (28477 +37908) (28478 37907) (28479 37891) (28480 37895) (28481 37904) (28482 37942) (28483 37931) (28484 +37941) (28485 37921) (28486 37946) (28487 37953) (28488 37970) (28489 37956) (28490 37979) (28491 +37984) (28492 37986) (28493 37982) (28494 37994) (28495 37417) (28496 38000) (28497 38005) (28498 +38007) (28499 38013) (28500 37978) (28501 38012) (28502 38014) (28503 38017) (28504 38015) (28505 +38274) (28506 38279) (28507 38282) (28508 38292) (28509 38294) (28510 38296) (28511 38297) (28512 +38304) (28513 38312) (28514 38311) (28515 38317) (28516 38332) (28517 38331) (28518 38329) (28519 +38334) (28520 38346) (28521 28662) (28522 38339) (28523 38349) (28524 38348) (28525 38357) (28526 +38356) (28527 38358) (28528 38364) (28529 38369) (28530 38373) (28531 38370) (28532 38433) (28533 +38440) (28534 38446) (28535 38447) (28536 38466) (28537 38476) (28538 38479) (28539 38475) (28540 +38519) (28541 38492) (28542 38494) (28705 38493) (28706 38495) (28707 38502) (28708 38514) (28709 +38508) (28710 38541) (28711 38552) (28712 38549) (28713 38551) (28714 38570) (28715 38567) (28716 +38577) (28717 38578) (28718 38576) (28719 38580) (28720 38582) (28721 38584) (28722 38585) (28723 +38606) (28724 38603) (28725 38601) (28726 38605) (28727 35149) (28728 38620) (28729 38669) (28730 +38613) (28731 38649) (28732 38660) (28733 38662) (28734 38664) (28735 38675) (28736 38670) (28737 +38673) (28738 38671) (28739 38678) (28740 38681) (28741 38692) (28742 38698) (28743 38704) (28744 +38713) (28745 38717) (28746 38718) (28747 38724) (28748 38726) (28749 38728) (28750 38722) (28751 +38729) (28752 38748) (28753 38752) (28754 38756) (28755 38758) (28756 38760) (28757 21202) (28758 +38763) (28759 38769) (28760 38777) (28761 38789) (28762 38780) (28763 38785) (28764 38778) (28765 +38790) (28766 38795) (28767 38799) (28768 38800) (28769 38812) (28770 38824) (28771 38822) (28772 +38819) (28773 38835) (28774 38836) (28775 38851) (28776 38854) (28777 38856) (28778 38859) (28779 +38876) (28780 38893) (28781 40783) (28782 38898) (28783 31455) (28784 38902) (28785 38901) (28786 +38927) (28787 38924) (28788 38968) (28789 38948) (28790 38945) (28791 38967) (28792 38973) (28793 +38982) (28794 38991) (28795 38987) (28796 39019) (28797 39023) (28798 39024) (28961 39025) (28962 +39028) (28963 39027) (28964 39082) (28965 39087) (28966 39089) (28967 39094) (28968 39108) (28969 +39107) (28970 39110) (28971 39145) (28972 39147) (28973 39171) (28974 39177) (28975 39186) (28976 +39188) (28977 39192) (28978 39201) (28979 39197) (28980 39198) (28981 39204) (28982 39200) (28983 +39212) (28984 39214) (28985 39229) (28986 39230) (28987 39234) (28988 39241) (28989 39237) (28990 +39248) (28991 39243) (28992 39249) (28993 39250) (28994 39244) (28995 39253) (28996 39319) (28997 +39320) (28998 39333) (28999 39341) (29000 39342) (29001 39356) (29002 39391) (29003 39387) (29004 +39389) (29005 39384) (29006 39377) (29007 39405) (29008 39406) (29009 39409) (29010 39410) (29011 +39419) (29012 39416) (29013 39425) (29014 39439) (29015 39429) (29016 39394) (29017 39449) (29018 +39467) (29019 39479) (29020 39493) (29021 39490) (29022 39488) (29023 39491) (29024 39486) (29025 +39509) (29026 39501) (29027 39515) (29028 39511) (29029 39519) (29030 39522) (29031 39525) (29032 +39524) (29033 39529) (29034 39531) (29035 39530) (29036 39597) (29037 39600) (29038 39612) (29039 +39616) (29040 39631) (29041 39633) (29042 39635) (29043 39636) (29044 39646) (29045 39647) (29046 +39650) (29047 39651) (29048 39654) (29049 39663) (29050 39659) (29051 39662) (29052 39668) (29053 +39665) (29054 39671) (29217 39675) (29218 39686) (29219 39704) (29220 39706) (29221 39711) (29222 +39714) (29223 39715) (29224 39717) (29225 39719) (29226 39720) (29227 39721) (29228 39722) (29229 +39726) (29230 39727) (29231 39730) (29232 39748) (29233 39747) (29234 39759) (29235 39757) (29236 +39758) (29237 39761) (29238 39768) (29239 39796) (29240 39827) (29241 39811) (29242 39825) (29243 +39830) (29244 39831) (29245 39839) (29246 39840) (29247 39848) (29248 39860) (29249 39872) (29250 +39882) (29251 39865) (29252 39878) (29253 39887) (29254 39889) (29255 39890) (29256 39907) (29257 +39906) (29258 39908) (29259 39892) (29260 39905) (29261 39994) (29262 39922) (29263 39921) (29264 +39920) (29265 39957) (29266 39956) (29267 39945) (29268 39955) (29269 39948) (29270 39942) (29271 +39944) (29272 39954) (29273 39946) (29274 39940) (29275 39982) (29276 39963) (29277 39973) (29278 +39972) (29279 39969) (29280 39984) (29281 40007) (29282 39986) (29283 40006) (29284 39998) (29285 +40026) (29286 40032) (29287 40039) (29288 40054) (29289 40056) (29290 40167) (29291 40172) (29292 +40176) (29293 40201) (29294 40200) (29295 40171) (29296 40195) (29297 40198) (29298 40234) (29299 +40230) (29300 40367) (29301 40227) (29302 40223) (29303 40260) (29304 40213) (29305 40210) (29306 +40257) (29307 40255) (29308 40254) (29309 40262) (29310 40264) (29473 40285) (29474 40286) (29475 +40292) (29476 40273) (29477 40272) (29478 40281) (29479 40306) (29480 40329) (29481 40327) (29482 +40363) (29483 40303) (29484 40314) (29485 40346) (29486 40356) (29487 40361) (29488 40370) (29489 +40388) (29490 40385) (29491 40379) (29492 40376) (29493 40378) (29494 40390) (29495 40399) (29496 +40386) (29497 40409) (29498 40403) (29499 40440) (29500 40422) (29501 40429) (29502 40431) (29503 +40445) (29504 40474) (29505 40475) (29506 40478) (29507 40565) (29508 40569) (29509 40573) (29510 +40577) (29511 40584) (29512 40587) (29513 40588) (29514 40594) (29515 40597) (29516 40593) (29517 +40605) (29518 40613) (29519 40617) (29520 40632) (29521 40618) (29522 40621) (29523 38753) (29524 +40652) (29525 40654) (29526 40655) (29527 40656) (29528 40660) (29529 40668) (29530 40670) (29531 +40669) (29532 40672) (29533 40677) (29534 40680) (29535 40687) (29536 40692) (29537 40694) (29538 +40695) (29539 40697) (29540 40699) (29541 40700) (29542 40701) (29543 40711) (29544 40712) (29545 +30391) (29546 40725) (29547 40737) (29548 40748) (29549 40766) (29550 40778) (29551 40786) (29552 +40788) (29553 40803) (29554 40799) (29555 40800) (29556 40801) (29557 40806) (29558 40807) (29559 +40812) (29560 40810) (29561 40823) (29562 40818) (29563 40822) (29564 40853) (29565 40860) (29566 +40864) (29740 13027) (29741 13024) (29742 13047) (29743 13030) (29744 12956) (29745 12957) (29746 +12960) (29747 12949) (29748 (22679 8413)) (29749 (28187 8413)) (29750 (22522 8413)) (29751 (35519 8413 +)) (29752 12957) (29753 12950) (29754 12953) (29755 12958) (29756 12938) (29757 12939) (29758 12940) ( +29759 12941) (29760 12848) (29761 12842) (29762 12843) (29763 12844) (29764 12845) (29765 12846) ( +29766 12847) (29767 12864) (29768 12855) (29769 12850) (29770 12851) (29771 12852) (29772 12853) ( +29773 12854) (29774 12856) (29775 12857) (29776 13182) (29777 13181) (29778 13180) (29779 13179) ( +29808 9332) (29809 9333) (29810 9334) (29811 9335) (29812 9336) (29813 9337) (29814 9338) (29815 9339) + (29816 9340) (29817 9341) (29818 9342) (29819 12292) (29857 12896) (29858 12897) (29859 12898) (29860 + 12899) (29861 12900) (29862 12901) (29863 12902) (29864 12903) (29865 12904) (29866 12905) (29867 +12906) (29868 12907) (29869 12908) (29870 12909) (29871 12910) (29872 12911) (29873 12912) (29874 +12913) (29875 12914) (29876 12915) (29877 12916) (29878 12917) (29879 12918) (29880 12919) (29881 +12920) (29882 12921) (29883 12922) (29884 12923) (29888 12800) (29889 12801) (29890 12802) (29891 +12803) (29892 12804) (29893 12805) (29894 12806) (29895 12807) (29896 12808) (29897 12809) (29898 +12810) (29899 12811) (29900 12812) (29901 12813) (29902 12814) (29903 12815) (29904 12816) (29905 +12817) (29906 12818) (29907 12819) (29908 12820) (29909 12821) (29910 12822) (29911 12823) (29912 +12824) (29913 12825) (29914 12826) (29915 12827) (29916 12828) (29921 9372) (29922 9373) (29923 9374) +(29924 9375) (29925 9376) (29926 9377) (29927 9378) (29928 9379) (29929 9380) (29930 9381) (29931 9382 +) (29932 9383) (29933 9384) (29934 9385) (29935 9386) (29936 9387) (29937 9388) (29938 9389) (29939 +9390) (29940 9391) (29941 9392) (29942 9393) (29943 9394) (29944 9395) (29945 9396) (29946 9397) ( +29947 9343) (29948 9344) (29949 9345) (29950 9346) (29985 23383) (29985 22575) (29986 24590) (29986 +27079) (29987 24555) (29987 36953) (29988 24107) (29988 29796) (29989 34389) (29989 20956) (29990 +30456) (29990 29081) (29991 27963) (29992 35242) (29993 28023) (29994 38651) (29995 27597) (29996 +26524) (29997 31435) (29998 21407) (29999 21512) (30000 26360) (30001 20837) (30002 20006) (30003 +24179) (30004 26989) (30005 22577) (30006 36523) (30007 24066) (30008 34987) (30009 35377) (30010 +35531) (30011 23569) (30012 38291) (30013 39636) (30014 20303) (30015 36554) (30016 36557) (30017 +37002) (30018 37325) (30019 21152) (30020 22294) (30021 25110) (30022 27425) (30023 27599) (30024 +32317) (30025 28779) (30026 25991) (30027 23401) (30028 19990) (30029 23433) (30030 25918) (30031 +27231) (30032 20839) (30033 38364) (30034 21033) (30035 20687) (30036 29702) (30037 27604) (30038 +24859) (30039 29579) (30040 21029) (30041 22827) (30042 33287) (30043 20809) (30044 33457) (30045 +33775) (30046 35506) (30047 32946) (30048 25925) (30049 24517) (30050 26781) (30051 23229) (30052 +24351) (30053 29238) (30054 36890) (30055 34920) (30056 37329) (30057 23531) (30058 24049) (30059 +25165) (30060 27827) (30061 30465) (30062 21488) (30063 27714) (30064 25910) (30065 33836) (30066 +19988) (30067 20309) (30068 20195) (30069 20849) (30070 21463) (30071 39080) (30072 27743) (30073 +25343) (30074 38627) (30075 30028) (30076 20449) (30077 26395) (30078 31354) (30113 27515) (30114 +29677) (30115 39340) (30116 26399) (30117 38750) (30118 27193) (30119 21450) (30120 32080) (30121 +34399) (30122 24118) (30123 20803) (30124 20132) (30125 35442) (30126 26410) (30127 32681) (30128 +24220) (30129 23436) (30130 35542) (30131 37666) (30132 39131) (30133 21629) (30134 24373) (30135 +21729) (30136 25976) (30137 26519) (30138 25509) (30139 23616) (30140 21451) (30141 21916) (30142 +28165) (30143 27915) (30144 27138) (30145 23130) (30146 31038) (30147 26089) (30148 24067) (30149 +26997) (30150 30524) (30151 21966) (30152 29986) (30153 21578) (30154 21733) (30155 33288) (30156 +21214) (30157 37941) (30158 21462) (30159 31639) (30160 26356) (30161 20853) (30162 36896) (30163 +31572) (30164 25214) (30165 32631) (30166 22833) (30167 36939) (30168 24418) (30169 26131) (30170 +32675) (30171 24230) (30172 21322) (30173 34915) (30174 33509) (30175 33267) (30176 35696) (30177 +36817) (30178 29031) (30179 35722) (30180 22992) (30181 26381) (30182 21063) (30183 39006) (30184 +33521) (30185 29699) (30186 21315) (30187 24448) (30188 35611) (30189 35336) (30190 25136) (30191 +26408) (30192 31505) (30193 21151) (30194 33289) (30195 36319) (30196 31070) (30197 27770) (30198 +27969) (30199 29105) (30200 21531) (30201 31350) (30202 32004) (30203 38587) (30204 30452) (30205 +21476) (30206 40643) (30256 (48 8415)) (30257 (49 8415)) (30258 (50 8415)) (30259 (51 8415)) (30260 ( +52 8415)) (30261 (53 8415)) (30262 (54 8415)) (30263 (55 8415)) (30264 (56 8415)) (30265 (57 8415)) ( +30273 9398) (30274 9399) (30275 9400) (30276 9401) (30277 9402) (30278 9403) (30279 9404) (30280 9405) + (30281 9406) (30282 9407) (30283 9408) (30284 9409) (30285 9410) (30286 9411) (30287 9412) (30288 +9413) (30289 9414) (30290 9415) (30291 9416) (30292 9417) (30293 9418) (30294 9419) (30295 9420) ( +30296 9421) (30297 9422) (30298 9423) (30299 9322) (30300 9323) (30301 9324) (30302 9325) (30303 9326) + (30305 9424) (30306 9425) (30307 9426) (30308 9427) (30309 9428) (30310 9429) (30311 9430) (30312 +9431) (30313 9432) (30314 9433) (30315 9434) (30316 9435) (30317 9436) (30318 9437) (30319 9438) ( +30320 9439) (30321 9440) (30322 9441) (30323 9442) (30324 9443) (30325 9444) (30326 9445) (30327 9446) + (30328 9447) (30329 9448) (30330 9449) (30331 9327) (30332 9328) (30333 9329) (30334 9330) (30395 +9331) (30396 9450) (57381 1642) (57388 1548) (57390 1748) (57392 1632) (57393 1633) (57394 1634) ( +57395 1635) (57396 1636) (57397 1637) (57398 1638) (57399 1639) (57400 1640) (57401 1641) (57403 1563) + (57407 1567) (57409 1569) (57410 1570) (57411 1571) (57412 1572) (57413 1573) (57414 1574) (57415 +1575) (57416 1576) (57417 1577) (57418 1578) (57419 1579) (57420 1580) (57421 1581) (57422 1582) ( +57423 1583) (57424 1584) (57425 1585) (57426 1586) (57427 1587) (57428 1588) (57429 1589) (57430 1590) + (57431 1591) (57432 1592) (57433 1593) (57434 1594) (57440 1600) (57441 1601) (57442 1602) (57443 +1603) (57444 1604) (57445 1605) (57446 1606) (57447 1607) (57448 1608) (57449 1609) (57450 1610) ( +57451 1611) (57452 1612) (57453 1613) (57454 1614) (57455 1615) (57456 1616) (57457 1617) (57458 1618) + (57459 1648) (57460 1649) (57461 1643) (57462 1644) (57505 1700) (57506 1662) (57507 1670) (57508 +1688) (57509 1711) (57510 1728) (57511 1657) (57512 1672) (57513 1681) (57514 1722) (57515 1726) ( +57516 1729) (57517 1731) (57518 1730) (57519 1746) (57521 1660) (57522 1665) (57523 1669) (57524 1673) + (57525 1683) (57526 1686) (57527 1690) (57528 1724) (57529 1744) (57530 1741) (57531 1650) (57532 +1651) (57533 1747) (57534 1749) (57535 64467) (57536 1735) (57537 1734) (57538 1736) (57539 64477) ( +57540 1739) (57541 1733) (57542 1737) (57543 1652) (57544 1653) (57545 1654) (57546 1666) (57547 1655) + (57548 1656) (57549 1661) (57550 1674) (57551 1675) (57552 1707) (57553 1679) (57554 1680) (57555 +1740) (57556 1659) (57557 1664) (57558 1658) (57559 1663) (57560 1702) (57561 1668) (57562 1667) ( +57563 1671) (57564 1677) (57565 1676) (57566 1678) (57567 1705) (57568 1715) (57569 1713) (57570 1723) + (57571 1682) (57572 1684) (57573 1685) (57574 1687) (57575 1689) (57576 1691) (57577 1692) (57578 +1693) (57579 1694) (57580 1695) (57581 1696) (57582 1697) (57583 1698) (57584 1699) (57585 1701) ( +57586 1703) (57587 1704) (57588 1706) (57589 1708) (57590 1709) (57592 1710) (57593 1712) (57594 1714) + (57595 1716) (57596 8206) (57597 8207) (57598 8205) (57634 1438) (57636 8362) (57639 1436) (57644 44) + (57645 8209) (57658 1475) (57659 59) (57664 1488) (57665 1489) (57666 1490) (57667 1491) (57668 1492) + (57669 1493) (57670 1494) (57671 1495) (57672 1496) (57673 1497) (57674 1498) (57675 1499) (57676 +1500) (57677 1501) (57678 1502) (57679 1503) (57680 1504) (57681 1505) (57682 1506) (57683 1507) ( +57684 1508) (57685 1509) (57686 1510) (57687 1511) (57688 1512) (57689 1513) (57690 1514) (57691 64305 +) (57692 64315) (57693 64324) (57694 64298) (57695 64299) (57696 64300) (57697 64301) (57698 64302) ( +57699 64303) (57700 64331) (57701 64332) (57702 64333) (57703 64334) (57704 64335) (57705 64287) ( +57706 64288) (57707 64289) (57708 64290) (57709 64291) (57710 64292) (57711 64293) (57712 64294) ( +57713 64295) (57714 64296) (57715 64297) (57716 1520) (57717 1521) (57718 1522) (57719 64304) (57720 +64306) (57721 64307) (57722 64308) (57723 64309) (57724 64310) (57725 64312) (57726 64313) (57761 +64314) (57762 64316) (57763 64318) (57764 64320) (57765 64321) (57766 64323) (57767 64326) (57768 +64327) (57769 64328) (57770 64329) (57771 64330) (57793 1460) (57794 1461) (57795 1462) (57796 1467) ( +57797 1464) (57798 1463) (57799 1456) (57800 1458) (57801 1457) (57802 1459) (57803 1474) (57804 1473) + (57806 1465) (57807 1468) (57839 1469) (57840 64286) (57841 1471) (57842 1472) (57889 776) (57890 771 +) (57891 774) (57892 775) (57893 865) (57894 820) (57895 801) (57896 802) (57897 805) (57898 812) ( +57899 804) (57900 810) (57901 811) (57902 809) (57903 797) (57904 803) (57905 798) (57906 796) (57907 +799) (57908 800) (57909 860) (57910 724) (57911 725) (57912 (32 799)) (57913 (32 800)) (57914 720) ( +57915 721) (57916 825) (57917 796) (57918 712) (57919 716) (57920 772) (57921 817) (57922 769) (57923 +791) (57924 768) (57925 790) (57926 770) (57927 780) (57928 788) (57929 787) (57930 702) (57937 105) ( +57938 121) (57939 617) (57940 618) (57941 655) (57942 101) (57943 248) (57944 603) (57945 339) (57946 +230) (57947 97) (57948 630) (57949 616) (57950 649) (57951 601) (57952 602) (57953 629) (57954 604) ( +57955 592) (57956 623) (57957 117) (57958 631) (57959 650) (57960 612) (57961 111) (57962 652) (57963 +596) (57964 593) (57965 594) (57966 600) (57967 605) (57968 606) (57969 639) (57970 645) (57971 666) ( +57980 644) (57981 619) (57982 608) (58017 109) (58018 112) (58019 98) (58020 632) (58021 946) (58022 +613) (58023 653) (58024 119) (58025 595) (58026 664) (58027 625) (58028 102) (58029 118) (58030 651) ( +58031 110) (58032 116) (58033 100) (58034 952) (58035 240) (58036 446) (58037 443) (58038 115) (58039 +122) (58040 963) (58041 397) (58042 633) (58043 620) (58044 622) (58045 108) (58046 636) (58047 634) ( +58048 114) (58049 638) (58050 599) (58051 647) (58052 663) (58053 662) (58054 627) (58055 648) (58056 +598) (58057 642) (58058 656) (58059 635) (58060 621) (58061 637) (58062 597) (58063 657) (58064 643) ( +58065 658) (58066 646) (58067 659) (58068 426) (58069 442) (58070 615) (58071 626) (58072 99) (58073 +607) (58074 231) (58075 669) (58076 654) (58077 331) (58078 107) (58079 609) (58080 120) (58081 611) ( +58082 624) (58083 608) (58084 628) (58085 414) (58086 113) (58087 610) (58088 967) (58089 641) (58090 +640) (58091 295) (58092 661) (58093 660) (58094 104) (58095 614) (58096 665) (58097 667) (58098 668) ( +58099 669) (58100 670) (58101 671) (58102 672) (58103 673) (58104 674) (58105 675) (58106 676) (58107 +677) (58108 678) (58109 679) (58110 680) (58146 12645) (58147 12646) (58148 12647) (58149 12648) ( +58150 12649) (58151 12650) (58152 12651) (58153 12652) (58154 12653) (58155 12654) (58156 12655) ( +58157 12656) (58158 12657) (58159 12658) (58160 12659) (58161 12660) (58162 12661) (58163 12662) ( +58164 12663) (58165 12664) (58166 12665) (58167 12666) (58168 12667) (58169 12668) (58170 12669) ( +58171 12670) (58172 12671) (58173 12672) (58174 12673) (58175 12674) (58176 12675) (58177 12676) ( +58178 12677) (58179 12678) (58180 12679) (58181 12680) (58182 12681) (58183 12682) (58184 12683) ( +58185 12684) (58186 12685) (58187 12686) (58273 32) (58274 8361) (58305 4352) (58306 4353) (58307 4522 +) (58308 4354) (58309 4524) (58310 4525) (58311 4355) (58312 4356) (58313 4357) (58314 4528) (58315 +4529) (58316 4530) (58317 4531) (58318 4532) (58319 4533) (58320 4534) (58321 4358) (58322 4359) ( +58323 4360) (58324 4537) (58325 4361) (58326 4362) (58327 4363) (58328 4364) (58329 4365) (58330 4366) + (58331 4367) (58332 4368) (58333 4369) (58334 4370) (58335 (49324 8414)) (58338 4449) (58339 4450) ( +58340 4451) (58341 4452) (58342 4453) (58343 4454) (58346 4455) (58347 4456) (58348 4457) (58349 4458) + (58350 4459) (58351 4460) (58354 4461) (58355 4462) (58356 4463) (58357 4464) (58358 4465) (58359 +4466) (58362 4467) (58363 4468) (58364 4469) (58365 (47784 8414)) (58401 4304) (58402 4305) (58403 +4306) (58404 4307) (58405 4308) (58406 4309) (58407 4310) (58408 4337) (58409 4311) (58410 4312) ( +58411 4313) (58412 4314) (58413 4315) (58414 4316) (58415 4338) (58416 4317) (58417 4318) (58418 4319) + (58419 4320) (58420 4321) (58421 4322) (58422 4323) (58423 4339) (58424 4324) (58425 4325) (58426 +4326) (58427 4327) (58428 4328) (58429 4329) (58430 4330) (58431 4331) (58432 4332) (58433 4333) ( +58434 4334) (58435 4340) (58436 4335) (58437 4336) (58438 4341) (58439 4342) (58446 1417) (58447 4347) + (58449 4256) (58450 4257) (58451 4258) (58452 4259) (58453 4260) (58454 4261) (58455 4262) (58456 +4289) (58457 4263) (58458 4264) (58459 4265) (58460 4266) (58461 4267) (58462 4268) (58463 4290) ( +58464 4269) (58465 4270) (58466 4271) (58467 4272) (58468 4273) (58469 4274) (58470 4275) (58471 4291) + (58472 4276) (58473 4277) (58474 4278) (58475 4279) (58476 4280) (58477 4281) (58478 4282) (58479 +4283) (58480 4284) (58481 4285) (58482 4286) (58483 4292) (58484 4287) (58485 4288) (58486 4293) ( +58529 1329) (58530 1330) (58531 1331) (58532 1332) (58533 1333) (58534 1334) (58535 1335) (58536 1336) + (58537 1337) (58538 1338) (58539 1339) (58540 1340) (58541 1341) (58542 1342) (58543 1343) (58544 +1344) (58545 1345) (58546 1346) (58547 1347) (58548 1348) (58549 1349) (58550 1350) (58551 1351) ( +58552 1352) (58553 1353) (58554 1354) (58555 1355) (58556 1356) (58557 1357) (58558 1358) (58559 1359) + (58560 1360) (58561 1361) (58562 1362) (58563 1363) (58564 1364) (58565 1365) (58566 1366) (58569 +1369) (58570 1417) (58571 1370) (58572 1371) (58573 1372) (58574 1373) (58575 1374) (58576 1375) ( +58577 1377) (58578 1378) (58579 1379) (58580 1380) (58581 1381) (58582 1382) (58583 1383) (58584 1384) + (58585 1385) (58586 1386) (58587 1387) (58588 1388) (58589 1389) (58590 1390) (58591 1391) (58592 +1392) (58593 1393) (58594 1394) (58595 1395) (58596 1396) (58597 1397) (58598 1398) (58599 1399) ( +58600 1400) (58601 1401) (58602 1402) (58603 1403) (58604 1404) (58605 1405) (58606 1406) (58607 1407) + (58608 1408) (58609 1409) (58610 1410) (58611 1411) (58612 1412) (58613 1413) (58614 1414) (58616 +64275) (58617 64276) (58618 64277) (58619 64278) (58620 64279) (58622 1415) (58657 2406) (58658 2407) +(58659 2408) (58660 2409) (58661 2410) (58662 2411) (58663 2412) (58664 2413) (58665 2414) (58666 2415 +) (58671 8360) (58736 2378) (58737 2385) (58738 2386) (58739 2387) (58740 2388) (58741 2405) (58785 +2305) (58786 2306) (58787 2307) (58788 2317) (58789 2309) (58790 2310) (58791 2311) (58792 2312) ( +58793 2313) (58794 2314) (58795 2315) (58796 2400) (58797 2316) (58798 2401) (58800 2319) (58801 2320) + (58802 2321) (58803 2322) (58804 2323) (58805 2324) (58807 2325) (58808 2392) (58809 2326) (58810 +2393) (58811 2327) (58812 2394) (58813 2328) (58814 2329) (58815 2330) (58816 2331) (58817 2332) ( +58818 2395) (58819 2333) (58820 2334) (58821 2335) (58822 2336) (58823 2337) (58824 2396) (58825 2338) + (58826 2397) (58827 2339) (58828 2340) (58829 2341) (58830 2342) (58831 2343) (58832 2344) (58833 +2345) (58834 2346) (58835 2347) (58836 2398) (58837 2348) (58838 2349) (58839 2350) (58840 2351) ( +58841 2399) (58842 2352) (58843 2353) (58844 2354) (58845 2355) (58846 2356) (58847 2357) (58848 2358) + (58849 2359) (58850 2360) (58851 2361) (58854 2366) (58855 2367) (58856 2368) (58857 2369) (58858 +2370) (58859 2371) (58860 2372) (58861 2402) (58862 2403) (58863 2364) (58864 2375) (58865 2376) ( +58866 2373) (58868 2379) (58869 2380) (58870 2374) (58871 2381) (58872 2416) (58873 2365) (58874 2384) + (58875 2404) (58876 2377) (58877 8360) (58878 2381) (58913 2534) (58914 2535) (58915 2536) (58916 +2537) (58917 2538) (58918 2539) (58919 2540) (58920 2541) (58921 2542) (58922 2543) (58928 2547) ( +58929 2548) (58930 2549) (58931 2550) (58932 2552) (58933 2546) (58934 2553) (58935 2551) (59041 2433) + (59042 2434) (59043 2435) (59045 2437) (59046 2438) (59047 2439) (59048 2440) (59049 2441) (59050 +2442) (59051 2443) (59052 2528) (59053 2444) (59054 2529) (59056 2447) (59057 2448) (59060 2451) ( +59061 2452) (59063 2453) (59065 2454) (59067 2455) (59069 2456) (59070 2457) (59071 2458) (59072 2459) + (59073 2460) (59075 2461) (59076 2462) (59077 2463) (59078 2464) (59079 2465) (59080 2524) (59081 +2466) (59082 2525) (59083 2467) (59084 2468) (59085 2469) (59086 2470) (59087 2471) (59088 2472) ( +59090 2474) (59091 2475) (59093 2476) (59094 2477) (59095 2478) (59096 2479) (59097 2527) (59098 2480) + (59099 2544) (59100 2482) (59103 2545) (59104 2486) (59105 2487) (59106 2488) (59107 2489) (59108 +2492) (59109 160) (59110 2494) (59111 2495) (59112 2496) (59113 2497) (59114 2498) (59115 2499) (59116 + 2500) (59117 2530) (59118 2531) (59120 2503) (59121 2504) (59124 2507) (59125 2508) (59127 2509) ( +59130 2554) (59131 2404) (59170 2562) (59173 2565) (59174 2566) (59175 2567) (59176 2568) (59177 2569) + (59178 2570) (59183 2575) (59184 2576) (59187 2579) (59188 2580) (59189 2581) (59190 2582) (59191 +2583) (59192 2584) (59193 2585) (59194 2586) (59195 2587) (59196 2588) (59197 2589) (59198 2590) ( +59199 2591) (59200 2592) (59201 2593) (59202 2594) (59203 2595) (59204 2596) (59205 2597) (59206 2598) + (59207 2599) (59208 2600) (59210 2602) (59211 2603) (59212 2604) (59213 2605) (59214 2606) (59215 +2607) (59216 2608) (59218 2610) (59219 2611) (59221 2613) (59222 2614) (59224 2616) (59225 2617) ( +59228 2620) (59230 2622) (59231 2623) (59232 2624) (59233 2625) (59234 2626) (59239 2631) (59240 2632) + (59243 2635) (59244 2636) (59245 2637) (59257 2649) (59258 2650) (59259 2651) (59260 2652) (59262 +2654) (59425 3585) (59426 3586) (59427 3587) (59428 3588) (59429 3589) (59430 3590) (59431 3591) ( +59432 3592) (59433 3593) (59434 3594) (59435 3595) (59436 3596) (59437 3597) (59438 3598) (59439 3599) + (59440 3600) (59441 3601) (59442 3602) (59443 3603) (59444 3604) (59445 3605) (59446 3606) (59447 +3607) (59448 3608) (59449 3609) (59450 3610) (59451 3611) (59452 3612) (59453 3613) (59454 3614) ( +59455 3615) (59456 3616) (59457 3617) (59458 3618) (59459 3619) (59460 3620) (59461 3621) (59462 3622) + (59463 3623) (59464 3624) (59465 3625) (59466 3626) (59467 3627) (59468 3628) (59469 3629) (59470 +3630) (59471 3631) (59472 3632) (59473 3633) (59474 3634) (59475 3635) (59476 3636) (59477 3637) ( +59478 3638) (59479 3639) (59480 3640) (59481 3641) (59482 3642) (59487 3647) (59488 3648) (59489 3649) + (59490 3650) (59491 3651) (59492 3652) (59493 3653) (59494 3654) (59495 3655) (59496 3656) (59497 +3657) (59498 3658) (59499 3659) (59500 3660) (59501 3661) (59502 3662) (59503 3663) (59504 3664) ( +59505 3665) (59506 3666) (59507 3667) (59508 3668) (59509 3669) (59510 3670) (59511 3671) (59512 3672) + (59513 3673) (59514 3674) (59515 3675) (59553 3713) (59554 3714) (59556 3716) (59559 3719) (59560 +3720) (59562 3722) (59565 3725) (59572 3732) (59573 3733) (59574 3734) (59575 3735) (59577 3737) ( +59578 3738) (59579 3739) (59580 3740) (59581 3741) (59582 3742) (59583 3743) (59585 3745) (59586 3746) + (59587 3747) (59589 3749) (59591 3751) (59594 3754) (59595 3755) (59597 3757) (59598 3758) (59599 +3759) (59600 3760) (59601 3761) (59602 3762) (59603 3763) (59604 3764) (59605 3765) (59606 3766) ( +59607 3767) (59608 3768) (59609 3769) (59611 3771) (59612 3772) (59613 3773) (59616 3776) (59617 3777) + (59618 3778) (59619 3779) (59620 3780) (59621 3773) (59622 3782) (59624 3784) (59625 3785) (59626 +3786) (59627 3787) (59628 3788) (59629 3789) (59632 3792) (59633 3793) (59634 3794) (59635 3795) ( +59636 3796) (59637 3797) (59638 3798) (59639 3799) (59640 3800) (59641 3801) (59644 3804) (59645 3805) + (60193 8473) (60194 8459) (60195 8464) (60196 8779) (60197 8860) (60198 8455) (60199 818) (60200 8253 +) (60201 8984) (60203 8460) (60205 120125) (60206 8645) (60207 8693) (60208 8674) (60209 8803) (60210 +8845) (60211 10941) (60212 10773) (60213 10774) (60214 8751) (60215 8752) (60219 9635) (60220 8259) ( +60221 8524) (60222 9878) (60223 8353) (60224 9608) (60225 9764) (60226 8456) (60228 9775) (60229 9785) + (60230 9855) (60231 9642) (60235 8985) (60236 9700) (60237 9701) (60238 9698) (60239 9699) (60240 +8533) (60241 8534) (60242 8535) (60243 8536) (60244 8537) (60245 8538) (60246 9833) (60249 8749) ( +60250 9702) (60254 8499) (60255 8981) (60262 8721) (60267 9632) (60268 9656) (60269 9666) (60270 8226) + (60271 8495) (60273 8472) (60275 8482) (60276 8482) (60279 9633) (60280 9643) (60281 9702) (60282 +8891) (60283 8493) (60284 8488) (60285 8359) (60326 9676) (60327 9645) (60328 9649) (60330 8480) ( +60331 8402) (60332 8403) (60334 8408) (60335 8410) (60336 8409) (60337 8404) (60338 8405) (60339 8825) + (60340 8824) (60343 8774) (60344 8892) (60345 8893) (60347 8716) (60348 8462) (60350 9769) (60351 +9747) (60353 8754) (60354 8755) (60355 8753) (60356 8887) (60357 8886) (60358 8766) (60359 8763) ( +60363 8669) (60364 8668) (60365 8967) (60368 8489) (60369 8554) (60370 8555) (60383 9694) (60384 9693) + (60385 9695) (60386 9692) (60450 9755) (60451 9754) (60453 9986) (60454 9988) (60455 9742) (60456 +10002) (60458 10003) (60459 65291) (60462 9733) (60463 9734) (60464 42) (60480 64) (60486 10008) ( +60490 9988) (60491 9743) (60492 10001) (60494 9989) (60496 64) (60497 9686) (60531 10133) (60535 9754) + (60600 9312) (60601 9313) (60602 9314) (60603 9315) (60604 9316) (60605 9317) (60606 9318) (60607 +9319) (60608 9320) (60609 9321) (60610 10112) (60611 10113) (60612 10114) (60613 10115) (60614 10116) +(60615 10117) (60616 10118) (60617 10119) (60618 10120) (60619 10121) (60620 10122) (60621 10123) ( +60622 10124) (60623 10125) (60624 10126) (60625 10127) (60626 10128) (60627 10129) (60628 10130) ( +60629 10131) (60640 9679) (60641 9685) (60642 9682) (60643 9681) (60644 9684) (60645 9675) (60661 9680 +) (60662 9683) (60663 10077) (60664 10078) (60665 10072) (60705 9985) (60706 9986) (60707 9987) (60708 + 9988) (60709 9742) (60710 9990) (60711 9991) (60712 9992) (60713 9993) (60714 9755) (60715 9758) ( +60716 9996) (60717 9997) (60718 9998) (60719 9999) (60720 10000) (60721 10001) (60722 10002) (60723 +10004) (60724 10005) (60725 10006) (60727 10008) (60728 10009) (60729 10010) (60730 10011) (60731 +10012) (60732 10013) (60733 10014) (60734 10015) (60735 10017) (60736 10018) (60737 10019) (60738 +10020) (60739 10021) (60740 10022) (60741 10023) (60742 10025) (60743 10026) (60744 10027) (60745 +10028) (60746 10029) (60747 10030) (60748 10031) (60749 10032) (60750 10033) (60751 10034) (60752 +10035) (60753 10036) (60754 10037) (60755 10038) (60756 10039) (60757 10040) (60758 10041) (60759 +10042) (60760 10043) (60761 10044) (60762 10045) (60763 10046) (60764 10047) (60765 10048) (60766 +10049) (60767 10050) (60768 10051) (60769 10052) (60770 10053) (60771 10054) (60772 10055) (60773 +10056) (60774 10057) (60775 10058) (60776 10059) (60777 10061) (60778 10063) (60779 10064) (60780 +10065) (60781 10066) (60782 10070) (60783 9687) (60784 10073) (60785 10074) (60786 10081) (60787 10082 +) (60788 10083) (60789 10084) (60790 10085) (60791 10086) (60792 10087) (60793 10102) (60794 10103) ( +60795 10104) (60796 10105) (60797 10106) (60798 10107) (60833 10108) (60834 10109) (60835 10110) ( +60836 10111) (60837 10132) (60838 10136) (60839 10137) (60840 10138) (60841 10139) (60842 10140) ( +60843 10141) (60844 10142) (60845 10143) (60846 10144) (60847 10146) (60848 10147) (60849 10148) ( +60850 10149) (60851 10150) (60852 10151) (60853 10152) (60854 10153) (60855 10154) (60856 10155) ( +60857 10156) (60858 10157) (60859 10158) (60860 10159) (60861 10161) (60862 10162) (60863 10163) ( +60864 10164) (60865 10165) (60866 10166) (60867 10167) (60868 10168) (60869 10169) (60870 10170) ( +60871 10171) (60872 10172) (60873 10173) (60874 10174) (60899 10075) (60900 10076) (60961 8196) (60962 + 8197) (60963 8202) (60964 8200) (60965 8231) (60966 8974) (60967 8975) (60968 8972) (60969 8973) ( +60970 9646) (60971 8724) (60972 1644) (60973 8722) (60974 1643) (60975 8463) (60976 8812) (60977 8448) + (60979 9743) (60980 8758) (60981 33) (60982 8870) (60983 9007) (60984 9008) (60985 437) (60986 8962) +(60987 8760) (60988 8726) (60989 8793) (60990 8794) (60991 8903) (60992 8454) (60993 9688) (60994 8782 +) (60995 8475) (60996 8466) (60997 8710) (60998 8977) (60999 8248) (61000 8452) (61001 9188) (61002 +9649) (61003 9005) (61004 8978) (61005 8979) (61006 9006) (61007 8982) (61008 8644) (61009 8661) ( +61010 8847) (61011 8848) (61012 402) (61013 9689) (61014 8898) (61015 8899) (61021 8987) (61024 9617) +(61025 9619) (61026 8914) (61027 8915) (61028 8762) (61031 8728) (61032 8770) (61033 8705) (61034 8976 +) (61035 8242) (61036 8822) (61037 8823) (61038 8818) (61039 8819) (61040 8868) (61041 8708) (61042 +8802) (61043 8968) (61044 8970) (61045 124) (61046 8969) (61047 8971) (61048 8778) (61049 8783) (61050 + 8252) (61051 8245) (61052 8739) (61053 8727) (61054 8764) (61089 8890) (61090 8228) (61091 8229) ( +61092 11157) (61093 11013) (61094 11014) (61095 11015) (61096 8680) (61097 8678) (61098 8679) (61099 +8681) (61100 8592) (61101 8593) (61102 8594) (61103 8595) (61104 9654) (61105 9664) (61106 9655) ( +61107 9665) (61108 8901) (61109 8597) (61110 8616) (61111 9074) (61112 9073) (61113 9608) (61114 9604) + (61115 9616) (61116 9612) (61117 9600) (61118 9668) (61119 9658) (61120 9067) (61121 9042) (61122 +9035) (61123 9021) (61124 9033) (61125 9055) (61126 9054) (61127 9017) (61128 9023) (61129 9024) ( +61130 8965) (61131 9828) (61132 9829) (61133 9830) (61134 9831) (61136 9038) (61137 9045) (61138 9053) + (61139 9014) (61140 9019) (61141 9835) (61142 8905) (61143 8906) (61144 8907) (61145 8908) (61146 +8966) (61147 8891) (61148 9015) (61149 8735) (61150 9644) (61151 9787) (61152 9131) (61153 9130) ( +61154 9132) (61155 9133) (61156 9127) (61157 9129) (61158 9128) (61159 9136) (61160 9137) (61161 8911) + (61162 8910) (61163 8884) (61164 8885) (61165 8992) (61166 8993) (61167 9130) (61168 9026) (61170 +8630) (61171 8631) (61172 8634) (61173 8635) (61174 8651) (61175 8602) (61176 8603) (61177 8622) ( +61178 8653) (61179 8655) (61180 8654) (61181 8909) (61182 8769) (61217 160) (61218 8209) (61219 173) ( +61220 8211) (61221 8212) (61222 8210) (61223 39) (61224 8222) (61225 8220) (61226 8249) (61227 8250) ( +61228 8192) (61229 8193) (61230 8199) (61231 8201) (61232 8224) (61233 8225) (61234 9001) (61235 9002) + (61236 9758) (61237 9756) (61238 8866) (61239 8867) (61240 8872) (61241 10980) (61242 12310) (61243 +12311) (61244 8598) (61245 8600) (61246 8599) (61247 8601) (61248 8453) (61249 8240) (61250 8810) ( +61251 8811) (61252 8814) (61253 8815) (61254 8739) (61255 8740) (61256 8741) (61257 8742) (61258 8712) + (61259 8713) (61260 8715) (61261 8656) (61262 8660) (61263 8658) (61264 8652) (61265 8646) (61266 +8596) (61267 8605) (61270 8745) (61271 8746) (61272 8839) (61273 8838) (61274 8835) (61275 8834) ( +61276 8841) (61277 8840) (61278 8837) (61279 8836) (61280 9746) (61281 8709) (61282 8853) (61283 8854) + (61284 8855) (61285 8856) (61286 8226) (61287 8728) (61288 8463) (61289 8467) (61290 172) (61291 166) + (61292 8736) (61293 8737) (61294 8759) (61295 8757) (61296 8869) (61297 8733) (61298 8801) (61299 +8784) (61300 8799) (61301 8747) (61302 8750) (61303 8771) (61304 8773) (61305 8776) (61306 8721) ( +61307 8719) (61308 8730) (61309 8723) (61310 9618) (61345 8354) (61346 402) (61347 8355) (61348 8359) +(61349 8352) (61350 36) (61351 8501) (61352 8470) (61353 8478) (61354 8481) (61355 658) (61356 8450) ( +61357 8469) (61358 8477) (61359 8484) (61360 8968) (61361 8969) (61362 8970) (61363 8971) (61364 8707) + (61365 8704) (61366 8896) (61367 8897) (61368 8718) (61369 8711) (61370 8706) (61371 9280) (61372 +9282) (61373 9281) (61374 9190) (61375 8215) (61376 8978) (61377 8544) (61378 8545) (61379 8546) ( +61380 8547) (61381 8548) (61382 8549) (61383 8550) (61384 8551) (61385 8552) (61386 8553) (61387 9824) + (61388 9825) (61389 9826) (61390 9827) (61391 10003) (61392 10007) (61393 9312) (61394 9313) (61395 +9314) (61396 9315) (61397 9316) (61398 9317) (61399 9318) (61400 9319) (61401 9320) (61402 9321) ( +61403 (8594 8413)) (61404 (8628 8413)) (61405 (8626 8413)) (61406 9774) (61407 9786) (61408 9760) ( +61409 9475) (61410 9473) (61411 9547) (61412 9474) (61413 9472) (61414 9532) (61415 9737) (61416 9789) + (61417 9790) (61418 9791) (61419 9795) (61420 9796) (61421 9797) (61422 9798) (61423 9799) (61424 +9810) (61425 9811) (61426 9800) (61427 9801) (61428 9802) (61429 9803) (61430 9804) (61431 9805) ( +61432 9806) (61433 9807) (61434 9808) (61435 9809) (61436 9742) (61437 8531) (61438 8532) (61473 64256 +) (61474 64259) (61475 64260) (61476 64257) (61477 64258) (61478 64261) (61479 (102 8205 106)) (61480 +(99 8205 116)) (61481 64262) (61552 188) (61553 189) (61554 190) (61555 8531) (61556 8532) (61557 8539 +) (61558 8540) (61559 8541) (61560 8542) (61561 8543) (61608 9227) (61609 9225) (61610 9226) (61611 +9228) (61612 9229) (61613 9252) (61616 9216) (61617 8196) (61618 8197) (61619 8198) (61620 8192) ( +61621 8193) (61622 8200) (61623 8200) (61624 8595) (61625 8594) (61626 8628) (61627 8609) (61628 8592) + (61629 8629) (61630 10550) (61635 8227) (61636 9679) (61639 65533) (61644 (42 773)) (61646 (59 773)) +(61666 10692) (61667 (8230 8414)) (61668 (8594 8414)) (61671 (57 8414)) (61673 (42 8414)) (61676 (43 +8414)) (61677 (45 8414)) (61678 (46 8414)) (61679 (44 8414)) (61686 (947 8414)) (61687 (1103 8414)) ( +61688 (12402 8414)) (61689 (12459 8414)) (61690 (28450 8414)) (61691 (21644 8414)) (61692 183) (61693 +384) (61694 9251) (61729 192) (61730 193) (61731 194) (61732 195) (61733 256) (61734 258) (61735 196) +(61736 197) (61737 260) (61738 262) (61739 264) (61740 266) (61741 199) (61742 268) (61743 270) (61744 + 200) (61745 201) (61746 202) (61747 274) (61748 278) (61749 203) (61750 280) (61751 282) (61752 500) +(61753 284) (61754 286) (61755 288) (61756 290) (61757 292) (61758 204) (61759 461) (61760 206) (61761 + 296) (61762 298) (61763 304) (61764 207) (61765 302) (61766 308) (61767 310) (61768 313) (61769 315) +(61770 317) (61771 323) (61772 209) (61773 325) (61774 327) (61775 210) (61776 211) (61777 212) (61778 + 213) (61779 332) (61780 214) (61781 336) (61782 340) (61783 342) (61784 344) (61785 346) (61786 348) +(61787 350) (61788 352) (61789 354) (61790 356) (61791 217) (61792 218) (61793 219) (61794 360) (61795 + 362) (61796 364) (61797 220) (61798 366) (61799 368) (61800 370) (61801 372) (61802 7922) (61803 221) + (61804 374) (61805 376) (61806 377) (61807 379) (61808 381) (61809 (76 789)) (61810 (84 789)) (61811 +(68 789)) (61812 7884) (61813 562) (61814 482) (61815 (338 772)) (61816 (256 774)) (61817 461) (61818 +276) (61819 (274 803)) (61820 (274 774)) (61821 486) (61822 300) (61857 224) (61858 225) (61859 226) ( +61860 227) (61861 257) (61862 259) (61863 228) (61864 229) (61865 261) (61866 263) (61867 265) (61868 +267) (61869 231) (61870 269) (61871 271) (61872 232) (61873 233) (61874 234) (61875 275) (61876 279) ( +61877 235) (61878 281) (61879 283) (61880 501) (61881 285) (61882 287) (61883 289) (61884 291) (61885 +293) (61886 236) (61887 237) (61888 238) (61889 297) (61890 299) (61892 239) (61893 303) (61894 309) ( +61895 311) (61896 314) (61897 316) (61898 318) (61899 324) (61900 241) (61901 326) (61902 328) (61903 +242) (61904 243) (61905 244) (61906 245) (61907 333) (61908 246) (61909 337) (61910 341) (61911 343) ( +61912 345) (61913 347) (61914 349) (61915 351) (61916 353) (61917 355) (61918 357) (61919 249) (61920 +250) (61921 251) (61922 361) (61923 363) (61924 365) (61925 252) (61926 367) (61927 369) (61928 371) ( +61929 373) (61930 7923) (61931 253) (61932 375) (61933 255) (61934 378) (61935 380) (61936 382) (61937 + (108 789)) (61938 (116 789)) (61939 (100 789)) (61940 7885) (61941 563) (61942 483) (61943 (339 772)) + (61944 (257 774)) (61945 462) (61946 277) (61947 (275 803)) (61948 (275 774)) (61949 487) (61950 301) + (61985 (73 772 774)) (61986 463) (61987 (78 772)) (61988 (77 772)) (61989 465) (61990 334) (61991 ( +332 774)) (61992 (332 803)) (61993 490) (61994 467) (61995 (362 774)) (61996 (89 774)) (61997 (89 772 +774)) (61998 (89 780)) (61999 (68 817)) (62000 (84 817)) (62001 7692) (62002 7716) (62003 7778) (62004 + 7788) (62005 (68 817 803)) (62113 (299 774)) (62114 464) (62115 (110 772)) (62116 (109 772)) (62117 +466) (62118 335) (62119 (333 774)) (62120 (333 803)) (62121 491) (62122 468) (62123 363) (62124 (121 +774)) (62125 (563 774)) (62126 (121 780)) (62127 7695) (62128 7791) (62129 7693) (62130 7717) (62131 +7779) (62132 7789) (62133 (7695 803)) (62241 7937) (62242 7945) (62243 7936) (62244 7944) (62245 8049) + (62246 8123) (62247 8048) (62248 8122) (62249 8118) (62250 (913 771)) (62251 7941) (62252 7949) ( +62253 7939) (62254 7949) (62255 7943) (62256 7951) (62257 7940) (62258 7948) (62259 7938) (62260 7946) + (62261 7942) (62262 7950) (62263 8115) (62264 8124) (62265 8065) (62266 8073) (62267 8064) (62268 +8072) (62269 8116) (62270 (8124 769)) (62271 8114) (62272 (8124 768)) (62273 8119) (62274 (8124 771)) +(62275 8069) (62276 8077) (62277 8067) (62278 8075) (62279 8071) (62280 8079) (62281 8068) (62282 8076 +) (62283 8066) (62284 8074) (62285 8070) (62286 8078) (62287 7953) (62288 7961) (62289 7952) (62290 +7960) (62291 8051) (62292 8137) (62293 8050) (62294 8136) (62295 7957) (62296 7965) (62297 7955) ( +62298 7963) (62299 7956) (62300 7964) (62301 7954) (62302 7962) (62303 7969) (62304 7977) (62305 7968) + (62306 7976) (62307 8053) (62308 8139) (62309 8052) (62310 8138) (62311 8134) (62312 (919 771)) ( +62313 7973) (62314 7981) (62315 7971) (62316 7979) (62317 7975) (62318 7983) (62319 8084) (62320 7980) + (62321 7970) (62322 7978) (62323 7974) (62324 7982) (62325 8131) (62326 8140) (62327 8081) (62328 +8089) (62329 8080) (62330 8088) (62331 8132) (62332 (8140 769)) (62333 8130) (62334 (8140 768)) (62369 + 8135) (62370 (8140 771)) (62371 8085) (62372 8093) (62373 8083) (62374 8091) (62375 8087) (62376 8095 +) (62377 8084) (62378 8092) (62379 8082) (62380 8090) (62381 8086) (62382 8094) (62383 7985) (62384 +7993) (62385 7984) (62386 7992) (62387 8055) (62388 8155) (62389 8054) (62390 8154) (62391 8150) ( +62392 (921 771)) (62393 7989) (62394 7997) (62395 7987) (62396 7995) (62397 7991) (62398 7999) (62399 +7988) (62400 7996) (62401 7986) (62402 7994) (62403 7990) (62404 7998) (62405 (970 769)) (62406 (938 +769)) (62407 (970 768)) (62408 (938 768)) (62409 (970 771)) (62410 (938 771)) (62411 8001) (62412 8009 +) (62413 8000) (62414 8008) (62415 8057) (62416 8185) (62417 8056) (62418 8184) (62419 8005) (62420 +8013) (62421 8003) (62422 8011) (62423 8004) (62424 8012) (62425 8002) (62426 8010) (62427 8017) ( +62428 8025) (62429 8016) (62430 (933 787)) (62431 8059) (62432 8171) (62433 8058) (62434 8170) (62435 +8166) (62436 (933 771)) (62437 8021) (62438 8029) (62439 8019) (62440 8027) (62441 8023) (62442 8031) +(62443 (971 771)) (62444 (939 771)) (62445 8020) (62446 (8171 787)) (62447 8018) (62448 (8170 787)) ( +62449 8022) (62450 (933 787 771)) (62451 (971 769)) (62452 (939 769)) (62453 (971 768)) (62454 (939 +768)) (62455 8033) (62456 8041) (62457 8032) (62458 8040) (62459 8061) (62460 8187) (62461 8060) ( +62462 8186) (62497 8182) (62498 (937 771)) (62499 8037) (62500 8045) (62501 8035) (62502 8043) (62503 +8039) (62504 8047) (62505 8036) (62506 8044) (62507 8034) (62508 8042) (62509 8038) (62510 8046) ( +62511 8179) (62512 8188) (62513 8097) (62514 8105) (62515 8096) (62516 8104) (62517 8180) (62518 (8188 + 769)) (62519 8178) (62520 (8188 768)) (62521 8183) (62522 (8188 771)) (62523 8101) (62524 8107) ( +62525 8099) (62526 8107) (62527 8103) (62528 8111) (62529 8100) (62530 8108) (62531 8098) (62532 8106) + (62533 8102) (62534 8110) (62535 8165) (62536 8172) (62537 8164) (62538 (8127 929)) (62753 65154) ( +62754 65156) (62755 65158) (62756 65160) (62757 65163) (62758 65164) (62759 65162) (62760 65166) ( +62761 65169) (62762 65170) (62763 65168) (62764 65172) (62765 65175) (62766 65176) (62767 65174) ( +62768 65179) (62769 65180) (62770 65178) (62771 65183) (62772 65184) (62773 65182) (62774 65187) ( +62775 65188) (62776 65186) (62777 65191) (62778 65192) (62779 65190) (62780 65194) (62781 65196) ( +62782 65198) (62783 65200) (62784 65203) (62785 65204) (62786 65202) (62787 65207) (62788 65208) ( +62789 65206) (62790 65211) (62791 65212) (62792 65210) (62793 65215) (62794 65216) (62795 65214) ( +62796 65219) (62797 65220) (62798 65218) (62799 65223) (62800 65224) (62801 65222) (62802 65227) ( +62803 65228) (62804 65226) (62805 65231) (62806 65232) (62807 65230) (62808 65235) (62809 65236) ( +62810 65234) (62811 65239) (62812 65240) (62813 65238) (62814 65243) (62815 65244) (62816 65242) ( +62817 65247) (62818 65248) (62819 65246) (62820 65251) (62821 65252) (62822 65250) (62823 65255) ( +62824 65256) (62825 65254) (62826 65259) (62827 65260) (62828 65258) (62829 65262) (62830 65264) ( +62831 65267) (62832 65268) (62833 65266) (62834 65269) (62835 65270) (62836 65271) (62837 65272) ( +62838 65273) (62839 65274) (62840 65275) (62841 65276) (62842 1780) (62843 1780) (62844 1781) (62845 +1782) (62882 64606) (62883 64607) (62884 64608) (62885 64609) (62886 64610) (62887 64364) (62888 64365 +) (62889 64363) (62890 1740) (62891 64562) (62956 64344) (62957 64345) (62958 64343) (62959 64380) ( +62960 64381) (62961 64379) (62962 64395) (62963 1705) (62964 64399) (62965 64404) (62966 64405) (62967 + 64403) (62968 64421) (64812 1644) (64832 978) (64848 7425) (64849 630) (64859 1013) (64860 982) ( +64861 977) (64862 1009) (64863 966) (64864 1008) (64865 7424) (64866 665) (64867 7428) (64868 7429) ( +64869 7431) (64870 42800) (64871 610) (64872 668) (64873 618) (64874 7434) (64875 7435) (64876 671) ( +64877 7437) (64878 628) (64879 7439) (64880 7448) (64881 42927) (64882 640) (64883 42801) (64884 7451) + (64885 7452) (64886 7456) (64887 7457) (64888 120) (64889 655) (64890 7458) (64891 411) (64893 945) ( +64936 8319) (64942 8316) (64944 8304) (64945 185) (64946 178) (64947 179) (64948 8308) (64949 8309) ( +64950 8310) (64951 8311) (64952 8312) (64953 8313) (64958 8314) (64959 8315) (64992 8320) (64993 8321) + (64994 8322) (64995 8323) (64996 8324) (64997 8325) (64998 8326) (64999 8327) (65000 8328) (65001 +8329) (65002 8331) (65003 8330) (65004 8332) (65008 (48 824))))) +(DECLARE%: DONTCOPY + (FILEMAP (NIL (3333 19425 (UTF8.OUTCHARFN 3343 . 6359) (UTF8.SLUG.OUTCHARFN 6361 . 7025) ( +UTF8.INCCODEFN 7027 . 13306) (UTF8.PEEKCCODEFN 13308 . 18441) (\UTF8.BACKCCODEFN 18443 . 19423)) ( +19426 24341 (UTF16BE.OUTCHARFN 19436 . 20455) (UTF16BE.INCCODEFN 20457 . 21799) (UTF16BE.PEEKCCODEFN +21801 . 23145) (\UTF16BE.BACKCCODEFN 23147 . 24339)) (24342 29073 (UTF16LE.OUTCHARFN 24352 . 25468) ( +UTF16LE.INCCODEFN 25470 . 26599) (UTF16LE.PEEKCCODEFN 26601 . 27877) (\UTF16LE.BACKCCODEFN 27879 . +29071)) (29074 32121 (READBOM 29084 . 31153) (WRITEBOM 31155 . 32119)) (32122 36153 ( +MAKE-UNICODE-FORMATS 32132 . 36151)) (36221 40715 (UTF8.BINCODE 36231 . 38919) (\UTF8.FETCHCODE 38921 + . 40713)) (40716 46339 (UTF8.VALIDATE 40726 . 43323) (NUTF8-BYTE1-BYTES 43325 . 44062) ( +NUTF8-CODE-BYTES 44064 . 45121) (NUTF8-STRING-BYTES 45123 . 46015) (N-MCHARS 46017 . 46337)) (46403 +47677 (MTOUCODE 46413 . 46582) (UTOMCODE 46584 . 46781) (MTOUCODE? 46783 . 47162) (UTOMCODE? 47164 . +47675)) (47678 54250 (MTOUSTRING 47688 . 48271) (UTOMSTRING 48273 . 48856) (MTOUTF8STRING 48858 . +53137) (UTF8TOMSTRING 53139 . 54248)) (54308 60016 (XTOUCODE 54318 . 54836) (UTOXCODE 54838 . 55346) ( +XTOUCODE? 55348 . 56409) (UTOXCODE? 56411 . 57494) (XTOUSTRING 57496 . 58191) (UTOXSTRING 58193 . +58936) (XTOUTF8STRING 58938 . 60014)) (60017 65196 (MERGE-UNICODE-TRANSLATION-TABLES 60027 . 62789) ( +UNICODE.UNMAPPED 62791 . 65194)) (68935 69188 (UNICODE-INIT 68945 . 69186))))) +STOP diff --git a/sources/UNICODE-FORMATS.LCOM b/sources/UNICODE-FORMATS.LCOM new file mode 100644 index 0000000000000000000000000000000000000000..5ee08dff666f992352f91a46f49e8d7244409c4a GIT binary patch literal 165202 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�V;z3@fohmsNIA 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 hD16BhI7% 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 pLw36t5EzDzRZwWCtO22+u@WF8bgTlnZsCiH^Y`