Forráskód Böngészése

* fixed UTF8ToUnicode() based on patch by JoshyFun, and also added
support for 4-character UTF-8 codepoints (mantis #11791)
* fixed UnicodeToUtf8() based on patch by A. J. Miller (mantis
#13075)

git-svn-id: trunk@12902 -

Jonas Maebe 16 éve
szülő
commit
d67dbcf030
5 módosított fájl, 2307 hozzáadás és 243 törlés
  1. 2 0
      .gitattributes
  2. 349 122
      rtl/inc/ustrings.inc
  3. 349 121
      rtl/inc/wstrings.inc
  4. 1435 0
      tests/webtbs/tw11791.pp
  5. 172 0
      tests/webtbs/tw13075.pp

+ 2 - 0
.gitattributes

@@ -8726,6 +8726,7 @@ tests/webtbs/tw11711.pp svneol=native#text/plain
 tests/webtbs/tw11762.pp svneol=native#text/plain
 tests/webtbs/tw11762.pp svneol=native#text/plain
 tests/webtbs/tw11763.pp svneol=native#text/plain
 tests/webtbs/tw11763.pp svneol=native#text/plain
 tests/webtbs/tw11786.pp svneol=native#text/plain
 tests/webtbs/tw11786.pp svneol=native#text/plain
+tests/webtbs/tw11791.pp svneol=native#text/plain
 tests/webtbs/tw1181.pp svneol=native#text/plain
 tests/webtbs/tw1181.pp svneol=native#text/plain
 tests/webtbs/tw11825.pp svneol=native#text/plain
 tests/webtbs/tw11825.pp svneol=native#text/plain
 tests/webtbs/tw11846a.pp svneol=native#text/plain
 tests/webtbs/tw11846a.pp svneol=native#text/plain
@@ -8788,6 +8789,7 @@ tests/webtbs/tw1299.pp svneol=native#text/plain
 tests/webtbs/tw12993.pp svneol=native#text/plain
 tests/webtbs/tw12993.pp svneol=native#text/plain
 tests/webtbs/tw13015.pp svneol=native#text/plain
 tests/webtbs/tw13015.pp svneol=native#text/plain
 tests/webtbs/tw13019.pp svneol=native#text/plain
 tests/webtbs/tw13019.pp svneol=native#text/plain
+tests/webtbs/tw13075.pp svneol=native#text/plain
 tests/webtbs/tw1310.pp svneol=native#text/plain
 tests/webtbs/tw1310.pp svneol=native#text/plain
 tests/webtbs/tw13133.pp svneol=native#text/plain
 tests/webtbs/tw13133.pp svneol=native#text/plain
 tests/webtbs/tw1318.pp svneol=native#text/plain
 tests/webtbs/tw1318.pp svneol=native#text/plain

+ 349 - 122
rtl/inc/ustrings.inc

@@ -1857,6 +1857,40 @@ end;
 
 
 {$endif CPU64}
 {$endif CPU64}
 
 
+{ converts an utf-16 code point or surrogate pair to utf-32 }
+function utf16toutf32(const S: UnicodeString; const index: SizeInt; out len: longint): UCS4Char; [public, alias: 'FPC_UTF16TOUTF32'];
+var
+  w: unicodechar;
+begin
+  { UTF-16 points in the range #$0-#$D7FF and #$E000-#$FFFF }
+  { are the same in UTF-32                                  }
+  w:=s[index];
+  if (w<=#$d7ff) or
+     (w>=#$e000) then
+    begin
+      result:=UCS4Char(w);
+      len:=1;
+    end
+  { valid surrogate pair? }
+  else if (w<=#$dbff) and
+          { w>=#$d7ff check not needed, checked above }
+          (index<length(s)) and
+          (s[index+1]>=#$dc00) and
+          (s[index+1]<=#$dfff) then
+      { convert the surrogate pair to UTF-32 }
+    begin
+      result:=(UCS4Char(w)-$d800) shl 10 + (UCS4Char(s[index+1])-$dc00) + $10000;
+      len:=2;
+    end
+  else
+    { invalid surrogate -> do nothing }
+    begin
+      result:=UCS4Char(w);
+      len:=1;
+    end;
+end;
+
+
 function UnicodeToUtf8(Dest: PChar; Source: PUnicodeChar; MaxBytes: SizeInt): SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
 function UnicodeToUtf8(Dest: PChar; Source: PUnicodeChar; MaxBytes: SizeInt): SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
   begin
   begin
     if assigned(Source) then
     if assigned(Source) then
@@ -1870,6 +1904,8 @@ function UnicodeToUtf8(Dest: PChar; MaxDestBytes: SizeUInt; Source: PUnicodeChar
   var
   var
     i,j : SizeUInt;
     i,j : SizeUInt;
     w : word;
     w : word;
+    lw : longword;
+    len : longint;
   begin
   begin
     result:=0;
     result:=0;
     if source=nil then
     if source=nil then
@@ -1895,16 +1931,34 @@ function UnicodeToUtf8(Dest: PChar; MaxDestBytes: SizeUInt; Source: PUnicodeChar
                   Dest[j+1]:=char($80 or (w and $3f));
                   Dest[j+1]:=char($80 or (w and $3f));
                   inc(j,2);
                   inc(j,2);
                 end;
                 end;
-              else
+              $800..$d7ff,$e000..$ffff:
+                begin
+                  if j+2>=MaxDestBytes then
+                    break;
+                  Dest[j]:=char($e0 or (w shr 12));
+                  Dest[j+1]:=char($80 or ((w shr 6) and $3f));
+                  Dest[j+2]:=char($80 or (w and $3f));
+                  inc(j,3);
+                end;
+              $d800..$dbff:
+                {High Surrogates}
                 begin
                 begin
-                    if j+2>=MaxDestBytes then
-                      break;
-                    Dest[j]:=char($e0 or (w shr 12));
-                    Dest[j+1]:=char($80 or ((w shr 6)and $3f));
-                    Dest[j+2]:=char($80 or (w and $3f));
-                    inc(j,3);
+                  if j+3>=MaxDestBytes then
+                    break;
+                  if (i<sourcechars-1) and
+                     (word(Source[i+1]) >= $dc00) and
+                     (word(Source[i+1]) <= $dfff) then
+                    begin
+                      lw:=longword(utf16toutf32(Source[i] + Source[i+1], 1, len));
+                      Dest[j]:=char($f0 or (lw shr 18));
+                      Dest[j+1]:=char($80 or ((lw shr 12) and $3f));
+                      Dest[j+2]:=char($80 or ((lw shr 6) and $3f));
+                      Dest[j+3]:=char($80 or (lw and $3f));
+                      inc(j,4);
+                      inc(i);
+                    end;
                 end;
                 end;
-            end;
+              end;
             inc(i);
             inc(i);
           end;
           end;
 
 
@@ -1922,8 +1976,18 @@ function UnicodeToUtf8(Dest: PChar; MaxDestBytes: SizeUInt; Source: PUnicodeChar
                 inc(j);
                 inc(j);
               $80..$7ff:
               $80..$7ff:
                 inc(j,2);
                 inc(j,2);
-              else
+              $800..$d7ff,$e000..$ffff:
                 inc(j,3);
                 inc(j,3);
+              $d800..$dbff:
+                begin
+                  if (i<sourcechars-1) and
+                     (word(Source[i+1]) >= $dc00) and
+                     (word(Source[i+1]) <= $dfff) then
+                    begin
+                      inc(j,4);
+                      inc(i);
+                    end;
+                end;
             end;
             end;
             inc(i);
             inc(i);
           end;
           end;
@@ -1941,88 +2005,285 @@ function Utf8ToUnicode(Dest: PUnicodeChar; Source: PChar; MaxChars: SizeInt): Si
   end;
   end;
 
 
 
 
-function Utf8ToUnicode(Dest: PUnicodeChar; MaxDestChars: SizeUInt; Source: PChar; SourceBytes: SizeUInt): SizeUInt;
-
-var
-  i,j : SizeUInt;
-  w: SizeUInt;
-  b : byte;
-begin
-  if not assigned(Source) then
+function UTF8ToUnicode(Dest: PUnicodeChar; MaxDestChars: SizeUInt; Source: PChar; SourceBytes: SizeUInt): SizeUInt;
+  const
+    UNICODE_INVALID=63;
+  var
+    InputUTF8: SizeUInt;
+    IBYTE: BYTE;
+    OutputUnicode: SizeUInt;
+    PRECHAR: SizeUInt;
+    TempBYTE: BYTE;
+    CharLen: SizeUint;
+    LookAhead: SizeUInt;
+    UC: SizeUInt;
   begin
   begin
-    result:=0;
-    exit;
-  end;
-  result:=SizeUInt(-1);
-  i:=0;
-  j:=0;
-  if assigned(Dest) then
-    begin
-      while (j<MaxDestChars) and (i<SourceBytes) do
-        begin
-          b:=byte(Source[i]);
-          w:=b;
-          inc(i);
-          // 2 or 3 bytes?
-          if b>=$80 then
-            begin
-              w:=b and $3f;
-              if i>=SourceBytes then
-                exit;
-              // 3 bytes?
-              if (b and $20)<>0 then
-                begin
-                  b:=byte(Source[i]);
-                  inc(i);
-                  if i>=SourceBytes then
-                    exit;
-                  if (b and $c0)<>$80 then
-                    exit;
-                  w:=(w shl 6) or (b and $3f);
+    if not assigned(Source) then
+      begin
+        result:=0;
+        exit;
+      end;
+    result:=SizeUInt(-1);
+    InputUTF8:=0;
+    OutputUnicode:=0;
+    PreChar:=0;
+    if Assigned(Dest) Then
+      begin
+        while (OutputUnicode<MaxDestChars) and (InputUTF8<SourceBytes) do
+          begin
+            IBYTE:=byte(Source[InputUTF8]);
+            if (IBYTE and $80) = 0 then
+              begin
+                //One character US-ASCII, convert it to unicode
+                if IBYTE = 10 then
+                  begin
+                    If (PreChar<>13) and FALSE then
+                      begin
+                        //Expand to crlf, conform UTF-8.
+                        //This procedure will break the memory alocation by
+                        //FPC for the widestring, so never use it. Condition never true due the "and FALSE".
+                        if OutputUnicode+1<MaxDestChars then
+                          begin
+                            Dest[OutputUnicode]:=WideChar(13);
+                            inc(OutputUnicode);
+                            Dest[OutputUnicode]:=WideChar(10);
+                            inc(OutputUnicode);
+                            PreChar:=10;
+                          end
+                        else
+                          begin
+                            Dest[OutputUnicode]:=WideChar(13);
+                            inc(OutputUnicode);
+                          end;
+                      end
+                    else
+                      begin
+                        Dest[OutputUnicode]:=WideChar(IBYTE);
+                        inc(OutputUnicode);
+                        PreChar:=IBYTE;
+                      end;
+                  end
+                else
+                  begin
+                    Dest[OutputUnicode]:=WideChar(IBYTE);
+                    inc(OutputUnicode);
+                    PreChar:=IBYTE;
+                  end;
+                inc(InputUTF8);
+              end
+            else
+              begin
+                TempByte:=IBYTE;
+                CharLen:=0;
+                while (TempBYTE and $80)<>0 do
+                  begin
+                    TempBYTE:=(TempBYTE shl 1) and $FE;
+                    inc(CharLen);
+                  end;
+                //Test for the "CharLen" conforms UTF-8 string
+                //This means the 10xxxxxx pattern.
+                if SizeUInt(InputUTF8+CharLen-1)>SourceBytes then
+                  begin
+                    //Insuficient chars in string to decode
+                    //UTF-8 array. Fallback to single char.
+                    CharLen:= 1;
+                  end;
+                for LookAhead := 1 to CharLen-1 do
+                  begin
+                    if ((byte(Source[InputUTF8+LookAhead]) and $80)<>$80) or
+                       ((byte(Source[InputUTF8+LookAhead]) and $40)<>$00) then
+                      begin
+                        //Invalid UTF-8 sequence, fallback.
+                        CharLen:= LookAhead;
+                        break;
+                      end;
+                  end;
+                UC:=$FFFF;
+                case CharLen of
+                  1:  begin
+                        //Not valid UTF-8 sequence
+                        UC:=UNICODE_INVALID;
+                      end;
+                  2:  begin
+                        //Two bytes UTF, convert it
+                        UC:=(byte(Source[InputUTF8]) and $1F) shl 6;
+                        UC:=UC or (byte(Source[InputUTF8+1]) and $3F);
+                        if UC <= $7F then
+                          begin
+                            //Invalid UTF sequence.
+                            UC:=UNICODE_INVALID;
+                          end;
+                      end;
+                  3:  begin
+                        //Three bytes, convert it to unicode
+                        UC:= (byte(Source[InputUTF8]) and $0F) shl 12;
+                        UC:= UC or ((byte(Source[InputUTF8+1]) and $3F) shl 6);
+                        UC:= UC or ((byte(Source[InputUTF8+2]) and $3F));
+                        if (UC <= $7FF) or (UC >= $FFFE) or ((UC >= $D800) and (UC <= $DFFF)) then
+                          begin
+                            //Invalid UTF-8 sequence
+                            UC:= UNICODE_INVALID;
+                          End;
+                      end;
+                  4:  begin
+                        //Four bytes, convert it to two unicode characters
+                        UC:= (byte(Source[InputUTF8]) and $07) shl 18;
+                        UC:= UC or ((byte(Source[InputUTF8+1]) and $3F) shl 12);
+                        UC:= UC or ((byte(Source[InputUTF8+2]) and $3F) shl 6);
+                        UC:= UC or ((byte(Source[InputUTF8+3]) and $3F));
+                        if (UC < $10000) or (UC > $10FFFF) then
+                          begin
+                            UC:= UNICODE_INVALID;
+                          end
+                        else
+                          begin
+                            { only store pair if room }
+                            dec(UC,$10000);
+                            if (OutputUnicode<MaxDestChars-1) then
+                              begin
+                                Dest[OutputUnicode]:=WideChar(UC shr 10 + $D800);
+                                inc(OutputUnicode);
+                                UC:=(UC and $3ff) + $DC00;
+                              end
+                            else
+                              begin
+                                InputUTF8:= InputUTF8 + CharLen;
+                                { don't store anything }
+                                CharLen:=0;
+                              end;
+                          end;
+                      end;
+                  5,6,7:  begin
+                            //Invalid UTF8 to unicode conversion,
+                            //mask it as invalid UNICODE too.
+                            UC:=UNICODE_INVALID;
+                          end;
                 end;
                 end;
-              b:=byte(Source[i]);
-              w:=(w shl 6) or (b and $3f);
-              if (b and $c0)<>$80 then
-                exit;
-              inc(i);
-            end;
-          Dest[j]:=UnicodeChar(w);
-          inc(j);
-        end;
-      if j>=MaxDestChars then j:=MaxDestChars-1;
-      Dest[j]:=#0;
-    end
-  else
-    begin
-      while i<SourceBytes do
-        begin
-          b:=byte(Source[i]);
-          inc(i);
-          // 2 or 3 bytes?
-          if b>=$80 then
-            begin
-              if i>=SourceBytes then
-                exit;
-              // 3 bytes?
-              b := b and $3f;
-              if (b and $20)<>0 then
-                begin
-                  b:=byte(Source[i]);
-                  inc(i);
-                  if i>=SourceBytes then
-                    exit;
-                  if (b and $c0)<>$80 then
-                    exit;
+                if CharLen > 0 then
+                  begin
+                    PreChar:=UC;
+                    Dest[OutputUnicode]:=WideChar(UC);
+                    inc(OutputUnicode);
+                  end;
+                InputUTF8:= InputUTF8 + CharLen;
+              end;
+          end;
+        Result:=OutputUnicode+1;
+      end
+    else
+      begin
+        while (InputUTF8<SourceBytes) do
+          begin
+            IBYTE:=byte(Source[InputUTF8]);
+            if (IBYTE and $80) = 0 then
+              begin
+                //One character US-ASCII, convert it to unicode
+                if IBYTE = 10 then
+                  begin
+                    if (PreChar<>13) and FALSE then
+                      begin
+                        //Expand to crlf, conform UTF-8.
+                        //This procedure will break the memory alocation by
+                        //FPC for the widestring, so never use it. Condition never true due the "and FALSE".
+                        inc(OutputUnicode,2);
+                        PreChar:=10;
+                      end
+                    else
+                      begin
+                        inc(OutputUnicode);
+                        PreChar:=IBYTE;
+                      end;
+                  end
+                else
+                  begin
+                    inc(OutputUnicode);
+                    PreChar:=IBYTE;
+                  end;
+                inc(InputUTF8);
+              end
+            else
+              begin
+                TempByte:=IBYTE;
+                CharLen:=0;
+                while (TempBYTE and $80)<>0 do
+                  begin
+                    TempBYTE:=(TempBYTE shl 1) and $FE;
+                    inc(CharLen);
+                  end;
+                //Test for the "CharLen" conforms UTF-8 string
+                //This means the 10xxxxxx pattern.
+                if SizeUInt(InputUTF8+CharLen-1)>SourceBytes then
+                  begin
+                    //Insuficient chars in string to decode
+                    //UTF-8 array. Fallback to single char.
+                    CharLen:= 1;
+                  end;
+                for LookAhead := 1 to CharLen-1 do
+                  begin
+                    if ((byte(Source[InputUTF8+LookAhead]) and $80)<>$80) or
+                       ((byte(Source[InputUTF8+LookAhead]) and $40)<>$00) then
+                      begin
+                        //Invalid UTF-8 sequence, fallback.
+                        CharLen:= LookAhead;
+                        break;
+                      end;
+                  end;
+                UC:=$FFFF;
+                case CharLen of
+                  1:  begin
+                        //Not valid UTF-8 sequence
+                        UC:=UNICODE_INVALID;
+                      end;
+                  2:  begin
+                        //Two bytes UTF, convert it
+                        UC:=(byte(Source[InputUTF8]) and $1F) shl 6;
+                        UC:=UC or (byte(Source[InputUTF8+1]) and $3F);
+                        if UC <= $7F then
+                          begin
+                            //Invalid UTF sequence.
+                            UC:=UNICODE_INVALID;
+                          end;
+                      end;
+                  3:  begin
+                        //Three bytes, convert it to unicode
+                        UC:= (byte(Source[InputUTF8]) and $0F) shl 12;
+                        UC:= UC or ((byte(Source[InputUTF8+1]) and $3F) shl 6);
+                        UC:= UC or ((byte(Source[InputUTF8+2]) and $3F));
+                        If (UC <= $7FF) or (UC >= $FFFE) or ((UC >= $D800) and (UC <= $DFFF)) then
+                          begin
+                            //Invalid UTF-8 sequence
+                            UC:= UNICODE_INVALID;
+                          end;
+                      end;
+                  4:  begin
+                        //Four bytes, convert it to two unicode characters
+                        UC:= (byte(Source[InputUTF8]) and $07) shl 18;
+                        UC:= UC or ((byte(Source[InputUTF8+1]) and $3F) shl 12);
+                        UC:= UC or ((byte(Source[InputUTF8+2]) and $3F) shl 6);
+                        UC:= UC or ((byte(Source[InputUTF8+3]) and $3F));
+                        if (UC < $10000) or (UC > $10FFFF) then
+                          UC:= UNICODE_INVALID
+                        else
+                          { extra character character }
+                          inc(OutputUnicode);
+                      end;
+                  5,6,7:  begin
+                            //Invalid UTF8 to unicode conversion,
+                            //mask it as invalid UNICODE too.
+                            UC:=UNICODE_INVALID;
+                          end;
                 end;
                 end;
-              if (byte(Source[i]) and $c0)<>$80 then
-                exit;
-              inc(i);
-            end;
-          inc(j);
-        end;
-    end;
-  result:=j+1;
-end;
+                if CharLen > 0 then
+                  begin
+                    PreChar:=UC;
+                    inc(OutputUnicode);
+                  end;
+                InputUTF8:= InputUTF8 + CharLen;
+              end;
+          end;
+        Result:=OutputUnicode+1;
+      end;
+  end;
 
 
 
 
 function UTF8Encode(const s : Ansistring) : UTF8String; inline;
 function UTF8Encode(const s : Ansistring) : UTF8String; inline;
@@ -2079,40 +2340,6 @@ function Utf8ToAnsi(const s : UTF8String) : ansistring;{$ifdef SYSTEMINLINE}inli
   end;
   end;
 
 
 
 
-{ converts an utf-16 code point or surrogate pair to utf-32 }
-function utf16toutf32(const S: UnicodeString; const index: SizeInt; out len: longint): UCS4Char; [public, alias: 'FPC_UTF16TOUTF32'];
-var
-  w: unicodechar;
-begin
-  { UTF-16 points in the range #$0-#$D7FF and #$E000-#$FFFF }
-  { are the same in UTF-32                                  }
-  w:=s[index];
-  if (w<=#$d7ff) or
-     (w>=#$e000) then
-    begin
-      result:=UCS4Char(w);
-      len:=1;
-    end
-  { valid surrogate pair? }
-  else if (w<=#$dbff) and
-          { w>=#$d7ff check not needed, checked above }
-          (index<length(s)) and
-          (s[index+1]>=#$dc00) and
-          (s[index+1]<=#$dfff) then
-      { convert the surrogate pair to UTF-32 }
-    begin
-      result:=(UCS4Char(w)-$d800) shl 10 + (UCS4Char(s[index+1])-$dc00) + $10000;
-      len:=2;
-    end
-  else
-    { invalid surrogate -> do nothing }
-    begin
-      result:=UCS4Char(w);
-      len:=1;
-    end;
-end;
-
-
 function UnicodeStringToUCS4String(const s : UnicodeString) : UCS4String;
 function UnicodeStringToUCS4String(const s : UnicodeString) : UCS4String;
   var
   var
     i, slen,
     i, slen,

+ 349 - 121
rtl/inc/wstrings.inc

@@ -1227,6 +1227,40 @@ end;
 
 
 {$endif CPU64}
 {$endif CPU64}
 
 
+{ converts an utf-16 code point or surrogate pair to utf-32 }
+function utf16toutf32(const S: WideString; const index: SizeInt; out len: longint): UCS4Char; [public, alias: 'FPC_WIDETOUTF32'];
+var
+  w: widechar;
+begin
+  { UTF-16 points in the range #$0-#$D7FF and #$E000-#$FFFF }
+  { are the same in UTF-32                                  }
+  w:=s[index];
+  if (w<=#$d7ff) or
+     (w>=#$e000) then
+    begin
+      result:=UCS4Char(w);
+      len:=1;
+    end
+  { valid surrogate pair? }
+  else if (w<=#$dbff) and
+          { w>=#$d7ff check not needed, checked above }
+          (index<length(s)) and
+          (s[index+1]>=#$dc00) and
+          (s[index+1]<=#$dfff) then
+      { convert the surrogate pair to UTF-32 }
+    begin
+      result:=(UCS4Char(w)-$d800) shl 10 + (UCS4Char(s[index+1])-$dc00) + $10000;
+      len:=2;
+    end
+  else
+    { invalid surrogate -> do nothing }
+    begin
+      result:=UCS4Char(w);
+      len:=1;
+    end;
+end;
+
+
 function UnicodeToUtf8(Dest: PChar; Source: PWideChar; MaxBytes: SizeInt): SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
 function UnicodeToUtf8(Dest: PChar; Source: PWideChar; MaxBytes: SizeInt): SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
   begin
   begin
     if assigned(Source) then
     if assigned(Source) then
@@ -1240,6 +1274,8 @@ function UnicodeToUtf8(Dest: PChar; MaxDestBytes: SizeUInt; Source: PWideChar; S
   var
   var
     i,j : SizeUInt;
     i,j : SizeUInt;
     w : word;
     w : word;
+    lw : longword;
+    len : longint;
   begin
   begin
     result:=0;
     result:=0;
     if source=nil then
     if source=nil then
@@ -1265,16 +1301,34 @@ function UnicodeToUtf8(Dest: PChar; MaxDestBytes: SizeUInt; Source: PWideChar; S
                   Dest[j+1]:=char($80 or (w and $3f));
                   Dest[j+1]:=char($80 or (w and $3f));
                   inc(j,2);
                   inc(j,2);
                 end;
                 end;
-              else
+              $800..$d7ff,$e000..$ffff:
                 begin
                 begin
-                    if j+2>=MaxDestBytes then
-                      break;
-                    Dest[j]:=char($e0 or (w shr 12));
-                    Dest[j+1]:=char($80 or ((w shr 6)and $3f));
-                    Dest[j+2]:=char($80 or (w and $3f));
-                    inc(j,3);
+                  if j+2>=MaxDestBytes then
+                    break;
+                  Dest[j]:=char($e0 or (w shr 12));
+                  Dest[j+1]:=char($80 or ((w shr 6) and $3f));
+                  Dest[j+2]:=char($80 or (w and $3f));
+                  inc(j,3);
                 end;
                 end;
-            end;
+              $d800..$dbff:
+                {High Surrogates}
+                begin
+                  if j+3>=MaxDestBytes then
+                    break;
+                  if (i<sourcechars-1) and
+                     (word(Source[i+1]) >= $dc00) and
+                     (word(Source[i+1]) <= $dfff) then
+                    begin
+                      lw:=longword(utf16toutf32(Source[i] + Source[i+1], 1, len));
+                      Dest[j]:=char($f0 or (lw shr 18));
+                      Dest[j+1]:=char($80 or ((lw shr 12) and $3f));
+                      Dest[j+2]:=char($80 or ((lw shr 6) and $3f));
+                      Dest[j+3]:=char($80 or (lw and $3f));
+                      inc(j,4);
+                      inc(i);
+                    end;
+                end;
+              end;
             inc(i);
             inc(i);
           end;
           end;
 
 
@@ -1292,8 +1346,18 @@ function UnicodeToUtf8(Dest: PChar; MaxDestBytes: SizeUInt; Source: PWideChar; S
                 inc(j);
                 inc(j);
               $80..$7ff:
               $80..$7ff:
                 inc(j,2);
                 inc(j,2);
-              else
+              $800..$d7ff,$e000..$ffff:
                 inc(j,3);
                 inc(j,3);
+              $d800..$dbff:
+                begin
+                  if (i<sourcechars-1) and
+                     (word(Source[i+1]) >= $dc00) and
+                     (word(Source[i+1]) <= $dfff) then
+                    begin
+                      inc(j,4);
+                      inc(i);
+                    end;
+                end;
             end;
             end;
             inc(i);
             inc(i);
           end;
           end;
@@ -1311,88 +1375,286 @@ function Utf8ToUnicode(Dest: PWideChar; Source: PChar; MaxChars: SizeInt): SizeI
   end;
   end;
 
 
 
 
-function Utf8ToUnicode(Dest: PWideChar; MaxDestChars: SizeUInt; Source: PChar; SourceBytes: SizeUInt): SizeUInt;
 
 
-var
-  i,j : SizeUInt;
-  w: SizeUInt;
-  b : byte;
-begin
-  if not assigned(Source) then
+function UTF8ToUnicode(Dest: PWideChar; MaxDestChars: SizeUInt; Source: PChar; SourceBytes: SizeUInt): SizeUInt;
+  const
+    UNICODE_INVALID=63;
+  var
+    InputUTF8: SizeUInt;
+    IBYTE: BYTE;
+    OutputUnicode: SizeUInt;
+    PRECHAR: SizeUInt;
+    TempBYTE: BYTE;
+    CharLen: SizeUint;
+    LookAhead: SizeUInt;
+    UC: SizeUInt;
   begin
   begin
-    result:=0;
-    exit;
-  end;
-  result:=SizeUInt(-1);
-  i:=0;
-  j:=0;
-  if assigned(Dest) then
-    begin
-      while (j<MaxDestChars) and (i<SourceBytes) do
-        begin
-          b:=byte(Source[i]);
-          w:=b;
-          inc(i);
-          // 2 or 3 bytes?
-          if b>=$80 then
-            begin
-              w:=b and $3f;
-              if i>=SourceBytes then
-                exit;
-              // 3 bytes?
-              if (b and $20)<>0 then
-                begin
-                  b:=byte(Source[i]);
-                  inc(i);
-                  if i>=SourceBytes then
-                    exit;
-                  if (b and $c0)<>$80 then
-                    exit;
-                  w:=(w shl 6) or (b and $3f);
+    if not assigned(Source) then
+      begin
+        result:=0;
+        exit;
+      end;
+    result:=SizeUInt(-1);
+    InputUTF8:=0;
+    OutputUnicode:=0;
+    PreChar:=0;
+    if Assigned(Dest) Then
+      begin
+        while (OutputUnicode<MaxDestChars) and (InputUTF8<SourceBytes) do
+          begin
+            IBYTE:=byte(Source[InputUTF8]);
+            if (IBYTE and $80) = 0 then
+              begin
+                //One character US-ASCII, convert it to unicode
+                if IBYTE = 10 then
+                  begin
+                    If (PreChar<>13) and FALSE then
+                      begin
+                        //Expand to crlf, conform UTF-8.
+                        //This procedure will break the memory alocation by
+                        //FPC for the widestring, so never use it. Condition never true due the "and FALSE".
+                        if OutputUnicode+1<MaxDestChars then
+                          begin
+                            Dest[OutputUnicode]:=WideChar(13);
+                            inc(OutputUnicode);
+                            Dest[OutputUnicode]:=WideChar(10);
+                            inc(OutputUnicode);
+                            PreChar:=10;
+                          end
+                        else
+                          begin
+                            Dest[OutputUnicode]:=WideChar(13);
+                            inc(OutputUnicode);
+                          end;
+                      end
+                    else
+                      begin
+                        Dest[OutputUnicode]:=WideChar(IBYTE);
+                        inc(OutputUnicode);
+                        PreChar:=IBYTE;
+                      end;
+                  end
+                else
+                  begin
+                    Dest[OutputUnicode]:=WideChar(IBYTE);
+                    inc(OutputUnicode);
+                    PreChar:=IBYTE;
+                  end;
+                inc(InputUTF8);
+              end
+            else
+              begin
+                TempByte:=IBYTE;
+                CharLen:=0;
+                while (TempBYTE and $80)<>0 do
+                  begin
+                    TempBYTE:=(TempBYTE shl 1) and $FE;
+                    inc(CharLen);
+                  end;
+                //Test for the "CharLen" conforms UTF-8 string
+                //This means the 10xxxxxx pattern.
+                if SizeUInt(InputUTF8+CharLen-1)>SourceBytes then
+                  begin
+                    //Insuficient chars in string to decode
+                    //UTF-8 array. Fallback to single char.
+                    CharLen:= 1;
+                  end;
+                for LookAhead := 1 to CharLen-1 do
+                  begin
+                    if ((byte(Source[InputUTF8+LookAhead]) and $80)<>$80) or
+                       ((byte(Source[InputUTF8+LookAhead]) and $40)<>$00) then
+                      begin
+                        //Invalid UTF-8 sequence, fallback.
+                        CharLen:= LookAhead;
+                        break;
+                      end;
+                  end;
+                UC:=$FFFF;
+                case CharLen of
+                  1:  begin
+                        //Not valid UTF-8 sequence
+                        UC:=UNICODE_INVALID;
+                      end;
+                  2:  begin
+                        //Two bytes UTF, convert it
+                        UC:=(byte(Source[InputUTF8]) and $1F) shl 6;
+                        UC:=UC or (byte(Source[InputUTF8+1]) and $3F);
+                        if UC <= $7F then
+                          begin
+                            //Invalid UTF sequence.
+                            UC:=UNICODE_INVALID;
+                          end;
+                      end;
+                  3:  begin
+                        //Three bytes, convert it to unicode
+                        UC:= (byte(Source[InputUTF8]) and $0F) shl 12;
+                        UC:= UC or ((byte(Source[InputUTF8+1]) and $3F) shl 6);
+                        UC:= UC or ((byte(Source[InputUTF8+2]) and $3F));
+                        if (UC <= $7FF) or (UC >= $FFFE) or ((UC >= $D800) and (UC <= $DFFF)) then
+                          begin
+                            //Invalid UTF-8 sequence
+                            UC:= UNICODE_INVALID;
+                          End;
+                      end;
+                  4:  begin
+                        //Four bytes, convert it to two unicode characters
+                        UC:= (byte(Source[InputUTF8]) and $07) shl 18;
+                        UC:= UC or ((byte(Source[InputUTF8+1]) and $3F) shl 12);
+                        UC:= UC or ((byte(Source[InputUTF8+2]) and $3F) shl 6);
+                        UC:= UC or ((byte(Source[InputUTF8+3]) and $3F));
+                        if (UC < $10000) or (UC > $10FFFF) then
+                          begin
+                            UC:= UNICODE_INVALID;
+                          end
+                        else
+                          begin
+                            { only store pair if room }
+                            dec(UC,$10000);
+                            if (OutputUnicode<MaxDestChars-1) then
+                              begin
+                                Dest[OutputUnicode]:=WideChar(UC shr 10 + $D800);
+                                inc(OutputUnicode);
+                                UC:=(UC and $3ff) + $DC00;
+                              end
+                            else
+                              begin
+                                InputUTF8:= InputUTF8 + CharLen;
+                                { don't store anything }
+                                CharLen:=0;
+                              end;
+                          end;
+                      end;
+                  5,6,7:  begin
+                            //Invalid UTF8 to unicode conversion,
+                            //mask it as invalid UNICODE too.
+                            UC:=UNICODE_INVALID;
+                          end;
                 end;
                 end;
-              b:=byte(Source[i]);
-              w:=(w shl 6) or (b and $3f);
-              if (b and $c0)<>$80 then
-                exit;
-              inc(i);
-            end;
-          Dest[j]:=WideChar(w);
-          inc(j);
-        end;
-      if j>=MaxDestChars then j:=MaxDestChars-1;
-      Dest[j]:=#0;
-    end
-  else
-    begin
-      while i<SourceBytes do
-        begin
-          b:=byte(Source[i]);
-          inc(i);
-          // 2 or 3 bytes?
-          if b>=$80 then
-            begin
-              if i>=SourceBytes then
-                exit;
-              // 3 bytes?
-              b := b and $3f;
-              if (b and $20)<>0 then
-                begin
-                  b:=byte(Source[i]);
-                  inc(i);
-                  if i>=SourceBytes then
-                    exit;
-                  if (b and $c0)<>$80 then
-                    exit;
+                if CharLen > 0 then
+                  begin
+                    PreChar:=UC;
+                    Dest[OutputUnicode]:=WideChar(UC);
+                    inc(OutputUnicode);
+                  end;
+                InputUTF8:= InputUTF8 + CharLen;
+              end;
+          end;
+        Result:=OutputUnicode+1;
+      end
+    else
+      begin
+        while (InputUTF8<SourceBytes) do
+          begin
+            IBYTE:=byte(Source[InputUTF8]);
+            if (IBYTE and $80) = 0 then
+              begin
+                //One character US-ASCII, convert it to unicode
+                if IBYTE = 10 then
+                  begin
+                    if (PreChar<>13) and FALSE then
+                      begin
+                        //Expand to crlf, conform UTF-8.
+                        //This procedure will break the memory alocation by
+                        //FPC for the widestring, so never use it. Condition never true due the "and FALSE".
+                        inc(OutputUnicode,2);
+                        PreChar:=10;
+                      end
+                    else
+                      begin
+                        inc(OutputUnicode);
+                        PreChar:=IBYTE;
+                      end;
+                  end
+                else
+                  begin
+                    inc(OutputUnicode);
+                    PreChar:=IBYTE;
+                  end;
+                inc(InputUTF8);
+              end
+            else
+              begin
+                TempByte:=IBYTE;
+                CharLen:=0;
+                while (TempBYTE and $80)<>0 do
+                  begin
+                    TempBYTE:=(TempBYTE shl 1) and $FE;
+                    inc(CharLen);
+                  end;
+                //Test for the "CharLen" conforms UTF-8 string
+                //This means the 10xxxxxx pattern.
+                if SizeUInt(InputUTF8+CharLen-1)>SourceBytes then
+                  begin
+                    //Insuficient chars in string to decode
+                    //UTF-8 array. Fallback to single char.
+                    CharLen:= 1;
+                  end;
+                for LookAhead := 1 to CharLen-1 do
+                  begin
+                    if ((byte(Source[InputUTF8+LookAhead]) and $80)<>$80) or
+                       ((byte(Source[InputUTF8+LookAhead]) and $40)<>$00) then
+                      begin
+                        //Invalid UTF-8 sequence, fallback.
+                        CharLen:= LookAhead;
+                        break;
+                      end;
+                  end;
+                UC:=$FFFF;
+                case CharLen of
+                  1:  begin
+                        //Not valid UTF-8 sequence
+                        UC:=UNICODE_INVALID;
+                      end;
+                  2:  begin
+                        //Two bytes UTF, convert it
+                        UC:=(byte(Source[InputUTF8]) and $1F) shl 6;
+                        UC:=UC or (byte(Source[InputUTF8+1]) and $3F);
+                        if UC <= $7F then
+                          begin
+                            //Invalid UTF sequence.
+                            UC:=UNICODE_INVALID;
+                          end;
+                      end;
+                  3:  begin
+                        //Three bytes, convert it to unicode
+                        UC:= (byte(Source[InputUTF8]) and $0F) shl 12;
+                        UC:= UC or ((byte(Source[InputUTF8+1]) and $3F) shl 6);
+                        UC:= UC or ((byte(Source[InputUTF8+2]) and $3F));
+                        If (UC <= $7FF) or (UC >= $FFFE) or ((UC >= $D800) and (UC <= $DFFF)) then
+                          begin
+                            //Invalid UTF-8 sequence
+                            UC:= UNICODE_INVALID;
+                          end;
+                      end;
+                  4:  begin
+                        //Four bytes, convert it to two unicode characters
+                        UC:= (byte(Source[InputUTF8]) and $07) shl 18;
+                        UC:= UC or ((byte(Source[InputUTF8+1]) and $3F) shl 12);
+                        UC:= UC or ((byte(Source[InputUTF8+2]) and $3F) shl 6);
+                        UC:= UC or ((byte(Source[InputUTF8+3]) and $3F));
+                        if (UC < $10000) or (UC > $10FFFF) then
+                          UC:= UNICODE_INVALID
+                        else
+                          { extra character character }
+                          inc(OutputUnicode);
+                      end;
+                  5,6,7:  begin
+                            //Invalid UTF8 to unicode conversion,
+                            //mask it as invalid UNICODE too.
+                            UC:=UNICODE_INVALID;
+                          end;
                 end;
                 end;
-              if (byte(Source[i]) and $c0)<>$80 then
-                exit;
-              inc(i);
-            end;
-          inc(j);
-        end;
-    end;
-  result:=j+1;
-end;
+                if CharLen > 0 then
+                  begin
+                    PreChar:=UC;
+                    inc(OutputUnicode);
+                  end;
+                InputUTF8:= InputUTF8 + CharLen;
+              end;
+          end;
+        Result:=OutputUnicode+1;
+      end;
+  end;
 
 
 
 
 function UTF8Encode(const s : WideString) : UTF8String;
 function UTF8Encode(const s : WideString) : UTF8String;
@@ -1413,40 +1675,6 @@ function UTF8Encode(const s : WideString) : UTF8String;
   end;
   end;
 
 
 
 
-{ converts an utf-16 code point or surrogate pair to utf-32 }
-function utf16toutf32(const S: WideString; const index: SizeInt; out len: longint): UCS4Char; [public, alias: 'FPC_WIDETOUTF32'];
-var
-  w: widechar;
-begin
-  { UTF-16 points in the range #$0-#$D7FF and #$E000-#$FFFF }
-  { are the same in UTF-32                                  }
-  w:=s[index];
-  if (w<=#$d7ff) or
-     (w>=#$e000) then
-    begin
-      result:=UCS4Char(w);
-      len:=1;
-    end
-  { valid surrogate pair? }
-  else if (w<=#$dbff) and
-          { w>=#$d7ff check not needed, checked above }
-          (index<length(s)) and
-          (s[index+1]>=#$dc00) and
-          (s[index+1]<=#$dfff) then
-      { convert the surrogate pair to UTF-32 }
-    begin
-      result:=(UCS4Char(w)-$d800) shl 10 + (UCS4Char(s[index+1])-$dc00) + $10000;
-      len:=2;
-    end
-  else
-    { invalid surrogate -> do nothing }
-    begin
-      result:=UCS4Char(w);
-      len:=1;
-    end;
-end;
-
-
 const
 const
   SNoWidestrings = 'This binary has no widestrings support compiled in.';
   SNoWidestrings = 'This binary has no widestrings support compiled in.';
   SRecompileWithWidestrings = 'Recompile the application with a widestrings-manager in the program uses clause.';
   SRecompileWithWidestrings = 'Recompile the application with a widestrings-manager in the program uses clause.';

+ 1435 - 0
tests/webtbs/tw11791.pp

@@ -0,0 +1,1435 @@
+{$mode objfpc}{$H+}
+
+uses
+{$ifdef unix}cwstring,{$endif}
+Classes, SysUtils;
+
+
+const buffer : array[1..20334] of char=(
+  'U','T','F','-','8',' ','d','e','c','o','d','e','r',' ','c',
+  'a','p','a','b','i','l','i','t','y',' ','a','n','d',' ','s',
+  't','r','e','s','s',' ','t','e','s','t',#010,'-','-','-','-',
+  '-','-','-','-','-','-','-','-','-','-','-','-','-','-','-',
+  '-','-','-','-','-','-','-','-','-','-','-','-','-','-','-',
+  '-','-','-','-','-','-',#010,#010,'M','a','r','k','u','s',' ',
+  'K','u','h','n',' ','<','h','t','t','p',':','/','/','w','w',
+  'w','.','c','l','.','c','a','m','.','a','c','.','u','k','/',
+  '~','m','g','k','2','5','/','>',' ','-',' ','2','0','0','3',
+  '-','0','2','-','1','9',#010,#010,'T','h','i','s',' ','t','e',
+  's','t',' ','f','i','l','e',' ','c','a','n',' ','h','e','l',
+  'p',' ','y','o','u',' ','e','x','a','m','i','n','e',',',' ',
+  'h','o','w',' ','y','o','u','r',' ','U','T','F','-','8',' ',
+  'd','e','c','o','d','e','r',' ','h','a','n','d','l','e','s',
+  #010,'v','a','r','i','o','u','s',' ','t','y','p','e','s',' ',
+  'o','f',' ','c','o','r','r','e','c','t',',',' ','m','a','l',
+  'f','o','r','m','e','d',',',' ','o','r',' ','o','t','h','e',
+  'r','w','i','s','e',' ','i','n','t','e','r','e','s','t','i',
+  'n','g',' ','U','T','F','-','8',#010,'s','e','q','u','e','n',
+  'c','e','s','.',' ','T','h','i','s',' ','f','i','l','e',' ',
+  'i','s',' ','n','o','t',' ','m','e','a','n','t',' ','t','o',
+  ' ','b','e',' ','a',' ','c','o','n','f','o','r','m','a','n',
+  'c','e',' ','t','e','s','t','.',' ','I','t',' ','d','o','e',
+  's',#010,'n','o','t',' ','p','r','e','s','c','r','i','b','e',
+  's',' ','a','n','y',' ','p','a','r','t','i','c','u','l','a',
+  'r',' ','o','u','t','c','o','m','e',' ','a','n','d',' ','t',
+  'h','e','r','e','f','o','r','e',' ','t','h','e','r','e',' ',
+  'i','s',' ','n','o',' ','w','a','y',' ','t','o',#010,'"','p',
+  'a','s','s','"',' ','o','r',' ','"','f','a','i','l','"',' ',
+  't','h','i','s',' ','t','e','s','t',' ','f','i','l','e',',',
+  ' ','e','v','e','n',' ','t','h','o','u','g','h',' ','t','h',
+  'e',' ','t','e','x','t','s',' ','s','u','g','g','e','s','t',
+  's',' ','a',#010,'p','r','e','f','e','r','a','b','l','e',' ',
+  'd','e','c','o','d','e','r',' ','b','e','h','a','v','i','o',
+  'u','r',' ','a','t',' ','s','o','m','e',' ','p','l','a','c',
+  'e','s','.',' ','T','h','e',' ','a','i','m',' ','i','s',' ',
+  'i','n','s','t','e','a','d',' ','t','o',#010,'h','e','l','p',
+  ' ','y','o','u',' ','t','h','i','n','k',' ','a','b','o','u',
+  't',' ','a','n','d',' ','t','e','s','t',' ','t','h','e',' ',
+  'b','e','h','a','v','i','o','u','r',' ','o','f',' ','y','o',
+  'u','r',' ','U','T','F','-','8',' ','o','n',' ','a',#010,'s',
+  'y','s','t','e','m','a','t','i','c',' ','c','o','l','l','e',
+  'c','t','i','o','n',' ','o','f',' ','u','n','u','s','u','a',
+  'l',' ','i','n','p','u','t','s','.',' ','E','x','p','e','r',
+  'i','e','n','c','e',' ','s','o',' ','f','a','r',' ','s','u',
+  'g','g','e','s','t','s',#010,'t','h','a','t',' ','m','o','s',
+  't',' ','f','i','r','s','t','-','t','i','m','e',' ','a','u',
+  't','h','o','r','s',' ','o','f',' ','U','T','F','-','8',' ',
+  'd','e','c','o','d','e','r','s',' ','f','i','n','d',' ','a',
+  't',' ','l','e','a','s','t',' ','o','n','e',#010,'s','e','r',
+  'i','o','u','s',' ','p','r','o','b','l','e','m',' ','i','n',
+  ' ','t','h','e','i','r',' ','d','e','c','o','d','e','r',' ',
+  'b','y',' ','u','s','i','n','g',' ','t','h','i','s',' ','f',
+  'i','l','e','.',#010,#010,'T','h','e',' ','t','e','s','t',' ',
+  'l','i','n','e','s',' ','b','e','l','o','w',' ','c','o','v',
+  'e','r',' ','b','o','u','n','d','a','r','y',' ','c','o','n',
+  'd','i','t','i','o','n','s',',',' ','m','a','l','f','o','r',
+  'm','e','d',' ','U','T','F','-','8',#010,'s','e','q','u','e',
+  'n','c','e','s',' ','a','s',' ','w','e','l','l',' ','a','s',
+  ' ','c','o','r','r','e','c','t','l','y',' ','e','n','c','o',
+  'd','e','d',' ','U','T','F','-','8',' ','s','e','q','u','e',
+  'n','c','e','s',' ','o','f',' ','U','n','i','c','o','d','e',
+  ' ','c','o','d','e',#010,'p','o','i','n','t','s',' ','t','h',
+  'a','t',' ','s','h','o','u','l','d',' ','n','e','v','e','r',
+  ' ','o','c','c','u','r',' ','i','n',' ','a',' ','c','o','r',
+  'r','e','c','t',' ','U','T','F','-','8',' ','f','i','l','e',
+  '.',#010,#010,'A','c','c','o','r','d','i','n','g',' ','t','o',
+  ' ','I','S','O',' ','1','0','6','4','6','-','1',':','2','0',
+  '0','0',',',' ','s','e','c','t','i','o','n','s',' ','D','.',
+  '7',' ','a','n','d',' ','2','.','3','c',',',' ','a',' ','d',
+  'e','v','i','c','e',#010,'r','e','c','e','i','v','i','n','g',
+  ' ','U','T','F','-','8',' ','s','h','a','l','l',' ','i','n',
+  't','e','r','p','r','e','t',' ','a',' ','"','m','a','l','f',
+  'o','r','m','e','d',' ','s','e','q','u','e','n','c','e',' ',
+  'i','n',' ','t','h','e',' ','s','a','m','e',' ','w','a','y',
+  #010,'t','h','a','t',' ','i','t',' ','i','n','t','e','r','p',
+  'r','e','t','s',' ','a',' ','c','h','a','r','a','c','t','e',
+  'r',' ','t','h','a','t',' ','i','s',' ','o','u','t','s','i',
+  'd','e',' ','t','h','e',' ','a','d','o','p','t','e','d',' ',
+  's','u','b','s','e','t','"',' ','a','n','d',#010,'"','c','h',
+  'a','r','a','c','t','e','r','s',' ','t','h','a','t',' ','a',
+  'r','e',' ','n','o','t',' ','w','i','t','h','i','n',' ','t',
+  'h','e',' ','a','d','o','p','t','e','d',' ','s','u','b','s',
+  'e','t',' ','s','h','a','l','l',' ','b','e',' ','i','n','d',
+  'i','c','a','t','e','d',#010,'t','o',' ','t','h','e',' ','u',
+  's','e','r','"',' ','b','y',' ','a',' ','r','e','c','e','i',
+  'v','i','n','g',' ','d','e','v','i','c','e','.',' ','A',' ',
+  'q','u','i','t','e',' ','c','o','m','m','o','n','l','y',' ',
+  'u','s','e','d',' ','a','p','p','r','o','a','c','h',' ','i',
+  'n',#010,'U','T','F','-','8',' ','d','e','c','o','d','e','r',
+  's',' ','i','s',' ','t','o',' ','r','e','p','l','a','c','e',
+  ' ','a','n','y',' ','m','a','l','f','o','r','m','e','d',' ',
+  'U','T','F','-','8',' ','s','e','q','u','e','n','c','e',' ',
+  'b','y',' ','a',#010,'r','e','p','l','a','c','e','m','e','n',
+  't',' ','c','h','a','r','a','c','t','e','r',' ','(','U','+',
+  'F','F','F','D',')',',',' ','w','h','i','c','h',' ','l','o',
+  'o','k','s',' ','a',' ','b','i','t',' ','l','i','k','e',' ',
+  'a','n',' ','i','n','v','e','r','t','e','d',#010,'q','u','e',
+  's','t','i','o','n',' ','m','a','r','k',',',' ','o','r',' ',
+  'a',' ','s','i','m','i','l','a','r',' ','s','y','m','b','o',
+  'l','.',' ','I','t',' ','m','i','g','h','t',' ','b','e',' ',
+  'a',' ','g','o','o','d',' ','i','d','e','a',' ','t','o',#010,
+  'v','i','s','u','a','l','l','y',' ','d','i','s','t','i','n',
+  'g','u','i','s','h',' ','a',' ','m','a','l','f','o','r','m',
+  'e','d',' ','U','T','F','-','8',' ','s','e','q','u','e','n',
+  'c','e',' ','f','r','o','m',' ','a',' ','c','o','r','r','e',
+  'c','t','l','y',#010,'e','n','c','o','d','e','d',' ','U','n',
+  'i','c','o','d','e',' ','c','h','a','r','a','c','t','e','r',
+  ' ','t','h','a','t',' ','i','s',' ','j','u','s','t',' ','n',
+  'o','t',' ','a','v','a','i','l','a','b','l','e',' ','i','n',
+  ' ','t','h','e',' ','c','u','r','r','e','n','t',#010,'f','o',
+  'n','t',' ','b','u','t',' ','o','t','h','e','r','w','i','s',
+  'e',' ','f','u','l','l','y',' ','l','e','g','a','l',',',' ',
+  'e','v','e','n',' ','t','h','o','u','g','h',' ','I','S','O',
+  ' ','1','0','6','4','6','-','1',' ','d','o','e','s','n',#039,
+  't',#010,'m','a','n','d','a','t','e',' ','t','h','i','s','.',
+  ' ','I','n',' ','a','n','y',' ','c','a','s','e',',',' ','j',
+  'u','s','t',' ','i','g','n','o','r','i','n','g',' ','m','a',
+  'l','f','o','r','m','e','d',' ','s','e','q','u','e','n','c',
+  'e','s',' ','o','r',#010,'u','n','a','v','a','i','l','a','b',
+  'l','e',' ','c','h','a','r','a','c','t','e','r','s',' ','d',
+  'o','e','s',' ','n','o','t',' ','c','o','n','f','o','r','m',
+  ' ','t','o',' ','I','S','O',' ','1','0','6','4','6',',',' ',
+  'w','i','l','l',' ','m','a','k','e',#010,'d','e','b','u','g',
+  'g','i','n','g',' ','m','o','r','e',' ','d','i','f','f','i',
+  'c','u','l','t',',',' ','a','n','d',' ','c','a','n',' ','l',
+  'e','a','d',' ','t','o',' ','u','s','e','r',' ','c','o','n',
+  'f','u','s','i','o','n','.',#010,#010,'P','l','e','a','s','e',
+  ' ','c','h','e','c','k',',',' ','w','h','e','t','h','e','r',
+  ' ','a',' ','m','a','l','f','o','r','m','e','d',' ','U','T',
+  'F','-','8',' ','s','e','q','u','e','n','c','e',' ','i','s',
+  ' ','(','1',')',' ','r','e','p','r','e','s','e','n','t','e',
+  'd',' ','a','t',#010,'a','l','l',',',' ','(','2',')',' ','r',
+  'e','p','r','e','s','e','n','t','e','d',' ','b','y',' ','e',
+  'x','a','c','t','l','y',' ','o','n','e',' ','s','i','n','g',
+  'l','e',' ','r','e','p','l','a','c','e','m','e','n','t',' ',
+  'c','h','a','r','a','c','t','e','r',' ','(','o','r',#010,'e',
+  'q','u','i','v','a','l','e','n','t',' ','s','i','g','n','a',
+  'l',')',',',' ','a','n','d',' ','(','3',')',' ','t','h','e',
+  ' ','f','o','l','l','o','w','i','n','g',' ','q','u','o','t',
+  'a','t','i','o','n',' ','m','a','r','k',' ','a','f','t','e',
+  'r',' ','a','n',#010,'i','l','l','e','g','a','l',' ','U','T',
+  'F','-','8',' ','s','e','q','u','e','n','c','e',' ','i','s',
+  ' ','c','o','r','r','e','c','t','l','y',' ','d','i','s','p',
+  'l','a','y','e','d',',',' ','i','.','e','.',' ','p','r','o',
+  'p','e','r',#010,'r','e','s','y','n','c','h','r','o','n','i',
+  'z','a','t','i','o','n',' ','t','a','k','e','s',' ','p','l',
+  'a','c','e',' ','i','m','m','a','g','e','a','t','e','l','y',
+  ' ','a','f','t','e','r',' ','a','n','y',' ','m','a','l','f',
+  'o','r','m','e','d',#010,'s','e','q','u','e','n','c','e','.',
+  ' ','T','h','i','s',' ','f','i','l','e',' ','s','a','y','s',
+  ' ','"','T','H','E',' ','E','N','D','"',' ','i','n',' ','t',
+  'h','e',' ','l','a','s','t',' ','l','i','n','e',',',' ','s',
+  'o',' ','i','f',' ','y','o','u',' ','d','o','n',#039,'t',#010,
+  's','e','e',' ','t','h','a','t',',',' ','y','o','u','r',' ',
+  'd','e','c','o','d','e','r',' ','c','r','a','s','h','e','d',
+  ' ','s','o','m','e','h','o','w',' ','b','e','f','o','r','e',
+  ',',' ','w','h','i','c','h',' ','s','h','o','u','l','d',' ',
+  'a','l','w','a','y','s',' ','b','e',#010,'c','a','u','s','e',
+  ' ','f','o','r',' ','c','o','n','c','e','r','n','.',#010,#010,
+  'A','l','l',' ','l','i','n','e','s',' ','i','n',' ','t','h',
+  'i','s',' ','f','i','l','e',' ','a','r','e',' ','e','x','a',
+  'c','t','l','y',' ','7','9',' ','c','h','a','r','a','c','t',
+  'e','r','s',' ','l','o','n','g',' ','(','p','l','u','s',' ',
+  't','h','e',' ','l','i','n','e',#010,'f','e','e','d',')','.',
+  ' ','I','n',' ','a','d','d','i','t','i','o','n',',',' ','a',
+  'l','l',' ','l','i','n','e','s',' ','e','n','d',' ','w','i',
+  't','h',' ','"','|','"',',',' ','e','x','c','e','p','t',' ',
+  'f','o','r',' ','t','h','e',' ','t','w','o',' ','t','e','s',
+  't',#010,'l','i','n','e','s',' ','2','.','1','.','1',' ','a',
+  'n','d',' ','2','.','2','.','1',',',' ','w','h','i','c','h',
+  ' ','c','o','n','t','a','i','n',' ','n','o','n','-','p','r',
+  'i','n','t','a','b','l','e',' ','A','S','C','I','I',' ','c',
+  'o','n','t','r','o','l','s',#010,'U','+','0','0','0','0',' ',
+  'a','n','d',' ','U','+','0','0','7','F','.',' ','I','f',' ',
+  'y','o','u',' ','d','i','s','p','l','a','y',' ','t','h','i',
+  's',' ','f','i','l','e',' ','w','i','t','h',' ','a',' ','f',
+  'i','x','e','d','-','w','i','d','t','h',' ','f','o','n','t',
+  ',',#010,'t','h','e','s','e',' ','"','|','"',' ','c','h','a',
+  'r','a','c','t','e','r','s',' ','s','h','o','u','l','d',' ',
+  'a','l','l',' ','l','i','n','e',' ','u','p',' ','i','n',' ',
+  'c','o','l','u','m','n',' ','7','9',' ','(','r','i','g','h',
+  't',' ','m','a','r','g','i','n',')','.',#010,'T','h','i','s',
+  ' ','a','l','l','o','w','s',' ','y','o','u',' ','t','o',' ',
+  't','e','s','t',' ','q','u','i','c','k','l','y',',',' ','w',
+  'h','e','t','h','e','r',' ','y','o','u','r',' ','U','T','F',
+  '-','8',' ','d','e','c','o','d','e','r',' ','f','i','n','d',
+  's',' ','t','h','e',#010,'c','o','r','r','e','c','t',' ','n',
+  'u','m','b','e','r',' ','o','f',' ','c','h','a','r','a','c',
+  't','e','r','s',' ','i','n',' ','e','v','e','r','y',' ','l',
+  'i','n','e',',',' ','t','h','a','t',' ','i','s',' ','w','h',
+  'e','t','h','e','r',' ','e','a','c','h',#010,'m','a','l','f',
+  'o','r','m','e','d',' ','s','e','q','u','e','n','c','e','s',
+  ' ','i','s',' ','r','e','p','l','a','c','e','d',' ','b','y',
+  ' ','a',' ','s','i','n','g','l','e',' ','r','e','p','l','a',
+  'c','e','m','e','n','t',' ','c','h','a','r','a','c','t','e',
+  'r','.',#010,#010,'N','o','t','e',' ','t','h','a','t',' ','a',
+  's',' ','a','n',' ','a','l','t','e','r','n','a','t','i','v',
+  'e',' ','t','o',' ','t','h','e',' ','n','o','t','i','o','n',
+  ' ','o','f',' ','m','a','l','f','o','r','m','e','d',' ','s',
+  'e','q','u','e','n','c','e',' ','u','s','e','d',#010,'h','e',
+  'r','e',',',' ','i','t',' ','i','s',' ','a','l','s','o',' ',
+  'a',' ','p','e','r','f','e','c','t','l','y',' ','a','c','c',
+  'e','p','t','a','b','l','e',' ','(','a','n','d',' ','i','n',
+  ' ','s','o','m','e',' ','s','i','t','u','a','t','i','o','n',
+  's',' ','e','v','e','n',#010,'p','r','e','f','e','r','a','b',
+  'l','e',')',' ','s','o','l','u','t','i','o','n',' ','t','o',
+  ' ','r','e','p','r','e','s','e','n','t',' ','e','a','c','h',
+  ' ','i','n','d','i','v','i','d','u','a','l',' ','b','y','t',
+  'e',' ','o','f',' ','a',' ','m','a','l','f','o','r','m','e',
+  'd',#010,'s','e','q','u','e','n','c','e',' ','b','y',' ','a',
+  ' ','r','e','p','l','a','c','e','m','e','n','t',' ','c','h',
+  'a','r','a','c','t','e','r','.',' ','I','f',' ','y','o','u',
+  ' ','f','o','l','l','o','w',' ','t','h','i','s',' ','s','t',
+  'r','a','t','e','g','y',' ','i','n',#010,'y','o','u','r',' ',
+  'd','e','c','o','d','e','r',',',' ','t','h','e','n',' ','p',
+  'l','e','a','s','e',' ','i','g','n','o','r','e',' ','t','h',
+  'e',' ','"','|','"',' ','c','o','l','u','m','n','.',#010,#010,
+  #010,'H','e','r','e',' ','c','o','m','e',' ','t','h','e',' ',
+  't','e','s','t','s',':',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ','|',#010,' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'1',' ',' ','S',
+  'o','m','e',' ','c','o','r','r','e','c','t',' ','U','T','F',
+  '-','8',' ','t','e','x','t',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',
+  #010,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ','|',#010,'Y','o','u',' ','s','h','o','u','l',
+  'd',' ','s','e','e',' ','t','h','e',' ','G','r','e','e','k',
+  ' ','w','o','r','d',' ',#039,'k','o','s','m','e',#039,':',' ',
+  ' ',' ',' ',' ',' ',' ','"',#206,#186,#225,#189,#185,#207,#131,#206,
+  #188,#206,#181,'"',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  '|',#010,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ','|',#010,'2',' ',' ','B','o','u','n','d',
+  'a','r','y',' ','c','o','n','d','i','t','i','o','n',' ','t',
+  'e','s','t',' ','c','a','s','e','s',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  '|',#010,'2','.','1',' ',' ','F','i','r','s','t',' ','p','o',
+  's','s','i','b','l','e',' ','s','e','q','u','e','n','c','e',
+  ' ','o','f',' ','a',' ','c','e','r','t','a','i','n',' ','l',
+  'e','n','g','t','h',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ','|',#010,' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'2','.','1',
+  '.','1',' ',' ','1',' ','b','y','t','e',' ',' ','(','U','-',
+  '0','0','0','0','0','0','0','0',')',':',' ',' ',' ',' ',' ',
+  ' ',' ',' ','"',#000,'"',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',#010,'2','.','1','.','2',' ',' ','2',' ','b','y','t','e',
+  's',' ','(','U','-','0','0','0','0','0','0','8','0',')',':',
+  ' ',' ',' ',' ',' ',' ',' ',' ','"',#194,#128,'"',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ','|',#010,'2','.','1','.','3',' ',' ',
+  '3',' ','b','y','t','e','s',' ','(','U','-','0','0','0','0',
+  '0','8','0','0',')',':',' ',' ',' ',' ',' ',' ',' ',' ','"',
+  #224,#160,#128,'"',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,
+  '2','.','1','.','4',' ',' ','4',' ','b','y','t','e','s',' ',
+  '(','U','-','0','0','0','1','0','0','0','0',')',':',' ',' ',
+  ' ',' ',' ',' ',' ',' ','"',#240,#144,#128,#128,'"',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ','|',#010,'2','.','1','.','5',' ',' ',
+  '5',' ','b','y','t','e','s',' ','(','U','-','0','0','2','0',
+  '0','0','0','0',')',':',' ',' ',' ',' ',' ',' ',' ',' ','"',
+  #248,#136,#128,#128,#128,'"',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  '|',#010,'2','.','1','.','6',' ',' ','6',' ','b','y','t','e',
+  's',' ','(','U','-','0','4','0','0','0','0','0','0',')',':',
+  ' ',' ',' ',' ',' ',' ',' ',' ','"',#252,#132,#128,#128,#128,#128,
+  '"',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  '|',#010,'2','.','2',' ',' ','L','a','s','t',' ','p','o','s',
+  's','i','b','l','e',' ','s','e','q','u','e','n','c','e',' ',
+  'o','f',' ','a',' ','c','e','r','t','a','i','n',' ','l','e',
+  'n','g','t','h',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ','|',#010,' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'2','.','2',
+  '.','1',' ',' ','1',' ','b','y','t','e',' ',' ','(','U','-',
+  '0','0','0','0','0','0','7','F',')',':',' ',' ',' ',' ',' ',
+  ' ',' ',' ','"','','"',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',#010,'2','.','2','.','2',' ',' ','2',' ','b','y','t','e',
+  's',' ','(','U','-','0','0','0','0','0','7','F','F',')',':',
+  ' ',' ',' ',' ',' ',' ',' ',' ','"',#223,#191,'"',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ','|',#010,'2','.','2','.','3',' ',' ',
+  '3',' ','b','y','t','e','s',' ','(','U','-','0','0','0','0',
+  'F','F','F','F',')',':',' ',' ',' ',' ',' ',' ',' ',' ','"',
+  #239,#191,#191,'"',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,
+  '2','.','2','.','4',' ',' ','4',' ','b','y','t','e','s',' ',
+  '(','U','-','0','0','1','F','F','F','F','F',')',':',' ',' ',
+  ' ',' ',' ',' ',' ',' ','"',#247,#191,#191,#191,'"',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ','|',#010,'2','.','2','.','5',' ',' ',
+  '5',' ','b','y','t','e','s',' ','(','U','-','0','3','F','F',
+  'F','F','F','F',')',':',' ',' ',' ',' ',' ',' ',' ',' ','"',
+  #251,#191,#191,#191,#191,'"',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  '|',#010,'2','.','2','.','6',' ',' ','6',' ','b','y','t','e',
+  's',' ','(','U','-','7','F','F','F','F','F','F','F',')',':',
+  ' ',' ',' ',' ',' ',' ',' ',' ','"',#253,#191,#191,#191,#191,#191,
+  '"',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  '|',#010,'2','.','3',' ',' ','O','t','h','e','r',' ','b','o',
+  'u','n','d','a','r','y',' ','c','o','n','d','i','t','i','o',
+  'n','s',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ','|',#010,' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'2','.','3',
+  '.','1',' ',' ','U','-','0','0','0','0','D','7','F','F',' ',
+  '=',' ','e','d',' ','9','f',' ','b','f',' ','=',' ','"',#237,
+  #159,#191,'"',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,'2','.','3','.','2',' ',' ','U','-','0','0',
+  '0','0','E','0','0','0',' ','=',' ','e','e',' ','8','0',' ',
+  '8','0',' ','=',' ','"',#238,#128,#128,'"',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'2','.','3','.',
+  '3',' ',' ','U','-','0','0','0','0','F','F','F','D',' ','=',
+  ' ','e','f',' ','b','f',' ','b','d',' ','=',' ','"',#239,#191,
+  #189,'"',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ','|',#010,'2','.','3','.','4',' ',' ','U','-','0','0','1',
+  '0','F','F','F','F',' ','=',' ','f','4',' ','8','f',' ','b',
+  'f',' ','b','f',' ','=',' ','"',#244,#143,#191,#191,'"',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'2','.','3','.',
+  '5',' ',' ','U','-','0','0','1','1','0','0','0','0',' ','=',
+  ' ','f','4',' ','9','0',' ','8','0',' ','8','0',' ','=',' ',
+  '"',#244,#144,#128,#128,'"',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,'3',' ',' ','M','a','l',
+  'f','o','r','m','e','d',' ','s','e','q','u','e','n','c','e',
+  's',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,'3','.','1',' ',' ','U','n','e','x','p','e',
+  'c','t','e','d',' ','c','o','n','t','i','n','u','a','t','i',
+  'o','n',' ','b','y','t','e','s',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'E',
+  'a','c','h',' ','u','n','e','x','p','e','c','t','e','d',' ',
+  'c','o','n','t','i','n','u','a','t','i','o','n',' ','b','y',
+  't','e',' ','s','h','o','u','l','d',' ','b','e',' ','s','e',
+  'p','a','r','a','t','e','l','y',' ','s','i','g','n','a','l',
+  'l','e','d',' ','a','s',' ','a',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,'m','a','l','f','o','r','m','e','d',' ','s',
+  'e','q','u','e','n','c','e',' ','o','f',' ','i','t','s',' ',
+  'o','w','n','.',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'3',
+  '.','1','.','1',' ',' ','F','i','r','s','t',' ','c','o','n',
+  't','i','n','u','a','t','i','o','n',' ','b','y','t','e',' ',
+  '0','x','8','0',':',' ','"',#128,'"',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,'3','.','1','.','2',' ',' ','L','a','s','t',
+  ' ',' ','c','o','n','t','i','n','u','a','t','i','o','n',' ',
+  'b','y','t','e',' ','0','x','b','f',':',' ','"',#191,'"',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'3',
+  '.','1','.','3',' ',' ','2',' ','c','o','n','t','i','n','u',
+  'a','t','i','o','n',' ','b','y','t','e','s',':',' ','"',#128,
+  #191,'"',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,'3','.','1','.','4',' ',' ','3',' ','c','o',
+  'n','t','i','n','u','a','t','i','o','n',' ','b','y','t','e',
+  's',':',' ','"',#128,#191,#128,'"',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,'3','.','1','.','5',' ',
+  ' ','4',' ','c','o','n','t','i','n','u','a','t','i','o','n',
+  ' ','b','y','t','e','s',':',' ','"',#128,#191,#128,#191,'"',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'3',
+  '.','1','.','6',' ',' ','5',' ','c','o','n','t','i','n','u',
+  'a','t','i','o','n',' ','b','y','t','e','s',':',' ','"',#128,
+  #191,#128,#191,#128,'"',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,'3','.','1','.','7',' ',' ','6',' ','c','o',
+  'n','t','i','n','u','a','t','i','o','n',' ','b','y','t','e',
+  's',':',' ','"',#128,#191,#128,#191,#128,#191,'"',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,'3','.','1','.','8',' ',
+  ' ','7',' ','c','o','n','t','i','n','u','a','t','i','o','n',
+  ' ','b','y','t','e','s',':',' ','"',#128,#191,#128,#191,#128,#191,
+  #128,'"',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,'3','.','1','.','9',' ',' ','S','e','q','u',
+  'e','n','c','e',' ','o','f',' ','a','l','l',' ','6','4',' ',
+  'p','o','s','s','i','b','l','e',' ','c','o','n','t','i','n',
+  'u','a','t','i','o','n',' ','b','y','t','e','s',' ','(','0',
+  'x','8','0','-','0','x','b','f',')',':',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,' ',
+  ' ',' ','"',#128,#129,#130,#131,#132,#133,#134,#135,#136,#137,#138,#139,
+  #140,#141,#142,#143,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,' ',' ',' ',' ',#144,#145,#146,#147,#148,#149,#150,
+  #151,#152,#153,#154,#155,#156,#157,#158,#159,' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,' ',' ',' ',' ',#160,#161,
+  #162,#163,#164,#165,#166,#167,#168,#169,#170,#171,#172,#173,#174,#175,' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,' ',
+  ' ',' ',' ',#176,#177,#178,#179,#180,#181,#182,#183,#184,#185,#186,#187,
+  #188,#189,#190,#191,'"',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,'3','.','2',' ',' ','L',
+  'o','n','e','l','y',' ','s','t','a','r','t',' ','c','h','a',
+  'r','a','c','t','e','r','s',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,'3','.','2','.','1',' ',' ','A','l','l',' ',
+  '3','2',' ','f','i','r','s','t',' ','b','y','t','e','s',' ',
+  'o','f',' ','2','-','b','y','t','e',' ','s','e','q','u','e',
+  'n','c','e','s',' ','(','0','x','c','0','-','0','x','d','f',
+  ')',',',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,' ',' ',' ',' ',' ',' ',
+  ' ','e','a','c','h',' ','f','o','l','l','o','w','e','d',' ',
+  'b','y',' ','a',' ','s','p','a','c','e',' ','c','h','a','r',
+  'a','c','t','e','r',':',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,' ',' ',' ','"',#192,' ',#193,' ',#194,' ',#195,
+  ' ',#196,' ',#197,' ',#198,' ',#199,' ',#200,' ',#201,' ',#202,' ',
+  #203,' ',#204,' ',#205,' ',#206,' ',#207,' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,' ',' ',' ',' ',#208,' ',
+  #209,' ',#210,' ',#211,' ',#212,' ',#213,' ',#214,' ',#215,' ',#216,
+  ' ',#217,' ',#218,' ',#219,' ',#220,' ',#221,' ',#222,' ',#223,' ',
+  '"',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,'3','.','2','.','2',' ',' ','A','l','l',' ',
+  '1','6',' ','f','i','r','s','t',' ','b','y','t','e','s',' ',
+  'o','f',' ','3','-','b','y','t','e',' ','s','e','q','u','e',
+  'n','c','e','s',' ','(','0','x','e','0','-','0','x','e','f',
+  ')',',',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,' ',' ',' ',' ',' ',' ',
+  ' ','e','a','c','h',' ','f','o','l','l','o','w','e','d',' ',
+  'b','y',' ','a',' ','s','p','a','c','e',' ','c','h','a','r',
+  'a','c','t','e','r',':',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,' ',' ',' ','"',#224,' ',#225,' ',#226,' ',#227,
+  ' ',#228,' ',#229,' ',#230,' ',#231,' ',#232,' ',#233,' ',#234,' ',
+  #235,' ',#236,' ',#237,' ',#238,' ',#239,' ','"',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'3',
+  '.','2','.','3',' ',' ','A','l','l',' ','8',' ','f','i','r',
+  's','t',' ','b','y','t','e','s',' ','o','f',' ','4','-','b',
+  'y','t','e',' ','s','e','q','u','e','n','c','e','s',' ','(',
+  '0','x','f','0','-','0','x','f','7',')',',',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,' ',' ',' ',' ',' ',' ',' ','e','a','c','h',
+  ' ','f','o','l','l','o','w','e','d',' ','b','y',' ','a',' ',
+  's','p','a','c','e',' ','c','h','a','r','a','c','t','e','r',
+  ':',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,' ',
+  ' ',' ','"',#240,' ',#241,' ',#242,' ',#243,' ',#244,' ',#245,' ',
+  #246,' ',#247,' ','"',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,'3','.','2','.','4',' ',
+  ' ','A','l','l',' ','4',' ','f','i','r','s','t',' ','b','y',
+  't','e','s',' ','o','f',' ','5','-','b','y','t','e',' ','s',
+  'e','q','u','e','n','c','e','s',' ','(','0','x','f','8','-',
+  '0','x','f','b',')',',',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,' ',
+  ' ',' ',' ',' ',' ',' ','e','a','c','h',' ','f','o','l','l',
+  'o','w','e','d',' ','b','y',' ','a',' ','s','p','a','c','e',
+  ' ','c','h','a','r','a','c','t','e','r',':',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,' ',' ',' ','"',#248,' ',
+  #249,' ',#250,' ',#251,' ','"',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,'3','.','2','.','5',' ',' ','A','l','l',' ',
+  '2',' ','f','i','r','s','t',' ','b','y','t','e','s',' ','o',
+  'f',' ','6','-','b','y','t','e',' ','s','e','q','u','e','n',
+  'c','e','s',' ','(','0','x','f','c','-','0','x','f','d',')',
+  ',',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,' ',' ',' ',' ',' ',' ',
+  ' ','e','a','c','h',' ','f','o','l','l','o','w','e','d',' ',
+  'b','y',' ','a',' ','s','p','a','c','e',' ','c','h','a','r',
+  'a','c','t','e','r',':',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,' ',' ',' ','"',#252,' ',#253,' ','"',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'3',
+  '.','3',' ',' ','S','e','q','u','e','n','c','e','s',' ','w',
+  'i','t','h',' ','l','a','s','t',' ','c','o','n','t','i','n',
+  'u','a','t','i','o','n',' ','b','y','t','e',' ','m','i','s',
+  's','i','n','g',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,'A','l','l',' ','b','y',
+  't','e','s',' ','o','f',' ','a','n',' ','i','n','c','o','m',
+  'p','l','e','t','e',' ','s','e','q','u','e','n','c','e',' ',
+  's','h','o','u','l','d',' ','b','e',' ','s','i','g','n','a',
+  'l','l','e','d',' ','a','s',' ','a',' ','s','i','n','g','l',
+  'e',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'m',
+  'a','l','f','o','r','m','e','d',' ','s','e','q','u','e','n',
+  'c','e',',',' ','i','.','e','.',',',' ','y','o','u',' ','s',
+  'h','o','u','l','d',' ','s','e','e',' ','o','n','l','y',' ',
+  'a',' ','s','i','n','g','l','e',' ','r','e','p','l','a','c',
+  'e','m','e','n','t',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,'c','h','a','r','a','c','t','e','r',' ','i',
+  'n',' ','e','a','c','h',' ','o','f',' ','t','h','e',' ','n',
+  'e','x','t',' ','1','0',' ','t','e','s','t','s','.',' ','(',
+  'C','h','a','r','a','c','t','e','r','s',' ','a','s',' ','i',
+  'n',' ','s','e','c','t','i','o','n',' ','2',')',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'3',
+  '.','3','.','1',' ',' ','2','-','b','y','t','e',' ','s','e',
+  'q','u','e','n','c','e',' ','w','i','t','h',' ','l','a','s',
+  't',' ','b','y','t','e',' ','m','i','s','s','i','n','g',' ',
+  '(','U','+','0','0','0','0',')',':',' ',' ',' ',' ',' ','"',
+  #192,'"',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,'3','.','3','.','2',' ',' ','3','-','b','y',
+  't','e',' ','s','e','q','u','e','n','c','e',' ','w','i','t',
+  'h',' ','l','a','s','t',' ','b','y','t','e',' ','m','i','s',
+  's','i','n','g',' ','(','U','+','0','0','0','0',')',':',' ',
+  ' ',' ',' ',' ','"',#224,#128,'"',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'3','.','3','.','3',
+  ' ',' ','4','-','b','y','t','e',' ','s','e','q','u','e','n',
+  'c','e',' ','w','i','t','h',' ','l','a','s','t',' ','b','y',
+  't','e',' ','m','i','s','s','i','n','g',' ','(','U','+','0',
+  '0','0','0',')',':',' ',' ',' ',' ',' ','"',#240,#128,#128,'"',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  '|',#010,'3','.','3','.','4',' ',' ','5','-','b','y','t','e',
+  ' ','s','e','q','u','e','n','c','e',' ','w','i','t','h',' ',
+  'l','a','s','t',' ','b','y','t','e',' ','m','i','s','s','i',
+  'n','g',' ','(','U','+','0','0','0','0',')',':',' ',' ',' ',
+  ' ',' ','"',#248,#128,#128,#128,'"',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'3','.','3','.','5',
+  ' ',' ','6','-','b','y','t','e',' ','s','e','q','u','e','n',
+  'c','e',' ','w','i','t','h',' ','l','a','s','t',' ','b','y',
+  't','e',' ','m','i','s','s','i','n','g',' ','(','U','+','0',
+  '0','0','0',')',':',' ',' ',' ',' ',' ','"',#252,#128,#128,#128,
+  #128,'"',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,'3','.','3','.','6',' ',' ','2','-','b','y',
+  't','e',' ','s','e','q','u','e','n','c','e',' ','w','i','t',
+  'h',' ','l','a','s','t',' ','b','y','t','e',' ','m','i','s',
+  's','i','n','g',' ','(','U','-','0','0','0','0','0','7','F',
+  'F',')',':',' ','"',#223,'"',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,'3','.','3','.','7',' ',
+  ' ','3','-','b','y','t','e',' ','s','e','q','u','e','n','c',
+  'e',' ','w','i','t','h',' ','l','a','s','t',' ','b','y','t',
+  'e',' ','m','i','s','s','i','n','g',' ','(','U','-','0','0',
+  '0','0','F','F','F','F',')',':',' ','"',#239,#191,'"',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,
+  '3','.','3','.','8',' ',' ','4','-','b','y','t','e',' ','s',
+  'e','q','u','e','n','c','e',' ','w','i','t','h',' ','l','a',
+  's','t',' ','b','y','t','e',' ','m','i','s','s','i','n','g',
+  ' ','(','U','-','0','0','1','F','F','F','F','F',')',':',' ',
+  '"',#247,#191,#191,'"',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ','|',#010,'3','.','3','.','9',' ',' ','5',
+  '-','b','y','t','e',' ','s','e','q','u','e','n','c','e',' ',
+  'w','i','t','h',' ','l','a','s','t',' ','b','y','t','e',' ',
+  'm','i','s','s','i','n','g',' ','(','U','-','0','3','F','F',
+  'F','F','F','F',')',':',' ','"',#251,#191,#191,#191,'"',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,
+  '3','.','3','.','1','0',' ','6','-','b','y','t','e',' ','s',
+  'e','q','u','e','n','c','e',' ','w','i','t','h',' ','l','a',
+  's','t',' ','b','y','t','e',' ','m','i','s','s','i','n','g',
+  ' ','(','U','-','7','F','F','F','F','F','F','F',')',':',' ',
+  '"',#253,#191,#191,#191,#191,'"',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'3',
+  '.','4',' ',' ','C','o','n','c','a','t','e','n','a','t','i',
+  'o','n',' ','o','f',' ','i','n','c','o','m','p','l','e','t',
+  'e',' ','s','e','q','u','e','n','c','e','s',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,'A','l','l',' ','t','h',
+  'e',' ','1','0',' ','s','e','q','u','e','n','c','e','s',' ',
+  'o','f',' ','3','.','3',' ','c','o','n','c','a','t','e','n',
+  'a','t','e','d',',',' ','y','o','u',' ','s','h','o','u','l',
+  'd',' ','s','e','e',' ','1','0',' ','m','a','l','f','o','r',
+  'm','e','d',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'s',
+  'e','q','u','e','n','c','e','s',' ','b','e','i','n','g',' ',
+  's','i','g','n','a','l','l','e','d',':',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,' ',' ',' ','"',#192,#224,
+  #128,#240,#128,#128,#248,#128,#128,#128,#252,#128,#128,#128,#128,#223,#239,
+  #191,#247,#191,#191,#251,#191,#191,#191,#253,#191,#191,#191,#191,'"',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,'3','.','5',' ',' ','I',
+  'm','p','o','s','s','i','b','l','e',' ','b','y','t','e','s',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,'T','h','e',' ','f','o','l','l','o','w','i',
+  'n','g',' ','t','w','o',' ','b','y','t','e','s',' ','c','a',
+  'n','n','o','t',' ','a','p','p','e','a','r',' ','i','n',' ',
+  'a',' ','c','o','r','r','e','c','t',' ','U','T','F','-','8',
+  ' ','s','t','r','i','n','g',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'3',
+  '.','5','.','1',' ',' ','f','e',' ','=',' ','"',#254,'"',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,'3','.','5','.','2',' ',' ','f','f',' ','=',
+  ' ','"',#255,'"',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,'3','.','5','.','3',' ',
+  ' ','f','e',' ','f','e',' ','f','f',' ','f','f',' ','=',' ',
+  '"',#254,#254,#255,#255,'"',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,'4',' ',' ','O','v','e','r','l','o','n','g',
+  ' ','s','e','q','u','e','n','c','e','s',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'T',
+  'h','e',' ','f','o','l','l','o','w','i','n','g',' ','s','e',
+  'q','u','e','n','c','e','s',' ','a','r','e',' ','n','o','t',
+  ' ','m','a','l','f','o','r','m','e','d',' ','a','c','c','o',
+  'r','d','i','n','g',' ','t','o',' ','t','h','e',' ','l','e',
+  't','t','e','r',' ','o','f',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,'t','h','e',' ','U','n','i','c','o','d','e',
+  ' ','2','.','0',' ','s','t','a','n','d','a','r','d','.',' ',
+  'H','o','w','e','v','e','r',',',' ','t','h','e','y',' ','a',
+  'r','e',' ','l','o','n','g','e','r',' ','t','h','e','n',' ',
+  'n','e','c','e','s','s','a','r','y',' ','a','n','d',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,'a',' ','c','o','r','r',
+  'e','c','t',' ','U','T','F','-','8',' ','e','n','c','o','d',
+  'e','r',' ','i','s',' ','n','o','t',' ','a','l','l','o','w',
+  'e','d',' ','t','o',' ','p','r','o','d','u','c','e',' ','t',
+  'h','e','m','.',' ','A',' ','"','s','a','f','e',' ','U','T',
+  'F','-','8',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'d',
+  'e','c','o','d','e','r','"',' ','s','h','o','u','l','d',' ',
+  'r','e','j','e','c','t',' ','t','h','e','m',' ','j','u','s',
+  't',' ','l','i','k','e',' ','m','a','l','f','o','r','m','e',
+  'd',' ','s','e','q','u','e','n','c','e','s',' ','f','o','r',
+  ' ','t','w','o',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,'r','e','a','s','o','n','s',':',' ','(','1',
+  ')',' ','I','t',' ','h','e','l','p','s',' ','t','o',' ','d',
+  'e','b','u','g',' ','a','p','p','l','i','c','a','t','i','o',
+  'n','s',' ','i','f',' ','o','v','e','r','l','o','n','g',' ',
+  's','e','q','u','e','n','c','e','s',' ','a','r','e',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,'n','o','t',' ','t','r',
+  'e','a','t','e','d',' ','a','s',' ','v','a','l','i','d',' ',
+  'r','e','p','r','e','s','e','n','t','a','t','i','o','n','s',
+  ' ','o','f',' ','c','h','a','r','a','c','t','e','r','s',',',
+  ' ','b','e','c','a','u','s','e',' ','t','h','i','s',' ','h',
+  'e','l','p','s',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'t',
+  'o',' ','s','p','o','t',' ','p','r','o','b','l','e','m','s',
+  ' ','m','o','r','e',' ','q','u','i','c','k','l','y','.',' ',
+  '(','2',')',' ','O','v','e','r','l','o','n','g',' ','s','e',
+  'q','u','e','n','c','e','s',' ','p','r','o','v','i','d','e',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,'a','l','t','e','r','n','a','t','i','v','e',
+  ' ','r','e','p','r','e','s','e','n','t','a','t','i','o','n',
+  's',' ','o','f',' ','c','h','a','r','a','c','t','e','r','s',
+  ',',' ','t','h','a','t',' ','c','o','u','l','d',' ','m','a',
+  'l','i','c','i','o','u','s','l','y',' ','b','e',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,'u','s','e','d',' ','t',
+  'o',' ','b','y','p','a','s','s',' ','f','i','l','t','e','r',
+  's',' ','t','h','a','t',' ','c','h','e','c','k',' ','o','n',
+  'l','y',' ','f','o','r',' ','A','S','C','I','I',' ','c','h',
+  'a','r','a','c','t','e','r','s','.',' ','F','o','r',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'i',
+  'n','s','t','a','n','c','e',',',' ','a',' ','2','-','b','y',
+  't','e',' ','e','n','c','o','d','e','d',' ','l','i','n','e',
+  ' ','f','e','e','d',' ','(','L','F',')',' ','w','o','u','l',
+  'd',' ','n','o','t',' ','b','e',' ','c','a','u','g','h','t',
+  ' ','b','y',' ','a',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,'l','i','n','e',' ','c','o','u','n','t','e',
+  'r',' ','t','h','a','t',' ','c','o','u','n','t','s',' ','o',
+  'n','l','y',' ','0','x','0','a',' ','b','y','t','e','s',',',
+  ' ','b','u','t',' ','i','t',' ','w','o','u','l','d',' ','s',
+  't','i','l','l',' ','b','e',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,'p','r','o','c','e','s',
+  's','e','d',' ','a','s',' ','a',' ','l','i','n','e',' ','f',
+  'e','e','d',' ','b','y',' ','a','n',' ','u','n','s','a','f',
+  'e',' ','U','T','F','-','8',' ','d','e','c','o','d','e','r',
+  ' ','l','a','t','e','r',' ','i','n',' ','t','h','e',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'p',
+  'i','p','e','l','i','n','e','.',' ','F','r','o','m',' ','a',
+  ' ','s','e','c','u','r','i','t','y',' ','p','o','i','n','t',
+  ' ','o','f',' ','v','i','e','w',',',' ','A','S','C','I','I',
+  ' ','c','o','m','p','a','t','i','b','i','l','i','t','y',' ',
+  'o','f',' ','U','T','F','-','8',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,'s','e','q','u','e','n','c','e','s',' ','m',
+  'e','a','n','s',' ','a','l','s','o',',',' ','t','h','a','t',
+  ' ','A','S','C','I','I',' ','c','h','a','r','a','c','t','e',
+  'r','s',' ','a','r','e',' ','*','o','n','l','y','*',' ','a',
+  'l','l','o','w','e','d',' ','t','o',' ','b','e',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,'r','e','p','r','e','s',
+  'e','n','t','e','d',' ','b','y',' ','A','S','C','I','I',' ',
+  'b','y','t','e','s',' ','i','n',' ','t','h','e',' ','r','a',
+  'n','g','e',' ','0','x','0','0','-','0','x','7','f','.',' ',
+  'T','o',' ','e','n','s','u','r','e',' ','t','h','i','s',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'a',
+  's','p','e','c','t',' ','o','f',' ','A','S','C','I','I',' ',
+  'c','o','m','p','a','t','i','b','i','l','i','t','y',',',' ',
+  'u','s','e',' ','o','n','l','y',' ','"','s','a','f','e',' ',
+  'U','T','F','-','8',' ','d','e','c','o','d','e','r','s','"',
+  ' ','t','h','a','t',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,'r','e','j','e','c','t',' ','o','v','e','r',
+  'l','o','n','g',' ','U','T','F','-','8',' ','s','e','q','u',
+  'e','n','c','e','s',' ','f','o','r',' ','w','h','i','c','h',
+  ' ','a',' ','s','h','o','r','t','e','r',' ','e','n','c','o',
+  'd','i','n','g',' ','e','x','i','s','t','s','.',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'4',
+  '.','1',' ',' ','E','x','a','m','p','l','e','s',' ','o','f',
+  ' ','a','n',' ','o','v','e','r','l','o','n','g',' ','A','S',
+  'C','I','I',' ','c','h','a','r','a','c','t','e','r',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,'W','i','t','h',' ','a',
+  ' ','s','a','f','e',' ','U','T','F','-','8',' ','d','e','c',
+  'o','d','e','r',',',' ','a','l','l',' ','o','f',' ','t','h',
+  'e',' ','f','o','l','l','o','w','i','n','g',' ','f','i','v',
+  'e',' ','o','v','e','r','l','o','n','g',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'r',
+  'e','p','r','e','s','e','n','t','a','t','i','o','n','s',' ',
+  'o','f',' ','t','h','e',' ','A','S','C','I','I',' ','c','h',
+  'a','r','a','c','t','e','r',' ','s','l','a','s','h',' ','(',
+  '"','/','"',')',' ','s','h','o','u','l','d',' ','b','e',' ',
+  'r','e','j','e','c','t','e','d',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,'l','i','k','e',' ','a',' ','m','a','l','f',
+  'o','r','m','e','d',' ','U','T','F','-','8',' ','s','e','q',
+  'u','e','n','c','e',',',' ','f','o','r',' ','i','n','s','t',
+  'a','n','c','e',' ','b','y',' ','s','u','b','s','t','i','t',
+  'u','t','i','n','g',' ','i','t',' ','w','i','t','h',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,'a',' ','r','e','p','l',
+  'a','c','e','m','e','n','t',' ','c','h','a','r','a','c','t',
+  'e','r','.',' ','I','f',' ','y','o','u',' ','s','e','e',' ',
+  'a',' ','s','l','a','s','h',' ','b','e','l','o','w',',',' ',
+  'y','o','u',' ','d','o',' ','n','o','t',' ','h','a','v','e',
+  ' ','a',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'s',
+  'a','f','e',' ','U','T','F','-','8',' ','d','e','c','o','d',
+  'e','r','!',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,'4','.','1','.','1',' ',
+  'U','+','0','0','2','F',' ','=',' ','c','0',' ','a','f',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','=',' ','"',
+  #192,#175,'"',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,
+  '4','.','1','.','2',' ','U','+','0','0','2','F',' ','=',' ',
+  'e','0',' ','8','0',' ','a','f',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ','=',' ','"',#224,#128,#175,'"',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ','|',#010,'4','.','1','.','3',' ','U','+',
+  '0','0','2','F',' ','=',' ','f','0',' ','8','0',' ','8','0',
+  ' ','a','f',' ',' ',' ',' ',' ',' ',' ','=',' ','"',#240,#128,
+  #128,#175,'"',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,
+  '4','.','1','.','4',' ','U','+','0','0','2','F',' ','=',' ',
+  'f','8',' ','8','0',' ','8','0',' ','8','0',' ','a','f',' ',
+  ' ',' ',' ','=',' ','"',#248,#128,#128,#128,#175,'"',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,'4','.','1','.','5',' ',
+  'U','+','0','0','2','F',' ','=',' ','f','c',' ','8','0',' ',
+  '8','0',' ','8','0',' ','8','0',' ','a','f',' ','=',' ','"',
+  #252,#128,#128,#128,#128,#175,'"',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,'4','.','2',' ',' ','M',
+  'a','x','i','m','u','m',' ','o','v','e','r','l','o','n','g',
+  ' ','s','e','q','u','e','n','c','e','s',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,'B','e','l','o','w',' ','y','o','u',' ','s',
+  'e','e',' ','t','h','e',' ','h','i','g','h','e','s','t',' ',
+  'U','n','i','c','o','d','e',' ','v','a','l','u','e',' ','t',
+  'h','a','t',' ','i','s',' ','s','t','i','l','l',' ','r','e',
+  's','u','l','t','i','n','g',' ','i','n',' ','a','n',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,'o','v','e','r','l','o',
+  'n','g',' ','s','e','q','u','e','n','c','e',' ','i','f',' ',
+  'r','e','p','r','e','s','e','n','t','e','d',' ','w','i','t',
+  'h',' ','t','h','e',' ','g','i','v','e','n',' ','n','u','m',
+  'b','e','r',' ','o','f',' ','b','y','t','e','s','.',' ','T',
+  'h','i','s',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'i',
+  's',' ','a',' ','b','o','u','n','d','a','r','y',' ','t','e',
+  's','t',' ','f','o','r',' ','s','a','f','e',' ','U','T','F',
+  '-','8',' ','d','e','c','o','d','e','r','s','.',' ','A','l',
+  'l',' ','f','i','v','e',' ','c','h','a','r','a','c','t','e',
+  'r','s',' ','s','h','o','u','l','d',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,'b','e',' ','r','e','j','e','c','t','e','d',
+  ' ','l','i','k','e',' ','m','a','l','f','o','r','m','e','d',
+  ' ','U','T','F','-','8',' ','s','e','q','u','e','n','c','e',
+  's','.',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'4',
+  '.','2','.','1',' ',' ','U','-','0','0','0','0','0','0','7',
+  'F',' ','=',' ','c','1',' ','b','f',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','=',' ','"',#193,#191,'"',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ','|',#010,'4','.','2','.','2',' ',' ','U','-','0',
+  '0','0','0','0','7','F','F',' ','=',' ','e','0',' ','9','f',
+  ' ','b','f',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','=',' ',
+  '"',#224,#159,#191,'"',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'4','.','2',
+  '.','3',' ',' ','U','-','0','0','0','0','F','F','F','F',' ',
+  '=',' ','f','0',' ','8','f',' ','b','f',' ','b','f',' ',' ',
+  ' ',' ',' ',' ',' ','=',' ','"',#240,#143,#191,#191,'"',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ','|',#010,'4','.','2','.','4',' ',' ','U','-','0',
+  '0','1','F','F','F','F','F',' ','=',' ','f','8',' ','8','7',
+  ' ','b','f',' ','b','f',' ','b','f',' ',' ',' ',' ','=',' ',
+  '"',#248,#135,#191,#191,#191,'"',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'4',
+  '.','2','.','5',' ',' ','U','-','0','3','F','F','F','F','F',
+  'F',' ','=',' ','f','c',' ','8','3',' ','b','f',' ','b','f',
+  ' ','b','f',' ','b','f',' ','=',' ','"',#252,#131,#191,#191,#191,
+  #191,'"',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'4',
+  '.','3',' ',' ','O','v','e','r','l','o','n','g',' ','r','e',
+  'p','r','e','s','e','n','t','a','t','i','o','n',' ','o','f',
+  ' ','t','h','e',' ','N','U','L',' ','c','h','a','r','a','c',
+  't','e','r',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,'T','h','e',' ','f','o',
+  'l','l','o','w','i','n','g',' ','f','i','v','e',' ','s','e',
+  'q','u','e','n','c','e','s',' ','s','h','o','u','l','d',' ',
+  'a','l','s','o',' ','b','e',' ','r','e','j','e','c','t','e',
+  'd',' ','l','i','k','e',' ','m','a','l','f','o','r','m','e',
+  'd',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'U',
+  'T','F','-','8',' ','s','e','q','u','e','n','c','e','s',' ',
+  'a','n','d',' ','s','h','o','u','l','d',' ','n','o','t',' ',
+  'b','e',' ','t','r','e','a','t','e','d',' ','l','i','k','e',
+  ' ','t','h','e',' ','A','S','C','I','I',' ','N','U','L',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,'c','h','a','r','a','c','t','e','r','.',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'4',
+  '.','3','.','1',' ',' ','U','+','0','0','0','0',' ','=',' ',
+  'c','0',' ','8','0',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ','=',' ','"',#192,#128,'"',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ','|',#010,'4','.','3','.','2',' ',' ','U','+','0',
+  '0','0','0',' ','=',' ','e','0',' ','8','0',' ','8','0',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ','=',' ','"',#224,#128,#128,
+  '"',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'4','.','3',
+  '.','3',' ',' ','U','+','0','0','0','0',' ','=',' ','f','0',
+  ' ','8','0',' ','8','0',' ','8','0',' ',' ',' ',' ',' ',' ',
+  ' ','=',' ','"',#240,#128,#128,#128,'"',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ','|',#010,'4','.','3','.','4',' ',' ','U','+','0',
+  '0','0','0',' ','=',' ','f','8',' ','8','0',' ','8','0',' ',
+  '8','0',' ','8','0',' ',' ',' ',' ','=',' ','"',#248,#128,#128,
+  #128,#128,'"',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'4',
+  '.','3','.','5',' ',' ','U','+','0','0','0','0',' ','=',' ',
+  'f','c',' ','8','0',' ','8','0',' ','8','0',' ','8','0',' ',
+  '8','0',' ','=',' ','"',#252,#128,#128,#128,#128,#128,'"',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'5',
+  ' ',' ','I','l','l','e','g','a','l',' ','c','o','d','e',' ',
+  'p','o','s','i','t','i','o','n','s',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,'T','h','e',' ','f','o',
+  'l','l','o','w','i','n','g',' ','U','T','F','-','8',' ','s',
+  'e','q','u','e','n','c','e','s',' ','s','h','o','u','l','d',
+  ' ','b','e',' ','r','e','j','e','c','t','e','d',' ','l','i',
+  'k','e',' ','m','a','l','f','o','r','m','e','d',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'s',
+  'e','q','u','e','n','c','e','s',',',' ','b','e','c','a','u',
+  's','e',' ','t','h','e','y',' ','n','e','v','e','r',' ','r',
+  'e','p','r','e','s','e','n','t',' ','v','a','l','i','d',' ',
+  'I','S','O',' ','1','0','6','4','6',' ','c','h','a','r','a',
+  'c','t','e','r','s',' ','a','n','d',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,'a',' ','U','T','F','-','8',' ','d','e','c',
+  'o','d','e','r',' ','t','h','a','t',' ','a','c','c','e','p',
+  't','s',' ','t','h','e','m',' ','m','i','g','h','t',' ','i',
+  'n','t','r','o','d','u','c','e',' ','s','e','c','u','r','i',
+  't','y',' ','p','r','o','b','l','e','m','s',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,'c','o','m','p','a','r',
+  'a','b','l','e',' ','t','o',' ','o','v','e','r','l','o','n',
+  'g',' ','U','T','F','-','8',' ','s','e','q','u','e','n','c',
+  'e','s','.',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,'5','.','1',' ','S','i','n','g','l','e',' ',
+  'U','T','F','-','1','6',' ','s','u','r','r','o','g','a','t',
+  'e','s',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'5',
+  '.','1','.','1',' ',' ','U','+','D','8','0','0',' ','=',' ',
+  'e','d',' ','a','0',' ','8','0',' ','=',' ','"',#237,#160,#128,
+  '"',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ','|',#010,'5','.','1','.','2',' ',' ','U','+',
+  'D','B','7','F',' ','=',' ','e','d',' ','a','d',' ','b','f',
+  ' ','=',' ','"',#237,#173,#191,'"',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'5','.',
+  '1','.','3',' ',' ','U','+','D','B','8','0',' ','=',' ','e',
+  'd',' ','a','e',' ','8','0',' ','=',' ','"',#237,#174,#128,'"',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ','|',#010,'5','.','1','.','4',' ',' ','U','+','D',
+  'B','F','F',' ','=',' ','e','d',' ','a','f',' ','b','f',' ',
+  '=',' ','"',#237,#175,#191,'"',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'5','.','1',
+  '.','5',' ',' ','U','+','D','C','0','0',' ','=',' ','e','d',
+  ' ','b','0',' ','8','0',' ','=',' ','"',#237,#176,#128,'"',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,'5','.','1','.','6',' ',' ','U','+','D','F',
+  '8','0',' ','=',' ','e','d',' ','b','e',' ','8','0',' ','=',
+  ' ','"',#237,#190,#128,'"',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'5','.','1','.',
+  '7',' ',' ','U','+','D','F','F','F',' ','=',' ','e','d',' ',
+  'b','f',' ','b','f',' ','=',' ','"',#237,#191,#191,'"',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ','|',#010,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ','|',#010,'5','.','2',' ','P','a','i',
+  'r','e','d',' ','U','T','F','-','1','6',' ','s','u','r','r',
+  'o','g','a','t','e','s',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ','|',#010,'5','.','2','.','1',' ',' ','U','+','D','8','0',
+  '0',' ','U','+','D','C','0','0',' ','=',' ','e','d',' ','a',
+  '0',' ','8','0',' ','e','d',' ','b','0',' ','8','0',' ','=',
+  ' ','"',#237,#160,#128,#237,#176,#128,'"',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'5','.','2',
+  '.','2',' ',' ','U','+','D','8','0','0',' ','U','+','D','F',
+  'F','F',' ','=',' ','e','d',' ','a','0',' ','8','0',' ','e',
+  'd',' ','b','f',' ','b','f',' ','=',' ','"',#237,#160,#128,#237,
+  #191,#191,'"',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ','|',#010,'5','.','2','.','3',' ',' ','U','+',
+  'D','B','7','F',' ','U','+','D','C','0','0',' ','=',' ','e',
+  'd',' ','a','d',' ','b','f',' ','e','d',' ','b','0',' ','8',
+  '0',' ','=',' ','"',#237,#173,#191,#237,#176,#128,'"',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,
+  '5','.','2','.','4',' ',' ','U','+','D','B','7','F',' ','U',
+  '+','D','F','F','F',' ','=',' ','e','d',' ','a','d',' ','b',
+  'f',' ','e','d',' ','b','f',' ','b','f',' ','=',' ','"',#237,
+  #173,#191,#237,#191,#191,'"',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010,'5','.','2','.','5',' ',
+  ' ','U','+','D','B','8','0',' ','U','+','D','C','0','0',' ',
+  '=',' ','e','d',' ','a','e',' ','8','0',' ','e','d',' ','b',
+  '0',' ','8','0',' ','=',' ','"',#237,#174,#128,#237,#176,#128,'"',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ','|',#010,'5','.','2','.','6',' ',' ','U','+','D','B','8',
+  '0',' ','U','+','D','F','F','F',' ','=',' ','e','d',' ','a',
+  'e',' ','8','0',' ','e','d',' ','b','f',' ','b','f',' ','=',
+  ' ','"',#237,#174,#128,#237,#191,#191,'"',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,'5','.','2',
+  '.','7',' ',' ','U','+','D','B','F','F',' ','U','+','D','C',
+  '0','0',' ','=',' ','e','d',' ','a','f',' ','b','f',' ','e',
+  'd',' ','b','0',' ','8','0',' ','=',' ','"',#237,#175,#191,#237,
+  #176,#128,'"',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ','|',#010,'5','.','2','.','8',' ',' ','U','+',
+  'D','B','F','F',' ','U','+','D','F','F','F',' ','=',' ','e',
+  'd',' ','a','f',' ','b','f',' ','e','d',' ','b','f',' ','b',
+  'f',' ','=',' ','"',#237,#175,#191,#237,#191,#191,'"',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ','|',#010,'5','.','3',' ','O','t','h','e','r',' ',
+  'i','l','l','e','g','a','l',' ','c','o','d','e',' ','p','o',
+  's','i','t','i','o','n','s',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ','|',#010,' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,
+  '5','.','3','.','1',' ',' ','U','+','F','F','F','E',' ','=',
+  ' ','e','f',' ','b','f',' ','b','e',' ','=',' ','"',#239,#191,
+  #190,'"',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ','|',#010,'5','.','3','.','2',' ',' ','U',
+  '+','F','F','F','F',' ','=',' ','e','f',' ','b','f',' ','b',
+  'f',' ','=',' ','"',#239,#191,#191,'"',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',#010,' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ','|',#010,'T','H','E',' ','E','N','D',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+  ' ',' ',' ',' ',' ',' ',' ','|',#010);
+
+procedure dotest;
+var
+  LineBuffer,
+  LineBuffer2: UTF8String;
+  j: integer;
+  TargetPosition: integer;
+  AnsiVersion: ansistring;
+  WideVersion: UnicodeString;
+  tmpwide,
+  cnvwide: UnicodeString;
+  RB: integer;
+  BOM: WORD;
+  BytesUsed1: integer;
+  BytesUsed2: integer;
+begin
+  AnsiVersion:='';
+  WideVersion:='';
+  SetLength(LineBuffer,4096);
+  TargetPosition:=1;
+  for j := low(buffer) to high(Buffer) do
+    begin
+      if (Buffer[j]=#10) or (TargetPosition=4096) then
+        begin
+          SetLength(LineBuffer,TargetPosition-1);
+          AnsiVersion:=AnsiVersion+UTF8Decode(LineBuffer)+#10;
+          WideVersion:=WideVersion+UTF8Decode(LineBuffer)+#10;
+          //This test checks the bytes needed calculation and
+          //the conversion itself to return the same amount of bytes needed.
+          BytesUsed1:=Length(UTF8Decode(LineBuffer));
+          BytesUsed2:=UTF8ToUnicode(nil,0,pchar(LineBuffer),Length(LineBuffer));
+          if BytesUsed1<>(BytesUsed2-1) then //UTF8ToUnicode includes terminating #0 -> -1
+            begin
+              writeln(UTF8Decode(linebuffer));
+              writeln('error at ',j,': ',BytesUsed1,' <> ',BytesUsed2-1);
+              halt(1);
+            end;
+          SetLength(LineBuffer2,4096);
+
+          tmpwide:=UTF8Decode(LineBuffer);
+          
+          // UnicodeToUTF8 includes terminating #0 -> length-1
+          setlength(LineBuffer2,UnicodeToUTF8(@LineBuffer2[1],length(LineBuffer2),punicodechar(@tmpwide[1]),length(tmpwide))-1);
+          cnvwide:=UTF8Decode(LineBuffer2);
+          if (cnvwide <> tmpwide) then
+            begin
+              writeln(j);
+              writeln('org (len: ',length(tmpwide),'): "',tmpwide,'"');
+              writeln('new (len: ',length(cnvwide),'): "',cnvwide,'"');
+              halt(2);
+            end;
+          SetLength(LineBuffer,4096);
+          TargetPosition:=1;
+        end
+      else
+        begin
+          if Buffer[j]<>#13 then
+            begin
+              LineBuffer[TargetPosition]:=Buffer[j];
+              inc(TargetPosition);
+            end;
+        end;
+    end;
+
+end;
+
+begin
+  dotest;
+end.
+
+

+ 172 - 0
tests/webtbs/tw13075.pp

@@ -0,0 +1,172 @@
+{$mode objfpc}{$H+}
+
+
+uses
+{$ifdef unix}
+  cwstring,
+{$endif}
+  Classes, SysUtils;
+
+function localUnicodeToUTF8(u: cardinal; Buf: PChar): integer;
+
+  procedure RaiseInvalidUnicode;
+  begin
+    raise Exception.Create('UnicodeToUTF8: invalid unicode: '+IntToStr(u));
+  end;
+
+begin
+  case u of
+    0..$7f:
+      begin
+        Result:=1;
+        Buf[0]:=char(byte(u));
+      end;
+    $80..$7ff:
+      begin
+        Result:=2;
+        Buf[0]:=char(byte($c0 or (u shr 6)));
+        Buf[1]:=char(byte($80 or (u and $3f)));
+      end;
+    $800..$ffff:
+      begin
+        Result:=3;
+        Buf[0]:=char(byte($e0 or (u shr 12)));
+        Buf[1]:=char(byte((u shr 6) and $3f) or $80);
+        Buf[2]:=char(byte(u and $3f) or $80);
+      end;
+    $10000..$10ffff:
+      begin
+        Result:=4;
+        Buf[0]:=char(byte($f0 or (u shr 18)));
+        Buf[1]:=char(byte((u shr 12) and $3f) or $80);
+        Buf[2]:=char(byte((u shr 6) and $3f) or $80);
+        Buf[3]:=char(byte(u and $3f) or $80);
+      end;
+  else
+    RaiseInvalidUnicode;
+  end;
+end;
+
+function localUnicodeToUTF8(u: cardinal): shortstring;
+begin
+  Result[0]:=chr(localUnicodeToUTF8(u,@Result[1]));
+end;
+
+
+function localUnicodeToUTF16(u: cardinal): widestring;
+begin
+  // u should be <= $10FFFF to fit into UTF-16
+
+  if u < $10000 then
+    // Note: codepoints $D800 - $DFFF are reserved
+    Result:=widechar(u)
+  else
+    Result:=widechar($D800+((u - $10000) shr 10))+widechar($DC00+((u - $10000) and $3ff));
+end;
+
+
+function UnicodeToCESU8(u: cardinal; Buf: PChar): integer;
+
+  procedure RaiseInvalidUnicode;
+  begin
+    raise Exception.Create('UnicodeToCESU8: invalid unicode: '+IntToStr(u));
+  end;
+
+var
+  st: widestring;
+begin
+  case u of
+    0..$ffff:
+      begin
+        Result:=localUnicodeToUTF8(u,Buf);
+      end;
+    $10000..$10ffff:
+      begin
+        st := localUnicodeToUTF16(u);
+
+        Result:=6;
+        Buf[0]:=char(byte($e0 or (ord(st[1]) shr 12)));
+        Buf[1]:=char(byte((ord(st[1]) shr 6) and $3f) or $80);
+        Buf[2]:=char(byte(ord(st[1]) and $3f) or $80);
+        Buf[3]:=char(byte($e0 or (ord(st[2]) shr 12)));
+        Buf[4]:=char(byte((ord(st[2]) shr 6) and $3f) or $80);
+        Buf[5]:=char(byte(ord(st[2]) and $3f) or $80);
+     end;
+  else
+    RaiseInvalidUnicode;
+  end;
+end;
+
+function UnicodeToCESU8(u: cardinal): utf8string;
+begin
+  setlength(result,1000);
+  setlength(result,UnicodeToCESU8(u,@Result[1]));
+end;
+
+procedure dotest;
+var
+  s1,s2: utf8string;
+  w1,w2: unicodestring;
+  s3,s4: utf8string;
+  i: longint;
+begin
+  s1 := localUnicodeToUTF8 ($10300);
+  s2 := UnicodeToCESU8 ($10300);
+  setlength(w1,20);
+  setlength(w2,20);
+  // -1 because UTF8ToUnicode returns a null-terminated string
+  setlength(w1,UTF8ToUnicode(punicodechar(@w1[1]),length(w1),pchar(s1),Length(s1))-1);
+  setlength(w2,UTF8ToUnicode(punicodechar(@w2[1]),length(w2),pchar(s2),Length(s2))-1);
+(*
+  writeln('len: ',length(w1),' - "',w1,'"');
+  write('  ');
+  for i:= 1 to length(w1) do
+    write('#$',hexstr(ord(w1[i]),4));
+  writeln;
+  writeln('len: ',length(w2),' - "',w2,'"');
+  write('  ');
+  for i:= 1 to length(w2) do
+    write('#$',hexstr(ord(w2[i]),4));
+  writeln;
+  writeln;
+*)
+  
+  setlength(s3,20);
+  setlength(s4,20);
+  // -1 because UnicodeToUTF8 returns a null-terminated string
+  setlength(s3,UnicodeToUTF8(@s3[1],length(s3),punicodechar(@w1[1]),length(w1))-1);
+  setlength(s4,UnicodeToUTF8(@s4[1],length(s4),punicodechar(@w2[1]),length(w2))-1);
+  
+  if (s3<>s1) or
+     { invalid: CESU-8 }
+     (w2<>'??') or
+     (s4<>'??') then
+    begin
+      writeln('len: ',length(s1),' - "',s1,'"');
+      write('  ');
+      for i:= 1 to length(s1) do
+        write('#$',hexstr(ord(s1[i]),2));
+      writeln;
+      writeln('len: ',length(s2),' - "',s2,'"');
+      write('  ');
+      for i:= 1 to length(s2) do
+        write('#$',hexstr(ord(s2[i]),2));
+      writeln;
+      writeln('len: ',length(s3),' - "',s3,'"');
+      write('  ');
+      for i:= 1 to length(s3) do
+        write('#$',hexstr(ord(s3[i]),2));
+      writeln;
+      writeln('len: ',length(s4),' - "',s4,'"');
+      write('  ');
+      for i:= 1 to length(s4) do
+        write('#$',hexstr(ord(s4[i]),2));
+      writeln;
+      halt(1);
+    end;
+end;
+
+begin
+  dotest;
+end.
+