10580 lines · 865.7 KB · Java
RawDownload
 /* * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.  Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ /* */ package sun.nio.cs.ext; import java.nio.CharBuffer;import java.nio.ByteBuffer;import java.nio.charset.Charset;import java.nio.charset.CharsetDecoder;import java.nio.charset.CharsetEncoder;import java.nio.charset.CoderResult;import sun.nio.cs.HistoricallyNamedCharset; public class IBM964    extends Charset    implements HistoricallyNamedCharset{     public IBM964() {        super("x-IBM964", ExtendedCharsets.aliasesFor("x-IBM964"));    }     public String historicalName() {        return "Cp964";    }     public boolean contains(Charset cs) {        return (cs instanceof IBM964);    }     public CharsetDecoder newDecoder() {        return new Decoder(this);    }     public CharsetEncoder newEncoder() {        return new Encoder(this);    }      /**     * These accessors are temporarily supplied while sun.io     * converters co-exist with the sun.nio.cs.{ext} charset coders     * These facilitate sharing of conversion tables between the     * two co-existing implementations. When sun.io converters     * are made extinct these will be unncessary and should be removed     */     public String getDecoderSingleByteMappings() {        return Decoder.byteToCharTable;    }     public String getDecoderMappingTableG1() {        return Decoder.mappingTableG1;    }     public String getDecoderMappingTableG2a2() {        return Decoder.mappingTableG2a2;    }     public String getDecoderMappingTableG2ac() {        return Decoder.mappingTableG2ac;    }     public String getDecoderMappingTableG2ad() {        return Decoder.mappingTableG2ad;    }     public short[] getEncoderIndex1() {        return Encoder.index1;     }    public String getEncoderIndex2() {        return Encoder.index2;     }    public String getEncoderIndex2a() {        return Encoder.index2a;    }     public String getEncoderIndex2b() {        return Encoder.index2b;    }     public String getEncoderIndex2c() {        return Encoder.index2c;    }    protected static class Decoder extends CharsetDecoder {        private final int SS2 =  0x8E;        private final int SS3 =  0x8F;         private String mappingTableG2;         public Decoder(Charset cs) {                super(cs, 1.0f, 1.0f);        }         private CoderResult decodeArrayLoop(ByteBuffer src, CharBuffer dst) {            byte[] sa = src.array();            int sp = src.arrayOffset() + src.position();            int sl = src.arrayOffset() + src.limit();            assert (sp <= sl);            sp = (sp <= sl ? sp : sl);            char[] da = dst.array();            int dp = dst.arrayOffset() + dst.position();            int dl = dst.arrayOffset() + dst.limit();            assert (dp <= dl);            dp = (dp <= dl ? dp : dl);             try {            while (sp < sl) {                int byte1, byte2;                int inputSize = 1;                char outputChar = '\uFFFD';                byte1 = sa[sp] & 0xff;                 if (byte1 == SS2) {                    if (sl - sp < 4) {                        return CoderResult.UNDERFLOW;                    }                    byte1 = sa[sp + 1] & 0xff;                    inputSize = 2;                    if ( byte1 == 0xa2)                        mappingTableG2 = mappingTableG2a2;                    else if ( byte1 == 0xac)                        mappingTableG2 = mappingTableG2ac;                    else if ( byte1 == 0xad)                        mappingTableG2 = mappingTableG2ad;                    else                        return CoderResult.malformedForLength(2);                    byte1 = sa[sp + 2] & 0xff;                    if ( byte1 < 0xa1 || byte1 > 0xfe) {                        return CoderResult.malformedForLength(3);                    }                    byte2 = sa[sp + 3] & 0xff;                    if ( byte2 < 0xa1 || byte2 > 0xfe) {                      return CoderResult.malformedForLength(4);                    }                    inputSize = 4;                    outputChar = mappingTableG2.charAt(((byte1 - 0xa1) * 94) + byte2 - 0xa1);                } else if(byte1 == SS3 ) {                    return CoderResult.malformedForLength(1);                } else if ( byte1 <= 0x9f ) {                // valid single byte                    outputChar = byteToCharTable.charAt(byte1);                } else if (byte1 < 0xa1 || byte1 > 0xfe) {   // invalid range?                    return CoderResult.malformedForLength(1);                } else {                                     // G1                    if (sl - sp < 2) {                        return CoderResult.UNDERFLOW;                    }                    byte2 = sa[sp + 1] & 0xff;                    inputSize = 2;                    if ( byte2 < 0xa1 || byte2 > 0xfe) {                        return CoderResult.malformedForLength(2);                    }                    outputChar = mappingTableG1.charAt(((byte1 - 0xa1) * 94) + byte2 - 0xa1);                }                if  (outputChar == '\uFFFD')                    return CoderResult.unmappableForLength(inputSize);                if (dl - dp < 1)                    return CoderResult.OVERFLOW;                da[dp++] = outputChar;                sp += inputSize;            }            return CoderResult.UNDERFLOW;            } finally {                src.position(sp - src.arrayOffset());                dst.position(dp - dst.arrayOffset());            }        }         private CoderResult decodeBufferLoop(ByteBuffer src, CharBuffer dst) {            int mark = src.position();            try {                while (src.hasRemaining()) {                    int byte1, byte2;                    int inputSize = 1;                    char outputChar = '\uFFFD';                    byte1 = src.get() & 0xff;                     if (byte1 == SS2) {                        if (src.remaining() < 3)                            return CoderResult.UNDERFLOW;                        byte1 = src.get() & 0xff;                        inputSize = 2;                        if ( byte1 == 0xa2)                            mappingTableG2 = mappingTableG2a2;                        else if ( byte1 == 0xac)                            mappingTableG2 = mappingTableG2ac;                        else if ( byte1 == 0xad)                          mappingTableG2 = mappingTableG2ad;                        else                            return CoderResult.malformedForLength(2);                        byte1 = src.get() & 0xff;                        if ( byte1 < 0xa1 || byte1 > 0xfe)                            return CoderResult.malformedForLength(3);                        byte2 = src.get() & 0xff;                        if ( byte2 < 0xa1 || byte2 > 0xfe)                            return CoderResult.malformedForLength(4);                        inputSize = 4;                        outputChar = mappingTableG2.charAt(((byte1 - 0xa1) * 94) + byte2 - 0xa1);                    } else if (byte1 == SS3 ) {                        return CoderResult.malformedForLength(1);                    } else if ( byte1 <= 0x9f ) {                // valid single byte                        outputChar = byteToCharTable.charAt(byte1);                    } else if (byte1 < 0xa1 || byte1 > 0xfe) {   // invalid range?                        return CoderResult.malformedForLength(1);                    } else {                                     // G1                        if (src.remaining() < 1)                            return CoderResult.UNDERFLOW;                        byte2 = src.get() & 0xff;                        if ( byte2 < 0xa1 || byte2 > 0xfe) {                            return CoderResult.malformedForLength(2);                        }                        inputSize = 2;                        outputChar = mappingTableG1.charAt(((byte1 - 0xa1) * 94) + byte2 - 0xa1);                    }                     if (outputChar == '\uFFFD')                        return CoderResult.unmappableForLength(inputSize);                    if (!dst.hasRemaining())                        return CoderResult.OVERFLOW;                    dst.put(outputChar);                    mark += inputSize;                }                return CoderResult.UNDERFLOW;            } finally {                    src.position(mark);            }        }         protected CoderResult decodeLoop(ByteBuffer src, CharBuffer dst) {            if (true && src.hasArray() && dst.hasArray())                return decodeArrayLoop(src, dst);            else                return decodeBufferLoop(src, dst);        }         private final static String byteToCharTable;        private final static String mappingTableG1;        private final static String mappingTableG2a2;        private final static String mappingTableG2ac;        private final static String mappingTableG2ad;         static {            byteToCharTable =                "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007" +                "\u0008\u0009\n\u000B\u000C\r\u000E\u000F" +                "\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017" +                "\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F" +                "\u0020\u0021\"\u0023\u0024\u0025\u0026\u0027" +                "\u0028\u0029\u002A\u002B\u002C\u002D\u002E\u002F" +                "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037" +                "\u0038\u0039\u003A\u003B\u003C\u003D\u003E\u003F" +                "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047" +                "\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F" +                "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057" +                "\u0058\u0059\u005A\u005B\\\u005D\u005E\u005F" +                "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067" +                "\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F" +                "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077" +                "\u0078\u0079\u007A\u007B\u007C\u007D\u007E\u007F" +                "\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087" +                "\u0088\u0089\u008A\u008B\u008C\u008D\uFFFD\uFFFD" +                "\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097" +                "\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F"                ;            mappingTableG1 =                "\u3000\uFF0C\u3001\u3002\uFF0E\u2027\uFF1B\uFF1A" +                "\uFF1F\uFF01\uFE30\u2026\u2025\uFE50\uFE51\uFE52" +                "\u00B7\uFE54\uFE55\uFE56\uFE57\uFE31\u2014\uFE32" +                "\uFE58\uFE33\u2574\uFE34\uFE4F\uFF08\uFF09\uFE35" +                "\uFE36\uFF5B\uFF5D\uFE37\uFE38\u3014\u3015\uFE39" +                "\uFE3A\u3010\u3011\uFE3B\uFE3C\u300A\u300B\uFE3D" +                "\uFE3E\u3008\u3009\uFE3F\uFE40\u300C\u300D\uFE41" +                "\uFE42\u300E\u300F\uFE43\uFE44\uFE59\uFE5A\uFE5B" +                "\uFE5C\uFE5D\uFE5E\u2018\u2019\u201C\u201D\u301D" +                "\u301E\u2035\u2032\uFF03\uFF06\uFF0A\u203B\u00A7" +                "\u3003\u25CB\u25CF\u25B3\u25B2\u25CE\u2606\u2605" +                "\u25C7\u25C6\u25A1\u25A0\u25BD\u25BC\u32A3\u2105" +                "\u203E\uFFE3\uFF3F\u02CD\uFE49\uFE4A\uFE4D\uFE4E" +                "\uFE4B\uFE4C\uFE5F\uFE60\uFE61\uFF0B\uFF0D\u00D7" +                "\u00F7\u00B1\u221A\uFF1C\uFF1E\uFF1D\u2266\u2267" +                "\u2260\u221E\u2252\u2261\uFE62\uFE63\uFE64\uFE65" +                "\uFE66\u223C\u2229\u222A\u22A5\u2220\u221F\u22BF" +                "\u33D2\u33D1\u222B\u222E\u2235\u2234\u2640\u2642" +                "\u2295\u2299\u2191\u2193\u2192\u2190\u2196\u2197" +                "\u2199\u2198\u2225\uFF5C\uFF0F\uFF3C\u2215\uFE68" +                "\uFF04\uFFE5\u3012\uFFE0\uFFE1\uFF05\uFF20\u2103" +                "\u2109\uFE69\uFE6A\uFE6B\u33D5\u339C\u339D\u339E" +                "\u33CE\u33A1\u338E\u338F\u33C4\u00B0\u5159\u515B" +                "\u515E\u515D\u5161\u5163\u55E7\u74E9\u7CCE\u2581" +                "\u2582\u2583\u2584\u2585\u2586\u2587\u2588\u258F" +                "\u258E\u258D\u258C\u258B\u258A\u2589\u253C\u2534" +                "\u252C\u2524\u251C\u2594\u2500\u2502\u2595\u250C" +                "\u2510\u2514\u2518\u256D\u256E\u2570\u256F\u2550" +                "\u255E\u256A\u2561\u25E2\u25E3\u25E5\u25E4\u2571" +                "\u2572\u2573\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFF10\uFF11\uFF12\uFF13\uFF14\uFF15" +                "\uFF16\uFF17\uFF18\uFF19\u2160\u2161\u2162\u2163" +                "\u2164\u2165\u2166\u2167\u2168\u2169\u3021\u3022" +                "\u3023\u3024\u3025\u3026\u3027\u3028\u3029\u5341" +                "\u5344\u5345\uFF21\uFF22\uFF23\uFF24\uFF25\uFF26" +                "\uFF27\uFF28\uFF29\uFF2A\uFF2B\uFF2C\uFF2D\uFF2E" +                "\uFF2F\uFF30\uFF31\uFF32\uFF33\uFF34\uFF35\uFF36" +                "\uFF37\uFF38\uFF39\uFF3A\uFF41\uFF42\uFF43\uFF44" +                "\uFF45\uFF46\uFF47\uFF48\uFF49\uFF4A\uFF4B\uFF4C" +                "\uFF4D\uFF4E\uFF4F\uFF50\uFF51\uFF52\uFF53\uFF54" +                "\uFF55\uFF56\uFF57\uFF58\uFF59\uFF5A\u0391\u0392" +                "\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039A" +                "\u039B\u039C\u039D\u039E\u039F\u03A0\u03A1\u03A3" +                "\u03A4\u03A5\u03A6\u03A7\u03A8\u03A9\u03B1\u03B2" +                "\u03B3\u03B4\u03B5\u03B6\u03B7\u03B8\u03B9\u03BA" +                "\u03BB\u03BC\u03BD\u03BE\u03BF\u03C0\u03C1\u03C3" +                "\u03C4\u03C5\u03C6\u03C7\u03C8\u03C9\u3105\u3106" +                "\u3107\u3108\u3109\u310A\u310B\u310C\u310D\u310E" +                "\u310F\u3110\u3111\u3112\u3113\u3114\u3115\u3116" +                "\u3117\u3118\u3119\u311A\u311B\u311C\u311D\u311E" +                "\u311F\u3120\u3121\u3122\u3123\u3124\u3125\u3126" +                "\u3127\u3128\u3129\u02D9\u02C9\u02CA\u02C7\u02CB" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u2460\u2461" +                "\u2462\u2463\u2464\u2465\u2466\u2467\u2468\u2469" +                "\u2474\u2475\u2476\u2477\u2478\u2479\u247A\u247B" +                "\u247C\u247D\u2170\u2171\u2172\u2173\u2174\u2175" +                "\u2176\u2177\u2178\u2179\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\u4E00\u4E28\u4E36\u4E3F" +                "\u4E59\u4E85\u4E8C\u4EA0\u4EBA\u513F\u5165\u516B" +                "\u5182\u5196\u51AB\u51E0\u51F5\u5200\u529B\u52F9" +                "\u5315\u531A\u5338\u5341\u535C\u5369\u5382\u53B6" +                "\u53C8\u53E3\u56D7\u571F\u58EB\u590A\u5915\u5927" +                "\u5973\u5B50\u5B80\u5BF8\u5C0F\u5C22\u5C38\u5C6E" +                "\u5C71\u5DDB\u5DE5\u5DF1\u5DFE\u5E72\u5E7A\u5E7F" +                "\u5EF4\u5EFE\u5F0B\u5F13\u5F50\u5F61\u5F73\u5FC3" +                "\u6208\u6236\u624B\u652F\u6534\u6587\u6597\u65A4" +                "\u65B9\u65E0\u65E5\u66F0\u6708\u6728\u6B20\u6B62" +                "\u6B79\u6BB3\u6BCB\u6BD4\u6BDB\u6C0F\u6C14\u6C34" +                "\u706B\u722A\u7236\u723B\u723F\u7247\u7259\u725B" +                "\u72AC\u7384\u7389\u74DC\u74E6\u7518\u751F\u7528" +                "\u7530\u758B\u7592\u7676\u767D\u76AE\u76BF\u76EE" +                "\u77DB\u77E2\u77F3\u793A\u79B8\u79BE\u7A74\u7ACB" +                "\u7AF9\u7C73\u7CF8\u7F36\u7F51\u7F8A\u7FBD\u8001" +                "\u800C\u8012\u8033\u807F\u8089\u81E3\u81EA\u81F3" +                "\u81FC\u820C\u821B\u821F\u826E\u8272\u8278\u864D" +                "\u866B\u8840\u884C\u8863\u897E\u898B\u89D2\u8A00" +                "\u8C37\u8C46\u8C55\u8C78\u8C9D\u8D64\u8D70\u8DB3" +                "\u8EAB\u8ECA\u8F9B\u8FB0\u8FB5\u9091\u9149\u91C6" +                "\u91CC\u91D1\u9577\u9580\u961C\u96B6\u96B9\u96E8" +                "\u9752\u975E\u9762\u9769\u97CB\u97ED\u97F3\u9801" +                "\u98A8\u98DB\u98DF\u9996\u9999\u99AC\u9AA8\u9AD8" +                "\u9ADF\u9B25\u9B2F\u9B32\u9B3C\u9B5A\u9CE5\u9E75" +                "\u9E7F\u9EA5\u9EBB\u9EC3\u9ECD\u9ED1\u9EF9\u9EFD" +                "\u9F0E\u9F13\u9F20\u9F3B\u9F4A\u9F52\u9F8D\u9F9C" +                "\u9FA0\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +                "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +

Lines 1–500 of 10580.